Class: Cisco::VrfAF

Inherits:
NodeUtil show all
Defined in:
lib/cisco_node_utils/vrf_af.rb

Overview

VrfAF - node utility class for VRF Address-Family configuration

Class Method Summary collapse

Instance Method Summary collapse

Methods inherited from NodeUtil

client, #client, config_get, #config_get, #config_get_default, config_get_default, config_set, #config_set, #get, #ios_xr?, #nexus?, #node, node, platform, #platform, supports?, #supports?

Constructor Details

#initialize(vrf, af, instantiate = true) ⇒ VrfAF

Returns a new instance of VrfAF.



26
27
28
29
# File 'lib/cisco_node_utils/vrf_af.rb', line 26

def initialize(vrf, af, instantiate=true)
  validate_args(vrf, af)
  create if instantiate
end

Class Method Details

.afsObject



35
36
37
38
39
40
41
42
43
44
45
46
47
48
# File 'lib/cisco_node_utils/vrf_af.rb', line 35

def self.afs
  hash = {}
  vrfs = config_get('vrf', 'all_vrfs')
  vrfs.each do |vrf|
    hash[vrf] = {}
    afs = config_get('vrf_af', 'all_afs', vrf: vrf)

    next if afs.nil?
    afs.each do |af|
      hash[vrf][af] = VrfAF.new(vrf, af, false)
    end
  end
  hash
end

Instance Method Details

#createObject



50
51
52
# File 'lib/cisco_node_utils/vrf_af.rb', line 50

def create
  config_set('vrf', 'address_family', set_args_keys(state: ''))
end

#default_route_policy_exportObject



111
112
113
# File 'lib/cisco_node_utils/vrf_af.rb', line 111

def default_route_policy_export
  config_get_default('vrf_af', 'route_policy_export')
end

#default_route_policy_importObject



132
133
134
# File 'lib/cisco_node_utils/vrf_af.rb', line 132

def default_route_policy_import
  config_get_default('vrf_af', 'route_policy_import')
end

#default_route_target_both_autoObject



147
148
149
# File 'lib/cisco_node_utils/vrf_af.rb', line 147

def default_route_target_both_auto
  config_get_default('vrf_af', 'route_target_both_auto')
end

#default_route_target_both_auto_evpnObject



162
163
164
# File 'lib/cisco_node_utils/vrf_af.rb', line 162

def default_route_target_both_auto_evpn
  config_get_default('vrf_af', 'route_target_both_auto_evpn')
end

#default_route_target_exportObject



177
178
179
# File 'lib/cisco_node_utils/vrf_af.rb', line 177

def default_route_target_export
  config_get_default('vrf_af', 'route_target_export')
end

#default_route_target_export_evpnObject



193
194
195
# File 'lib/cisco_node_utils/vrf_af.rb', line 193

def default_route_target_export_evpn
  config_get_default('vrf_af', 'route_target_export_evpn')
end

#default_route_target_export_stitchingObject



208
209
210
# File 'lib/cisco_node_utils/vrf_af.rb', line 208

def default_route_target_export_stitching
  config_get_default('vrf_af', 'route_target_export_stitching')
end

#default_route_target_importObject



223
224
225
# File 'lib/cisco_node_utils/vrf_af.rb', line 223

def default_route_target_import
  config_get_default('vrf_af', 'route_target_import')
end

#default_route_target_import_evpnObject



239
240
241
# File 'lib/cisco_node_utils/vrf_af.rb', line 239

def default_route_target_import_evpn
  config_get_default('vrf_af', 'route_target_import_evpn')
end

#default_route_target_import_stitchingObject



254
255
256
# File 'lib/cisco_node_utils/vrf_af.rb', line 254

def default_route_target_import_stitching
  config_get_default('vrf_af', 'route_target_import_stitching')
end

#destroyObject



54
55
56
# File 'lib/cisco_node_utils/vrf_af.rb', line 54

def destroy
  config_set('vrf', 'address_family', set_args_keys(state: 'no'))
end

#route_policy_exportObject

PROPERTIES #



94
95
96
# File 'lib/cisco_node_utils/vrf_af.rb', line 94

def route_policy_export
  config_get('vrf_af', 'route_policy_export', @get_args)
end

#route_policy_export=(name) ⇒ Object



