cisco_node_utils 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (202) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +2 -1
  3. data/CHANGELOG.md +126 -1
  4. data/README.md +19 -12
  5. data/Rakefile +1 -0
  6. data/bin/git/hooks/commit-msg/enforce_style +8 -0
  7. data/cisco_node_utils.gemspec +4 -3
  8. data/docs/README-develop-best-practices.md +127 -109
  9. data/docs/README-develop-node-utils-APIs.md +47 -39
  10. data/docs/template-router.rb +3 -7
  11. data/lib/.rubocop.yml +4 -4
  12. data/lib/cisco_node_utils.rb +1 -1
  13. data/lib/cisco_node_utils/aaa_authentication_login.rb +96 -0
  14. data/lib/cisco_node_utils/aaa_authentication_login_service.rb +133 -0
  15. data/lib/cisco_node_utils/aaa_authorization_service.rb +150 -0
  16. data/lib/cisco_node_utils/ace.rb +196 -0
  17. data/lib/cisco_node_utils/acl.rb +100 -0
  18. data/lib/cisco_node_utils/bgp.rb +301 -163
  19. data/lib/cisco_node_utils/bgp_af.rb +187 -19
  20. data/lib/cisco_node_utils/bgp_neighbor.rb +18 -33
  21. data/lib/cisco_node_utils/bgp_neighbor_af.rb +25 -48
  22. data/lib/cisco_node_utils/cisco_cmn_utils.rb +23 -4
  23. data/lib/cisco_node_utils/cmd_ref/README_YAML.md +593 -0
  24. data/lib/cisco_node_utils/cmd_ref/aaa_auth_login_service.yaml +22 -0
  25. data/lib/cisco_node_utils/cmd_ref/aaa_authentication_login.yaml +31 -0
  26. data/lib/cisco_node_utils/cmd_ref/aaa_authorization_service.yaml +22 -0
  27. data/lib/cisco_node_utils/cmd_ref/acl.yaml +43 -0
  28. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +242 -0
  29. data/lib/cisco_node_utils/cmd_ref/bgp_af.yaml +164 -0
  30. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +131 -0
  31. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +179 -0
  32. data/lib/cisco_node_utils/cmd_ref/dnsclient.yaml +34 -0
  33. data/lib/cisco_node_utils/cmd_ref/evpn_vni.yaml +42 -0
  34. data/lib/cisco_node_utils/cmd_ref/fabricpath.yaml +172 -0
  35. data/lib/cisco_node_utils/cmd_ref/fabricpath_topology.yaml +35 -0
  36. data/lib/cisco_node_utils/cmd_ref/feature.yaml +42 -0
  37. data/lib/cisco_node_utils/cmd_ref/fex.yaml +9 -0
  38. data/lib/cisco_node_utils/cmd_ref/images.yaml +7 -0
  39. data/lib/cisco_node_utils/cmd_ref/interface.yaml +339 -0
  40. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +28 -0
  41. data/lib/cisco_node_utils/cmd_ref/interface_ospf.yaml +61 -0
  42. data/lib/cisco_node_utils/cmd_ref/interface_portchannel.yaml +54 -0
  43. data/lib/cisco_node_utils/cmd_ref/interface_service_vni.yaml +32 -0
  44. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +45 -0
  45. data/lib/cisco_node_utils/cmd_ref/memory.yaml +13 -0
  46. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +7 -0
  47. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +14 -0
  48. data/lib/cisco_node_utils/cmd_ref/ospf.yaml +74 -0
  49. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +33 -0
  50. data/lib/cisco_node_utils/cmd_ref/pim.yaml +40 -0
  51. data/lib/cisco_node_utils/cmd_ref/portchannel_global.yaml +69 -0
  52. data/lib/cisco_node_utils/cmd_ref/radius_global.yaml +25 -0
  53. data/lib/cisco_node_utils/cmd_ref/radius_server.yaml +64 -0
  54. data/lib/cisco_node_utils/cmd_ref/radius_server_group.yaml +14 -0
  55. data/lib/cisco_node_utils/cmd_ref/show_system.yaml +5 -0
  56. data/lib/cisco_node_utils/cmd_ref/show_version.yaml +72 -0
  57. data/lib/cisco_node_utils/cmd_ref/snmp_community.yaml +23 -0
  58. data/lib/cisco_node_utils/cmd_ref/snmp_group.yaml +7 -0
  59. data/lib/cisco_node_utils/cmd_ref/snmp_notification_receiver.yaml +50 -0
  60. data/lib/cisco_node_utils/cmd_ref/snmp_server.yaml +51 -0
  61. data/lib/cisco_node_utils/cmd_ref/snmp_user.yaml +55 -0
  62. data/lib/cisco_node_utils/cmd_ref/snmpnotification.yaml +11 -0
  63. data/lib/cisco_node_utils/cmd_ref/syslog_server.yaml +18 -0
  64. data/lib/cisco_node_utils/cmd_ref/syslog_settings.yaml +7 -0
  65. data/lib/cisco_node_utils/cmd_ref/system.yaml +6 -0
  66. data/lib/cisco_node_utils/cmd_ref/tacacs_server.yaml +49 -0
  67. data/lib/cisco_node_utils/cmd_ref/tacacs_server_group.yaml +33 -0
  68. data/lib/cisco_node_utils/cmd_ref/tacacs_server_host.yaml +35 -0
  69. data/lib/cisco_node_utils/cmd_ref/vdc.yaml +38 -0
  70. data/lib/cisco_node_utils/cmd_ref/virtual_service.yaml +6 -0
  71. data/lib/cisco_node_utils/cmd_ref/vlan.yaml +56 -0
  72. data/lib/cisco_node_utils/cmd_ref/vni.yaml +76 -0
  73. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +197 -0
  74. data/lib/cisco_node_utils/cmd_ref/vrf.yaml +88 -0
  75. data/lib/cisco_node_utils/cmd_ref/vtp.yaml +38 -0
  76. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +60 -0
  77. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +39 -0
  78. data/lib/cisco_node_utils/cmd_ref/yum.yaml +13 -0
  79. data/lib/cisco_node_utils/command_reference.rb +359 -187
  80. data/lib/cisco_node_utils/configparser_lib.rb +1 -1
  81. data/lib/cisco_node_utils/dns_domain.rb +19 -5
  82. data/lib/cisco_node_utils/domain_name.rb +4 -8
  83. data/lib/cisco_node_utils/evpn_vni.rb +157 -0
  84. data/lib/cisco_node_utils/fabricpath_global.rb +388 -0
  85. data/lib/cisco_node_utils/fabricpath_topology.rb +150 -0
  86. data/lib/cisco_node_utils/feature.rb +111 -0
  87. data/lib/cisco_node_utils/interface.rb +390 -97
  88. data/lib/cisco_node_utils/interface_channel_group.rb +124 -0
  89. data/lib/cisco_node_utils/interface_ospf.rb +11 -34
  90. data/lib/cisco_node_utils/interface_portchannel.rb +157 -0
  91. data/lib/cisco_node_utils/interface_service_vni.rb +132 -0
  92. data/lib/cisco_node_utils/name_server.rb +1 -1
  93. data/lib/cisco_node_utils/node.rb +55 -249
  94. data/lib/cisco_node_utils/node_util.rb +5 -1
  95. data/lib/cisco_node_utils/ntp_config.rb +2 -2
  96. data/lib/cisco_node_utils/ntp_server.rb +14 -5
  97. data/lib/cisco_node_utils/overlay_global.rb +153 -0
  98. data/lib/cisco_node_utils/pim.rb +124 -0
  99. data/lib/cisco_node_utils/pim_group_list.rb +108 -0
  100. data/lib/cisco_node_utils/pim_rp_address.rb +102 -0
  101. data/lib/cisco_node_utils/platform.rb +8 -9
  102. data/lib/cisco_node_utils/portchannel_global.rb +277 -0
  103. data/lib/cisco_node_utils/radius_global.rb +9 -19
  104. data/lib/cisco_node_utils/radius_server.rb +31 -41
  105. data/lib/cisco_node_utils/radius_server_group.rb +117 -0
  106. data/lib/cisco_node_utils/router_ospf.rb +1 -1
  107. data/lib/cisco_node_utils/router_ospf_vrf.rb +14 -19
  108. data/lib/cisco_node_utils/snmp_notification_receiver.rb +158 -0
  109. data/lib/cisco_node_utils/snmpcommunity.rb +3 -5
  110. data/lib/cisco_node_utils/snmpgroup.rb +1 -1
  111. data/lib/cisco_node_utils/snmpnotification.rb +57 -0
  112. data/lib/cisco_node_utils/snmpserver.rb +8 -17
  113. data/lib/cisco_node_utils/snmpuser.rb +67 -28
  114. data/lib/cisco_node_utils/syslog_server.rb +3 -9
  115. data/lib/cisco_node_utils/syslog_settings.rb +2 -10
  116. data/lib/cisco_node_utils/tacacs_server.rb +9 -14
  117. data/lib/cisco_node_utils/tacacs_server_group.rb +145 -0
  118. data/lib/cisco_node_utils/tacacs_server_host.rb +5 -9
  119. data/lib/cisco_node_utils/vdc.rb +88 -0
  120. data/lib/cisco_node_utils/version.rb +5 -2
  121. data/lib/cisco_node_utils/vlan.rb +71 -8
  122. data/lib/cisco_node_utils/vni.rb +227 -0
  123. data/lib/cisco_node_utils/vpc.rb +377 -0
  124. data/lib/cisco_node_utils/vrf.rb +60 -9
  125. data/lib/cisco_node_utils/vrf_af.rb +191 -0
  126. data/lib/cisco_node_utils/vtp.rb +8 -6
  127. data/lib/cisco_node_utils/vxlan_vtep.rb +151 -0
  128. data/lib/cisco_node_utils/vxlan_vtep_vni.rb +234 -0
  129. data/lib/cisco_node_utils/yum.rb +1 -1
  130. data/tests/.rubocop.yml +1 -1
  131. data/tests/basetest.rb +16 -7
  132. data/tests/ciscotest.rb +55 -13
  133. data/tests/cmd_config.yaml +2 -2
  134. data/tests/platform_info.rb +3 -2
  135. data/tests/test_aaa_authentication_login.rb +219 -0
  136. data/tests/test_aaa_authentication_login_service.rb +759 -0
  137. data/tests/test_aaa_authorization_service.rb +1041 -0
  138. data/tests/test_ace.rb +160 -0
  139. data/tests/test_acl.rb +176 -0
  140. data/tests/test_bgp_af.rb +269 -13
  141. data/tests/test_bgp_neighbor.rb +38 -40
  142. data/tests/test_bgp_neighbor_af.rb +92 -32
  143. data/tests/test_command_config.rb +5 -5
  144. data/tests/test_command_reference.rb +284 -101
  145. data/tests/test_dns_domain.rb +1 -1
  146. data/tests/test_domain_name.rb +1 -1
  147. data/tests/test_evpn_vni.rb +106 -0
  148. data/tests/test_fabricpath_global.rb +243 -0
  149. data/tests/test_fabricpath_topology.rb +98 -0
  150. data/tests/test_interface.rb +292 -74
  151. data/tests/test_interface_channel_group.rb +74 -0
  152. data/tests/test_interface_ospf.rb +9 -4
  153. data/tests/test_interface_portchannel.rb +105 -0
  154. data/tests/test_interface_service_vni.rb +232 -0
  155. data/tests/test_interface_svi.rb +77 -62
  156. data/tests/test_interface_switchport.rb +17 -5
  157. data/tests/test_name_server.rb +1 -1
  158. data/tests/test_node.rb +1 -1
  159. data/tests/test_node_ext.rb +10 -20
  160. data/tests/test_ntp_config.rb +1 -1
  161. data/tests/test_ntp_server.rb +18 -6
  162. data/tests/test_overlay_global.rb +102 -0
  163. data/tests/test_pim.rb +177 -0
  164. data/tests/test_pim_group_list.rb +181 -0
  165. data/tests/test_pim_rp_address.rb +153 -0
  166. data/tests/test_platform.rb +3 -3
  167. data/tests/test_portchannel_global.rb +202 -0
  168. data/tests/test_radius_global.rb +1 -1
  169. data/tests/test_radius_server.rb +92 -57
  170. data/tests/test_radius_server_group.rb +149 -0
  171. data/tests/test_router_bgp.rb +283 -112
  172. data/tests/test_router_ospf.rb +2 -2
  173. data/tests/test_router_ospf_vrf.rb +4 -4
  174. data/tests/test_snmp_notification_receiver.rb +167 -0
  175. data/tests/test_snmpcommunity.rb +1 -1
  176. data/tests/test_snmpgroup.rb +1 -1
  177. data/tests/test_snmpnotification.rb +72 -0
  178. data/tests/test_snmpserver.rb +29 -105
  179. data/tests/test_snmpuser.rb +32 -30
  180. data/tests/test_syslog_server.rb +36 -10
  181. data/tests/test_syslog_settings.rb +1 -1
  182. data/tests/test_tacacs_server.rb +1 -1
  183. data/tests/test_tacacs_server_group.rb +405 -0
  184. data/tests/test_tacacs_server_host.rb +1 -1
  185. data/tests/test_vdc.rb +78 -0
  186. data/tests/test_vlan.rb +74 -19
  187. data/tests/test_vlan_mt_full.rb +95 -0
  188. data/tests/test_vni.rb +106 -0
  189. data/tests/test_vpc.rb +361 -0
  190. data/tests/test_vrf.rb +172 -29
  191. data/tests/test_vtp.rb +1 -1
  192. data/tests/test_vxlan_vtep.rb +214 -0
  193. data/tests/test_vxlan_vtep_vni.rb +201 -0
  194. data/tests/test_yum.rb +1 -1
  195. metadata +120 -11
  196. data/lib/cisco_node_utils/README_YAML.md +0 -325
  197. data/lib/cisco_node_utils/command_reference_common.yaml +0 -1051
  198. data/lib/cisco_node_utils/command_reference_common_bgp.yaml +0 -535
  199. data/lib/cisco_node_utils/command_reference_n3064.yaml +0 -13
  200. data/lib/cisco_node_utils/command_reference_n7k.yaml +0 -52
  201. data/lib/cisco_node_utils/command_reference_n9k.yaml +0 -26
  202. data/tests/platform_info.yaml +0 -10
