Class: Cisco::Node

Inherits:
Object
  • Object
show all
Defined in:
lib/cisco_node_utils/node.rb

Overview

class Cisco::Node Singleton representing the network node (switch/router) that is running this code. The singleton is lazily instantiated, meaning that it doesn’t exist until some client requests it (with Node.instance())

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeNode

Returns a new instance of Node.



158
159
160
161
162
163
164
165
# File 'lib/cisco_node_utils/node.rb', line 158

def initialize
  @client = Cisco::Client.create
  @cmd_ref = nil
  @cmd_ref = CommandReference.new(product:      product_id,
                                  platform:     @client.platform,
                                  data_formats: @client.data_formats)
  cache_flush
end

Instance Attribute Details

#clientObject (readonly)

Here and below are implementation details and private APIs that most providers shouldn’t need to know about or use.



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

def client
  @client
end

#cmd_refObject (readonly)

Here and below are implementation details and private APIs that most providers shouldn’t need to know about or use.



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

def cmd_ref
  @cmd_ref
end

Class Method Details

.instanceObject



154
155
156
# File 'lib/cisco_node_utils/node.rb', line 154

def self.instance
  @instance ||= new
end

Instance Method Details

#bootString

Returns such as “bootflash:///n3000-uk9-kickstart.6.0.2.U5.0.941.bin”.

Returns:

  • (String)

    such as “bootflash:///n3000-uk9-kickstart.6.0.2.U5.0.941.bin”



295
296
297
# File 'lib/cisco_node_utils/node.rb', line 295

def boot
  config_get('show_version', 'boot_image')
end

#cache_auto=(enable) ⇒ Object



187
188
189
# File 'lib/cisco_node_utils/node.rb', line 187

def cache_auto=(enable)
  @client.cache_auto = enable
end

#cache_auto?Boolean

Returns:

  • (Boolean)


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

def cache_auto?
  @client.cache_auto?
end

#cache_enable=(enable) ⇒ Object



179
180
181
# File 'lib/cisco_node_utils/node.rb', line 179

def cache_enable=(enable)
  @client.cache_enable = enable
end

#cache_enable?Boolean

Returns:

  • (Boolean)


175
176
177
# File 'lib/cisco_node_utils/node.rb', line 175

def cache_enable?
  @client.cache_enable?
end

#cache_flushObject

Clear the cache of CLI output results.

If cache_auto is true (default) then this will be performed automatically whenever a config_set() is called, but providers may also call this to explicitly force the cache to be cleared.



145
146
147
# File 'lib/cisco_node_utils/node.rb', line 145

def cache_flush
  @client.cache_flush
end

#config_get(feature, property, *args) ⇒ String, ...

Convenience wrapper for get() Uses CommandReference to look up the given show command and key of interest, executes that command, and returns the value corresponding to that key.

Examples:

config_get(“show_version”, “system_image”)

config_get(“ospf”, “router_id”,

{name: "green", vrf: "one"})

Parameters:

  • feature (String)
  • name (String)

Returns:

  • (String, Hash, Array)

Raises:

  • (IndexError)

    if the given (feature, name) pair is not in the CommandReference data or if the data doesn’t have values defined for the ‘get_command’ and (optional) ‘get_value’ fields.

  • (Cisco::UnsupportedError)

    if the (feature, name) pair is flagged in the YAML as unsupported on this device.

  • (Cisco::RequestFailed)

    if the command is rejected by the device.



53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/cisco_node_utils/node.rb', line 53

def config_get(feature, property, *args)
  ref = @cmd_ref.lookup(feature, property)

  # If we have a default value but no getter, just return the default
  return ref.default_value if ref.default_value? && !ref.getter?

  get_args = ref.getter(*args)
  massage(get(command:     ref.get_command,
              data_format: get_args[:data_format],
              context:     get_args[:context],
              value:       get_args[:value]),
          ref)
end

#config_get_default(feature, property) ⇒ String?

Uses CommandReference to lookup the default value for a given feature and feature property.

Examples:

config_get_default(“vtp”, “file”)

