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,153 @@
1
+ # VXLAN global provider class
2
+ # Provides configuration of anycast gateways and duplicate host IP and
3
+ # mac detection
4
+ #
5
+ # Alok Aggarwal, October 2015
6
+ #
7
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
8
+ #
9
+ # Licensed under the Apache License, Version 2.0 (the "License");
10
+ # you may not use this file except in compliance with the License.
11
+ # You may obtain a copy of the License at
12
+ #
13
+ # http://www.apache.org/licenses/LICENSE-2.0
14
+ #
15
+ # Unless required by applicable law or agreed to in writing, software
16
+ # distributed under the License is distributed on an "AS IS" BASIS,
17
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18
+ # See the License for the specific language governing permissions and
19
+ # limitations under the License.
20
+
21
+ require_relative 'cisco_cmn_utils'
22
+ require_relative 'feature'
23
+ require_relative 'node_util'
24
+
25
+ module Cisco
26
+ # node_utils class for overlay_global
27
+ class OverlayGlobal < NodeUtil
28
+ # ----------
29
+ # PROPERTIES
30
+ # ----------
31
+
32
+ # dup-host-ip-addr-detection
33
+ def dup_host_ip_addr_detection
34
+ return nil unless Feature.nv_overlay_evpn_enabled?
35
+ match = config_get('overlay_global', 'dup_host_ip_addr_detection')
36
+ if match.nil?
37
+ default_dup_host_ip_addr_detection
38
+ else
39
+ match.collect(&:to_i)
40
+ end
41
+ end
42
+
43
+ def dup_host_ip_addr_detection_host_moves
44
+ host_moves, _timeout = dup_host_ip_addr_detection
45
+ host_moves
46
+ end
47
+
48
+ def dup_host_ip_addr_detection_timeout
49
+ _host_moves, timeout = dup_host_ip_addr_detection
50
+ timeout
51
+ end
52
+
53
+ def dup_host_ip_addr_detection_set(host_moves, timeout)
54
+ Feature.nv_overlay_evpn_enable
55
+ if host_moves == default_dup_host_ip_addr_detection_host_moves &&
56
+ timeout == default_dup_host_ip_addr_detection_timeout
57
+ state = 'no'
58
+ else
59
+ state = ''
60
+ end
61
+ set_args = { state: state, host_moves: host_moves, timeout: timeout }
62
+ config_set('overlay_global', 'dup_host_ip_addr_detection', set_args)
63
+ end
64
+
65
+ def default_dup_host_ip_addr_detection
66
+ [default_dup_host_ip_addr_detection_host_moves,
67
+ default_dup_host_ip_addr_detection_timeout]
68
+ end
69
+
70
+ def default_dup_host_ip_addr_detection_host_moves
71
+ config_get_default('overlay_global',
72
+ 'dup_host_ip_addr_detection_host_moves')
73
+ end
74
+
75
+ def default_dup_host_ip_addr_detection_timeout
76
+ config_get_default('overlay_global', 'dup_host_ip_addr_detection_timeout')
77
+ end
78
+
79
+ # dup-host-mac-detection
80
+ def dup_host_mac_detection
81
+ match = config_get('overlay_global', 'dup_host_mac_detection')
82
+ if match.nil?
83
+ default_dup_host_mac_detection
84
+ else
85
+ match.collect(&:to_i)
86
+ end
87
+ end
88
+
89
+ def dup_host_mac_detection_host_moves
90
+ host_moves, _timeout = dup_host_mac_detection
91
+ host_moves
92
+ end
93
+
94
+ def dup_host_mac_detection_timeout
95
+ _host_moves, timeout = dup_host_mac_detection
96
+ timeout
97
+ end
98
+
99
+ def dup_host_mac_detection_set(host_moves, timeout)
100
+ set_args = { host_moves: host_moves, timeout: timeout }
101
+ if host_moves == default_dup_host_mac_detection_host_moves &&
102
+ timeout == default_dup_host_mac_detection_timeout
103
+ dup_host_mac_detection_default
104
+ else
105
+ config_set('overlay_global', 'dup_host_mac_detection', set_args)
106
+ end
107
+ end
108
+
109
+ def dup_host_mac_detection_default
110
+ config_set('overlay_global', 'dup_host_mac_detection_default')
111
+ end
112
+
113
+ def default_dup_host_mac_detection
114
+ [default_dup_host_mac_detection_host_moves,
115
+ default_dup_host_mac_detection_timeout]
116
+ end
117
+
118
+ def default_dup_host_mac_detection_host_moves
119
+ config_get_default('overlay_global', 'dup_host_mac_detection_host_moves')
120
+ end
121
+
122
+ def default_dup_host_mac_detection_timeout
123
+ config_get_default('overlay_global', 'dup_host_mac_detection_timeout')
124
+ end
125
+
126
+ # anycast-gateway-mac
127
+ def anycast_gateway_mac
128
+ return nil unless Feature.nv_overlay_evpn_enabled?
129
+ mac = config_get('overlay_global', 'anycast_gateway_mac')
130
+ # This value gets 0-padded when nvgened, so we need to convert it.
131
+ Utils.zero_pad_macaddr(mac).nil? ? default_anycast_gateway_mac : mac
132
+ end
133
+
134
+ def anycast_gateway_mac=(mac_addr)
135
+ fail TypeError unless mac_addr.is_a?(String)
136
+
137
+ Feature.nv_overlay_evpn_enable
138
+ Feature.fabric_forwarding_enable
139
+ if mac_addr == default_anycast_gateway_mac
140
+ state = 'no'
141
+ mac_addr = ''
142
+ else
143
+ state = ''
144
+ end
145
+ config_set('overlay_global', 'anycast_gateway_mac',
146
+ state: state, mac_addr: mac_addr)
147
+ end
148
+
149
+ def default_anycast_gateway_mac
150
+ config_get_default('overlay_global', 'anycast_gateway_mac')
151
+ end
152
+ end # class
153
+ end # module
@@ -0,0 +1,124 @@
1
+ #
2
+ # NXAPI implementation of PIM class
3
+ #
4
+ # Smitha Gopalan, November 2015
5
+ #
6
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
7
+ #
8
+ # Licensed under the Apache License, Version 2.0 (the "License");
9
+ # you may not use this file except in compliance with the License.
10
+ # You may obtain a copy of the License at
11
+ #
12
+ # http://www.apache.org/licenses/LICENSE-2.0
13
+ #
14
+ # Unless required by applicable law or agreed to in writing, software
15
+ # distributed under the License is distributed on an "AS IS" BASIS,
16
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
17
+ # See the License for the specific language governing permissions and
18
+ # limitations under the License.
19
+
20
+ require_relative 'node_util'
21
+
22
+ module Cisco
23
+ # node_utils class for Pim
24
+ class Pim < NodeUtil
25
+ attr_reader :vrf, :afi
26
+
27
+ # Constructor with vrf
28
+ # ---------------------
29
+ def initialize(afi, vrf, instantiate=true)
30
+ fail ArgumentError unless vrf.is_a?(String) || vrf.length > 0
31
+ @vrf = vrf
32
+ @afi = Pim.afi_cli(afi)
33
+ set_args_keys_default
34
+
35
+ Pim.feature_enable if instantiate
36
+ end
37
+
38
+ def self.feature_enabled
39
+ config_get('pim', 'feature')
40
+ rescue Cisco::CliError => e
41
+ # cmd will syntax reject when feature is not enabled
42
+ raise unless e.clierror =~ /Syntax error/
43
+ return false
44
+ end
45
+
46
+ def self.feature_enable
47
+ config_set('pim', 'feature')
48
+ end
49
+
50
+ # self.pims returns a hash of all current pim objects.
51
+ # There will be one object for each vrf. This method has slightly different
52
+ # behavior than most of the other "get all objects" methods because the
53
+ # pim properties are standalone and do not reside in a "pim" container;
54
+ # therefore, this method simply returns a pim object for each vrf
55
+ # regardless of whether there are any specific pim properties currently
56
+ # defined for the context.
57
+ def self.pims
58
+ afis = %w(ipv4) # TBD: No support for ipv6 at this time
59
+ hash_final = {}
60
+ afis.each do |afi|
61
+ hash_final[afi] = {}
62
+ default_vrf = 'default'
63
+ hash_final[afi][default_vrf] = Pim.new(afi, default_vrf, false)
64
+
65
+ # Now the vrf's
66
+ vrf_ids = config_get('vrf', 'all_vrfs')
67
+ vrf_ids.delete_if { |vrf_id| vrf_id == 'management' }
68
+ vrf_ids.each do |vrf|
69
+ hash_final[afi][vrf] = Pim.new(afi, vrf, false)
70
+ end
71
+ end
72
+ hash_final
73
+ rescue Cisco::CliError => e
74
+ # cmd will syntax reject when feature is not enabled
75
+ raise unless e.clierror =~ /Syntax error/
76
+ return {}
77
+ end
78
+
79
+ def self.afi_cli(afi)
80
+ # Add ipv6 support later
81
+ fail ArgumentError, "Argument afi must be 'ipv4'" unless
82
+ afi[/(ipv4)/]
83
+ afi[/ipv4/] ? 'ip' : afi
84
+ end
85
+
86
+ def set_args_keys_default
87
+ keys = { afi: @afi }
88
+ keys[:vrf] = @vrf unless @vrf == 'default'
89
+ @get_args = @set_args = keys
90
+ end
91
+
92
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
93
+ set_args_keys_default
94
+ @set_args = @get_args.merge!(hash) unless hash.empty?
95
+ end
96
+
97
+ # This destroy method is different than most because pim does not have a
98
+ # "container" for properties, they simply exist in a given vrf context.
99
+ # For that reason destroy needs to explicitly set each property
100
+ # to its default state.
101
+ def destroy
102
+ self.ssm_range = ''
103
+ end
104
+
105
+ #-----------
106
+ # Properties
107
+ #-----------
108
+ def ssm_range
109
+ config_get('pim', 'ssm_range', @get_args)
110
+ end
111
+
112
+ def ssm_range=(range)
113
+ if range.empty?
114
+ state = 'no'
115
+ range = ssm_range
116
+ return if range.nil?
117
+ else
118
+ state = ''
119
+ end
120
+ set_args_keys(state: state, ssm_range: range)
121
+ config_set('pim', 'ssm_range', @set_args)
122
+ end
123
+ end # Class
124
+ end # Module
@@ -0,0 +1,108 @@
1
+ # NXAPI implementation of the PimGroupList class
2
+ #
3
+ # Smitha Gopalan, November 2015
4
+ #
5
+ # Copyright (c) 2014-2016 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'node_util'
20
+ require_relative 'pim'
21
+
22
+ module Cisco
23
+ # node_utils class for pim grouplist
24
+ class PimGroupList < NodeUtil
25
+ attr_reader :afi, :rp_addr, :group, :vrf
26
+
27
+ # Constructor with grouplist and vrf
28
+ # ----------------------------------
29
+ def initialize(afi, vrf, rp_addr, group, instantiate=true)
30
+ fail ArgumentError unless vrf.is_a?(String) || vrf.length > 0
31
+ @afi = Pim.afi_cli(afi)
32
+ @rp_addr = rp_addr
33
+ @group = group
34
+ @vrf = vrf
35
+ set_args_keys_default
36
+
37
+ create if instantiate
38
+ end
39
+
40
+ # Create a hash of [afi][vrf][rp-addr,grouplist]
41
+ # --------------------------------------------------
42
+ def self.group_lists
43
+ afis = %w(ipv4) # TBD ipv6
44
+ hash = {}
45
+ afis.each do |afi|
46
+ hash[afi] = {}
47
+ default_vrf = 'default'
48
+ get_args = { afi: Pim.afi_cli(afi) }
49
+ rp_addrs = config_get('pim', 'all_group_lists', get_args)
50
+ unless rp_addrs.nil?
51
+ rp_addrs.each do |addr_and_group|
52
+ addr, group = addr_and_group
53
+ hash[afi][default_vrf] ||= {}
54
+ hash[afi][default_vrf][addr_and_group] =
55
+ PimGroupList.new(afi, default_vrf, addr, group, false)
56
+ end
57
+ end
58
+ vrf_ids = config_get('vrf', 'all_vrfs')
59
+ vrf_ids.each do |vrf|
60
+ get_args = { vrf: vrf, afi: Pim.afi_cli(afi) }
61
+ rp_addrs = config_get('pim', 'all_group_lists', get_args)
62
+ next if rp_addrs.nil?
63
+ rp_addrs.each do |addr_and_group|
64
+ hash[afi][vrf] ||= {}
65
+ addr, group = addr_and_group
66
+ hash[afi][vrf][addr_and_group] =
67
+ PimGroupList.new(afi, vrf, addr, group, false)
68
+ end
69
+ end
70
+ end
71
+ hash
72
+ rescue Cisco::CliError => e
73
+ # cmd will syntax reject when feature is not enabled
74
+ raise unless e.clierror =~ /Syntax error/
75
+ return {}
76
+ end
77
+
78
+ # set_args_keys_default
79
+ # ---------------------
80
+ def set_args_keys_default
81
+ keys = { afi: @afi, addr: @rp_addr, group: @group }
82
+ keys[:vrf] = @vrf unless @vrf == 'default'
83
+ @get_args = @set_args = keys
84
+ end
85
+
86
+ # set_args_key
87
+ # -------------
88
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
89
+ set_args_keys_default
90
+ @set_args = @get_args.merge!(hash) unless hash.empty?
91
+ end
92
+
93
+ # Create pim grouplist instance
94
+ # ---------------------------------
95
+ def create
96
+ Pim.feature_enable unless Pim.feature_enabled
97
+ set_args_keys(state: '')
98
+ config_set('pim', 'group_list', @set_args)
99
+ end
100
+
101
+ # Destroy pim grouplist instance
102
+ # ----------------------------------
103
+ def destroy
104
+ set_args_keys(state: 'no')
105
+ config_set('pim', 'group_list', @set_args)
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,102 @@
1
+ # NXAPI implementation of the PimRpAddress class
2
+ #
3
+ # Smitha Gopalan, November 2015
4
+ #
5
+ # Copyright (c) 2015-2016 Cisco and/or its affiliates.
6
+ #
7
+ # Licensed under the Apache License, Version 2.0 (the "License");
8
+ # you may not use this file except in compliance with the License.
9
+ # You may obtain a copy of the License at
10
+ #
11
+ # http://www.apache.org/licenses/LICENSE-2.0
12
+ #
13
+ # Unless required by applicable law or agreed to in writing, software
14
+ # distributed under the License is distributed on an "AS IS" BASIS,
15
+ # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ # See the License for the specific language governing permissions and
17
+ # limitations under the License.
18
+
19
+ require_relative 'node_util'
20
+ require_relative 'pim'
21
+
22
+ module Cisco
23
+ # node_utils class for pim_rp_address
24
+ class PimRpAddress < NodeUtil
25
+ attr_reader :afi, :rp_addr, :vrf
26
+
27
+ # Constructor with afi, rp_address and vrf
28
+ # -----------------------------------------
29
+ def initialize(afi, vrf, rp_addr, instantiate=true)
30
+ fail ArgumentError unless vrf.is_a?(String) || vrf.length > 0
31
+ @afi = Pim.afi_cli(afi)
32
+ @rp_addr = rp_addr
33
+ @vrf = vrf
34
+ create if instantiate
35
+ end
36
+
37
+ # Create a hash of [afi][vrf][rp_address]
38
+ # ------------------------------------------------
39
+ def self.rp_addresses
40
+ afis = %w(ipv4) # TBD ipv6
41
+ hash = {}
42
+ afis.each do |afi|
43
+ hash[afi] = {}
44
+ default_vrf = 'default'
45
+ get_args = { afi: Pim.afi_cli(afi) }
46
+ rp_addrs = config_get('pim', 'all_rp_addresses', get_args)
47
+ unless rp_addrs.nil?
48
+ rp_addrs.each do |addr|
49
+ hash[afi][default_vrf] ||= {}
50
+ hash[afi][default_vrf][addr] =
51
+ PimRpAddress.new(afi, default_vrf, addr, false)
52
+ end
53
+ end
54
+ vrf_ids = config_get('vrf', 'all_vrfs')
55
+ vrf_ids.each do |vrf|
56
+ get_args = { afi: Pim.afi_cli(afi), vrf: vrf }
57
+ rp_addrs = config_get('pim', 'all_rp_addresses', get_args)
58
+ next if rp_addrs.nil?
59
+ rp_addrs.each do |addr|
60
+ hash[afi][vrf] ||= {}
61
+ hash[afi][vrf][addr] = PimRpAddress.new(afi, vrf, addr, false)
62
+ end
63
+ end
64
+ end
65
+ hash
66
+ rescue Cisco::CliError => e
67
+ # cmd will syntax reject when feature is not enabled
68
+ raise unless e.clierror =~ /Syntax error/
69
+ return {}
70
+ end
71
+
72
+ # set_args_keys_default
73
+ # ----------------------
74
+ def set_args_keys_default
75
+ keys = { afi: @afi, addr: @rp_addr }
76
+ keys[:vrf] = @vrf unless @vrf == 'default'
77
+ @get_args = @set_args = keys
78
+ end
79
+
80
+ # set_args_key
81
+ # -------------
82
+ def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
83
+ set_args_keys_default
84
+ @set_args = @get_args.merge!(hash) unless hash.empty?
85
+ end
86
+
87
+ # Create pim rp_addr instance
88
+ # ------------------------------
89
+ def create
90
+ Pim.feature_enable unless Pim.feature_enabled
91
+ set_args_keys(state: '')
92
+ config_set('pim', 'rp_address', @set_args)
93
+ end
94
+
95
+ # Destroy pim rp_addr instance
96
+ # ------------------------------
97
+ def destroy
98
+ set_args_keys(state: 'no')
99
+ config_set('pim', 'rp_address', @set_args)
100
+ end
101
+ end
102
+ end