cisco_node_utils 1.6.0 → 1.7.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 (82) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +60 -1
  3. data/Gemfile +1 -1
  4. data/LICENSE +1 -1
  5. data/README.md +1 -1
  6. data/cisco_node_utils.gemspec +1 -1
  7. data/docs/README-develop-node-utils-APIs.md +2 -0
  8. data/docs/README-maintainers.md +45 -80
  9. data/lib/cisco_node_utils/ace.rb +24 -43
  10. data/lib/cisco_node_utils/bfd_global.rb +1 -0
  11. data/lib/cisco_node_utils/bgp_af_aggr_addr.rb +207 -0
  12. data/lib/cisco_node_utils/bgp_neighbor.rb +8 -5
  13. data/lib/cisco_node_utils/bgp_neighbor_af.rb +8 -6
  14. data/lib/cisco_node_utils/cisco_cmn_utils.rb +40 -0
  15. data/lib/cisco_node_utils/cmd_ref/bfd_global.yaml +1 -1
  16. data/lib/cisco_node_utils/cmd_ref/bgp.yaml +8 -4
  17. data/lib/cisco_node_utils/cmd_ref/bgp_af_aa.yaml +38 -0
  18. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor.yaml +9 -4
  19. data/lib/cisco_node_utils/cmd_ref/bgp_neighbor_af.yaml +8 -3
  20. data/lib/cisco_node_utils/cmd_ref/dhcp_relay_global.yaml +2 -1
  21. data/lib/cisco_node_utils/cmd_ref/feature.yaml +5 -0
  22. data/lib/cisco_node_utils/cmd_ref/interface.yaml +8 -0
  23. data/lib/cisco_node_utils/cmd_ref/interface_channel_group.yaml +7 -3
  24. data/lib/cisco_node_utils/cmd_ref/inventory.yaml +3 -3
  25. data/lib/cisco_node_utils/cmd_ref/ntp_auth_key.yaml +10 -0
  26. data/lib/cisco_node_utils/cmd_ref/ntp_config.yaml +13 -0
  27. data/lib/cisco_node_utils/cmd_ref/ntp_server.yaml +10 -2
  28. data/lib/cisco_node_utils/cmd_ref/overlay_global.yaml +6 -1
  29. data/lib/cisco_node_utils/cmd_ref/route_map.yaml +8 -0
  30. data/lib/cisco_node_utils/cmd_ref/span_session.yaml +65 -0
  31. data/lib/cisco_node_utils/cmd_ref/stp_global.yaml +2 -1
  32. data/lib/cisco_node_utils/cmd_ref/vpc.yaml +22 -3
  33. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep.yaml +2 -1
  34. data/lib/cisco_node_utils/cmd_ref/vxlan_vtep_vni.yaml +6 -3
  35. data/lib/cisco_node_utils/cmd_ref/yum.yaml +48 -4
  36. data/lib/cisco_node_utils/command_reference.rb +5 -2
  37. data/lib/cisco_node_utils/feature.rb +14 -1
  38. data/lib/cisco_node_utils/interface.rb +13 -0
  39. data/lib/cisco_node_utils/interface_channel_group.rb +33 -25
  40. data/lib/cisco_node_utils/itd_device_group.rb +17 -37
  41. data/lib/cisco_node_utils/itd_service.rb +9 -32
  42. data/lib/cisco_node_utils/node.rb +12 -4
  43. data/lib/cisco_node_utils/ntp_auth_key.rb +67 -0
  44. data/lib/cisco_node_utils/ntp_config.rb +19 -1
  45. data/lib/cisco_node_utils/ntp_server.rb +28 -27
  46. data/lib/cisco_node_utils/route_map.rb +33 -51
  47. data/lib/cisco_node_utils/snmpuser.rb +2 -2
  48. data/lib/cisco_node_utils/span_session.rb +149 -0
  49. data/lib/cisco_node_utils/upgrade.rb +21 -17
  50. data/lib/cisco_node_utils/version.rb +2 -2
  51. data/lib/cisco_node_utils/vlan.rb +1 -1
  52. data/lib/cisco_node_utils/vpc.rb +40 -0
  53. data/lib/cisco_node_utils/yum.rb +136 -13
  54. data/spec/schema.yaml +2 -0
  55. data/tests/ciscotest.rb +36 -0
  56. data/tests/test_ace.rb +6 -0
  57. data/tests/test_bfd_global.rb +1 -7
  58. data/tests/test_bgp_af.rb +2 -2
  59. data/tests/test_bgp_af_aa.rb +108 -0
  60. data/tests/test_bgp_neighbor.rb +2 -1
  61. data/tests/test_bgp_neighbor_af.rb +6 -6
  62. data/tests/test_dhcp_relay_global.rb +1 -0
  63. data/tests/test_interface.rb +18 -2
  64. data/tests/test_interface_channel_group.rb +47 -0
  65. data/tests/test_interface_svi.rb +1 -1
  66. data/tests/test_ntp_auth_key.rb +77 -0
  67. data/tests/test_ntp_config.rb +51 -4
  68. data/tests/test_ntp_server.rb +69 -9
  69. data/tests/test_overlay_global.rb +1 -0
  70. data/tests/test_route_map.rb +13 -24
  71. data/tests/test_router_bgp.rb +14 -9
  72. data/tests/test_span_session.rb +155 -0
  73. data/tests/test_stp_global.rb +1 -0
  74. data/tests/test_upgrade.rb +2 -3
  75. data/tests/test_vlan.rb +24 -3
  76. data/tests/test_vlan_private.rb +1 -1
  77. data/tests/test_vpc.rb +42 -17
  78. data/tests/test_vxlan_vtep.rb +1 -0
  79. data/tests/test_vxlan_vtep_vni.rb +5 -1
  80. data/tests/test_yum.rb +7 -30
  81. data/tests/yum_package.yaml +20 -0
  82. metadata +13 -3