Parameters:

  • feature (String)
  • name (String)

Returns:

  • (String)
  • (nil)

    if this feature/name pair is marked as unsupported

Raises:

  • (IndexError)

    if the given (feature, name) pair is not in the CommandReference data or if the data doesn’t have values defined for the ‘default_value’ field.



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

def config_get_default(feature, property)
  ref = @cmd_ref.lookup(feature, property)
  ref.default_value
end

#config_set(feature, property, *args) ⇒ Object

Uses CommandReference to look up the given config command(s) of interest and then applies the configuration.

Examples:

config_set(“vtp”, “domain”, “example.com”)

config_set(“ospf”, “router_id”,

{:name => "green", :vrf => "one", :state => "",
 :router_id => "192.0.0.1"})

Parameters:

  • feature (String)
  • name (String)
  • args (*String)

    zero or more args to be substituted into the cmdref.

Raises:

  • (IndexError)

    if no relevant cmd_ref config_set exists

  • (ArgumentError)

    if too many or too few args are provided.

  • (Cisco::UnsupportedError)

    if this feature/name is unsupported

  • (Cisco::RequestFailed)

    if any command is rejected by the device.



134
135
136
137
138
# File 'lib/cisco_node_utils/node.rb', line 134

def config_set(feature, property, *args)
  ref = @cmd_ref.lookup(feature, property)
  set_args = ref.setter(*args)
  set(**set_args)
end

#domain_nameString

Returns such as “example.com”.

Returns:

  • (String)

    such as “example.com”



261
262
263
# File 'lib/cisco_node_utils/node.rb', line 261

def domain_name
  config_get('dnsclient', 'domain_name')
end

#get(**kwargs) ⇒ Object

Send a show command to the device. In general, clients should use config_get() rather than calling this function directly.

Raises:



205
206
207
# File 'lib/cisco_node_utils/node.rb', line 205

def get(**kwargs)
  @client.get(**kwargs)
end

#host_nameString

Returns such as “bxb-oa-n3k-7”.

Returns:

  • (String)

    such as “bxb-oa-n3k-7”



256
257
258
# File 'lib/cisco_node_utils/node.rb', line 256

def host_name
  config_get('show_version', 'host_name')
end

#inspectObject



171
172
173
# File 'lib/cisco_node_utils/node.rb', line 171

def inspect
  "Node: client:'#{client.inspect}' cmd_ref:'#{cmd_ref.inspect}'"
end

#last_reset_reasonString

Returns such as “Reset Requested by CLI command reload”.

Returns:

  • (String)

    such as “Reset Requested by CLI command reload”



282
283
284
# File 'lib/cisco_node_utils/node.rb', line 282

def last_reset_reason
  config_get('show_version', 'last_reset_reason')
end

#last_reset_timeString

Returns timestamp of last reset time.

Returns:

  • (String)

    timestamp of last reset time



277
278
279
# File 'lib/cisco_node_utils/node.rb', line 277

def last_reset_time
  config_get('show_version', 'last_reset_time')
end

#massage(value, ref) ⇒ Object

Attempt to massage the given value into the format specified by the given CmdRef object.



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
# File 'lib/cisco_node_utils/node.rb', line 69

def massage(value, ref)
  Cisco::Logger.debug "Massaging '#{value}' (#{value.inspect})"
  if value.is_a?(Array) && !ref.multiple
    fail "Expected zero/one value but got '#{value}'" if value.length > 1
    value = value[0]
  end
  if (value.nil? || value.empty?) && ref.default_value? && ref.auto_default
    Cisco::Logger.debug "Default: #{ref.default_value}"
    return ref.default_value
  end
  return value unless ref.kind
  case ref.kind
  when :boolean
    if value.nil? || value.empty?
      value = false
    elsif /^no / =~ value
      value = false
    elsif /disable$/ =~ value
      value = false
    else
      value = true
    end
  when :int
    value = value.to_i unless value.nil?
  when :string
    value = '' if value.nil?
    value = value.to_s.strip
  when :symbol
    value = value.to_sym unless value.nil?
  end
  Cisco::Logger.debug "Massaged to '#{value}'"
  value