@@ -0,0 +1,124 @@
1
+ # January 2016, Chris Van Heuveln
2
+ #
3
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'node_util'
18
+
19
+ # Add some interface-specific constants to the Cisco namespace
20
+ module Cisco
21
+ # Interface - node utility class for general interface config management
22
+ class InterfaceChannelGroup < NodeUtil
23
+ attr_reader :name
24
+
25
+ def initialize(name)
26
+ validate_args(name)
27
+ end
28
+
29
+ def self.interfaces
30
+ hash = {}
31
+ all = config_get('interface_channel_group', 'all_interfaces')
32
+ return hash if all.nil?
33
+
34
+ all.each do |id|
35
+ id = id.downcase
36
+ hash[id] = InterfaceChannelGroup.new(id)
37
+ end
38
+ hash
39
+ end
40
+
41
+ def validate_args(name)
42
+ fail TypeError unless name.is_a?(String)
43
+ fail ArgumentError unless name.length > 0
44
+ fail "channel_group is not supported on #{name}" unless
45
+ name[/Ethernet/i]
46
+ @name = name.downcase
47
+ set_args_keys
48
+ end
49
+
50
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
51
+ @get_args = { name: @name }
52
+ @set_args = @get_args.merge!(hash) unless hash.empty?
53
+ end
54
+
55
+ def fail_cli(e)
56
+ fail "[#{@name}] '#{e.command}' : #{e.clierror}"
57
+ end
58
+
59
+ ########################################################
60
+ # PROPERTIES #
61
+ ########################################################
62
+
63
+ def channel_group
64
+ config_get('interface_channel_group', 'channel_group', @get_args)
65
+ end
66
+
67
+ def channel_group=(group)
68
+ # 'force' is needed by cli_nxos to handle the case where a port-channel
69
+ # interface is created prior to the channel-group cli; in which case
70
+ # the properties of the port-channel interface will be different from
71
+ # the ethernet interface. 'force' is not needed if the port-channel is
72
+ # created as a result of the channel-group cli but since it does no
73
+ # harm we will use it every time.
74
+ if group
75
+ state = ''
76
+ force = 'force'
77
+ else
78
+ state = 'no'
79
+ group = force = ''
80
+ end
81
+ config_set('interface_channel_group', 'channel_group',
82
+ set_args_keys(state: state, group: group, force: force))
83
+ rescue Cisco::CliError => e
84
+ fail_cli(e)
85
+ end
86
+
87
+ def default_channel_group
88
+ config_get_default('interface_channel_group', 'channel_group')
89
+ end
90
+
91
+ # ----------------------------
92
+ def description
93
+ config_get('interface_channel_group', 'description', @get_args)
94
+ end
95
+
96
+ def description=(desc)
97
+ state = desc.strip.empty? ? 'no' : ''
98
+ config_set('interface_channel_group', 'description',
99
+ set_args_keys(state: state, desc: desc))
100
+ rescue Cisco::CliError => e
101
+ fail_cli(e)
102
+ end
103
+
104
+ def default_description
105
+ config_get_default('interface_channel_group', 'description')
106
+ end
107
+
108
+ # ----------------------------
109
+ def shutdown
110
+ config_get('interface_channel_group', 'shutdown', @get_args)
111
+ end
112
+
113
+ def shutdown=(state)
114
+ config_set('interface_channel_group', 'shutdown',
115
+ set_args_keys(state: state ? '' : 'no'))
116
+ rescue Cisco::CliError => e
117
+ fail_cli(e)
118
+ end
119
+
120
+ def default_shutdown
121
+ config_get_default('interface_channel_group', 'shutdown')
122
+ end
123
+ end # Class
124
+ end # Module
@@ -1,6 +1,6 @@
1
1
  # March 2015, Alex Hunsberger