@@ -453,31 +453,6 @@ module Cisco
453
453
  config_get_default('route_map', 'match_ipv4_route_src_prefix_list')
454
454
  end
455
455
 
456
- # extract value of property from match ip multicast
457
- def extract_value(type, prop, prefix=nil)
458
- prefix = prop if prefix.nil?
459
- match =
460
- type == 'ipv4' ? match_ipv4_multicast_get : match_ipv6_multicast_get
461
-
462
- # matching not found
463
- return nil if match.nil? # no matching found
464
-
465
- # property not defined for matching
466
- return nil unless match.names.include?(prop)
467
-
468
- # extract and return value that follows prefix + <space>
469
- regexp = Regexp.new("#{Regexp.escape(prefix)} (?<extracted>.*)")
470
- value_match = regexp.match(match[prop])
471
- return nil if value_match.nil?
472
- value_match[:extracted]
473
- end
474
-
475
- # prepend property name prefix/keyword to value
476
- def attach_prefix(val, prop, prefix=nil)
477
- prefix = prop.to_s if prefix.nil?
478
- @set_args[prop] = val.to_s.empty? ? val : "#{prefix} #{val}"
479
- end
480
-
481
456
  # match ip multicast source 242.1.1.1/32 group 239.2.2.2/32 rp 242.1.1.1/32
482
457
  # rp-type ASM
483
458
  # match ip multicast source 242.1.1.1/32 group-range
@@ -495,13 +470,13 @@ module Cisco
495
470
  end
496
471
 
497
472
  def match_ipv4_multicast_src_addr
498
- val = extract_value('ipv4', 'src', 'source')
473
+ val = Utils.extract_value(match_ipv4_multicast_get, 'src', 'source')
499
474
  return default_match_ipv4_multicast_src_addr if val.nil?
500
475
  val
501
476
  end
502
477
 
