Class: Puppet::Util::NetworkDevice::Cisco::Interface

Inherits:
Object
  • Object
show all
Extended by:
IPCalc
Includes:
IPCalc
Defined in:
lib/vendor/puppet/util/network_device/cisco/interface.rb

Overview

this manages setting properties to an interface in a cisco switch or router

Constant Summary collapse

COMMANDS =
{
  # property     => order, ios command/block/array
  :description   => [1, "description %s"],
  :speed         => [2, "speed %s"],
  :duplex        => [3, "duplex %s"],
  :native_vlan   => [4, "switchport access vlan %s"],
  :encapsulation => [5, "switchport trunk encapsulation %s"],
  :mode          => [6, "switchport mode %s"],
  :allowed_trunk_vlans => [7, "switchport trunk allowed vlan %s"],
  :etherchannel  => [8, ["channel-group %s", "port group %s"]],
  :ipaddress     => [9,
    lambda do |prefix,ip,option|
      ip.ipv6? ? "ipv6 address #{ip.to_s}/#{prefix} #{option}" :
                 "ip address #{ip.to_s} #{netmask(Socket::AF_INET,prefix)}"
    end],
    :ensure        => [10, lambda { |value| value == :present ? "no shutdown" : "shutdown" } ]
}

Constants included from IPCalc

IPCalc::IP, IPCalc::IPv4, IPCalc::IPv6_full, IPCalc::IPv6_partial, IPCalc::Octet

Instance Attribute Summary collapse

Instance Method Summary collapse

Methods included from IPCalc

bits, fullmask, linklocal?, mask, netmask, parse, prefix_length, wildmask

Constructor Details

#initialize(name, transport) ⇒ Interface

Returns a new instance of Interface.



12
13
14
15
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 12

def initialize(name, transport)
  @name = name
  @transport = transport
end

Instance Attribute Details

#nameObject (readonly)

Returns the value of attribute name.



10
11
12
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 10

def name
  @name
end

#transportObject (readonly)

Returns the value of attribute transport.



10
11
12
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 10

def transport
  @transport
end

Instance Method Details

#command(command) ⇒ Object



77
78
79
80
81
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 77

def command(command)
  transport.command(command) do |out|
    Puppet.err "Error while executing #{command}, device returned #{out}" if out =~ /^%/mo
  end
end

#execute(property, value, prefix = '') ⇒ Object



59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 59

def execute(property, value, prefix='')
  case COMMANDS[property][1]
  when Array
    COMMANDS[property][1].each do |command|
      transport.command(prefix + command % value) do |out|
        break unless out =~ /^%/
      end
    end
  when String
    command(prefix + COMMANDS[property][1] % value)
  when Proc
    value = [value] unless value.is_a?(Array)
    value.each do |value|
      command(prefix + COMMANDS[property][1].call(*value))
    end
  end
end

#update(is = {}, should = {}) ⇒ Object



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
# File 'lib/vendor/puppet/util/network_device/cisco/interface.rb', line 35

def update(is={}, should={})
  Puppet.debug("Updating interface #{name}")
  command("conf t")
  command("interface #{name}")

  # apply changes in a defined orders for cisco IOS devices
  [is.keys, should.keys].flatten.uniq.sort {|a,b| COMMANDS[a][0] <=> COMMANDS[b][0] }.each do |property|
    # They're equal, so do nothing.
    next if is[property] == should[property]

    # We're deleting it
    if should[property] == :absent or should[property].nil?
      execute(property, is[property], "no ")
      next
    end

    # We're replacing an existing value or creating a new one
    execute(property, should[property])
  end

  command("exit")
  command("exit")
end