2
2
  #
3
- # Copyright (c) 2015 Cisco and/or its affiliates.
3
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
4
4
  #
5
5
  # Licensed under the Apache License, Version 2.0 (the "License");
6
6
  # you may not use this file except in compliance with the License.
@@ -59,8 +59,6 @@ module Cisco
59
59
  intf_list.each do |name|
60
60
  match = config_get('interface_ospf', 'area', name)
61
61
  next if match.nil?
62
- # should only be a single match under a given interface
63
- match = match.first
64
62
  # ip router ospf <name> area <area>
65
63
  ospf = match[0]
66
64
  area = match[1]
@@ -74,7 +72,7 @@ module Cisco
74
72
  def area
75
73
  match = config_get('interface_ospf', 'area', @interface.name)
76
74
  return nil if match.nil?
77
- val = match[0][1]
75
+ val = match[1]
78
76
  # Coerce numeric area to the expected dot-decimal format.
79
77
  val = IPAddr.new(val.to_i, Socket::AF_INET).to_s unless val.match(/\./)
80
78
  val
@@ -103,8 +101,7 @@ module Cisco
103
101
  end
104
102
 
105
103
  def message_digest
106
- !config_get('interface_ospf', 'message_digest',
107
- @interface.name).nil?
104
+ config_get('interface_ospf', 'message_digest', @interface.name)
108
105
  end