503
478
  def match_ipv4_multicast_src_addr=(src_addr)
504
- attach_prefix(src_addr, :source)
479
+ @set_args[:source] = Utils.attach_prefix(src_addr, :source)
505
480
  end
506
481
 
507
482
  def default_match_ipv4_multicast_src_addr
@@ -509,13 +484,13 @@ module Cisco
509
484
  end
510
485
 
511
486
  def match_ipv4_multicast_group_addr
512
- val = extract_value('ipv4', 'grp', 'group')
487
+ val = Utils.extract_value(match_ipv4_multicast_get, 'grp', 'group')
513
488
  return default_match_ipv4_multicast_group_addr if val.nil?
514
489
  val
515
490
  end
516
491
 
517
492
  def match_ipv4_multicast_group_addr=(grp_addr)
518
- attach_prefix(grp_addr, :group)
493
+ @set_args[:group] = Utils.attach_prefix(grp_addr, :group)
519
494
  end
520
495
 
521
496
  def default_match_ipv4_multicast_group_addr
@@ -523,13 +498,15 @@ module Cisco
523
498
  end
524
499
 
525
500
  def match_ipv4_multicast_group_range_begin_addr
526
- val = extract_value('ipv4', 'grp_range_start', 'group-range')
501
+ val = Utils.extract_value(match_ipv4_multicast_get,
502
+ 'grp_range_start', 'group-range')
527
503
  return default_match_ipv4_multicast_group_range_begin_addr if val.nil?
528
504
  val
529
505
  end
530
506
 
531
507
  def match_ipv4_multicast_group_range_begin_addr=(begin_addr)
532
- attach_prefix(begin_addr, :group_range, :'group-range')
508
+ @set_args[:group_range] =
509
+ Utils.attach_prefix(begin_addr, :group_range, :'group-range')
533
510
  end
534
511
 
535
512
  def default_match_ipv4_multicast_group_range_begin_addr
@@ -538,13 +515,13 @@ module Cisco
538
515
  end
539
516
 
540
517
  def match_ipv4_multicast_group_range_end_addr
541
- val = extract_value('ipv4', 'grp_range_end', 'to')
518
+ val = Utils.extract_value(match_ipv4_multicast_get, 'grp_range_end', 'to')
542
519
  return default_match_ipv4_multicast_group_range_end_addr if val.nil?
543
520
  val
544
521
  end
545
522
 
546
523
  def match_ipv4_multicast_group_range_end_addr=(end_addr)
547
- attach_prefix(end_addr, :to)
524
+ @set_args[:to] = Utils.attach_prefix(end_addr, :to)
548
525
  end
549
526
 
550
527
  def default_match_ipv4_multicast_group_range_end_addr
@@ -553,13 +530,13 @@ module Cisco
553
530
  end
554
531
 
555
532
  def match_ipv4_multicast_rp_addr
556
- val = extract_value('ipv4', 'rp')
533
+ val = Utils.extract_value(match_ipv4_multicast_get, 'rp')
557
534
  return default_match_ipv4_multicast_rp_addr if val.nil?
558
535
  val
559
536
  end
560
537
 
561
538
  def match_ipv4_multicast_rp_addr=(rp_addr)
562
- attach_prefix(rp_addr, :rp)
539
+ @set_args[:rp] = Utils.attach_prefix(rp_addr, :rp)
563
540
  end
564
541
 
565
542
  def default_match_ipv4_multicast_rp_addr
@@ -567,13 +544,13 @@ module Cisco
567
544
  end
568
545
 
569
546
  def match_ipv4_multicast_rp_type
570
- val = extract_value('ipv4', 'rp_type', 'rp-type')
547
+ val = Utils.extract_value(match_ipv4_multicast_get, 'rp_type', 'rp-type')
571
548
  return default_match_ipv4_multicast_rp_type if val.nil?
572
549
  val
573
550
  end
574
551
 
