opennebula-cli 5.8.5 → 5.9.80.pre

Sign up to get free protection for your applications and to get access to all the features.
@@ -636,6 +636,17 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
636
636
  print_pcis(pcis)
637
637
  end
638
638
 
639
+ begin
640
+ numa_nodes =
641
+ host.to_hash['HOST']['HOST_SHARE']['NUMA_NODES']['NODE']
642
+ rescue StandardError
643
+ numa_nodes = nil
644
+ end
645
+
646
+ if numa_nodes && !numa_nodes.empty?
647
+ print_numa_nodes(numa_nodes)
648
+ end
649
+
639
650
  puts
640
651
  CLIHelper.print_header('WILD VIRTUAL MACHINES', false)
641
652
  puts
@@ -718,4 +729,193 @@ class OneHostHelper < OpenNebulaHelper::OneHelper
718
729
  table.show(pcis)
719
730
  end
720
731
 
732
+ def print_numa_nodes(numa_nodes)
733
+ numa_nodes = get_numa_data(numa_nodes)
734
+
735
+ print_numa_cores(numa_nodes)
736
+ print_numa_memory(numa_nodes)
737
+ print_numa_hugepages(numa_nodes)
738
+ end
739
+
740
+ def get_numa_data(numa_nodes)
741
+ numa_nodes = [numa_nodes] if numa_nodes.class == Hash
742
+
743
+ numa_nodes.map! do |core|
744
+ cores = core['CORE']
745
+
746
+ free, used, cores_str = get_numa_cores(cores)
747
+
748
+ core['CORE'] = {}
749
+ core['CORE']['CORES'] = cores_str
750
+ core['CORE']['FREE'] = free
751
+ core['CORE']['USED'] = used
752
+
753
+ core
754
+ end
755
+
756
+ numa_nodes
757
+ end
758
+
759
+ def get_numa_cores(cores)
760
+ ret = ''
761
+ free = 0
762
+ used = 0
763
+
764
+ [cores].flatten.each do |info|
765
+ core = info['CPUS'].split(',')
766
+
767
+ core.uniq! do |c|
768
+ c = c.split(':')
769
+ c[0]
770
+ end
771
+
772
+ core.each do |c|
773
+ c = c.split(':')
774
+
775
+ if c[1] == '-1'
776
+ ret += '-'
777
+ free += 1
778
+ elsif c[1] == '-2'
779
+ ret += 'I'
780
+ used += 1
781
+ elsif c[1] != '-1' && info['FREE'] == '0'
782
+ ret += 'X'
783
+ used += 1
784
+ else
785
+ ret += 'x'
786
+ used += 1
787
+ end
788
+ end
789
+
790
+ ret += ' '
791
+ end
792
+
793
+ [free, used, ret]
794
+ end
795
+
796
+ def print_numa_cores(numa_nodes)
797
+ puts
798
+ CLIHelper.print_header('NUMA NODES', false)
799
+ puts
800
+
801
+ table = CLIHelper::ShowTable.new(nil, self) do
802
+ column :ID, 'Node ID', :size => 4, :left => false do |d|
803
+ d['NODE_ID']
804
+ end
805
+
806
+ column :CORES, 'Cores usage',
807
+ :left => true,
808
+ :adjust => true do |d|
809
+ d['CORE']['CORES']
810
+ end
811
+
812
+ column :USED, 'Used CPUs', :size => 4, :left => true do |d|
813
+ d['CORE']['USED']
814
+ end
815
+
816
+ column :FREE, 'Free CPUs', :size => 4, :left => true do |d|
817
+ d['CORE']['FREE']
818
+ end
819
+
820
+ default :ID, :CORES, :USED, :FREE
821
+ end
822
+
823
+ table.show(numa_nodes)
824
+ end
825
+
826
+ def print_numa_memory(numa_nodes)
827
+ nodes = numa_nodes.clone
828
+
829
+ nodes.reject! do |node|
830
+ node['MEMORY'].nil? || node['MEMORY'].empty?
831
+ end
832
+
833
+ return if nodes.empty?
834
+
835
+ puts
836
+ CLIHelper.print_header('NUMA MEMORY', false)
837
+ puts
838
+
839
+ table = CLIHelper::ShowTable.new(nil, self) do
840
+ column :NODE_ID, 'Node ID', :size => 8, :left => false do |d|
841
+ d['NODE_ID']
842
+ end
843
+
844
+ column :TOTAL, 'Total memory', :size => 8, :left => true do |d|
845
+ OpenNebulaHelper.unit_to_str(d['MEMORY']['TOTAL'].to_i, {})
846
+ end
847
+
848
+ column :USED_REAL, 'Used memory', :size => 20, :left => true do |d|
849
+ OpenNebulaHelper.unit_to_str(d['MEMORY']['USED'].to_i, {})
850
+ end
851
+
852
+ column :USED_ALLOCATED, 'U memory',
853
+ :size => 20, :left => true do |d|
854
+ OpenNebulaHelper.unit_to_str(d['MEMORY']['USAGE'].to_i, {})
855
+ end
856
+
857
+ column :FREE, 'Free memory', :size => 8, :left => true do |d|
858
+ OpenNebulaHelper.unit_to_str(d['MEMORY']['FREE'].to_i, {})
859
+ end
860
+
861
+ default :NODE_ID, :TOTAL, :USED_REAL, :USED_ALLOCATED, :FREE
862
+ end
863
+
864
+ table.show(nodes)
865
+ end
866
+
867
+ def print_numa_hugepages(numa_nodes)
868
+ nodes = numa_nodes.clone
869
+
870
+ nodes.reject! do |node|
871
+ node['HUGEPAGE'].nil? || node['HUGEPAGE'].empty?
872
+ end
873
+
874
+ return if nodes.empty?
875
+
876
+ puts
877
+ CLIHelper.print_header('NUMA HUGEPAGES', false)
878
+ puts
879
+
880
+ table = CLIHelper::ShowTable.new(nil, self) do
881
+ column :NODE_ID, 'Node ID', :size => 8, :left => false do |d|
882
+ d['NODE_ID']
883
+ end
884
+
885
+ column :TOTAL, 'Total pages', :size => 8, :left => true do |d|
886
+ d['HUGEPAGE']['PAGES']
887
+ end
888
+
889
+ column :SIZE, 'Pages size', :size => 8, :left => true do |d|
890
+ OpenNebulaHelper.unit_to_str(d['HUGEPAGE']['SIZE'].to_i / 1024,
891
+ {},
892
+ 'M')
893
+ end
894
+
895
+ column :FREE, 'Free pages', :size => 8, :left => true do |d|
896
+ d['HUGEPAGE']['FREE']
897
+ end
898
+
899
+ column :USED, 'allocated pages', :size => 8, :left => true do |d|
900
+ d['HUGEPAGE']['USAGE']
901
+ end
902
+
903
+ default :NODE_ID, :SIZE, :TOTAL, :FREE, :USED
904
+ end
905
+
906
+ hugepages = []
907
+
908
+ nodes.each do |node|
909
+ [node['HUGEPAGE']].flatten.each do |hugepage|
910
+ h = {}
911
+ h['NODE_ID'] = node['NODE_ID']
912
+ h['HUGEPAGE'] = hugepage
913
+
914
+ hugepages << h
915
+ end
916
+ end
917
+
918
+ table.show(hugepages)
919
+ end
920
+
721
921
  end
@@ -249,6 +249,29 @@ class OneImageHelper < OpenNebulaHelper::OneHelper
249
249
  table
250
250
  end
251
251
 
252
+ def check_orphans
253
+ orphans = []
254
+ xpath = '/VMTEMPLATE_POOL/VMTEMPLATE/TEMPLATE/DISK'
255
+
256
+ pool = factory_pool
257
+ tmpl_pool = OpenNebula::TemplatePool.new(@client, -2)
258
+
259
+ pool.info
260
+ tmpl_pool.info
261
+
262
+ pool.each do |img|
263
+ attrs = { :id => img['ID'],
264
+ :name => img['NAME'],
265
+ :uname => img['UNAME'] }
266
+
267
+ orphans << img['ID'] if check_orphan(tmpl_pool,
268
+ xpath,
269
+ 'IMAGE', attrs)
270
+ end
271
+
272
+ orphans
273
+ end
274
+
252
275
  private
253
276
 
254
277
  def factory(id=nil)
@@ -157,7 +157,7 @@ class OneSecurityGroupHelper < OpenNebulaHelper::OneHelper
157
157
  d["ICMPV6_TYPE"]
158
158
  end
159
159
 
160
- column :NETWORK, "", :left, :donottruncate, :size=>35 do |d|
160
+ column :NETWORK, "", :left, :adjust, :size=>35 do |d|
161
161
  network = ""
162
162
  if(!d["NETWORK_ID"].nil? && d["NETWORK_ID"] != "")
163
163
  network += "VNet " + d["NETWORK_ID"]
@@ -185,7 +185,7 @@ class OneSecurityGroupHelper < OpenNebulaHelper::OneHelper
185
185
  network
186
186
  end
187
187
 
188
- column :RANGE, "", :left, :donottruncate, :size=>16 do |d|
188
+ column :RANGE, "", :left, :adjust, :size=>16 do |d|
189
189
  d["RANGE"]
190
190
  end
191
191
  end.show(rule_list, {})
@@ -65,9 +65,9 @@ class OneUserHelper < OpenNebulaHelper::OneHelper
65
65
  password = OpenNebula::X509Auth.escape_dn(password)
66
66
  end
67
67
 
68
- if options[:sha1] || options[:driver] == OpenNebula::User::CIPHER_AUTH
69
- require 'digest/sha1'
70
- password = Digest::SHA1.hexdigest(password)
68
+ if options[:sha256] || options[:driver] == OpenNebula::User::CIPHER_AUTH
69
+ require 'digest/sha2'
70
+ password = Digest::SHA256.hexdigest(password)
71
71
  end
72
72
 
73
73
  return 0, password
@@ -159,7 +159,8 @@ class OneVcenterHelper < OpenNebulaHelper::OneHelper
159
159
  {
160
160
  :user => options[:vuser],
161
161
  :password => password,
162
- :host => options[:vcenter]
162
+ :host => options[:vcenter],
163
+ :port => options[:port]
163
164
  }
164
165
  end
165
166
 
@@ -13,23 +13,26 @@
13
13
  # See the License for the specific language governing permissions and #
14
14
  # limitations under the License. #
15
15
  #--------------------------------------------------------------------------- #
16
+ # rubocop:disable Naming/UncommunicativeMethodParamName
16
17
 
17
18
  if !ONE_LOCATION
18
- MAD_LOCATION = "/usr/lib/one/mads"
19
- VAR_LOCATION = "/var/lib/one"
19
+ MAD_LOCATION = '/usr/lib/one/mads'
20
+ VAR_LOCATION = '/var/lib/one'
20
21
  else
21
- MAD_LOCATION = ONE_LOCATION + "/lib/mads"
22
- VAR_LOCATION = ONE_LOCATION + "/var"
22
+ MAD_LOCATION = ONE_LOCATION + '/lib/mads'
23
+ VAR_LOCATION = ONE_LOCATION + '/var'
23
24
  end
24
25
 
25
- VMS_LOCATION = VAR_LOCATION + "/vms"
26
+ VMS_LOCATION = VAR_LOCATION + '/vms'
26
27
 
27
- $: << MAD_LOCATION
28
+ $LOAD_PATH << MAD_LOCATION
28
29
 
29
30
  require 'one_helper'
30
31
  require 'optparse/time'
31
32
 
33
+ # colored strings
32
34
  class String
35
+
33
36
  def red
34
37
  colorize(31)
35
38
  end
@@ -38,183 +41,185 @@ class String
38
41
  colorize(32)
39
42
  end
40
43
 
41
- private
44
+ private
42
45
 
43
46
  def colorize(color_code)
44
47
  "\e[#{color_code}m#{self}\e[0m"
45
48
  end
46
- end
47
49
 
50
+ end
48
51
 
52
+ # Helper methods for OneVM
49
53
  class OneVMHelper < OpenNebulaHelper::OneHelper