109
106
 
110
107
  # interface %s
@@ -119,10 +116,7 @@ module Cisco
119
116
  end
120
117
 
121
118
  def message_digest_key_id
122
- match = config_get('interface_ospf', 'message_digest_key_id',
123
- @interface.name)
124
- # regex in yaml returns an array result, use .first to get match
125
- match.nil? ? default_message_digest_key_id : match.first.to_i
119
+ config_get('interface_ospf', 'message_digest_key_id', @interface.name)
126
120
  end
127
121
 
128
122
  def default_message_digest_algorithm_type
@@ -133,8 +127,7 @@ module Cisco
133
127
  def message_digest_algorithm_type
134
128
  match = config_get('interface_ospf', 'message_digest_alg_type',
135
129
  @interface.name)
136
- # regex in yaml returns an array result, use .first to get match
137
- match.nil? ? default_message_digest_algorithm_type : match.first.to_sym
130
+ match.to_sym
138
131
  end
139
132
 
140
133
  def default_message_digest_encryption_type
@@ -145,18 +138,11 @@ module Cisco
145
138
  def message_digest_encryption_type
146
139
  match = config_get('interface_ospf', 'message_digest_enc_type',
147
140
  @interface.name)
148
- # regex in yaml returns an array result, use .first to get match
149
- if match.nil?
150
- default_message_digest_encryption_type
151
- else
152
- Encryption.cli_to_symbol(match.first)
153
- end
141
+ Encryption.cli_to_symbol(match)
154
142
  end