575
552
  def match_ipv4_multicast_rp_type=(type)
576
- attach_prefix(type, :rp_type, :'rp-type')
553
+ @set_args[:rp_type] = Utils.attach_prefix(type, :rp_type, :'rp-type')
577
554
  end
578
555
 
579
556
  def default_match_ipv4_multicast_rp_type
@@ -750,13 +727,13 @@ module Cisco
750
727
  end
751
728
 
752
729
  def match_ipv6_multicast_src_addr
753
- val = extract_value('ipv6', 'src', 'source')
730
+ val = Utils.extract_value(match_ipv6_multicast_get, 'src', 'source')
754
731
  return default_match_ipv6_multicast_src_addr if val.nil?
755
732
  val
756
733
  end
757
734
 
758
735
  def match_ipv6_multicast_src_addr=(src_addr)
759
- attach_prefix(src_addr, :source)
736
+ @set_args[:source] = Utils.attach_prefix(src_addr, :source)
760
737
  end
761
738
 
762
739
  def default_match_ipv6_multicast_src_addr
@@ -764,13 +741,13 @@ module Cisco
764
741
  end
765
742
 
766
743
  def match_ipv6_multicast_group_addr
767
- val = extract_value('ipv6', 'grp', 'group')
744
+ val = Utils.extract_value(match_ipv6_multicast_get, 'grp', 'group')
768
745
  return default_match_ipv6_multicast_group_addr if val.nil?
769
746
  val
770
747
  end
771
748
 
772
749
  def match_ipv6_multicast_group_addr=(grp_addr)
773
- attach_prefix(grp_addr, :group)
750
+ @set_args[:group] = Utils.attach_prefix(grp_addr, :group)
774
751
  end
775
752
 
776
753
  def default_match_ipv6_multicast_group_addr
@@ -778,13 +755,15 @@ module Cisco
778
755
  end
779
756
 
780
757
  def match_ipv6_multicast_group_range_begin_addr
781
- val = extract_value('ipv6', 'grp_range_start', 'group-range')
758
+ val = Utils.extract_value(match_ipv6_multicast_get,
759
+ 'grp_range_start', 'group-range')
782
760
  return default_match_ipv6_multicast_group_range_begin_addr if val.nil?
783
761
  val
784
762
  end
785
763
 
786
764
  def match_ipv6_multicast_group_range_begin_addr=(begin_addr)
787
- attach_prefix(begin_addr, :group_range, :'group-range')
765
+ @set_args[:group_range] =
766
+ Utils.attach_prefix(begin_addr, :group_range, :'group-range')
788
767
  end
789
768
 
790
769
  def default_match_ipv6_multicast_group_range_begin_addr
@@ -793,13 +772,13 @@ module Cisco
793
772
  end
794
773
 
795
774
  def match_ipv6_multicast_group_range_end_addr
796
- val = extract_value('ipv6', 'grp_range_end', 'to')
775
+ val = Utils.extract_value(match_ipv6_multicast_get, 'grp_range_end', 'to')
797
776
  return default_match_ipv6_multicast_group_range_end_addr if val.nil?
798
777
  val
799
778
  end
800
779
 
801
780
  def match_ipv6_multicast_group_range_end_addr=(end_addr)
802
- attach_prefix(end_addr, :to)
781
+ @set_args[:to] = Utils.attach_prefix(end_addr, :to)
803
782
  end
804
783
 
805
784
  def default_match_ipv6_multicast_group_range_end_addr
@@ -808,13 +787,13 @@ module Cisco
808
787
  end
809
788
 
810
789
  def match_ipv6_multicast_rp_addr
811
- val = extract_value('ipv6', 'rp')
790
+ val = Utils.extract_value(match_ipv6_multicast_get, 'rp')
812
791
  return default_match_ipv6_multicast_rp_addr if val.nil?
813
792
  val
814
793
  end
815
794
 
