PageRenderTime 49ms CodeModel.GetById 24ms RepoModel.GetById 0ms app.codeStats 0ms

/lib/puppet/type/interface.rb

https://github.com/lak/puppet-old
Ruby | 109 lines | 82 code | 24 blank | 3 comment | 4 complexity | 08e5e59d08a6392d7fc6ba500c24afec MD5 | raw file
Possible License(s): Apache-2.0
  1. #
  2. # Manages an interface on a given router or switch
  3. #
  4. require 'puppet/util/network_device/ipcalc'
  5. Puppet::Type.newtype(:interface) do
  6. @doc = "This represents a router or switch interface. It is possible to manage
  7. interface mode (access or trunking, native vlan and encapsulation),
  8. switchport characteristics (speed, duplex)."
  9. apply_to_device
  10. ensurable do
  11. defaultvalues
  12. aliasvalue :shutdown, :absent
  13. aliasvalue :no_shutdown, :present
  14. defaultto { :no_shutdown }
  15. end
  16. newparam(:name) do
  17. desc "Interface name"
  18. end
  19. newparam(:device_url) do
  20. desc "Url to connect to a router or switch."
  21. end
  22. newproperty(:description) do
  23. desc "Interface description."
  24. defaultto { @resource[:name] }
  25. end
  26. newproperty(:speed) do
  27. desc "Interface speed."
  28. newvalues(:auto, /^\d+/)
  29. end
  30. newproperty(:duplex) do
  31. desc "Interface duplex."
  32. newvalues(:auto, :full, :half)
  33. end
  34. newproperty(:native_vlan) do
  35. desc "Interface native vlan (for access mode only)."
  36. newvalues(/^\d+/)
  37. end
  38. newproperty(:encapsulation) do
  39. desc "Interface switchport encapsulation."
  40. newvalues(:none, :dot1q, :isl )
  41. end
  42. newproperty(:mode) do
  43. desc "Interface switchport mode."
  44. newvalues(:access, :trunk)
  45. end
  46. newproperty(:allowed_trunk_vlans) do
  47. desc "Allowed list of Vlans that this trunk can forward."
  48. newvalues(:all, /./)
  49. end
  50. newproperty(:etherchannel) do
  51. desc "Channel group this interface is part of."
  52. newvalues(/^\d+/)
  53. end
  54. newproperty(:ipaddress, :array_matching => :all) do
  55. include Puppet::Util::NetworkDevice::IPCalc
  56. desc "IP Address of this interface (it might not be possible to set an interface IP address
  57. it depends on the interface type and device type).
  58. Valid format of ip addresses are:
  59. * IPV4, like 127.0.0.1
  60. * IPV4/prefixlength like 127.0.1.1/24
  61. * IPV6/prefixlength like FE80::21A:2FFF:FE30:ECF0/128
  62. * an optional suffix for IPV6 addresses from this list: eui-64, link-local
  63. It is also possible to use an array of values.
  64. "
  65. validate do |values|
  66. values = [values] unless values.is_a?(Array)
  67. values.each do |value|
  68. self.fail "Invalid interface ip address" unless parse(value.gsub(/\s*(eui-64|link-local)\s*$/,''))
  69. end
  70. end
  71. munge do |value|
  72. option = value =~ /eui-64|link-local/i ? value.gsub(/^.*?\s*(eui-64|link-local)\s*$/,'\1') : nil
  73. [parse(value.gsub(/\s*(eui-64|link-local)\s*$/,'')), option].flatten
  74. end
  75. def value_to_s(value)
  76. value = [value] unless value.is_a?(Array)
  77. value.map{ |v| "#{v[1].to_s}/#{v[0]} #{v[2]}"}.join(",")
  78. end
  79. def change_to_s(currentvalue, newvalue)
  80. currentvalue = value_to_s(currentvalue) if currentvalue != :absent
  81. newvalue = value_to_s(newvalue)
  82. super(currentvalue, newvalue)
  83. end
  84. end
  85. end