98
99
100
101
102
103
104
105
106
107
108
109
# File 'lib/cisco_node_utils/vrf_af.rb', line 98

def route_policy_export=(name)
  Feature.bgp_enable if platform == :nexus
  # Nexus requires passing in <policy_name> in "no export map" command.
  if name
    set_args_keys(state: '', policy_name: name)
  else
    remove_name = config_get('vrf_af', 'route_policy_export', @get_args)
    return nil if remove_name.nil?
    set_args_keys(state: 'no', policy_name: remove_name)
  end
  config_set('vrf_af', 'route_policy_export', @set_args)
end

#route_policy_importObject



115
116
117
# File 'lib/cisco_node_utils/vrf_af.rb', line 115

def route_policy_import
  config_get('vrf_af', 'route_policy_import', @get_args)
end

#route_policy_import=(name) ⇒ Object



119
120
121
122
123
124
125
126
127
128
129
130
# File 'lib/cisco_node_utils/vrf_af.rb', line 119

def route_policy_import=(name)
  Feature.bgp_enable if platform == :nexus
  # Nexus requires passing in <policy_name> in "no import map" command.
  if name
    set_args_keys(state: '', policy_name: name)
  else
    remove_name = config_get('vrf_af', 'route_policy_import', @get_args)
    return nil if remove_name.nil?
    set_args_keys(state: 'no', policy_name: remove_name)
  end
  config_set('vrf_af', 'route_policy_import', @set_args)
end

#route_target_both_autoObject




137
138
139
# File 'lib/cisco_node_utils/vrf_af.rb', line 137

def route_target_both_auto
  config_get('vrf_af', 'route_target_both_auto', @get_args)
end

#route_target_both_auto=(state) ⇒ Object



141
142
143
144
145
# File 'lib/cisco_node_utils/vrf_af.rb', line 141

def route_target_both_auto=(state)
  route_target_feature_enable(:require_nv_overlay)
  set_args_keys(state: (state ? '' : 'no'))
  config_set('vrf_af', 'route_target_both_auto', @set_args)
end

#route_target_both_auto_evpnObject




152
153
154
# File 'lib/cisco_node_utils/vrf_af.rb', line 152

def route_target_both_auto_evpn
  config_get('vrf_af', 'route_target_both_auto_evpn', @get_args)
end

#route_target_both_auto_evpn=(state) ⇒ Object



156
157
158
159
160
# File 'lib/cisco_node_utils/vrf_af.rb', line 156

def route_target_both_auto_evpn=(state)
  route_target_feature_enable(:require_nv_overlay)
  set_args_keys(state: (state ? '' : 'no'))
  config_set('vrf_af', 'route_target_both_auto_evpn', @set_args)
end

#route_target_delta(should, is, prop) ⇒ Object


route_target_delta is a common helper function for the route_target properties. It walks the delta hash and adds/removes each target cli.



261
262
263
264
265
266
267
268
269
270
271
272
273
274
# File 'lib/cisco_node_utils/vrf_af.rb', line 261

def route_target_delta(should, is, prop)
  fail Cisco::UnsupportedError.new('vrf_af', prop) if is.nil?
  delta_hash = Utils.delta_add_remove(should, is)
  return if delta_hash.values.flatten.empty?
  [:add, :remove].each do |action|
    Cisco::Logger.debug("#{prop}" \
      "#{@get_args}\n #{action}: #{delta_hash[action]}")
    delta_hash[action].each do |community|
      state = (action == :add) ? '' : 'no'
      set_args_keys(state: state, community: community)
      config_set('vrf_af', prop, @set_args)
    end
  end
end

#route_target_exportObject




167
168
169
170
# File 'lib/cisco_node_utils/vrf_af.rb', line 167