155
143
 
156
144
  def message_digest_password
157
- match = config_get('interface_ospf', 'message_digest_password',
158
- @interface.name)
159
- match.nil? ? nil : match.first
145
+ config_get('interface_ospf', 'message_digest_password', @interface.name)
160
146
  end
161
147
 
162
148
  # interface %s
@@ -177,9 +163,7 @@ module Cisco
177
163
  end
178
164
 
179
165
  def cost
180
- match = config_get('interface_ospf', 'cost', @interface.name)
181
- # regex in yaml returns an array result, use .first to get match
182
- match.nil? ? default_cost : match.first.to_i
166
+ config_get('interface_ospf', 'cost', @interface.name)
183
167
  end
184
168
 
185
169
  def default_cost
@@ -197,10 +181,7 @@ module Cisco
197
181
  end
198
182
 
199
183
  def hello_interval
200
- match = config_get('interface_ospf', 'hello_interval',
201
- @interface.name)
202
- # regex in yaml returns an array result, use .first to get match
203
- match.nil? ? default_hello_interval : match.first.to_i
184
+ config_get('interface_ospf', 'hello_interval', @interface.name)
204
185
  end
205
186
 
206
187
  def default_hello_interval
@@ -215,10 +196,7 @@ module Cisco
215
196
  end