50
- MULTIPLE={
51
- :name => "multiple",
52
- :short => "-m x",
53
- :large => "--multiple x",
54
+
55
+ MULTIPLE = {
56
+ :name => 'multiple',
57
+ :short => '-m x',
58
+ :large => '--multiple x',
54
59
  :format => Integer,
55
- :description => "Instance multiple VMs"
60
+ :description => 'Instance multiple VMs'
56
61
  }
57
62
 
58
63
  IMAGE = {
59
- :name => "image",
60
- :short => "-i id|name",
61
- :large => "--image id|name" ,
62
- :description => "Selects the image",
64
+ :name => 'image',
65
+ :short => '-i id|name',
66
+ :large => '--image id|name',
67
+ :description => 'Selects the image',
63
68
  :format => String,
64
- :proc => lambda { |o, options|
65
- OpenNebulaHelper.rname_to_id(o, "IMAGE")
69
+ :proc => lambda {|o, _options|
70
+ OpenNebulaHelper.rname_to_id(o, 'IMAGE')
66
71
  }
67
72
  }
68
73
 
69
74
  NETWORK = {
70
- :name => "network",
71
- :short => "-n id|name",
72
- :large => "--network id|name" ,
73
- :description => "Selects the virtual network",
75
+ :name => 'network',
76
+ :short => '-n id|name',
77
+ :large => '--network id|name',
78
+ :description => 'Selects the virtual network',
74
79
  :format => String,
75
- :proc => lambda { |o, options|
76
- OpenNebulaHelper.rname_to_id(o, "VNET")
80
+ :proc => lambda {|o, _options|
81
+ OpenNebulaHelper.rname_to_id(o, 'VNET')
77
82
  }
78
83
  }
79
84
 
80
- IP={
81
- :name => "ip",
82
- :short => "-i ip",
83
- :large => "--ip ip",
85
+ IP = {
86
+ :name => 'ip',
87
+ :short => '-i ip',
88
+ :large => '--ip ip',
84
89
  :format => String,
85
- :description => "IP address for the new NIC"
90
+ :description => 'IP address for the new NIC'
86
91
  }
87
92
 
88
93
  FILE = {
89
- :name => "file",
90
- :short => "-f file",
91
- :large => "--file file" ,
92
- :description => "Selects the template file",
94
+ :name => 'file',
95
+ :short => '-f file',
96
+ :large => '--file file',
97
+ :description => 'Selects the template file',
93
98
  :format => String,
94
- :proc => lambda { |o, options|
99
+ :proc => lambda {|o, options|
95
100
  if File.file?(o)
96
101
  options[:file] = o
97
102
  else
98
- exit -1
103
+ exit - 1
99
104
  end
100
105
  }
101
106
  }
102
107
 
103
108
  HOLD = {
104
- :name => "hold",
105
- :large => "--hold",
106
- :description => "Creates the new VM on hold state instead of pending"
109
+ :name => 'hold',
110
+ :large => '--hold',
111
+ :description => 'Creates the new VM on hold state instead of pending'
107
112
  }
108
113
 
109
114
  SCHEDULE = {
110
- :name => "schedule",
111
- :large => "--schedule TIME",
112
- :description => "Schedules this action to be executed after" \
113
- "the given time. For example: onevm resume 0 --schedule \"09/23 14:15\"",
114
- :format => Time
115
+ :name => 'schedule',
116
+ :large => '--schedule TIME',
117
+ :description => 'Schedules this action to be executed after' \
118
+ 'the given time. For example: onevm resume 0 --schedule "09/23 14:15"',
119
+ :format => Time
115
120
  }
116
121
 
117
122
  WEEKLY = {
118
- :name => "weekly",
119
- :large => "--weekly days",
120
- :description => "Repeats the schedule action the days of the week specified," \
121
- "it can be a number between 0,6 separated with commas." \
122
- "For example: onevm resume 0 --schedule \"09/23 14:15\" --weekly 0,2,4",
123
- :format => String
123
+ :name => 'weekly',
124
+ :large => '--weekly days',
125
+ :description => 'Repeats the schedule action the days of the week ' \
126
+ 'specified, it can be a number between 0,6 separated with commas.' \
127
+ 'For example: onevm resume 0 --schedule "09/23 14:15" --weekly 0,2,4',
128
+ :format => String
124
129
  }
125
130
 
126
131
  MONTHLY = {
127
- :name => "monthly",
128
- :large => "--monthly days",
129
- :description => "Repeats the schedule action the days of the month specified," \
130
- "it can be a number between 0,31 separated with commas." \
131
- "For example: onevm resume 0 --schedule \"09/23 14:15\" --monthly 0,14",
132
- :format => String
132
+ :name => 'monthly',
133
+ :large => '--monthly days',
134
+ :description => 'Repeats the schedule action the days of the month ' \
135
+ 'specified, it can be a number between 0,31 separated with commas.' \
136
+ 'For example: onevm resume 0 --schedule "09/23 14:15" --monthly 0,14',
137
+ :format => String
133
138
  }
134
139
 
135
140
  YEARLY = {
136
- :name => "yearly",
137
- :large => "--yearly days",
138
- :description => "Repeats the schedule action the days of the year specified," \
139
- "it can be a number between 0,365 separated with commas." \
140
- "For example: onevm resume 0 --schedule \"09/23 14:15\" --yearly 30,60",
141
- :format => String
141
+ :name => 'yearly',
142
+ :large => '--yearly days',
143
+ :description => 'Repeats the schedule action the days of the year ' \
144
+ 'specified, it can be a number between 0,365 separated with commas.' \
145
+ 'For example: onevm resume 0 --schedule "09/23 14:15" --yearly 30,60',
146
+ :format => String
142
147
  }
143
148
 
144
149
  HOURLY = {
145
- :name => "hourly",
146
- :large => "--hourly hour",
147
- :description => "Repeats the schedule action each hours specified," \
148
- "it can be a number between 0,168 separated with commas." \
149
- "For example: onevm resume 0 --schedule \"09/23 14:15\" --hourly 1,5",
150
- :format => Numeric
150
+ :name => 'hourly',
151
+ :large => '--hourly hour',
152
+ :description => 'Repeats the schedule action each hours specified,' \
153
+ 'it can be a number between 0,168 separated with commas.' \
154
+ 'For example: onevm resume 0 --schedule "09/23 14:15" --hourly 1,5',
155
+ :format => Numeric
151
156
  }
152
157
 
153
158
  END_TIME = {
154
- :name => "end",
155
- :large => "--end number|TIME",
156
- :description => "----",
157
- :format => String
159
+ :name => 'end',
160
+ :large => '--end number|TIME',
161
+ :description => '----',
162
+ :format => String
158
163
  }
159
164
 
160
165
  ALL_TEMPLATE = {
161
- :name => "all",
162
- :large => "--all",
163
- :description => "Show all template data"
166
+ :name => 'all',
167
+ :large => '--all',
168
+ :description => 'Show all template data'
164
169
  }
165
170
 
166
171
  LIVE = {
167
- :name => "live",
168
- :large => "--live",
169
- :description => "Do the action with the VM running"
172
+ :name => 'live',
173
+ :large => '--live',
174
+ :description => 'Do the action with the VM running'
170
175
  }
171
176
 
172
177
  HARD = {
173
- :name => "hard",
174
- :large => "--hard",
175
- :description=> "Does not communicate with the guest OS"
178
+ :name => 'hard',
179
+ :large => '--hard',
180
+ :description => 'Does not communicate with the guest OS'
176
181
  }
177
182
 
178
183
  POFF = {
179
- :name => "poweroff",
180
- :large => "--poff",
181
- :description => "Do the migrate by poweringoff the vm"
184
+ :name => 'poweroff',
185
+ :large => '--poff',
186
+ :description => 'Do the migrate by poweringoff the vm'
182
187
  }
183
188
 
184
189
  POFFHARD = {
185
- :name => "poweroff_hard",
186
- :large => "--poff-hard",
187
- :description => "Do the migrate by poweringoff hard the vm"
190
+ :name => 'poweroff_hard',
191
+ :large => '--poff-hard',
192
+ :description => 'Do the migrate by poweringoff hard the vm'
188
193
  }
189
194
 
190
195
  ALIAS = {
191
- :name => "alias",
192
- :short => "-a alias",
193
- :large => "--alias alias",
194
- :description=> "Attach the NIC as an ALIAS",
195
- :format => String
196
+ :name => 'alias',
197
+ :short => '-a alias',
198
+ :large => '--alias alias',
199
+ :description => 'Attach the NIC as an ALIAS',
200
+ :format => String
196
201
  }
197
202
 
198
203
  NIC_NAME = {
199
- :name => "nic_name",
200
- :large => "--nic_name name",
201
- :description=> "Name of the NIC",
202
- :format => String
204
+ :name => 'nic_name',
205
+ :large => '--nic_name name',
206
+ :description => 'Name of the NIC',
207
+ :format => String
203
208
  }
204
209
 
205
210
  SEARCH = {
206
- :name => "search",
207
- :large => "--search search",
208
- :description=> "query in KEY=VALUE format",
209
- :format => String
211
+ :name => 'search',
212
+ :large => '--search search',
213
+ :description => 'query in KEY=VALUE format',
214
+ :format => String
210
215
  }
211
216
 
212
217
  def self.rname
213
- "VM"
218
+ 'VM'
214
219
  end
215
220
 
216
221
  def self.conf_file
217
- "onevm.yaml"
222
+ 'onevm.yaml'
218
223
  end
219
224
 
220
225
  def self.state_to_str(id, lcm_id)
@@ -222,13 +227,13 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
222
227
  state_str = VirtualMachine::VM_STATE[id]
223
228
  short_state_str = VirtualMachine::SHORT_VM_STATES[state_str]
224
229
 
225
- if short_state_str=="actv"
230
+ if short_state_str == 'actv'
226
231
  lcm_id = lcm_id.to_i
227
232
  lcm_state_str = VirtualMachine::LCM_STATE[lcm_id]
228
233
  return VirtualMachine::SHORT_LCM_STATES[lcm_state_str]
229
234
  end
230
235
 
231
- return short_state_str
236
+ short_state_str
232
237
  end
233
238
 
234
239
  # Return the IP or several IPs of a VM
@@ -237,48 +242,61 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
237
242
 
238
243
  vm_nics = []
239
244
 
240
- if !vm["TEMPLATE"]["NIC"].nil?
241
- vm_nics = [vm["TEMPLATE"]['NIC']].flatten
245
+ if !vm['TEMPLATE']['NIC'].nil?
246
+ vm_nics = [vm['TEMPLATE']['NIC']].flatten
242
247
  end
243
248
 
244
- if !vm["TEMPLATE"]["PCI"].nil?
245
- vm_nics = [vm_nics, vm["TEMPLATE"]['PCI']].flatten
249
+ if !vm['TEMPLATE']['PCI'].nil?
250
+ vm_nics = [vm_nics, vm['TEMPLATE']['PCI']].flatten
246
251
  end
247
252
 
248
253
  vm_nics.each do |nic|
249
- ["IP", "IP6_GLOBAL", "IP6_ULA", "IP6",
250
- "VROUTER_IP", "VROUTER_IP6_GLOBAL", "VROUTER_IP6_ULA"].each do |attr|
251
- if nic.has_key?(attr)
254
+ %w[IP IP6_GLOBAL IP6_ULA IP6
255
+ VROUTER_IP VROUTER_IP6_GLOBAL VROUTER_IP6_ULA].each do |attr|
256
+ if nic.key?(attr)
252
257
  ips.push(nic[attr])
253
258
  end
254
259
  end
255
260
  end
256
261
 
257
262
  VirtualMachine::EXTERNAL_IP_ATTRS.each do |attr|
258
- external_ip = vm["MONITORING"][attr]
263
+ external_ip = vm['MONITORING'][attr]
259
264
 
260
265
  if !external_ip.nil? && !ips.include?(external_ip)
261
266
  ips.push(external_ip)
262
267
  end
263
268
  end
264
269
 
265
- if ips.empty?
266
- return "--"
267
- else
268
- return ips.join(",")
269
- end
270
+ return '--' if ips.empty?
271
+
272
+ ips.join(',')
270
273
  end
271
274
 
272
275
  def retrieve_snapshot_id(vm_id, id)
276
+ return [0, id.to_i] if id =~ /\A\d+\z/
277
+
273
278
  vm = retrieve_resource(vm_id)
274
279
  vm.info
275
280
 
276
- if !/\A\d+\z/.match(id)
277
- ids = vm.retrieve_elements("/VM/TEMPLATE/SNAPSHOT[NAME='#{id}']/SNAPSHOT_ID")
278
- return [-1, "#{id} not found or duplicated"] if ids.nil? || ids.size > 1
279
- else
280
- return [0, id.to_i]
281
- end
281
+ ids = vm.retrieve_elements(
282
+ "/VM/TEMPLATE/SNAPSHOT[NAME='#{id}']/SNAPSHOT_ID"
283
+ )
284
+
285
+ return [-1, "#{id} not found or duplicated"] \
286
+ if ids.nil? || ids.size > 1
287
+
288
+ [0, ids[0].to_i]
289
+ end
290
+
291
+ def retrieve_disk_snapshot_id(vm_id, id)
292
+ return [0, id.to_i] if id =~ /\A\d+\z/
293
+
294
+ vm = retrieve_resource(vm_id)
295
+ vm.info
296
+ ids = vm.retrieve_elements("/VM/SNAPSHOTS/SNAPSHOT[NAME='#{id}']/ID")
297
+
298
+ return [-1, "#{id} not found or duplicated"] \
299
+ if ids.nil? || ids.size > 1
282
300
 
283
301
  [0, ids[0].to_i]
284
302
  end
@@ -291,67 +309,69 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
291
309
  rc = cluster_pool.info
292
310
 
293
311
  cluster_names = {}
294
- cluster_names["-1"] = "default"
312
+ cluster_names['-1'] = 'default'
295
313
 
296
314
  if !OpenNebula.is_error?(rc)
297
315
  cluster_pool.each do |c|
298
- cluster_names[c["ID"]] = c["NAME"]
316
+ cluster_names[c['ID']] = c['NAME']
299
317
  end
300
318
  end
301
319
 
302
320
  table = CLIHelper::ShowTable.new(config_file, self) do
303
- column :ID, "ONE identifier for Virtual Machine", :size=>6 do |d|
304
- d["ID"]
321
+ column :ID, 'ONE identifier for Virtual Machine', :size => 6 do |d|
322
+ d['ID']
305
323
  end
306
324
 
307
- column :NAME, "Name of the Virtual Machine", :left,
308
- :size=>15 do |d|
309
- if d["RESCHED"] == "1"
310
- "*#{d["NAME"]}"
325
+ column :NAME, 'Name of the Virtual Machine', :left,
326
+ :size => 15 do |d|
327
+ if d['RESCHED'] == '1'
328
+ "*#{d['NAME']}"
311
329
  else
312
- d["NAME"]
330
+ d['NAME']
313
331
  end
314
332
  end
315
333
 
316
- column :USER, "Username of the Virtual Machine owner", :left,
317
- :size=>8 do |d|
334
+ column :USER, 'Username of the Virtual Machine owner', :left,
335
+ :size => 8 do |d|
318
336
  helper.user_name(d, options)
319
337
  end
320
338
 
321
- column :GROUP, "Group of the Virtual Machine", :left,
322
- :size=>8 do |d|
339
+ column :GROUP, 'Group of the Virtual Machine', :left,
340
+ :size => 8 do |d|
323
341
  helper.group_name(d, options)
324
342
  end
325
343
 
326
- column :STAT, "Actual status", :size=>4 do |d,e|
327
- OneVMHelper.state_to_str(d["STATE"], d["LCM_STATE"])
344
+ column :STAT, 'Actual status', :size => 4 do |d, _e|
345
+ OneVMHelper.state_to_str(d['STATE'], d['LCM_STATE'])
328
346
  end
329
347
 
330
- column :UCPU, "CPU percentage used by the VM", :size=>4 do |d|
331
- cpu = d["MONITORING"]["CPU"]
332
- cpu = "0" if cpu.nil?
348
+ column :UCPU, 'CPU percentage used by the VM', :size => 4 do |d|
349
+ cpu = d['MONITORING']['CPU']
350
+ cpu = '0' if cpu.nil?
333
351
 
334
352
  cpu
335
353
  end
336
354
 
337
- column :UMEM, "Memory used by the VM", :size=>7 do |d|
338
- OpenNebulaHelper.unit_to_str(d["MONITORING"]["MEMORY"].to_i, options)
355
+ column :UMEM, 'Memory used by the VM', :size => 7 do |d|
356
+ OpenNebulaHelper.unit_to_str(d['MONITORING']['MEMORY'].to_i,
357
+ options)
339
358
  end
340
359
 
341
- column :HOST, "Host where the VM is running", :left, :size=>10 do |d|
360
+ column :HOST, 'Host where the VM is running',
361
+ :left, :size => 10 do |d|
342
362
  if d['HISTORY_RECORDS'] && d['HISTORY_RECORDS']['HISTORY']
343
363
  state_str = VirtualMachine::VM_STATE[d['STATE'].to_i]
344
- if %w{ACTIVE SUSPENDED POWEROFF}.include? state_str
364
+ if %w[ACTIVE SUSPENDED POWEROFF].include? state_str
345
365
  d['HISTORY_RECORDS']['HISTORY']['HOSTNAME']
346
366
  end
347
367
  end
348
368
  end
349
369
 
350
- column :CLUSTER, "Cluster where the VM is running", :left,
351
- :size=> 10 do |d|
352
- if d["HISTORY_RECORDS"]["HISTORY"]
353
- history = [d["HISTORY_RECORDS"]["HISTORY"]].flatten
354
- cluster_id = history.last["CID"]
370
+ column :CLUSTER, 'Cluster where the VM is running', :left,
371
+ :size => 10 do |d|
372
+ if d['HISTORY_RECORDS']['HISTORY']
373
+ history = [d['HISTORY_RECORDS']['HISTORY']].flatten
374
+ cluster_id = history.last['CID']
355
375
  cluster = cluster_names[cluster_id]
356
376
 
357
377
  if !cluster
@@ -360,38 +380,38 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
360
380
  cluster
361
381
  end
362
382
  else
363
- "NONE"
383
+ 'NONE'
364
384
  end
365
385
  end
366
386
 
367
- column :TIME, "Time since the VM was submitted", :size=>10 do |d|
368
- stime = d["STIME"].to_i
369
- etime = d["ETIME"]=="0" ? Time.now.to_i : d["ETIME"].to_i
370
- dtime = etime-stime
387
+ column :TIME, 'Time since the VM was submitted', :size => 10 do |d|
388
+ stime = d['STIME'].to_i
389
+ etime = d['ETIME'] == '0' ? Time.now.to_i : d['ETIME'].to_i
390
+ dtime = etime - stime
371
391
  OpenNebulaHelper.period_to_str(dtime, false)
372
392
  end
373
393
 
374
- column :IP, "VM IP addresses", :left, :donottruncate, :size=>15 do |d|
394
+ column :IP, 'VM IP addresses', :left, :adjust, :size => 15 do |d|
375
395
  OneVMHelper.ip_str(d)
376
396
  end
377
397
 
378
398
  default :ID, :USER, :GROUP, :NAME, :STAT, :UCPU, :UMEM, :HOST,
379
- :TIME
399
+ :TIME
380
400
  end
381
401
 
382
402
  table
383
403
  end
384
404
 
385
-
386
- def schedule_actions(ids,options,action)
405
+ def schedule_actions(ids, options, action)
387
406
  # Verbose by default
388
407
  options[:verbose] = true
389
408
 
390
409
  perform_actions(
391
410
  ids, options,
392
- "#{action} scheduled at #{options[:schedule]}") do |vm|
411
+ "#{action} scheduled at #{options[:schedule]}"
412
+ ) do |vm|
393
413
 
394
- str_periodic = ""
414
+ str_periodic = ''
395
415
 
396
416
  if options.key?(:weekly)
397
417
  str_periodic << ", REPEAT = 0, DAYS = \"#{options[:weekly]}\""
@@ -400,56 +420,61 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
400
420
  elsif options.key?(:yearly)
401
421
  str_periodic << ", REPEAT = 2, DAYS = \"#{options[:yearly]}\""
402
422
  elsif options.key?(:hourly)
403
- str_periodic << ", REPEAT = 3, DAYS = \"#{options[:hourly].to_s}\""
423
+ str_periodic << ", REPEAT = 3, DAYS = \"#{options[:hourly]}\""
404
424
  end
405
425
 
406
426
  if options.key?(:end)
407
427
  begin
408
428
  end_date = Date.parse(options[:end])
409
- str_periodic << ", END_TYPE = 2, END_VALUE = #{end_date.to_time.to_i}"
429
+ str_periodic << ', END_TYPE = 2, ' \
430
+ "END_VALUE = #{end_date.to_time.to_i}"
410
431
  rescue ArgumentError
411
432
  if options[:end].to_i > 0
412
- str_periodic << ", END_TYPE = 1, END_VALUE = #{options[:end].to_i}"
433
+ str_periodic << ', END_TYPE = 1, ' \
434
+ "END_VALUE = #{options[:end].to_i}"
413
435
  end
414
436
  end
415
- elsif str_periodic != ""
416
- str_periodic << ", END_TYPE = 0"
437
+ elsif str_periodic != ''
438
+ str_periodic << ', END_TYPE = 0'
417
439
  end
418
440
 
419
441
  rc = vm.info
420
442
 
421
443
  if OpenNebula.is_error?(rc)
422
444
  puts rc.message
423
- exit -1
445
+ exit(-1)
424
446
  end
425
447
 
426
448
  ids = vm.retrieve_elements('USER_TEMPLATE/SCHED_ACTION/ID')
427
449
 
428
450
  id = 0
429
- if (!ids.nil? && !ids.empty?)
451
+ if !ids.nil? && !ids.empty?
430
452
  ids.map! {|e| e.to_i }
431
453
  id = ids.max + 1
432
454
  end
433
455
 
434
456
  tmp_str = vm.user_template_str
435
457
 
436
- tmp_str << "\nSCHED_ACTION = [ID = #{id}, ACTION = #{action}, TIME = #{options[:schedule].to_i}" << str_periodic << "]"
458
+ tmp_str << "\nSCHED_ACTION = "
459
+ tmp_str << "[ID = #{id}, ACTION = #{action}, "
460
+ tmp_str << "TIME = #{options[:schedule].to_i}"
461
+ tmp_str << str_periodic << ']'
437
462
 
438
463
  vm.update(tmp_str)
439
464
  end
440
465
  end
441
466
 
442
467
  RECOVER_RETRY_STEPS = {
443
- :PROLOG_MIGRATE_FAILURE => :migrate,
468
+ :PROLOG_MIGRATE_FAILURE => :migrate,
444
469
  :PROLOG_MIGRATE_POWEROFF_FAILURE => :migrate,
445
- :PROLOG_MIGRATE_SUSPEND_FAILURE => :migrate,
446
- :PROLOG_MIGRATE_UNKNOWN_FAILURE => :migrate,
447
- :PROLOG_FAILURE => :prolog,
448
- :PROLOG_RESUME_FAILURE => :resume,
449
- :PROLOG_UNDEPLOY_FAILURE => :resume,
450
- :EPILOG_FAILURE => :epilog,
451
- :EPILOG_STOP_FAILURE => :stop,
452
- :EPILOG_UNDEPLOY_FAILURE => :stop
470
+ :PROLOG_MIGRATE_SUSPEND_FAILURE => :migrate,
471
+ :PROLOG_MIGRATE_UNKNOWN_FAILURE => :migrate,
472
+ :PROLOG_FAILURE => :prolog,
473
+ :PROLOG_RESUME_FAILURE => :resume,
474
+ :PROLOG_UNDEPLOY_FAILURE => :resume,
475
+ :EPILOG_FAILURE => :epilog,
476
+ :EPILOG_STOP_FAILURE => :stop,
477
+ :EPILOG_UNDEPLOY_FAILURE => :stop
453
478
  }
454
479
 
455
480
  def recover_retry_interactive(vm)
@@ -457,32 +482,32 @@ class OneVMHelper < OpenNebulaHelper::OneHelper
457
482
  require 'one_tm'
458
483
  rescue LoadError
459
484
  STDERR.puts <<-EOT
460
- one_tm library not found. Make sure you execute recover --interactive
461
- in the frontend machine.
485
+ one_tm library not found. Make sure you execute recover --interactive
486
+ in the frontend machine.
462
487
  EOT
463
488
  exit(-1)
464
489
  end
465
490
 
466
491
  # Disable CTRL-C in the menu
467
- trap("SIGINT") { }
492
+ trap('SIGINT') {}
468
493
 
469
- if !File.readable?(VAR_LOCATION+"/config")
470
- STDERR.puts "Error reading #{VAR_LOCATION+'/config'}. The " <<
471
- "TM Debug Interactive Environment must be executed as " <<
472
- "oneadmin in the frontend."
473
- exit -1
494
+ if !File.readable?(VAR_LOCATION + '/config')
495
+ STDERR.puts "Error reading #{VAR_LOCATION + '/config'}. The TM " \
496
+ 'Debug Interactive Environment must be executed as ' \
497
+ 'oneadmin in the frontend.'
498
+ exit(-1)
474
499
  end
475
500
 
476
501
  rc = vm.info
477
502
  if OpenNebula.is_error?(rc)
478
503
  STDERR.puts rc.message
479
- exit -1
504
+ exit(-1)
480
505
  end
481
506
 
482
507
  if !RECOVER_RETRY_STEPS.include?(vm.lcm_state_str.to_sym)
483
- STDERR.puts "Current LCM STATE '#{vm.lcm_state_str}' not " <<
484
- "compatible with RECOVER RETRY action."
485
- exit -1
508
+ STDERR.puts "Current LCM STATE '#{vm.lcm_state_str}' not " \
509
+ 'compatible with RECOVER RETRY action.'
510
+ exit(-1)
486
511
  end
487
512
 
488
513
  seq = vm['/VM/HISTORY_RECORDS/HISTORY[last()]/SEQ']
@@ -493,27 +518,27 @@ in the frontend machine.
493
518
 
494
519
  if !File.readable?(tm_file)
495
520
  STDERR.puts "Cannot read #{tm_file}"
496
- exit -1
521
+ exit(-1)
497
522
  end
498
523
 
499
524
  @tm_action_list = File.read(tm_file)
500
525
 
501
- puts "TM Debug Interactive Environment.".green
526
+ puts 'TM Debug Interactive Environment.'.green
502
527
  puts
503
528
  print_tm_action_list
504
529
 
505
530
  @tm = TransferManagerDriver.new(nil)
506
- i=0
531
+ i = 0
507
532
  @tm_action_list.lines.each do |tm_command|
508
- i+=1
509
- success=false
533
+ i += 1
534
+ success = false
510
535
 
511
- while !success
536
+ until success
512
537
  puts "Current action (#{i}):".green
513
538
  puts tm_command
514
539
  puts
515
540
 
516
- puts <<-EOF.gsub(/^\s+/,"")
541
+ puts <<-EOF.gsub(/^\s+/, '')
517
542
  Choose action:
518
543
  (r) Run action
519
544
  (n) Skip to next action
@@ -521,47 +546,46 @@ in the frontend machine.
521
546
  (q) Quit
522
547
  EOF
523
548
 
524
- ans = ""
525
- while !%w(n a r q).include?(ans)
526
- printf "> "
549
+ ans = ''
550
+ until %w[n a r q].include?(ans)
551
+ printf '> '
527
552
  ans = STDIN.gets.strip.downcase
528
553
 
529
554
  puts
530
555
 
531
556
  case ans
532
- when "n"
557
+ when 'n'
533
558
  success = true
534
- when "a"
559
+ when 'a'
535
560
  print_tm_action_list
536
- when "q"
537
- exit -1
538
- when "r"
539
- result, result_message = @tm.do_transfer_action(@id, tm_command.split)
561
+ when 'q'
562
+ exit(-1)
563
+ when 'r'
564
+ result, = @tm.do_transfer_action(@id, tm_command.split)
540
565
 
541
- if result == "SUCCESS"
566
+ if result == 'SUCCESS'
542
567
  success = true
543
- puts "#{result}"
544
- puts
568
+ puts result.to_s
545
569
  else
546
570
  puts
547
571
  puts "#{result}. Repeat command.".red
548
- puts
549
572
  end
573
+ puts
550
574
  end
551
575
  end
552
576
  end
553
577
  end
554
578
 
555
- puts "If all the TM actions have been successful and you want to"
556
- puts "recover the Virtual Machine to the RUNNING state execute this command:"
557
- puts "$ onevm recover #{vm.id} --success"
579
+ puts 'If all the TM actions have been successful and you want to'
580
+ puts 'recover the Virtual Machine to the RUNNING state execute this '
581
+ puts "command $ onevm recover #{vm.id} --success"
558
582
  end
559
583
 
560
584
  def print_tm_action_list
561
- puts "TM Action list:".green
562
- i=0
585
+ puts 'TM Action list:'.green
586
+ i = 0
563
587
  @tm_action_list.lines.each do |line|
564
- i+=1
588
+ i += 1
565
589
  puts "(#{i}) #{line}"
566
590
  end
567
591
  puts
@@ -569,96 +593,102 @@ in the frontend machine.
569
593
 
570
594
  def get_migration_type(options)
571
595
  if options[:poweroff]
572
- return 1
596
+ 1
573
597
  elsif options[:poweroff_hard]
574
- return 2
598
+ 2
575
599
  else
576
- return 0
600
+ 0
577
601
  end
578
602
  end
579
603
 
580
604
  private
581
605
 
582
- def factory(id=nil)
606
+ def factory(id = nil)
583
607
  if id
584
608
  OpenNebula::VirtualMachine.new_with_id(id, @client)
585
609
  else
586
- xml=OpenNebula::VirtualMachine.build_xml
610
+ xml = OpenNebula::VirtualMachine.build_xml
587
611
  OpenNebula::VirtualMachine.new(xml, @client)
588
612
  end
589
613
  end
590
614
 
591
- def factory_pool(user_flag=-2)
615
+ def factory_pool(user_flag = -2)
592
616
  OpenNebula::VirtualMachinePool.new(@client, user_flag)
593
617
  end
594
618
 
595
619
  def format_resource(vm, options = {})
596
- str_h1="%-80s"
597
- str="%-20s: %-20s"
620
+ str_h1 = '%-80s'
621
+ str = '%-20s: %-20s'
598
622
 
599
623
  cluster = nil
600
624
 
601
625
  vm_hash = vm.to_hash
602
626
 
603
- if %w{ACTIVE SUSPENDED POWEROFF}.include? vm.state_str
627
+ if %w[ACTIVE SUSPENDED POWEROFF].include? vm.state_str
604
628
  cluster_id = vm['/VM/HISTORY_RECORDS/HISTORY[last()]/CID']
605
629
  else
606
630
  cluster_id = nil
607
631
  end
608
632
 
609
633
  if cluster_id
610
- if cluster_id == "-1"
611
- cluster = "default"
634
+ if cluster_id == '-1'
635
+ cluster = 'default'
612
636
  else
613
- clu = OpenNebula::Cluster.new(OpenNebula::Cluster.build_xml(cluster_id), @client)
637
+ clu = OpenNebula::Cluster.new(
638
+ OpenNebula::Cluster.build_xml(cluster_id), @client
639
+ )
614
640
  rc = clu.info
615
641
  if OpenNebula.is_error?(rc)
616
- cluster = "ERROR"
642
+ cluster = 'ERROR'
617
643
  else
618
- cluster = clu["NAME"]
644
+ cluster = clu['NAME']
619
645
  end
620
646
  end
621
647
  end
622
648
 
623
649
  CLIHelper.print_header(
624
- str_h1 % "VIRTUAL MACHINE #{vm['ID']} INFORMATION")
625
- puts str % ["ID", vm.id.to_s]
626
- puts str % ["NAME", vm.name]
627
- puts str % ["USER", vm['UNAME']]
628
- puts str % ["GROUP", vm['GNAME']]
629
- puts str % ["STATE", vm.state_str]
630
- puts str % ["LCM_STATE", vm.lcm_state_str]
631
- puts str % ["LOCK", OpenNebulaHelper.level_lock_to_str(vm['LOCK/LOCKED'])]
632
- puts str % ["RESCHED", OpenNebulaHelper.boolean_to_str(vm['RESCHED'])]
633
- puts str % ["HOST",
634
- vm['/VM/HISTORY_RECORDS/HISTORY[last()]/HOSTNAME']] if
635
- %w{ACTIVE SUSPENDED POWEROFF}.include? vm.state_str
636
- puts str % ["CLUSTER ID", cluster_id ] if cluster_id
637
- puts str % ["CLUSTER", cluster ] if cluster
638
- puts str % ["START TIME",
639
- OpenNebulaHelper.time_to_str(vm['/VM/STIME'])]
640
- puts str % ["END TIME",
641
- OpenNebulaHelper.time_to_str(vm['/VM/ETIME'])]
642
- value=vm['DEPLOY_ID']
643
- puts str % ["DEPLOY ID", value=="" ? "-" : value]
644
- value=vm['TEMPLATE/VROUTER_ID']
645
- puts str % ["VIRTUAL ROUTER ID", value] if value
650
+ str_h1 % "VIRTUAL MACHINE #{vm['ID']} INFORMATION"
651
+ )
652
+ puts format(str, 'ID', vm.id.to_s)
653
+ puts format(str, 'NAME', vm.name)
654
+ puts format(str, 'USER', vm['UNAME'])
655
+ puts format(str, 'GROUP', vm['GNAME'])
656
+ puts format(str, 'STATE', vm.state_str)
657
+ puts format(str, 'LCM_STATE', vm.lcm_state_str)
658
+ puts format(str, 'LOCK',
659
+ OpenNebulaHelper.level_lock_to_str(vm['LOCK/LOCKED']))
660
+ puts format(str, 'RESCHED',
661
+ OpenNebulaHelper.boolean_to_str(vm['RESCHED']))
662
+ if %w[ACTIVE SUSPENDED POWEROFF].include? vm.state_str
663
+ puts format(str, 'HOST',
664
+ vm['/VM/HISTORY_RECORDS/HISTORY[last()]/HOSTNAME'])
665
+ end
666
+ puts format(str, 'CLUSTER ID', cluster_id) if cluster_id
667
+ puts format(str, 'CLUSTER', cluster) if cluster
668
+ puts format(str, 'START TIME',
669
+ OpenNebulaHelper.time_to_str(vm['/VM/STIME']))
670
+ puts format(str, 'END TIME',
671
+ OpenNebulaHelper.time_to_str(vm['/VM/ETIME']))
672
+ value = vm['DEPLOY_ID']
673
+ puts format(str, 'DEPLOY ID', value == '' ? '-' : value)
674
+ value = vm['TEMPLATE/VROUTER_ID']
675
+ puts format(str, 'VIRTUAL ROUTER ID', value) if value
646
676
 
647
677
  puts
648
678
 
649
- CLIHelper.print_header(str_h1 % "VIRTUAL MACHINE MONITORING",false)
679
+ CLIHelper.print_header(str_h1 % 'VIRTUAL MACHINE MONITORING', false)
650
680
 
651
681
  vm_monitoring = vm_hash['VM']['MONITORING']
652
682
 
653
- # Find out if it is a hybrid VM to avoid showing local IPs
654
- isHybrid=false
655
- vm_monitoring.each{|key, value|
683
+ # Find out if it is a hybrid VM to avoid showing local IPs
684
+ is_hybrid = false
685
+ vm_monitoring.each do |key, _value|
656
686
  if VirtualMachine::EXTERNAL_IP_ATTRS.include? key
657
- isHybrid=true
687
+ is_hybrid = true
658
688
  end
659
- }
689
+ end
660
690
 
661
- order_attrs = %w(CPU MEMORY NETTX NETRX)
691
+ order_attrs = %w[CPU MEMORY NETTX NETRX]
662
692
 
663
693
  vm_monitoring_sort = []
664
694
  order_attrs.each do |key|
@@ -667,156 +697,159 @@ in the frontend machine.
667
697
  end
668
698
  end
669
699
 
670
- vm_monitoring_sort.sort{|a,b| a[0]<=>b[0]}
700
+ vm_monitoring_sort.sort_by {|a| a[0] }
671
701
 
672
- filter_attrs = %w(STATE DISK_SIZE SNAPSHOT_SIZE)
702
+ filter_attrs = %w[STATE DISK_SIZE SNAPSHOT_SIZE]
673
703
  vm_monitoring.each do |key, val|
674
704
  if !filter_attrs.include?(key)
675
705
  vm_monitoring_sort << [key, val]
676
706
  end
677
707
  end
678
708
 
679
- vm_monitoring_sort.each do |k,v|
680
- if k == "MEMORY"
681
- puts str % [k, OpenNebulaHelper.unit_to_str(v.to_i, {})]
682
- elsif k =~ /NET.X/
683
- puts str % [k, OpenNebulaHelper.unit_to_str(v.to_i/1024, {})]
709
+ vm_monitoring_sort.each do |k, v|
710
+ if k == 'MEMORY'
711
+ puts format(str, k, OpenNebulaHelper.unit_to_str(v.to_i, {}))
712
+ elsif k =~ /NET.X/
713
+ puts format(str, k,
714
+ OpenNebulaHelper.unit_to_str(v.to_i / 1024, {}))
684
715
  else
685
- puts str % [k, v]
716
+ puts format(str, k, v)
686
717
  end
687
718
  end
688
719
 
689
720
  puts
690
721
 
691
- CLIHelper.print_header(str_h1 % "PERMISSIONS",false)
722
+ CLIHelper.print_header(str_h1 % 'PERMISSIONS', false)
692
723
 
693
- ["OWNER", "GROUP", "OTHER"].each { |e|
694
- mask = "---"
695
- mask[0] = "u" if vm["PERMISSIONS/#{e}_U"] == "1"
696
- mask[1] = "m" if vm["PERMISSIONS/#{e}_M"] == "1"
697
- mask[2] = "a" if vm["PERMISSIONS/#{e}_A"] == "1"
724
+ %w[OWNER GROUP OTHER].each do |e|
725
+ mask = '---'
726
+ mask[0] = 'u' if vm["PERMISSIONS/#{e}_U"] == '1'
727
+ mask[1] = 'm' if vm["PERMISSIONS/#{e}_M"] == '1'
728
+ mask[2] = 'a' if vm["PERMISSIONS/#{e}_A"] == '1'
698
729
 
699
- puts str % [e, mask]
700
- }
730
+ puts format(str, e, mask)
731
+ end
701
732
 
702
733
  vm_disks = []
703
734
 
704
- if vm.has_elements?("/VM/TEMPLATE/DISK")
735
+ if vm.has_elements?('/VM/TEMPLATE/DISK')
705
736
  vm_disks = [vm_hash['VM']['TEMPLATE']['DISK']].flatten
706
737
  end
707
738
 
708
- if vm.has_elements?("/VM/TEMPLATE/CONTEXT") && vm["/VM/HISTORY_RECORDS/HISTORY[1]/VM_MAD"] != 'vcenter'
739
+ if vm.has_elements?('/VM/TEMPLATE/CONTEXT') \
740
+ && vm['/VM/HISTORY_RECORDS/HISTORY[1]/VM_MAD'] != 'vcenter'
709
741
  context_disk = vm_hash['VM']['TEMPLATE']['CONTEXT']
710
742
 
711
- context_disk["IMAGE"] = "CONTEXT"
712
- context_disk["DATASTORE"] = "-"
713
- context_disk["TYPE"] = "-"
714
- context_disk["READONLY"] = "-"
715
- context_disk["SAVE"] = "-"
716
- context_disk["CLONE"] = "-"
717
- context_disk["SAVE_AS"] = "-"
743
+ context_disk['IMAGE'] = 'CONTEXT'
744
+ context_disk['DATASTORE'] = '-'
745
+ context_disk['TYPE'] = '-'
746
+ context_disk['READONLY'] = '-'
747
+ context_disk['SAVE'] = '-'
748
+ context_disk['CLONE'] = '-'
749
+ context_disk['SAVE_AS'] = '-'
718
750
 
719
751
  vm_disks.push(context_disk)
720
752
  end
721
753
 
722
754
  # get monitoring data
723
755
  vm_disks.each do |disk|
724
- disk_id = disk["DISK_ID"]
725
- disk["MONITOR_SIZE"] = vm["MONITORING/DISK_SIZE[ID='#{disk_id}']/SIZE"]
756
+ disk_id = disk['DISK_ID']
757
+ disk['MONITOR_SIZE'] = \
758
+ vm["MONITORING/DISK_SIZE[ID='#{disk_id}']/SIZE"]
726
759
  end
727
760
 
728
761
  if !vm_disks.empty?
729
762
  puts
730
- CLIHelper.print_header(str_h1 % "VM DISKS",false)
763
+ CLIHelper.print_header(str_h1 % 'VM DISKS', false)
731
764
  CLIHelper::ShowTable.new(nil, self) do
732
- column :ID, "", :size=>3 do |d|
733
- d["DISK_ID"]
765
+ column :ID, '', :size => 3 do |d|
766
+ d['DISK_ID']
734
767
  end
735
768
 
736
- column :DATASTORE, "", :left, :size=>10 do |d|
737
- d["DATASTORE"]
769
+ column :DATASTORE, '', :left, :size => 10 do |d|
770
+ d['DATASTORE']
738
771
  end
739
772
 
740
- column :TARGET, "", :left, :size=>6 do |d|
741
- d["TARGET"]
773
+ column :TARGET, '', :left, :size => 6 do |d|
774
+ d['TARGET']
742
775
  end
743
776
 
744
- column :IMAGE, "", :left, :size=>35 do |d|
745
- if d["IMAGE"]
746
- d["IMAGE"]
747
- else
748
- case d["TYPE"].upcase
749
- when "FS"
750
- "#{d["FORMAT"]} - "<<
751
- OpenNebulaHelper.unit_to_str(d["SIZE"].to_i,
752
- {}, "M")
753
- when "SWAP"
754
- OpenNebulaHelper.unit_to_str(d["SIZE"].to_i,
755
- {}, "M")
756
-
757
- end
758
- end
777
+ # rubocop:disable Metrics/LineLength
778
+ column :IMAGE, '', :left, :size => 35 do |d|
779
+ d['IMAGE'] || case d['TYPE'].upcase
780
+ when 'FS'
781
+ "#{d['FORMAT']} - " <<
782
+ OpenNebulaHelper.unit_to_str(d['SIZE'].to_i,
783
+ {}, 'M')
784
+ when 'SWAP'
785
+ OpenNebulaHelper.unit_to_str(d['SIZE'].to_i,
786
+ {}, 'M')
787
+
788
+ end
759
789
  end
790
+ # rubocop:enable Metrics/LineLength
760
791
 
761
- column :SIZE, "", :left, :size=>9 do |d|
762
- if d["SIZE"]
792
+ column :SIZE, '', :left, :size => 9 do |d|
793
+ if d['SIZE']
763
794
  size = OpenNebulaHelper.unit_to_str(
764
- d['SIZE'].to_i,
765
- {},
766
- "M"
767
- )
795
+ d['SIZE'].to_i,
796
+ {},
797
+ 'M'
798
+ )
768
799
  else
769
- size = "-"
800
+ size = '-'
770
801
  end
771
802
 
772
- if d["MONITOR_SIZE"]
803
+ if d['MONITOR_SIZE']
773
804
  monitor_size = OpenNebulaHelper.unit_to_str(
774
- d['MONITOR_SIZE'].to_i,
775
- {},
776
- "M"
777
- )
805
+ d['MONITOR_SIZE'].to_i,
806
+ {},
807
+ 'M'
808
+ )
778
809
  else
779
- monitor_size = "-"
810
+ monitor_size = '-'
780
811
  end
781
812
 
782
813
  "#{monitor_size}/#{size}"
783
814
  end
784
815
 
785
- column :TYPE, "", :left, :size=>4 do |d|
786
- d["TYPE"].downcase
816
+ column :TYPE, '', :left, :size => 4 do |d|
817
+ d['TYPE'].downcase
787
818
  end
788
819
 
789
- column :"R/O", "", :size=>3 do |d|
790
- d["READONLY"]
820
+ column :"R/O", '', :size => 3 do |d|
821
+ d['READONLY']
791
822
  end
792
823
 
793
- column :"SAVE", "", :size=>4 do |d|
794
- d["SAVE"] || "NO"
824
+ column :SAVE, '', :size => 4 do |d|
825
+ d['SAVE'] || 'NO'
795
826
  end
796
827
 
797
- column :"CLONE", "", :size=>5 do |d|
798
- d["CLONE"]
828
+ column :CLONE, '', :size => 5 do |d|
829
+ d['CLONE']
799
830
  end
800
831
 
801
832
  default :ID, :DATASTORE, :TARGET, :IMAGE, :SIZE, :TYPE,
802
- :SAVE
833
+ :SAVE
803
834
  end.show(vm_disks, {})
804
835
 
805
- while vm.has_elements?("/VM/TEMPLATE/DISK")
806
- vm.delete_element("/VM/TEMPLATE/DISK")
807
- end if !options[:all]
836
+ if !options[:all]
837
+ while vm.has_elements?('/VM/TEMPLATE/DISK')
838
+ vm.delete_element('/VM/TEMPLATE/DISK')
839
+ end
840
+ end
808
841
  end
809
842
 
810
- if vm.has_elements?("/VM/SNAPSHOTS")
843
+ if vm.has_elements?('/VM/SNAPSHOTS')
811
844
  puts
812
- CLIHelper.print_header(str_h1 % "VM DISK SNAPSHOTS",false)
845
+ CLIHelper.print_header(str_h1 % 'VM DISK SNAPSHOTS', false)
813
846
  format_snapshots(vm)
814
847
  end
815
848
 
816
849
  sg_nics = []
817
850
 
818
- if (vm.has_elements?("/VM/TEMPLATE/NIC/SECURITY_GROUPS") ||
819
- vm.has_elements?("/VM/TEMPLATE/PCI[NIC_ID>-1]/SECURITY_GROUPS"))
851
+ if vm.has_elements?('/VM/TEMPLATE/NIC/SECURITY_GROUPS') ||
852
+ vm.has_elements?('/VM/TEMPLATE/PCI[NIC_ID>-1]/SECURITY_GROUPS')
820
853
 
821
854
  sg_nics = [vm_hash['VM']['TEMPLATE']['NIC']]
822
855
 
@@ -838,465 +871,558 @@ in the frontend machine.
838
871
  # array. Duplicate IPs are not shown.
839
872
  extra_ips = []
840
873
 
841
- if val=vm["/VM/MONITORING/GUEST_IP"]
874
+ if (val = vm['/VM/MONITORING/GUEST_IP'])
842
875
  extra_ips << val if val && !val.empty?
843
876
  end
844
877
 
845
- if val=vm["/VM/MONITORING/GUEST_IP_ADDRESSES"]
878
+ if (val = vm['/VM/MONITORING/GUEST_IP_ADDRESSES'])
846
879
  extra_ips += val.split(',') if val && !val.empty?
847
880
  end
848
881
 
849
882
  extra_ips.uniq!
850
883
 
851
- ['NIC', 'NIC_ALIAS'].each do |type|
852
- if vm.has_elements?("/VM/TEMPLATE/#{type}") ||
853
- vm.has_elements?("/VM/TEMPLATE/PCI[NIC_ID>-1]") || !extra_ips.empty?
884
+ %w[NIC NIC_ALIAS].each do |type|
885
+ next unless vm.has_elements?("/VM/TEMPLATE/#{type}") ||
886
+ vm.has_elements?('/VM/TEMPLATE/PCI[NIC_ID>-1]') ||
887
+ !extra_ips.empty?
854
888
 
855
- puts
856
- CLIHelper.print_header(str_h1 % "VM #{type == 'NIC' ? 'NICS' : 'ALIAS'}",false)
889
+ puts
890
+ CLIHelper.print_header(
891
+ str_h1 % "VM #{type == 'NIC' ? 'NICS' : 'ALIAS'}", false
892
+ )
857
893
 
858
- nic_default = {"NETWORK" => "-",
859
- "IP" => "-",
860
- "MAC"=> "-",
861
- "BRIDGE"=>"-"}
894
+ nic_default = { 'NETWORK' => '-',
895
+ 'IP' => '-',
896
+ 'MAC' => '-',
897
+ 'BRIDGE' => '-' }
862
898
 
863
- shown_ips = []
899
+ shown_ips = []
864
900
 
865
- array_id = 0
866
- vm_nics = [vm_hash['VM']['TEMPLATE'][type]]
901
+ array_id = 0
902
+ vm_nics = [vm_hash['VM']['TEMPLATE'][type]]
867
903
 
868
- if type == 'NIC'
869
- vm_pcis = [vm_hash['VM']['TEMPLATE']['PCI']].flatten.compact
904
+ if type == 'NIC'
905
+ vm_pcis = [vm_hash['VM']['TEMPLATE']['PCI']].flatten.compact
870
906
 
871
- vm_pcis.each do |pci|
872
- if !pci['NIC_ID'].nil?
873
- vm_nics << pci
874
- end
907
+ vm_pcis.each do |pci|
908
+ if !pci['NIC_ID'].nil?
909
+ vm_nics << pci
875
910
  end
876
911
  end
912
+ end
877
913
 
878
- vm_nics.flatten!
879
- vm_nics.compact!
914
+ vm_nics.flatten!
915
+ vm_nics.compact!
880
916
 
881
- vm_nics.each {|nic|
917
+ vm_nics.each do |nic|
918
+ next if nic.key?('CLI_DONE')
882
919
 
883
- next if nic.has_key?("CLI_DONE")
920
+ %w[IP6_LINK IP6_ULA IP6_GLOBAL IP6].each do |attr|
921
+ next unless nic.key?(attr)
884
922
 
885
- ["IP6_LINK", "IP6_ULA", "IP6_GLOBAL", "IP6"].each do |attr|
886
- if nic.has_key?(attr)
887
- shown_ips << nic[attr]
923
+ shown_ips << nic[attr]
888
924
 
889
- ipstr = {"IP" => nic.delete(attr),
890
- "CLI_DONE" => true,
891
- "DOUBLE_ENTRY" => true}
892
- vm_nics.insert(array_id+1,ipstr)
925
+ ipstr = { 'IP' => nic.delete(attr),
926
+ 'CLI_DONE' => true,
927
+ 'DOUBLE_ENTRY' => true }
928
+ vm_nics.insert(array_id + 1, ipstr)
893
929
 
894
- array_id += 1
895
- end
896
- end
930
+ array_id += 1
931
+ end
897
932
 
898
- ["VROUTER_IP", "VROUTER_IP6_LINK",
899
- "VROUTER_IP6_ULA", "VROUTER_IP6_GLOBAL"].each do |attr|
900
- if nic.has_key?(attr)
901
- shown_ips << nic[attr]
933
+ %w[VROUTER_IP VROUTER_IP6_LINK
934
+ VROUTER_IP6_ULA VROUTER_IP6_GLOBAL].each do |attr|
935
+ next unless nic.key?(attr)
902
936
 
903
- ipstr = {"IP" => nic.delete(attr) + " (VRouter)",
904
- "CLI_DONE" => true,
905
- "DOUBLE_ENTRY" => true}
906
- vm_nics.insert(array_id+1,ipstr)
937
+ shown_ips << nic[attr]
907
938
 
908
- array_id += 1
909
- end
910
- end
939
+ ipstr = { 'IP' => nic.delete(attr) + ' (VRouter)',
940
+ 'CLI_DONE' => true,
941
+ 'DOUBLE_ENTRY' => true }
942
+ vm_nics.insert(array_id + 1, ipstr)
911
943
 
912
- shown_ips << nic["IP"] if nic.has_key?("IP")
913
-
914
- nic.merge!(nic_default) {|k,v1,v2| v1}
915
944
  array_id += 1
916
- }
945
+ end
917
946
 
918
- extra_ips -= shown_ips
947
+ shown_ips << nic['IP'] if nic.key?('IP')
919
948
 
920
- # Add extra IPs to the VM NICS table
921
- extra_ips.each do |ip|
922
- vm_nics << {
923
- "NIC_ID" => "-",
924
- "IP" => ip,
925
- "NETWORK" => "Additional IP",
926
- "BRIDGE" => "-"
927
- }
928
- end
949
+ nic.merge!(nic_default) {|_k, v1, _v2| v1 }
950
+ array_id += 1
951
+ end
929
952
 
930
- CLIHelper::ShowTable.new(nil, self) do
931
- column :ID, "", :size=>3 do |d|
932
- if d["DOUBLE_ENTRY"]
933
- ""
934
- else
935
- d["NIC_ID"]
936
- end
937
- end
953
+ extra_ips -= shown_ips
938
954
 
939
- column :NETWORK, "", :left, :size=>20 do |d|
940
- if d["DOUBLE_ENTRY"]
941
- ""
942
- else
943
- d["NETWORK"]
944
- end
955
+ # Add extra IPs to the VM NICS table
956
+ extra_ips.each do |ip|
957
+ vm_nics << {
958
+ 'NIC_ID' => '-',
959
+ 'IP' => ip,
960
+ 'NETWORK' => 'Additional IP',
961
+ 'BRIDGE' => '-'
962
+ }
963
+ end
964
+
965
+ CLIHelper::ShowTable.new(nil, self) do
966
+ column :ID, '', :size => 3 do |d|
967
+ if d['DOUBLE_ENTRY']
968
+ ''
969
+ else
970
+ d['NIC_ID']
945
971
  end
972
+ end
946
973
 
947
- column :BRIDGE, "", :left, :size=>12 do |d|
948
- if d["DOUBLE_ENTRY"]
949
- ""
950
- else
951
- d["BRIDGE"]
952
- end
974
+ column :NETWORK, '', :left, :size => 20 do |d|
975
+ if d['DOUBLE_ENTRY']
976
+ ''
977
+ else
978
+ d['NETWORK']
953
979
  end
980
+ end
954
981
 
955
- column :IP, "",:left, :donottruncate, :size=>15 do |d|
956
- d["IP"]
982
+ column :BRIDGE, '', :left, :size => 12 do |d|
983
+ if d['DOUBLE_ENTRY']
984
+ ''
985
+ else
986
+ d['BRIDGE']
957
987
  end
988
+ end
958
989
 
959
- column :MAC, "", :left, :size=>17 do |d|
960
- if d["DOUBLE_ENTRY"]
961
- ""
962
- else
963
- d["MAC"]
964
- end
990
+ column :IP, '', :left, :adjust, :size => 15 do |d|
991
+ d['IP']
992
+ end
993
+
994
+ column :MAC, '', :left, :size => 17 do |d|
995
+ if d['DOUBLE_ENTRY']
996
+ ''
997
+ else
998
+ d['MAC']
965
999
  end
1000
+ end
966
1001
 
967
- if type == 'NIC'
968
- column :PCI_ID, "", :left, :size=>8 do |d|
969
- if d["DOUBLE_ENTRY"]
970
- ""
971
- else
972
- d["PCI_ID"]
973
- end
1002
+ if type == 'NIC'
1003
+ column :PCI_ID, '', :left, :size => 8 do |d|
1004
+ if d['DOUBLE_ENTRY']
1005
+ ''
1006
+ else
1007
+ d['PCI_ID']
974
1008
  end
975
1009
  end
1010
+ end
1011
+ end.show(vm_nics, {})
976
1012
 
977
- end.show(vm_nics,{})
1013
+ next if options[:all]
978
1014
 
979
- while vm.has_elements?("/VM/TEMPLATE/#{type}")
980
- vm.delete_element("/VM/TEMPLATE/#{type}")
981
- end if !options[:all]
1015
+ while vm.has_elements?("/VM/TEMPLATE/#{type}")
1016
+ vm.delete_element("/VM/TEMPLATE/#{type}")
982
1017
  end
983
1018
  end
984
1019
 
985
- while vm.has_elements?("/VM/TEMPLATE/NIC")
986
- vm.delete_element("/VM/TEMPLATE/NIC")
987
- end if !options[:all]
1020
+ if !options[:all]
1021
+ while vm.has_elements?('/VM/TEMPLATE/NIC')
1022
+ vm.delete_element('/VM/TEMPLATE/NIC')
1023
+ end
1024
+ end
988
1025
 
989
- if vm.has_elements?("/VM/TEMPLATE/SECURITY_GROUP_RULE") and !isHybrid
1026
+ if vm.has_elements?('/VM/TEMPLATE/SECURITY_GROUP_RULE') && !is_hybrid
990
1027
  puts
991
- CLIHelper.print_header(str_h1 % "SECURITY",false)
1028
+ CLIHelper.print_header(str_h1 % 'SECURITY', false)
992
1029
  puts
993
1030
 
994
1031
  CLIHelper::ShowTable.new(nil, self) do
995
- column :NIC_ID, "", :size=>6 do |d|
996
- d["NIC_ID"]
1032
+ column :NIC_ID, '', :size => 6 do |d|
1033
+ d['NIC_ID']
997
1034
  end
998
1035
 
999
- column :NETWORK, "", :left, :size=>25 do |d|
1000
- d["NETWORK"]
1036
+ column :NETWORK, '', :left, :size => 25 do |d|
1037
+ d['NETWORK']
1001
1038
  end
1002
1039
 
1003
- column :SECURITY_GROUPS, "", :left, :size=>47 do |d|
1004
- d["SECURITY_GROUPS"]
1040
+ column :SECURITY_GROUPS, '', :left, :size => 47 do |d|
1041
+ d['SECURITY_GROUPS']
1005
1042
  end
1006
- end.show(sg_nics,{})
1043
+ end.show(sg_nics, {})
1007
1044
 
1008
1045
  puts
1009
1046
 
1010
- CLIHelper.print_header(str_h1 % "SECURITY GROUP TYPE PROTOCOL NETWORK RANGE ",false)
1047
+ # rubocop:disable Metrics/LineLength
1048
+ CLIHelper.print_header(str_h1 % 'SECURITY GROUP TYPE PROTOCOL NETWORK RANGE ', false)
1011
1049
 
1012
1050
  CLIHelper::ShowTable.new(nil, self) do
1013
- column :ID, "", :size=>4 do |d|
1014
- d["SECURITY_GROUP_ID"]
1051
+ column :ID, '', :size => 4 do |d|
1052
+ d['SECURITY_GROUP_ID']
1015
1053
  end
1016
1054
 
1017
- column :NAME, "", :left, :size=>11 do |d|
1018
- d["SECURITY_GROUP_NAME"]
1055
+ column :NAME, '', :left, :size => 11 do |d|
1056
+ d['SECURITY_GROUP_NAME']
1019
1057
  end
1020
1058
 
1021
- column :" ", "", :left, :size=>8 do |d|
1022
- d["RULE_TYPE"]
1059
+ column :" ", '', :left, :size => 8 do |d|
1060
+ d['RULE_TYPE']
1023
1061
  end
1024
1062
 
1025
- column :" ", "", :left, :size=>8 do |d|
1026
- protocol = d["PROTOCOL"]
1063
+ column :" ", '', :left, :size => 8 do |d|
1064
+ protocol = d['PROTOCOL']
1027
1065
 
1028
- if(protocol.upcase == "ICMP")
1029
- icmp = d["ICMP_TYPE"].nil? ? "" : "-#{d["ICMP_TYPE"]}"
1066
+ if protocol.casecmp('ICMP').zero?
1067
+ d['ICMP_TYPE'].nil? ? icmp = '' : icmp = "-#{d['ICMP_TYPE']}"
1030
1068
  protocol += icmp
1031
1069
  end
1032
1070
 
1033
1071
  protocol
1034
1072
  end
1035
1073
 
1036
- column :VNET, "", :size=>4 do |d|
1037
- d["NETWORK_ID"]
1074
+ column :VNET, '', :size => 4 do |d|
1075
+ d['NETWORK_ID']
1038
1076
  end
1039
1077
 
1040
- column :START, "", :left, :donottruncate, :size=>17 do |d|
1041
- network = ""
1078
+ column :START, '', :left, :adjust, :size => 17 do |d|
1079
+ network = ''
1042
1080
 
1043
- if(!d["IP"].nil? && d["IP"] != "")
1044
- network = d["IP"]
1045
- elsif(!d["MAC"].nil? && d["MAC"] != "")
1046
- network = d["MAC"]
1081
+ if !d['IP'].nil? && d['IP'] != ''
1082
+ network = d['IP']
1083
+ elsif !d['MAC'].nil? && d['MAC'] != ''
1084
+ network = d['MAC']
1047
1085
  end
1048
1086
 
1049
1087
  network
1050
1088
  end
1051
1089
 
1052
- column :SIZE, "", :left, :donottruncate, :size=>6 do |d|
1053
- d["SIZE"]
1090
+ column :SIZE, '', :left, :adjust, :size => 6 do |d|
1091
+ d['SIZE']
1054
1092
  end
1055
1093
 
1056
- column :" ", "", :left, :donottruncate, :size=>15 do |d|
1057
- d["RANGE"]
1094
+ column :" ", '', :left, :adjust, :size => 15 do |d|
1095
+ d['RANGE']
1058
1096
  end
1097
+ end.show(
1098
+ [vm_hash['VM']['TEMPLATE']['SECURITY_GROUP_RULE']].flatten, {}
1099
+ )
1100
+ # rubocop:enable Metrics/LineLength
1059
1101
 
1060
- end.show([vm_hash['VM']['TEMPLATE']['SECURITY_GROUP_RULE']].flatten, {})
1061
-
1062
- while vm.has_elements?("/VM/TEMPLATE/SECURITY_GROUP_RULE")
1063
- vm.delete_element("/VM/TEMPLATE/SECURITY_GROUP_RULE")
1064
- end if !options[:all]
1102
+ if !options[:all]
1103
+ while vm.has_elements?('/VM/TEMPLATE/SECURITY_GROUP_RULE')
1104
+ vm.delete_element('/VM/TEMPLATE/SECURITY_GROUP_RULE')
1105
+ end
1106
+ end
1065
1107
  end
1066
1108
 
1067
- if vm.has_elements?("/VM/TEMPLATE/SNAPSHOT")
1109
+ if vm.has_elements?('/VM/TEMPLATE/SNAPSHOT')
1068
1110
  puts
1069
- CLIHelper.print_header(str_h1 % "SNAPSHOTS",false)
1111
+ CLIHelper.print_header(str_h1 % 'SNAPSHOTS', false)
1070
1112
 
1071
1113
  CLIHelper::ShowTable.new(nil, self) do
1072
-
1073
- column :"ID", "", :size=>4 do |d|
1074
- d["SNAPSHOT_ID"] if !d.nil?
1114
+ column :ID, '', :size => 4 do |d|
1115
+ d['SNAPSHOT_ID'] unless d.nil?
1075
1116
  end
1076
1117
 
1077
- column :"TIME", "", :size=>12 do |d|
1078
- OpenNebulaHelper.time_to_str(d["TIME"], false) if !d.nil?
1118
+ column :TIME, '', :size => 12 do |d|
1119
+ OpenNebulaHelper.time_to_str(d['TIME'], false) unless d.nil?
1079
1120
  end
1080
1121
 
1081
- column :"NAME", "", :left, :size=>46 do |d|
1082
- d["NAME"] if !d.nil?
1122
+ column :NAME, '', :left, :size => 46 do |d|
1123
+ d['NAME'] unless d.nil?
1083
1124
  end
1084
1125
 
1085
- column :"HYPERVISOR_ID", "", :left, :size=>15 do |d|
1086
- d["HYPERVISOR_ID"] if !d.nil?
1126
+ column :HYPERVISOR_ID, '', :left, :size => 15 do |d|
1127
+ d['HYPERVISOR_ID'] unless d.nil?
1087
1128
  end
1088
-
1089
1129
  end.show([vm_hash['VM']['TEMPLATE']['SNAPSHOT']].flatten, {})
1090
1130
 
1091
- vm.delete_element("/VM/TEMPLATE/SNAPSHOT")
1131
+ vm.delete_element('/VM/TEMPLATE/SNAPSHOT')
1092
1132
  end
1093
1133
 
1094
- if vm.has_elements?("/VM/HISTORY_RECORDS")
1134
+ if vm.has_elements?('/VM/HISTORY_RECORDS')
1095
1135
  puts
1096
1136
 
1097
- CLIHelper.print_header(str_h1 % "VIRTUAL MACHINE HISTORY",false)
1137
+ CLIHelper.print_header(str_h1 % 'VIRTUAL MACHINE HISTORY', false)
1098
1138
  format_history(vm)
1099
1139
  end
1100
1140
 
1101
- if vm.has_elements?("/VM/USER_TEMPLATE/SCHED_ACTION")
1141
+ if vm.has_elements?('/VM/USER_TEMPLATE/SCHED_ACTION')
1102
1142
  puts
1103
- CLIHelper.print_header(str_h1 % "SCHEDULED ACTIONS",false)
1143
+ CLIHelper.print_header(str_h1 % 'SCHEDULED ACTIONS', false)
1104
1144
 
1105
1145
  CLIHelper::ShowTable.new(nil, self) do
1106
-
1107
- column :"ID", "", :size=>2 do |d|
1108
- d["ID"] if !d.nil?
1146
+ column :ID, '', :size => 2 do |d|
1147
+ d['ID'] unless d.nil?
1109
1148
  end
1110
1149
 
1111
- column :"ACTION", "", :left, :size=>15 do |d|
1112
- d["ACTION"] if !d.nil?
1150
+ column :ACTION, '', :left, :size => 15 do |d|
1151
+ d['ACTION'] unless d.nil?
1113
1152
  end
1114
1153
 
1115
- column :"SCHEDULED", "", :size=>12 do |d|
1116
- OpenNebulaHelper.time_to_str(d["TIME"], false) if !d.nil?
1154
+ column :SCHEDULED, '', :size => 12 do |d|
1155
+ OpenNebulaHelper.time_to_str(d['TIME'], false) \
1156
+ unless d.nil?
1117
1157
  end
1118
1158
 
1119
- column :"REPEAT", "", :size=>20 do |d|
1120
- str_rep = ""
1121
- if !d.nil? && d.key?("REPEAT")
1122
- if d["REPEAT"] == "0"
1123
- str_rep << "Weekly "
1124
- elsif d["REPEAT"] == "1"
1125
- str_rep << "Monthly "
1126
- elsif d["REPEAT"] == "2"
1127
- str_rep << "Yearly "
1128
- elsif d["REPEAT"] == "3"
1129
- str_rep << "Each " << d['DAYS'] << " hours"
1159
+ column :REPEAT, '', :size => 20 do |d|
1160
+ str_rep = ''
1161
+ if !d.nil? && d.key?('REPEAT')
1162
+ if d['REPEAT'] == '0'
1163
+ str_rep << 'Weekly '
1164
+ elsif d['REPEAT'] == '1'
1165
+ str_rep << 'Monthly '
1166
+ elsif d['REPEAT'] == '2'
1167
+ str_rep << 'Yearly '
1168
+ elsif d['REPEAT'] == '3'
1169
+ str_rep << 'Each ' << d['DAYS'] << ' hours'
1130
1170
  end
1131
- if d["REPEAT"] != "3"
1132
- str_rep << d["DAYS"]
1171
+ if d['REPEAT'] != '3'
1172
+ str_rep << d['DAYS']
1133
1173
  end
1134
1174
  end
1135
- str_rep if !d.nil?
1175
+ str_rep unless d.nil?
1136
1176
  end
1137
1177
 
1138
- column :"END", "", :size=>20 do |d|
1139
- str_end = ""
1140
- if !d.nil? && d.key?("END_TYPE")
1141
- if d["END_TYPE"] == "0"
1142
- str_end << "None"
1143
- elsif d["END_TYPE"] == "1"
1144
- str_end << "After " << d["END_VALUE"] << " times"
1145
- elsif d["END_TYPE"] == "2"
1146
- str_end << "On " << OpenNebulaHelper.time_to_str(d["END_VALUE"], false, false, true)
1178
+ column :END, '', :size => 20 do |d|
1179
+ str_end = ''
1180
+ if !d.nil? && d.key?('END_TYPE')
1181
+ if d['END_TYPE'] == '0'
1182
+ str_end << 'None'
1183
+ elsif d['END_TYPE'] == '1'
1184
+ str_end << 'After ' << d['END_VALUE'] << ' times'
1185
+ elsif d['END_TYPE'] == '2'
1186
+ str_end << 'On ' << \
1187
+ OpenNebulaHelper.time_to_str(d['END_VALUE'],
1188
+ false, false,
1189
+ true)
1147
1190
  end
1148
1191
  end
1149
- str_end if !d.nil?
1192
+ str_end unless d.nil?
1150
1193
  end
1151
1194
 
1152
- column :"DONE", "", :size=>12 do |d|
1153
- OpenNebulaHelper.time_to_str(d["DONE"], false) if !d.nil?
1195
+ column :DONE, '', :size => 12 do |d|
1196
+ OpenNebulaHelper.time_to_str(d['DONE'], false) \
1197
+ unless d.nil?
1154
1198
  end
1155
1199
 
1156
- column :"MESSAGE", "", :left, :donottruncate, :size=>35 do |d|
1157
- d["MESSAGE"] if !d.nil?
1200
+ column :MESSAGE, '', :left, :adjust, :size => 35 do |d|
1201
+ d['MESSAGE'] unless d.nil?
1158
1202
  end
1159
- end.show([vm_hash['VM']['USER_TEMPLATE']['SCHED_ACTION']].flatten, {})
1203
+ end.show([vm_hash['VM']['USER_TEMPLATE']['SCHED_ACTION']].flatten,
1204
+ {})
1160
1205
  end
1161
1206
 
1162
- if vm.has_elements?("/VM/USER_TEMPLATE")
1207
+ if vm.has_elements?('/VM/USER_TEMPLATE')
1163
1208
  puts
1164
1209
 
1165
1210
  if !options[:all]
1166
- vm.delete_element("/VM/USER_TEMPLATE/SCHED_ACTION")
1211
+ vm.delete_element('/VM/USER_TEMPLATE/SCHED_ACTION')
1167
1212
  end
1168
1213
 
1169
- CLIHelper.print_header(str_h1 % "USER TEMPLATE",false)
1214
+ CLIHelper.print_header(str_h1 % 'USER TEMPLATE', false)
1170
1215
  puts vm.template_like_str('USER_TEMPLATE')
1171
1216
  end
1172
1217
 
1218
+ if vm.has_elements?('/VM/TEMPLATE/NUMA_NODE')
1219
+ print_numa_nodes([vm.to_hash['VM']['TEMPLATE']['NUMA_NODE']]
1220
+ .flatten)
1221
+ end
1222
+
1223
+ if vm.has_elements?('/VM/TEMPLATE/TOPOLOGY')
1224
+ print_topology([vm.to_hash['VM']['TEMPLATE']['TOPOLOGY']])
1225
+ end
1226
+
1227
+ if !options[:all]
1228
+ while vm.has_elements?('/VM/TEMPLATE/NUMA_NODE')
1229
+ vm.delete_element('/VM/TEMPLATE/NUMA_NODE')
1230
+ end
1231
+ end
1232
+
1233
+ if !options[:all]
1234
+ while vm.has_elements?('/VM/TEMPLATE/TOPOLOGY')
1235
+ vm.delete_element('/VM/TEMPLATE/TOPOLOGY')
1236
+ end
1237
+ end
1238
+
1173
1239
  puts
1174
- CLIHelper.print_header(str_h1 % "VIRTUAL MACHINE TEMPLATE",false)
1240
+ CLIHelper.print_header(str_h1 % 'VIRTUAL MACHINE TEMPLATE', false)
1175
1241
  puts vm.template_str
1176
1242
  end
1177
1243
 
1244
+ def print_numa_nodes(numa_nodes)
1245
+ puts
1246
+ CLIHelper.print_header('NUMA NODES', false)
1247
+ puts
1248
+
1249
+ # rubocop:disable Metrics/LineLength
1250
+ table = CLIHelper::ShowTable.new(nil, self) do
1251
+ column :ID, 'Node ID', :size => 4, :left => false do |d|
1252
+ d['NODE_ID']
1253
+ end
1254
+
1255
+ column :CPUS_IDS, 'Cpus used', :adjust => true, :left => false do |d|
1256
+ d['CPUS']
1257
+ end
1258
+
1259
+ column :MEMORY, 'Memory used', :size => 10, :left => false do |d|
1260
+ OpenNebulaHelper.unit_to_str(d['MEMORY'].to_i, {})
1261
+ end
1262
+
1263
+ column :TOTAL_CPUS, 'Total CPUs', :size => 10, :left => false do |d|
1264
+ d['TOTAL_CPUS']
1265
+ end
1266
+
1267
+ default :ID, :CPUS_IDS, :MEMORY, :TOTAL_CPUS
1268
+ end
1269
+ # rubocop:enable Metrics/LineLength
1270
+
1271
+ table.show(numa_nodes)
1272
+ end
1273
+
1274
+ def print_topology(topology)
1275
+ puts
1276
+ CLIHelper.print_header('TOPOLOGY', false)
1277
+ puts
1278
+
1279
+ table = CLIHelper::ShowTable.new(nil, self) do
1280
+ column :CORES, 'Cores', :size => 6, :left => false do |d|
1281
+ d['CORES']
1282
+ end
1283
+
1284
+ column :SOCKETS, 'Sockets', :size => 8, :left => false do |d|
1285
+ d['SOCKETS']
1286
+ end
1287
+
1288
+ column :THREADS, 'Threads', :size => 8, :left => false do |d|
1289
+ d['THREADS']
1290
+ end
1291
+
1292
+ default :CORES, :SOCKETS, :THREADS
1293
+ end
1294
+
1295
+ table.show(topology)
1296
+ end
1297
+
1178
1298
  def format_history(vm)
1179
- table=CLIHelper::ShowTable.new(nil, self) do
1180
- column :SEQ, "Sequence number", :size=>3 do |d|
1181
- d["SEQ"]
1299
+ table = CLIHelper::ShowTable.new(nil, self) do
1300
+ column :SEQ, 'Sequence number', :size => 3 do |d|
1301
+ d['SEQ']
1182
1302
  end
1183
1303
 
1184
- column :UID, "UID of the user that performed the action",
1185
- :left, :size=>4 do |d|
1186
- if d["UID"] != "-1"
1187
- d["UID"]
1304
+ column :UID, 'UID of the user that performed the action',
1305
+ :left, :size => 4 do |d|
1306
+ if d['UID'] != '-1'
1307
+ d['UID']
1188
1308
  else
1189
- "-"
1309
+ '-'
1190
1310
  end
1191
1311
  end
1192
1312
 
1193
- column :REQ, "Request ID of the action", :left, :size=>5 do |d|
1194
- if d["REQUEST_ID"] != "-1"
1195
- d["REQUEST_ID"]
1313
+ column :REQ, 'Request ID of the action', :left, :size => 5 do |d|
1314
+ if d['REQUEST_ID'] != '-1'
1315
+ d['REQUEST_ID']
1196
1316
  else
1197
- "-"
1317
+ '-'
1198
1318
  end
1199
1319
  end
1200
1320
 
1201
- column :HOST, "Host name of the VM container", :left, :size=>12 do |d|
1202
- d["HOSTNAME"]
1321
+ column :HOST, 'Host name of the VM container',
1322
+ :left, :size => 12 do |d|
1323
+ d['HOSTNAME']
1203
1324
  end
1204
1325
 
1205
- column :"ACTION", "VM state change action", :left, :size=>10 do |d|
1206
- VirtualMachine.get_history_action d["ACTION"]
1326
+ column :ACTION, 'VM state change action', :left, :size => 10 do |d|
1327
+ VirtualMachine.get_history_action d['ACTION']
1207
1328
  end
1208
1329
 
1209
- column :DS, "System Datastore", :size=>4 do |d|
1210
- d["DS_ID"]
1330
+ column :DS, 'System Datastore', :size => 4 do |d|
1331
+ d['DS_ID']
1211
1332
  end
1212
1333
 
1213
- column :START, "Time when the state changed", :size=>15 do |d|
1334
+ column :START, 'Time when the state changed', :size => 15 do |d|
1214
1335
  OpenNebulaHelper.time_to_str(d['STIME'])
1215
1336
  end
1216
1337
 
1217
- column :TIME, "Total time in this state", :size=>11 do |d|
1218
- stime = d["STIME"].to_i
1219
- etime = d["ETIME"]=="0" ? Time.now.to_i : d["ETIME"].to_i
1220
- dtime = etime-stime
1338
+ column :TIME, 'Total time in this state', :size => 11 do |d|
1339
+ stime = d['STIME'].to_i
1340
+ etime = d['ETIME'] == '0' ? Time.now.to_i : d['ETIME'].to_i
1341
+ dtime = etime - stime
1221
1342
  OpenNebulaHelper.period_to_str(dtime, false)
1222
1343
  end
1223
1344
 
1224
- column :PROLOG, "Prolog time for this state", :size=>10 do |d|
1225
- stime = d["PSTIME"].to_i
1226
- if d["PSTIME"]=="0"
1227
- etime=0
1345
+ column :PROLOG, 'Prolog time for this state', :size => 10 do |d|
1346
+ stime = d['PSTIME'].to_i
1347
+ if d['PSTIME'] == '0'
1348
+ etime = 0
1228
1349
  else
1229
- etime = d["PETIME"]=="0" ? Time.now.to_i: d["PETIME"].to_i
1350
+ if d['PETIME'] == '0'
1351
+ etime = Time.now.to_i
1352
+ else
1353
+ etime = d['PETIME'].to_i
1354
+ end
1230
1355
  end
1231
- dtime = etime-stime
1356
+ dtime = etime - stime
1232
1357
  OpenNebulaHelper.short_period_to_str(dtime)
1233
1358
  end
1234
1359
 
1235
- default :SEQ, :UID, :REQ, :HOST, :ACTION, :DS, :START, :TIME, :PROLOG
1360
+ default :SEQ, :UID, :REQ, :HOST, :ACTION, \
1361
+ :DS, :START, :TIME, :PROLOG
1236
1362
  end
1237
1363
 
1238
- vm_hash=vm.to_hash
1364
+ vm_hash = vm.to_hash
1239
1365
 
1240
- history=[vm_hash['VM']['HISTORY_RECORDS']['HISTORY']].flatten
1366
+ history = [vm_hash['VM']['HISTORY_RECORDS']['HISTORY']].flatten
1241
1367
 
1242
1368
  table.show(history)
1243
1369
  end
1244
1370
 
1245
1371
  def format_snapshots(vm)
1246
- table=CLIHelper::ShowTable.new(nil, self) do
1247
- column :AC , "Is active", :left, :size => 2 do |d|
1248
- if d["ACTIVE"] == "YES"
1249
- "=>"
1372
+ table = CLIHelper::ShowTable.new(nil, self) do
1373
+ column :AC, 'Is active', :left, :size => 2 do |d|
1374
+ if d['ACTIVE'] == 'YES'
1375
+ '=>'
1250
1376
  else
1251
- ""
1377
+ ''
1252
1378
  end
1253
1379
  end
1254
- column :ID, "Snapshot ID", :size=>3 do |d|
1255
- d["ID"]
1380
+ column :ID, 'Snapshot ID', :size => 3 do |d|
1381
+ d['ID']
1256
1382
  end
1257
1383
 
1258
- column :DISK, "Disk ID", :size=>4 do |d|
1259
- d["DISK_ID"]
1384
+ column :DISK, 'Disk ID', :size => 4 do |d|
1385
+ d['DISK_ID']
1260
1386
  end
1261
1387
 
1262
- column :PARENT, "Snapshot Parent ID", :size=>6 do |d|
1263
- d["PARENT"]
1388
+ column :PARENT, 'Snapshot Parent ID', :size => 6 do |d|
1389
+ d['PARENT']
1264
1390
  end
1265
1391
 
1266
- column :CHILDREN, "Snapshot Children IDs", :size=>10 do |d|
1267
- d["CHILDREN"]
1392
+ column :CHILDREN, 'Snapshot Children IDs', :size => 10 do |d|
1393
+ d['CHILDREN']
1268
1394
  end
1269
1395
 
1270
- column :SIZE, "", :left, :size=>12 do |d|
1271
- if d["SIZE"]
1396
+ column :SIZE, '', :left, :size => 12 do |d|
1397
+ if d['SIZE']
1272
1398
  size = OpenNebulaHelper.unit_to_str(
1273
- d['SIZE'].to_i,
1274
- {},
1275
- "M"
1276
- )
1399
+ d['SIZE'].to_i,
1400
+ {},
1401
+ 'M'
1402
+ )
1277
1403
  else