def route_target_export
  cmds = config_get('vrf_af', 'route_target_export', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_export=(should) ⇒ Object



172
173
174
175
# File 'lib/cisco_node_utils/vrf_af.rb', line 172

def route_target_export=(should)
  route_target_feature_enable
  route_target_delta(should, route_target_export, 'route_target_export')
end

#route_target_export_evpnObject




182
183
184
185
# File 'lib/cisco_node_utils/vrf_af.rb', line 182

def route_target_export_evpn
  cmds = config_get('vrf_af', 'route_target_export_evpn', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_export_evpn=(should) ⇒ Object



187
188
189
190
191
# File 'lib/cisco_node_utils/vrf_af.rb', line 187

def route_target_export_evpn=(should)
  route_target_feature_enable(:require_nv_overlay)
  route_target_delta(should, route_target_export_evpn,
                     'route_target_export_evpn')
end

#route_target_export_stitchingObject




198
199
200
201
# File 'lib/cisco_node_utils/vrf_af.rb', line 198

def route_target_export_stitching
  cmds = config_get('vrf_af', 'route_target_export_stitching', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_export_stitching=(should) ⇒ Object



203
204
205
206
# File 'lib/cisco_node_utils/vrf_af.rb', line 203

def route_target_export_stitching=(should)
  route_target_delta(should, route_target_export_stitching,
                     'route_target_export_stitching')
end

#route_target_feature_enable(require_nv_overlay = nil) ⇒ Object



78
79
80
81
82
83
84
85
86
87
88
# File 'lib/cisco_node_utils/vrf_af.rb', line 78

def route_target_feature_enable(require_nv_overlay=nil)
  return unless platform == :nexus

  # All NX route-target properties require feature bgp
  Feature.bgp_enable

  # Some platforms/versions also require nv overlay for some properties
  return unless require_nv_overlay
  Feature.nv_overlay_enable if Feature.nv_overlay_supported?
  Feature.nv_overlay_evpn_enable if Feature.nv_overlay_evpn_supported?
end

#route_target_importObject




213
214
215
216
# File 'lib/cisco_node_utils/vrf_af.rb', line 213

def route_target_import
  cmds = config_get('vrf_af', 'route_target_import', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_import=(should) ⇒ Object



218
219
220
221
# File 'lib/cisco_node_utils/vrf_af.rb', line 218

def route_target_import=(should)
  route_target_feature_enable
  route_target_delta(should, route_target_import, 'route_target_import')
end

#route_target_import_evpnObject




228
229
230
231
232
# File 'lib/cisco_node_utils/vrf_af.rb', line 228

def route_target_import_evpn
  route_target_feature_enable(:require_nv_overlay)
  cmds = config_get('vrf_af', 'route_target_import_evpn', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_import_evpn=(should) ⇒ Object



234
235
236
237
# File 'lib/cisco_node_utils/vrf_af.rb', line 234

def route_target_import_evpn=(should)
  route_target_delta(should, route_target_import_evpn,
                     'route_target_import_evpn')
end

#route_target_import_stitchingObject




244
245
246
247
# File 'lib/cisco_node_utils/vrf_af.rb', line 244

def route_target_import_stitching
  cmds = config_get('vrf_af', 'route_target_import_stitching', @get_args)
  cmds.nil? ? nil : cmds.sort
end

#route_target_import_stitching=(should) ⇒ Object



249
250
251
252
# File 'lib/cisco_node_utils/vrf_af.rb', line 249

def route_target_import_stitching=(should)
  route_target_delta(should, route_target_import_stitching,
                     'route_target_import_stitching')
end

#set_args_keys(hash = {}) ⇒ Object

rubocop:disable Style/AccessorMethodName



73
74
75
76
# File 'lib/cisco_node_utils/vrf_af.rb', line 73

def set_args_keys(hash={}) # rubocop:disable Style/AccessorMethodName
  set_args_keys_default
  @set_args = @get_args.merge!(hash) unless hash.empty?
end

#set_args_keys_defaultObject



67
68
69
70
71
# File 'lib/cisco_node_utils/vrf_af.rb', line 67

def set_args_keys_default
  keys = { afi: @afi, safi: @safi }
  keys[:vrf] = @vrf unless @vrf == 'default'
  @get_args = @set_args = keys
end

#to_sObject



31
32
33
# File 'lib/cisco_node_utils/vrf_af.rb', line 31

def to_s
  "VRF #{@vrf} afi #{@afi} safi #{@safi}"
end

#validate_args(vrf, af) ⇒ Object



58
59
60
61
62
63
64
65
# File 'lib/cisco_node_utils/vrf_af.rb', line 58

def validate_args(vrf, af)
  fail ArgumentError unless vrf.is_a?(String) && (vrf.length > 0)
  fail ArgumentError, "'af' must be an array specifying afi and safi" unless
    af.is_a?(Array) || af.length == 2
  @vrf = vrf.downcase
  @afi, @safi = af
  set_args_keys_default
end