216
197
 
217
198
  def dead_interval
218
- match = config_get('interface_ospf', 'dead_interval',
219
- @interface.name)
220
- # regex in yaml returns an array result, use .first to get match
221
- match.nil? ? default_dead_interval : match.first.to_i
199
+ config_get('interface_ospf', 'dead_interval', @interface.name)
222
200
  end
223
201
 
224
202
  def default_dead_interval
@@ -237,8 +215,7 @@ module Cisco
237
215
  end
238
216
 
239
217
  def passive_interface
240
- !config_get('interface_ospf', 'passive_interface',
241
- @interface.name).nil?
218
+ config_get('interface_ospf', 'passive_interface', @interface.name)
242
219
  end
243
220
 
244
221
  # interface %s
@@ -0,0 +1,157 @@
1
+ # December 2015, Sai Chintalapudi
2
+ #
3
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'node_util'
18
+ require_relative 'interface'
19
+
20
+ # Add some interface-specific constants to the Cisco namespace
21
+ module Cisco
22
+ # InterfacePortChannel - node utility class for port channel config management
23
+ class InterfacePortChannel < NodeUtil
24
+ attr_reader :name
25
+
26
+ def initialize(name, instantiate=true)
27
+ fail TypeError unless name.is_a?(String)
28
+ fail ArgumentError unless name.length > 0
29
+ @name = name.downcase
30
+ fail ArgumentError unless @name.start_with?('port-channel')
31
+
32
+ create if instantiate
33
+ end
34
+
35
+ def self.interfaces
36
+ hash = {}
37
+ intf_list = config_get('interface', 'all_interfaces')
38
+ return hash if intf_list.nil?
39
+
40
+ intf_list.each do |id|
41
+ id = id.downcase
42
+ next unless id.start_with?('port-channel')
43
+ hash[id] = InterfacePortChannel.new(id, false)
44
+ end
45
+ hash
46
+ end
47
+
48
+ def create
49
+ config_set('interface_portchannel', 'create', @name)
50
+ end
51
+
52
+ def destroy
53
+ config_set('interface_portchannel', 'destroy', @name)
54
+ end
55
+
56
+ ########################################################
57
+ # PROPERTIES #
58
+ ########################################################
59
+
60
+ def lacp_graceful_convergence
61
+ config_get('interface_portchannel', 'lacp_graceful_convergence', @name)
62
+ end
63
+
64
+ def lacp_graceful_convergence=(state)
65
+ no_cmd = (state ? '' : 'no')
66
+ config_set('interface_portchannel',
67
+ 'lacp_graceful_convergence', @name, no_cmd)
68
+ rescue Cisco::CliError => e
69
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
70
+ end
71
+
72
+ def default_lacp_graceful_convergence
73
+ config_get_default('interface_portchannel', 'lacp_graceful_convergence')
74
+ end
75
+
76
+ def lacp_max_bundle
77
+ config_get('interface_portchannel', 'lacp_max_bundle', @name)
78
+ end
79
+
80
+ def lacp_max_bundle=(val)
81
+ config_set('interface_portchannel', 'lacp_max_bundle', @name, val)
82
+ rescue Cisco::CliError => e
83
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
84
+ end
85
+
86
+ def default_lacp_max_bundle
87
+ config_get_default('interface_portchannel', 'lacp_max_bundle')
88
+ end
89
+
90
+ def lacp_min_links
91
+ config_get('interface_portchannel', 'lacp_min_links', @name)
92
+ end
93
+
94
+ def lacp_min_links=(val)
95
+ config_set('interface_portchannel', 'lacp_min_links', @name, val)
96
+ rescue Cisco::CliError => e
97
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
98
+ end
99
+
100
+ def default_lacp_min_links
101
+ config_get_default('interface_portchannel', 'lacp_min_links')
102
+ end
103
+
104
+ def lacp_suspend_individual
105
+ config_get('interface_portchannel', 'lacp_suspend_individual', @name)
106
+ end
107
+
108
+ def lacp_suspend_individual=(state)
109
+ no_cmd = (state ? '' : 'no')
110
+ config_set('interface_portchannel',
111
+ 'lacp_suspend_individual', @name, no_cmd)
112
+ rescue Cisco::CliError => e
113
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
114
+ end
115
+
116
+ def default_lacp_suspend_individual
117
+ config_get_default('interface_portchannel', 'lacp_suspend_individual')
118
+ end
119
+
120
+ def port_hash_distribution
121
+ config_get('interface_portchannel', 'port_hash_distribution', @name)
122
+ end
123
+
124
+ def port_hash_distribution=(val)
125
+ if val
126
+ state = ''
127
+ else
128
+ state = 'no'
129
+ val = ''
130
+ end
131
+ config_set('interface_portchannel',
132
+ 'port_hash_distribution', @name, state, val)
133
+ rescue Cisco::CliError => e
134
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
135
+ end
136
+
137
+ def default_port_hash_distribution
138
+ config_get_default('interface_portchannel', 'port_hash_distribution')
139
+ end
140
+
141
+ def port_load_defer
142
+ config_get('interface_portchannel', 'port_load_defer', @name)
143
+ end
144
+
145
+ def port_load_defer=(state)
146
+ no_cmd = (state ? '' : 'no')
147
+ config_set('interface_portchannel',
148
+ 'port_load_defer', @name, no_cmd)
149
+ rescue Cisco::CliError => e
150
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
151
+ end
152
+
153
+ def default_port_load_defer
154
+ config_get_default('interface_portchannel', 'port_load_defer')
155
+ end
156
+ end # Class
157
+ end # Module
@@ -0,0 +1,132 @@
1
+ # December 2015, Chris Van Heuveln
2
+ #
3
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
4
+ #
5
+ # Licensed under the Apache License, Version 2.0 (the "License");
6
+ # you may not use this file except in compliance with the License.
7
+ # You may obtain a copy of the License at
8
+ #
9
+ # http://www.apache.org/licenses/LICENSE-2.0
10
+ #
11
+ # Unless required by applicable law or agreed to in writing, software
12
+ # distributed under the License is distributed on an "AS IS" BASIS,
13
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ # See the License for the specific language governing permissions and
15
+ # limitations under the License.
16
+
17
+ require_relative 'node_util'
18
+ require_relative 'vni'
19
+
20
+ module Cisco
21
+ # InterfaceServiceVni - node utility class for Service VNI Instance commands
22
+ class InterfaceServiceVni < NodeUtil
23
+ attr_reader :name
24
+
25
+ def initialize(intf, sid, instantiate=true)
26
+ @name = intf.to_s.downcase
27
+ @sid = sid.to_s
28
+ fail ArgumentError if @name.empty? || @sid.empty?
29
+ set_args_keys_default
30
+ create if instantiate
31
+ end
32
+
33
+ def self.svc_vni_ids
34
+ hash = {}
35
+ intf_list = config_get('interface', 'all_interfaces')
36
+ return hash if intf_list.nil?
37
+
38
+ intf_list.each do |intf|
39
+ intf.downcase!
40
+ svc_ids = config_get('interface_service_vni', 'all_service_vni_ids',
41
+ name: intf)
42
+ next if svc_ids.nil?
43
+ hash[intf] = {}
44
+ svc_ids.each do |sid|
45
+ hash[intf][sid] = InterfaceServiceVni.new(intf, sid, false)
46
+ end
47
+ end
48
+ hash
49
+ end
50
+
51
+ def create
52
+ Vni.feature_vni_enable unless Vni.feature_vni_enabled
53
+ @set_args[:state] = ''
54
+ config_set('interface_service_vni', 'create_destroy', @set_args)
55
+ end
56
+
57
+ def destroy
58
+ @set_args[:state] = 'no'
59
+ config_set('interface_service_vni', 'create_destroy', @set_args)
60
+ end
61
+
62
+ def set_args_keys_default
63
+ keys = { name: @name, sid: @sid }
64
+ @get_args = @set_args = keys
65
+ end
66
+
67
+ # rubocop:disable Style/AccessorMethodName
68
+ def set_args_keys(hash={})
69
+ set_args_keys_default
70
+ @set_args = @get_args.merge!(hash) unless hash.empty?
71
+ end
72
+ # rubocop:enable Style/AccessorMethodNamefor
73
+
74
+ ########################################################
75
+ # PROPERTIES #
76
+ ########################################################
77
+
78
+ #
79
+ # encapsulation_profile_vni
80
+ #
81
+ # cli: service instance 1 vni
82
+ # encapsulation profile vni_500_5000 default
83
+ # type: 'vni_500_5000'
84
+ def encapsulation_profile_vni
85
+ config_get('interface_service_vni', 'encapsulation_profile_vni',
86
+ @get_args)
87
+ end
88
+
89
+ def encapsulation_profile_vni=(profile)
90
+ Vni.feature_vni_enable unless Vni.feature_vni_enabled
91
+ state = profile.empty? ? 'no' : ''
92
+ current = encapsulation_profile_vni
93
+
94
+ if state[/no/]
95
+ config_set('interface_service_vni', 'encapsulation_profile_vni',
96
+ set_args_keys(state: state, profile: current)) unless
97
+ current.empty?
98
+ else
99
+ # Remove current profile before adding a new one
100
+ config_set('interface_service_vni', 'encapsulation_profile_vni',
101
+ set_args_keys(state: 'no', profile: current)) unless
102
+ current.empty?
103
+ config_set('interface_service_vni', 'encapsulation_profile_vni',
104
+ set_args_keys(state: state, profile: profile))
105
+ end
106
+ rescue Cisco::CliError => e
107
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
108
+ end
109
+
110
+ def default_encapsulation_profile_vni
111
+ config_get_default('interface_service_vni', 'encapsulation_profile_vni')
112
+ end
113
+
114
+ #
115
+ # shutdown
116
+ #
117
+ def shutdown
118
+ config_get('interface_service_vni', 'shutdown', @get_args)
119
+ end
120
+
121
+ def shutdown=(state)
122
+ config_set('interface_service_vni', 'shutdown',
123
+ set_args_keys(state: state ? '' : 'no'))
124
+ rescue Cisco::CliError => e
125
+ raise "[#{@name}] '#{e.command}' : #{e.clierror}"
126
+ end
127
+
128
+ def default_shutdown
129
+ config_get_default('interface_service_vni', 'shutdown')
130
+ end
131
+ end # Class
132
+ end # Module