end

#osString

Returns such as “Cisco Nexus Operating System (NX-OS) Software”.

Returns:

  • (String)

    such as “Cisco Nexus Operating System (NX-OS) Software”



210
211
212
213
214
# File 'lib/cisco_node_utils/node.rb', line 210

def os
  o = config_get('show_version', 'header')
  fail 'failed to retrieve operating system information' if o.nil?
  o.split("\n")[0]
end

#os_versionString

Returns such as “6.0(2)U5(1) [build 6.0(2)U5(0.941)]”.

Returns:

  • (String)

    such as “6.0(2)U5(1) [build 6.0(2)U5(0.941)]”



217
218
219
# File 'lib/cisco_node_utils/node.rb', line 217

def os_version
  config_get('show_version', 'version')
end

#product_descriptionString

Returns such as “Nexus 3048 Chassis”.

Returns:

  • (String)

    such as “Nexus 3048 Chassis”



222
223
224
# File 'lib/cisco_node_utils/node.rb', line 222

def product_description
  config_get('show_version', 'description')
end

#product_idString

Returns such as “N3K-C3048TP-1GE”.

Returns:

  • (String)

    such as “N3K-C3048TP-1GE”



227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
# File 'lib/cisco_node_utils/node.rb', line 227

def product_id
  if @cmd_ref
    return config_get('inventory', 'productid')
  else
    # We use this function to *find* the appropriate CommandReference
    if @client.platform == :nexus
      entries = get(command:     'show inventory',
                    data_format: :nxapi_structured)
      return entries['TABLE_inv']['ROW_inv'][0]['productid']
    elsif @client.platform == :ios_xr
      # No support for structured output for this command yet
      output = get(command:     'show inventory',
                   data_format: :cli)
      return /NAME: "Rack 0".*\nPID: (\S+)/.match(output)[1]
    end
  end
end

#product_serial_numberString

Returns such as “FOC1722R0ET”.

Returns:

  • (String)

    such as “FOC1722R0ET”



251
252
253
# File 'lib/cisco_node_utils/node.rb', line 251

def product_serial_number
  config_get('inventory', 'serialnum')
end

#product_version_idString

Returns such as “V01”.

Returns:

  • (String)

    such as “V01”



246
247
248
# File 'lib/cisco_node_utils/node.rb', line 246

def product_version_id
  config_get('inventory', 'versionid')
end

#set(**kwargs) ⇒ Object

Send a config command to the device. In general, clients should use config_set() rather than calling this function directly.

Raises:



196
197
198
# File 'lib/cisco_node_utils/node.rb', line 196

def set(**kwargs)
  @client.set(**kwargs)
end

#systemString

Returns such as “bootflash:///n3000-uk9.6.0.2.U5.0.941.bin”.

Returns:

  • (String)

    such as “bootflash:///n3000-uk9.6.0.2.U5.0.941.bin”



301
302
303
# File 'lib/cisco_node_utils/node.rb', line 301

def system
  config_get('show_version', 'system_image')
end

#system_cpu_utilizationFloat

Returns combined user/kernel CPU utilization.

Returns:

  • (Float)

    combined user/kernel CPU utilization



287
288
289
290
291
# File 'lib/cisco_node_utils/node.rb', line 287

def system_cpu_utilization
  output = config_get('system', 'resources')
  return output if output.nil?
  output['cpu_state_user'].to_f + output['cpu_state_kernel'].to_f
end

#system_uptimeInteger

Returns System uptime, in seconds.

Returns:

  • (Integer)

    System uptime, in seconds



266
267
268
269
270
271
272
273
274
# File 'lib/cisco_node_utils/node.rb', line 266

def system_uptime
  cache_flush
  t = config_get('show_system', 'uptime')
  fail 'failed to retrieve system uptime' if t.nil?
  # time units: t = ["0", "23", "15", "49"]
  t.map!(&:to_i)
  d, h, m, s = t
  (s + 60 * (m + 60 * (h + 24 * (d))))
end

#to_sObject



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

def to_s
  client.to_s
end