816
795
  def match_ipv6_multicast_rp_addr=(rp_addr)
817
- attach_prefix(rp_addr, :rp)
796
+ @set_args[:rp] = Utils.attach_prefix(rp_addr, :rp)
818
797
  end
819
798
 
820
799
  def default_match_ipv6_multicast_rp_addr
@@ -822,13 +801,13 @@ module Cisco
822
801
  end
823
802
 
824
803
  def match_ipv6_multicast_rp_type
825
- val = extract_value('ipv6', 'rp_type', 'rp-type')
804
+ val = Utils.extract_value(match_ipv6_multicast_get, 'rp_type', 'rp-type')
826
805
  return default_match_ipv6_multicast_rp_type if val.nil?
827
806
  val
828
807
  end
829
808
 
830
809
  def match_ipv6_multicast_rp_type=(type)
831
- attach_prefix(type, :rp_type, :'rp-type')
810
+ @set_args[:rp_type] = Utils.attach_prefix(type, :rp_type, :'rp-type')
832
811
  end
833
812
 
834
813
  def default_match_ipv6_multicast_rp_type
@@ -1596,14 +1575,17 @@ module Cisco
1596
1575
  end
1597
1576
 
1598
1577
  def set_metric_set(plus, bndw, del, reliability, eff_bw, mtu)
1599
- state = bndw ? '' : 'no'
1578
+ set_args_keys(state: 'no', additive: '', bw: '', delay: '',
1579
+ rel: '', eff: '', mtu: '')
1580
+ config_set('route_map', 'set_metric', @set_args)
1581
+ return unless bndw
1600
1582
  additive = plus ? '+' : ''
1601
1583
  bw = bndw ? bndw : ''
1602
1584
  delay = del ? del : ''
1603
1585
  rel = reliability ? reliability : ''
1604
1586
  eff = eff_bw ? eff_bw : ''
1605
1587
  lmtu = mtu ? mtu : ''