1278
- size = "-"
1404
+ size = '-'
1279
1405
  end
1280
1406
 
1281
- if d["MONITOR_SIZE"]
1407
+ if d['MONITOR_SIZE']
1282
1408
  monitor_size = OpenNebulaHelper.unit_to_str(
1283
- d['MONITOR_SIZE'].to_i,
1284
- {},
1285
- "M"
1286
- )
1409
+ d['MONITOR_SIZE'].to_i,
1410
+ {},
1411
+ 'M'
1412
+ )
1287
1413
  else
1288
- monitor_size = "-"
1414
+ monitor_size = '-'
1289
1415
  end
1290
1416
 
1291
1417
  "#{monitor_size}/#{size}"
1292
1418
  end
1293
1419
 
1294
- column :NAME, "Snapshot Name", :left, :size=>32 do |d|
1295
- d["NAME"]
1420
+ column :NAME, 'Snapshot Name', :left, :size => 32 do |d|
1421
+ d['NAME']
1296
1422
  end
1297
1423
 
1298
- column :DATE, "Snapshot creation date", :size=>15 do |d|
1299
- OpenNebulaHelper.time_to_str(d["DATE"])
1424
+ column :DATE, 'Snapshot creation date', :size => 15 do |d|
1425
+ OpenNebulaHelper.time_to_str(d['DATE'])
1300
1426
  end