1606
- set_args_keys(state: state, additive: additive, bw: bw, delay: delay,
1588
+ set_args_keys(state: '', additive: additive, bw: bw, delay: delay,
1607
1589
  rel: rel, eff: eff, mtu: lmtu)
1608
1590
  config_set('route_map', 'set_metric', @set_args)
1609
1591
  end
@@ -241,7 +241,7 @@ module Cisco
241
241
  # Retrieve password hashes
242
242
  hashed_pw = SnmpUser.auth_password('dummy_user', @engine_id)
243
243
  if hashed_pw.nil?
244
- fail "SNMP dummy user #{dummy_user} #{@engine_id} was configured " \
244
+ fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
245
245
  "but password is missing?\n" \
246
246
  + @@node.get(command: 'show run snmp all')
247
247
  end
@@ -289,7 +289,7 @@ module Cisco
289
289
  dummyau = SnmpUser.auth_password('dummy_user', @engine_id)
290
290
  hashed_pw = SnmpUser.priv_password('dummy_user', @engine_id)
291
291
  if hashed_pw.nil?
292
- fail "SNMP dummy user #{dummy_user} #{@engine_id} was configured " \
292
+ fail "SNMP dummy user dummy_user #{@engine_id} was configured " \
293
293
  "but password is missing?\n" \
294
294
  + @@node.get(command: 'show run snmp all')
295
295
  end
@@ -0,0 +1,149 @@
1
+ # Insert appropriate license here
2
+ require_relative 'node_util'
3
+ require_relative 'interface'
4
+
5
+ module Cisco
6
+ # node utils class for SPAN (switchport analyzer) sessions
7
+ class SpanSession < NodeUtil
8
+ attr_reader :session_id
9
+
10
+ def initialize(session_id, instantiate=true)
11
+ validate_args(session_id.to_i)
12
+ create if instantiate
13
+ end
14
+
15
+ def self.sessions
16
+ hash = {}
17
+ all = config_get('span_session', 'all_sessions')
18
+ return hash if all.nil?
19
+
20
+ all.each do |id|
21
+ hash[id] = SpanSession.new(id, false)
22
+ end
23
+ hash
24
+ end
25
+
26
+ def validate_args(session_id)
27
+ fail TypeError unless session_id.is_a?(Integer)
28
+ @session_id = session_id
29
+ end
30
+
31
+ def create
32
+ config_set('span_session', 'create', id: @session_id)
33
+ end
34
+
35
+ def destroy
36
+ config_set('span_session', 'destroy', id: @session_id)
37
+ end
38
+
39
+ def description
40
+ config_get('span_session', 'description', id: @session_id)
41
+ end
42
+
43
+ def description=(val)
44
+ val = val.to_s
45
+ if val.empty?
46
+ config_set('span_session', 'description', id: @session_id,
47
+ state: 'no', description: '')
48
+ else
49
+ config_set('span_session', 'description', id: @session_id,
50
+ state: '', description: val)
51
+ end
52
+ end
53
+
54
+ def destination
55
+ config_get('span_session', 'destination', id: @session_id).downcase
56
+ end
57
+
58
+ def destination=(int)
59
+ # fail if int is not a valid interface
60
+ fail TypeError unless Interface.interfaces.key?(int.downcase)
61
+ config_set('span_session', 'destination', state: '', id: @session_id,
62
+ intf_name: int)
63
+ end
64
+
65
+ def session_id
66
+ config_get('span_session', 'session_id')
67
+ end
68
+
69
+ def session_id=(id)
70
+ fail TypeError unless id.is_a?(Integer)
71
+ config_set('span_session', 'session_id', id: id, state: '')
72
+ end
73
+
74
+ def shutdown
75
+ config_get('span_session', 'shutdown', id: @session_id)
76
+ end
77
+
78
+ def shutdown=(bool)
79
+ fail TypeError unless bool.is_a?(Boolean)
80
+ config_set('span_session', 'shutdown', id: @session_id, shutdown: bool)
81
+ end
82
+
83
+ def source_interfaces
84
+ ints = config_get('span_session', 'source_interfaces', id: @session_id)
85
+ intf = []
86
+ ints.each { |i| intf << i.map(&:downcase) }
87
+ intf
88
+ end
89
+
90
+ def source_interfaces=(sources)
91
+ fail TypeError unless sources.is_a?(Hash)
92
+ delta_hash = Utils.delta_add_remove(sources.to_a, source_interfaces.to_a,
93
+ :updates_not_allowed)
94
+ return if delta_hash.values.flatten.empty?
95
+ [:remove, :add].each do |action|
96
+ delta_hash[action].each do |name, dir|
97
+ state = (action == :add) ? '' : 'no'
98
+ config_set('span_session', 'source_interfaces', id: @session_id,
99
+ state: state, int_name: name, direction: dir)
100
+ end
101
+ end
102
+ end
103
+
104
+ def default_source_interfaces
105
+ config_get_default('span_session', 'source_interfaces')
106
+ end
107
+
108
+ def source_vlans
109
+ v = config_get('span_session', 'source_vlans', id: @session_id)
110
+ v.empty? ? v : [Utils.normalize_range_array(v[0]), v[1]]
111
+ end
112
+
113
+ def source_vlans=(sources)
114
+ fail TypeError unless sources.is_a?(Hash)
115
+ is = Utils.dash_range_to_elements(source_vlans[0]) unless
116
+ source_vlans.empty?
117
+ should = Utils.dash_range_to_elements(sources[:vlans])
118
+ direction = sources[:direction]
119
+ delta_hash = Utils.delta_add_remove(should, is)
120
+ [:add, :remove].each do |action|
121
+ delta_hash[action].each do |vlans|
122
+ state = (action == :add) ? '' : 'no'
123
+ config_set('span_session', 'source_vlans',
124
+ id: @session_id, state: state,
125
+ vlans: vlans, direction: direction)
126
+ end
127
+ end
128
+ end
129
+
130
+ def default_source_vlans
131
+ config_get_default('span_session', 'source_vlans')
132
+ end
133
+
134
+ def type
135
+ config_get('span_session', 'type', id: @session_id)
136
+ end
137
+
138
+ def type=(str)
139
+ valid_types = ['local', 'rspan', 'erspan-source']
140
+ fail TypeError unless valid_types.include?(str)
141
+ destroy # need to destroy session before changing type
142
+ if str.empty?
143
+ config_set('span_session', 'type', id: @session_id, type: 'local')
144
+ else
145
+ config_set('span_session', 'type', id: @session_id, type: str)
146
+ end
147
+ end
148
+ end # class
149
+ end # module
@@ -58,10 +58,23 @@ module Cisco
58
58
  if image && uri
59
59
  config_get('upgrade', 'image_version', image: image, uri: uri)
60
60
  else
61
- config_get('show_version', 'version').split(' ')[0]
61
+ version = config_get('show_version', 'version')
62
+ # show version displays version differently for release and
63
+ # development builds.
64
+ # Eg: release build
65
+ # NXOS: version 7.0(3)I4(2)
66
+ # Eg: development build
67
+ # NXOS: version 7.0(3)IFD6(1) [build 7.0(3)IGD7(0.65)]
68
+ return version unless version[/build\s+\S+/]
69
+ version.split(' ')[-1].split(']')[0]
62
70
  end
63
71
  end
64
72
 
73
+ # Return the nxos image installed on the device
74
+ def self.package
75
+ config_get('show_version', 'system_image')
76
+ end
77
+
65
78
  # Return true if box is online and config mode is ready to be used
66
79
  def self.box_online?
67
80
  output = config_set('upgrade', 'is_box_online')
@@ -85,32 +98,23 @@ module Cisco
85
98
  end
86
99
 
87
100
  # Attempts to upgrade the device to 'image'
88
- def self.upgrade(version, image, uri='bootflash:', del_boot=false,
101
+ def self.upgrade(image, uri='bootflash:', del_boot=false,
89
102
  force_all=false)
90
- # Only 'bootflash:' is a supported URI. Fail otherwise.
91
- fail "The Uri #{uri} is not supported" unless uri == 'bootflash:'
92
- # IMPORTANT - Check if version of image equals the version provided.
93
- # This is to avoid entering a loop with the Programmability Agent
94
- # continuously trying to reload the device if versions don't match.
95
- image_ver = image_version(image, uri)
96
- err_str = "Version Mismatch.\n
97
- The version of the image:#{image_ver}\n
98
- The version provided:#{version}\n
99
- Aborting upgrade."
100
- fail err_str unless image_ver.to_s.strip == version.to_s.strip
101
103
  delete_boot(uri) if del_boot
102
104
  force_all ? upgrade_str = 'upgrade_force' : upgrade_str = 'upgrade'
103
105
  begin
104
106
  Cisco::Logger.debug("Upgrading to version: #{image}")
105
107
  config_set('upgrade', upgrade_str, image: image, uri: uri)
106
- rescue Cisco::RequestFailed
108
+ rescue Cisco::RequestFailed, Cisco::CliError => e1
109
+ # raise if install command failed
110
+ raise e1 if e1.class == Cisco::CliError
107
111
  # Catch 'Backend Processing Error'. Install continues inspite of the
108
112
  # error thrown. Resend install command and expect a CliError.
109
113
  begin
110
114
  config_set('upgrade', upgrade_str, image: image, uri: uri)
111
- rescue Cisco::CliError => e
112
- raise e unless
113
- e.message.include?('Another install procedure may be in progress')
115
+ rescue Cisco::CliError => e2
116
+ raise e2 unless
117
+ e2.message.include?('Another install procedure may be in progress')
114
118
  end
115
119
  end
116
120
  end