1301
1427
 
1302
1428
  default :AC, :ID, :DISK, :PARENT, :DATE, :SIZE, :NAME
@@ -1313,19 +1439,23 @@ in the frontend machine.
1313
1439
 
1314
1440
  sshots = [disk['SNAPSHOT']].flatten
1315
1441
  sshots.each do |snapshot|
1316
- data = snapshot.merge({ 'DISK_ID' => disk_id })
1442
+ data = snapshot.merge('DISK_ID' => disk_id)
1317
1443
  snapshots << data
1318
1444
  end
1319
1445
  end
1320
1446
 
1321
1447
  # get monitoring data
1322
1448
  snapshots.each do |snapshot|
1323
- disk_id = snapshot["DISK_ID"]
1324
- snap_id = snapshot["ID"]
1325
- xpath = "MONITORING/SNAPSHOT_SIZE[ID='#{snap_id}' and DISK_ID='#{disk_id}']/SIZE"
1326
- snapshot["MONITOR_SIZE"] = vm[xpath]
1449
+ disk_id = snapshot['DISK_ID']
1450
+ snap_id = snapshot['ID']
1451
+ xpath = "MONITORING/SNAPSHOT_SIZE[ID='#{snap_id}' " \
1452
+ "and DISK_ID='#{disk_id}']/SIZE"
1453
+ snapshot['MONITOR_SIZE'] = vm[xpath]
1327
1454
  end
1328
1455
 
1329
1456
  table.show(snapshots)
1330
1457
  end
1458
+
1331
1459
  end
1460
+
1461
+ # rubocop:enable Naming/UncommunicativeMethodParamName