ibm_power_hmc 0.5.0 → 0.8.1
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.
- checksums.yaml +4 -4
- data/.gitignore +0 -0
- data/.rubocop.yml +0 -0
- data/.rubocop_local.yml +0 -0
- data/CHANGELOG.md +0 -0
- data/Gemfile +0 -0
- data/LICENSE +0 -0
- data/README.md +5 -5
- data/Rakefile +0 -0
- data/ibm_power_hmc.gemspec +0 -0
- data/lib/ibm_power_hmc/connection.rb +209 -1
- data/lib/ibm_power_hmc/job.rb +8 -9
- data/lib/ibm_power_hmc/parser.rb +536 -33
- data/lib/ibm_power_hmc/pcm.rb +0 -0
- data/lib/ibm_power_hmc/version.rb +1 -1
- data/lib/ibm_power_hmc.rb +0 -0
- metadata +7 -7
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: af5d28dd76ae4e57514691d4ab40e023ca18a6a7e71c4691b15c564097920964
|
4
|
+
data.tar.gz: 68a2d511853792668bca5247da9c1910725367ff6fb65ec3f21674953b7be876
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a77ff9b3db36ef774dd64b37d14b5bd57226cbfe31dece9e17c799089c94418d24bea27f2504fbd0ec84d9e3120023a11db1e4619f06e46f92f12c629398d1ff
|
7
|
+
data.tar.gz: 0feb113a298fb117d6ef5cbfaf1fbab3b6a7e72bb69a749c7a36bc0255147d1e0b640879acd1e233780eecb8ef96768efe35e43ea56e3c73ecd7914b63387f09
|
data/.gitignore
CHANGED
File without changes
|
data/.rubocop.yml
CHANGED
File without changes
|
data/.rubocop_local.yml
CHANGED
File without changes
|
data/CHANGELOG.md
CHANGED
File without changes
|
data/Gemfile
CHANGED
File without changes
|
data/LICENSE
CHANGED
File without changes
|
data/README.md
CHANGED
@@ -52,9 +52,9 @@ Listing the logical partitions and virtual I/O servers of each managed system:
|
|
52
52
|
|
53
53
|
```ruby
|
54
54
|
hc.managed_systems.each do |sys|
|
55
|
-
puts sys
|
56
|
-
|
57
|
-
|
55
|
+
puts sys.name
|
56
|
+
hc.lpars(sys.uuid).each { |lpar| puts lpar.name }
|
57
|
+
hc.vioses(sys.uuid).each { |vios| puts vios.name }
|
58
58
|
end
|
59
59
|
```
|
60
60
|
|
@@ -73,9 +73,9 @@ hc.poweroff_lpar(lpar_uuid, { "operation" => "shutdown" })
|
|
73
73
|
Processing events:
|
74
74
|
|
75
75
|
```ruby
|
76
|
-
loop
|
76
|
+
loop do
|
77
77
|
hc.next_events.each do |event|
|
78
|
-
puts event
|
78
|
+
puts event.type
|
79
79
|
end
|
80
80
|
end
|
81
81
|
```
|
data/Rakefile
CHANGED
File without changes
|
data/ibm_power_hmc.gemspec
CHANGED
File without changes
|
@@ -262,6 +262,171 @@ module IbmPowerHmc
|
|
262
262
|
network_adapter("VirtualIOServer", vios_uuid, netadap_uuid)
|
263
263
|
end
|
264
264
|
|
265
|
+
##
|
266
|
+
# @!method sriov_elp_lpar(lpar_uuid, sriov_elp_uuid = nil)
|
267
|
+
# Retrieve one or all SR-IOV ethernet logical ports attached to a logical partition.
|
268
|
+
# @param lpar_uuid [String] UUID of the logical partition.
|
269
|
+
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if omitted).
|
270
|
+
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
271
|
+
def sriov_elp_lpar(lpar_uuid, sriov_elp_uuid = nil)
|
272
|
+
sriov_ethernet_port("LogicalPartition", lpar_uuid, sriov_elp_uuid)
|
273
|
+
end
|
274
|
+
|
275
|
+
##
|
276
|
+
# @!method network_adapter_vios(vios_uuid, sriov_elp_uuid = nil)
|
277
|
+
# Retrieve one or all SR-IOV ethernet logical ports attached to a Virtual I/O Server.
|
278
|
+
# @param vios_uuid [String] UUID of the Virtual I/O Server.
|
279
|
+
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if omitted).
|
280
|
+
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
281
|
+
def sriov_elp_vios(vios_uuid, sriov_elp_uuid = nil)
|
282
|
+
sriov_ethernet_port("VirtualIOServer", vios_uuid, sriov_elp_uuid)
|
283
|
+
end
|
284
|
+
|
285
|
+
##
|
286
|
+
# @!method vnic_dedicated(lpar_uuid, vnic_uuid = nil)
|
287
|
+
# Retrieve one or all dedicated virtual network interface controller (vNIC) attached to a logical partition.
|
288
|
+
# @param lpar_uuid [String] UUID of the logical partition.
|
289
|
+
# @param vnic_uuid [String] UUID of the vNIC to match (returns all vNICs if omitted).
|
290
|
+
# @return [Array<IbmPowerHmc::VirtualNICDedicated>, IbmPowerHmc::VirtualNICDedicated] The list of vNICs.
|
291
|
+
def vnic_dedicated(lpar_uuid, vnic_uuid = nil)
|
292
|
+
if vnic_uuid.nil?
|
293
|
+
method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}/VirtualNICDedicated"
|
294
|
+
response = request(:get, method_url)
|
295
|
+
FeedParser.new(response.body).objects(:VirtualNICDedicated)
|
296
|
+
else
|
297
|
+
method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}/VirtualNICDedicated/#{vnic_uuid}"
|
298
|
+
response = request(:get, method_url)
|
299
|
+
Parser.new(response.body).object(:VirtualNICDedicated)
|
300
|
+
end
|
301
|
+
end
|
302
|
+
|
303
|
+
##
|
304
|
+
# @!method clusters
|
305
|
+
# Retrieve the list of clusters managed by the HMC.
|
306
|
+
# @return [Array<IbmPowerHmc::Cluster>] The list of clusters.
|
307
|
+
def clusters
|
308
|
+
method_url = "/rest/api/uom/Cluster"
|
309
|
+
response = request(:get, method_url)
|
310
|
+
FeedParser.new(response.body).objects(:Cluster)
|
311
|
+
end
|
312
|
+
|
313
|
+
##
|
314
|
+
# @!method cluster(cl_uuid)
|
315
|
+
# Retrieve information about a cluster.
|
316
|
+
# @param cl_uuid [String] The UUID of the cluster.
|
317
|
+
# @return [IbmPowerHmc::Cluster] The cluster.
|
318
|
+
def cluster(cl_uuid)
|
319
|
+
method_url = "/rest/api/uom/Cluster/#{cl_uuid}"
|
320
|
+
response = request(:get, method_url)
|
321
|
+
Parser.new(response.body).object(:Cluster)
|
322
|
+
end
|
323
|
+
|
324
|
+
##
|
325
|
+
# @!method ssps
|
326
|
+
# Retrieve the list of shared storage pools managed by the HMC.
|
327
|
+
# @return [Array<IbmPowerHmc::SharedStoragePool>] The list of shared storage pools.
|
328
|
+
def ssps
|
329
|
+
method_url = "/rest/api/uom/SharedStoragePool"
|
330
|
+
response = request(:get, method_url)
|
331
|
+
FeedParser.new(response.body).objects(:SharedStoragePool)
|
332
|
+
end
|
333
|
+
|
334
|
+
##
|
335
|
+
# @!method ssp(ssp_uuid)
|
336
|
+
# Retrieve information about a shared storage pool.
|
337
|
+
# @param ssp_uuid [String] The UUID of the shared storage pool.
|
338
|
+
# @return [IbmPowerHmc::SharedStoragePool] The shared storage pool.
|
339
|
+
def ssp(ssp_uuid)
|
340
|
+
method_url = "/rest/api/uom/SharedStoragePool/#{ssp_uuid}"
|
341
|
+
response = request(:get, method_url)
|
342
|
+
Parser.new(response.body).object(:SharedStoragePool)
|
343
|
+
end
|
344
|
+
|
345
|
+
##
|
346
|
+
# @!method tiers(group_name = nil)
|
347
|
+
# Retrieve the list of tiers that are part of shared storage pools managed by the HMC.
|
348
|
+
# @param group_name [String] The extended group attributes.
|
349
|
+
# @return [Array<IbmPowerHmc::Tier>] The list of tiers.
|
350
|
+
def tiers(group_name = nil)
|
351
|
+
method_url = "/rest/api/uom/Tier"
|
352
|
+
method_url += "?group=#{group_name}" unless group_name.nil?
|
353
|
+
response = request(:get, method_url)
|
354
|
+
FeedParser.new(response.body).objects(:Tier)
|
355
|
+
end
|
356
|
+
|
357
|
+
##
|
358
|
+
# @!method tier(tier_uuid, ssp_uuid = nil, group_name = nil)
|
359
|
+
# Retrieve information about a tier.
|
360
|
+
# @param tier_uuid [String] The UUID of the tier.
|
361
|
+
# @param ssp_uuid [String] The UUID of the shared storage pool.
|
362
|
+
# @param group_name [String] The extended group attributes.
|
363
|
+
# @return [IbmPowerHmc::Tier] The tier.
|
364
|
+
def tier(tier_uuid, ssp_uuid = nil, group_name = nil)
|
365
|
+
if ssp_uuid.nil?
|
366
|
+
method_url = "/rest/api/uom/Tier/#{tier_uuid}"
|
367
|
+
else
|
368
|
+
method_url = "/rest/api/uom/SharedStoragePool/#{ssp_uuid}/Tier/#{tier_uuid}"
|
369
|
+
end
|
370
|
+
method_url += "?group=#{group_name}" unless group_name.nil?
|
371
|
+
|
372
|
+
response = request(:get, method_url)
|
373
|
+
Parser.new(response.body).object(:Tier)
|
374
|
+
end
|
375
|
+
|
376
|
+
##
|
377
|
+
# @!method templates_summary
|
378
|
+
# Retrieve the list of partition template summaries.
|
379
|
+
# @return [Array<IbmPowerHmc::PartitionTemplateSummary>] The list of partition template summaries.
|
380
|
+
def templates_summary
|
381
|
+
method_url = "/rest/api/templates/PartitionTemplate"
|
382
|
+
response = request(:get, method_url)
|
383
|
+
FeedParser.new(response.body).objects(:PartitionTemplateSummary)
|
384
|
+
end
|
385
|
+
|
386
|
+
##
|
387
|
+
# @!method templates
|
388
|
+
# Retrieve the list of partition templates.
|
389
|
+
# @return [Array<IbmPowerHmc::PartitionTemplate>] The list of partition templates.
|
390
|
+
def templates
|
391
|
+
method_url = "/rest/api/templates/PartitionTemplate?detail=full"
|
392
|
+
response = request(:get, method_url)
|
393
|
+
FeedParser.new(response.body).objects(:PartitionTemplate)
|
394
|
+
end
|
395
|
+
|
396
|
+
##
|
397
|
+
# @!method template(template_uuid)
|
398
|
+
# Retrieve details for a particular partition template.
|
399
|
+
# @param template_uuid [String] UUID of the partition template.
|
400
|
+
# @return [IbmPowerHmc::PartitionTemplate] The partition template.
|
401
|
+
def template(template_uuid)
|
402
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
403
|
+
response = request(:get, method_url)
|
404
|
+
Parser.new(response.body).object(:PartitionTemplate)
|
405
|
+
end
|
406
|
+
|
407
|
+
##
|
408
|
+
# @!method capture_lpar(lpar_uuid, sys_uuid, template_name, sync = true)
|
409
|
+
# Capture partition configuration as template.
|
410
|
+
# @param lpar_uuid [String] The UUID of the logical partition.
|
411
|
+
# @param sys_uuid [String] The UUID of the managed system.
|
412
|
+
# @param template_name [String] The name to be given for the new template.
|
413
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
414
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
415
|
+
def capture_lpar(lpar_uuid, sys_uuid, template_name, sync = true)
|
416
|
+
# Need to include session token in payload so make sure we are logged in
|
417
|
+
logon if @api_session_token.nil?
|
418
|
+
method_url = "/rest/api/templates/PartitionTemplate/do/capture"
|
419
|
+
params = {
|
420
|
+
"TargetUuid" => lpar_uuid,
|
421
|
+
"NewTemplateName" => template_name,
|
422
|
+
"ManagedSystemUuid" => sys_uuid,
|
423
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
424
|
+
}
|
425
|
+
job = HmcJob.new(self, method_url, "Capture", "PartitionTemplate", params)
|
426
|
+
job.run if sync
|
427
|
+
job
|
428
|
+
end
|
429
|
+
|
265
430
|
##
|
266
431
|
# @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
|
267
432
|
# Power on a logical partition.
|
@@ -394,7 +559,31 @@ module IbmPowerHmc
|
|
394
559
|
# No need to sleep as the HMC already waits a bit before returning 204
|
395
560
|
break if response.code != 204 || !wait
|
396
561
|
end
|
397
|
-
FeedParser.new(response.body).objects(:Event)
|
562
|
+
FeedParser.new(response.body).objects(:Event).map do |e|
|
563
|
+
data = e.data.split("/") unless e.data.nil?
|
564
|
+
if !data.nil? && data.length >= 2 && data[-2].eql?("UserTask")
|
565
|
+
e.usertask = usertask(data.last)
|
566
|
+
end
|
567
|
+
e
|
568
|
+
end.compact
|
569
|
+
end
|
570
|
+
|
571
|
+
##
|
572
|
+
# @!method usertask(uuid = true)
|
573
|
+
# Retrieve details of an event of type "user task".
|
574
|
+
# @param uuid [String] UUID of user task.
|
575
|
+
# @return [Hash] Hash of user task attributes.
|
576
|
+
def usertask(uuid)
|
577
|
+
method_url = "/rest/api/ui/UserTask/#{uuid}"
|
578
|
+
response = request(:get, method_url)
|
579
|
+
j = JSON.parse(response.body)
|
580
|
+
if j['status'].eql?("Completed")
|
581
|
+
case j['key']
|
582
|
+
when "TEMPLATE_PARTITION_SAVE", "TEMPLATE_PARTITION_SAVE_AS", "TEMPLATE_PARTITION_CAPTURE"
|
583
|
+
j['template_uuid'] = templates_summary.find { |t| t.name.eql?(j['labelParams'].first) }&.uuid
|
584
|
+
end
|
585
|
+
end
|
586
|
+
j
|
398
587
|
end
|
399
588
|
|
400
589
|
##
|
@@ -518,5 +707,24 @@ module IbmPowerHmc
|
|
518
707
|
Parser.new(response.body).object(:ClientNetworkAdapter)
|
519
708
|
end
|
520
709
|
end
|
710
|
+
|
711
|
+
##
|
712
|
+
# @!method sriov_ethernet_port(vm_type, lpar_uuid, sriov_elp_uuid)
|
713
|
+
# Retrieve one or all SR-IOV Ethernet loical ports attached to a Logical Partition or a Virtual I/O Server.
|
714
|
+
# @param vm_type [String] "LogicalPartition" or "VirtualIOServer".
|
715
|
+
# @param lpar_uuid [String] UUID of the Logical Partition or the Virtual I/O Server.
|
716
|
+
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if nil).
|
717
|
+
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
718
|
+
def sriov_ethernet_port(vm_type, lpar_uuid, sriov_elp_uuid)
|
719
|
+
if sriov_elp_uuid.nil?
|
720
|
+
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort"
|
721
|
+
response = request(:get, method_url)
|
722
|
+
FeedParser.new(response.body).objects(:SRIOVEthernetLogicalPort)
|
723
|
+
else
|
724
|
+
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort/#{sriov_elp_uuid}"
|
725
|
+
response = request(:get, method_url)
|
726
|
+
Parser.new(response.body).object(:SRIOVEthernetLogicalPort)
|
727
|
+
end
|
728
|
+
end
|
521
729
|
end
|
522
730
|
end
|
data/lib/ibm_power_hmc/job.rb
CHANGED
@@ -26,7 +26,7 @@ module IbmPowerHmc
|
|
26
26
|
##
|
27
27
|
# @!method start
|
28
28
|
# Start the job asynchronously.
|
29
|
-
# @return [String] The
|
29
|
+
# @return [String] The URL of the job.
|
30
30
|
def start
|
31
31
|
headers = {
|
32
32
|
:content_type => "application/vnd.ibm.powervm.web+xml; type=JobRequest"
|
@@ -47,7 +47,8 @@ module IbmPowerHmc
|
|
47
47
|
end
|
48
48
|
response = @conn.request(:put, @method_url, headers, doc.to_s)
|
49
49
|
jobresp = Parser.new(response.body).object(:JobResponse)
|
50
|
-
|
50
|
+
# Save the URL of the job (JobID is not sufficient as not all jobs are in uom).
|
51
|
+
@href = jobresp.href.path
|
51
52
|
end
|
52
53
|
|
53
54
|
# @return [Hash] The job results returned by the HMC.
|
@@ -58,13 +59,12 @@ module IbmPowerHmc
|
|
58
59
|
# Return the status of the job.
|
59
60
|
# @return [String] The status of the job.
|
60
61
|
def status
|
61
|
-
raise JobNotStarted unless defined?(@
|
62
|
+
raise JobNotStarted unless defined?(@href)
|
62
63
|
|
63
|
-
method_url = "/rest/api/uom/jobs/#{@id}"
|
64
64
|
headers = {
|
65
65
|
:content_type => "application/vnd.ibm.powervm.web+xml; type=JobRequest"
|
66
66
|
}
|
67
|
-
response = @conn.request(:get,
|
67
|
+
response = @conn.request(:get, @href, headers)
|
68
68
|
jobresp = Parser.new(response.body).object(:JobResponse)
|
69
69
|
@results = jobresp.results
|
70
70
|
jobresp.status
|
@@ -100,17 +100,16 @@ module IbmPowerHmc
|
|
100
100
|
start
|
101
101
|
wait(timeout, poll_interval)
|
102
102
|
ensure
|
103
|
-
delete if defined?(@
|
103
|
+
delete if defined?(@href)
|
104
104
|
end
|
105
105
|
|
106
106
|
##
|
107
107
|
# @!method delete
|
108
108
|
# Delete the job from the HMC.
|
109
109
|
def delete
|
110
|
-
raise JobNotStarted unless defined?(@
|
110
|
+
raise JobNotStarted unless defined?(@href)
|
111
111
|
|
112
|
-
|
113
|
-
@conn.request(:delete, method_url)
|
112
|
+
@conn.request(:delete, @href)
|
114
113
|
# Returns HTTP 204 if ok
|
115
114
|
end
|
116
115
|
end
|
data/lib/ibm_power_hmc/parser.rb
CHANGED
@@ -74,9 +74,6 @@ module IbmPowerHmc
|
|
74
74
|
end
|
75
75
|
end
|
76
76
|
|
77
|
-
private_constant :Parser
|
78
|
-
private_constant :FeedParser
|
79
|
-
|
80
77
|
##
|
81
78
|
# HMC generic K2 non-REST object.
|
82
79
|
# @abstract
|
@@ -116,8 +113,33 @@ module IbmPowerHmc
|
|
116
113
|
attr.nil? ? elem.text&.strip : elem.attributes[attr]
|
117
114
|
end
|
118
115
|
|
119
|
-
def
|
120
|
-
|
116
|
+
def to_s
|
117
|
+
str = +"#{self.class.name}:\n"
|
118
|
+
self.class::ATTRS.each do |varname, _|
|
119
|
+
value = instance_variable_get("@#{varname}")
|
120
|
+
value = value.nil? ? "null" : "'#{value}'"
|
121
|
+
str << " #{varname}: #{value}\n"
|
122
|
+
end
|
123
|
+
str
|
124
|
+
end
|
125
|
+
|
126
|
+
def uuid_from_href(href, index = -1)
|
127
|
+
URI(href).path.split('/')[index]
|
128
|
+
end
|
129
|
+
|
130
|
+
def uuids_from_links(elem, index = -1)
|
131
|
+
xml.get_elements("#{elem}/link[@href]").map do |link|
|
132
|
+
uuid_from_href(link.attributes["href"], index)
|
133
|
+
end.compact
|
134
|
+
end
|
135
|
+
|
136
|
+
def collection_of(name, type)
|
137
|
+
objtype = Module.const_get("IbmPowerHmc::#{type}")
|
138
|
+
xml.get_elements("#{name}/#{type}").map do |elem|
|
139
|
+
objtype.new(elem)
|
140
|
+
end
|
141
|
+
rescue
|
142
|
+
[]
|
121
143
|
end
|
122
144
|
end
|
123
145
|
|
@@ -145,6 +167,12 @@ module IbmPowerHmc
|
|
145
167
|
attr_reader :uuid, :published, :href, :etag, :content_type
|
146
168
|
|
147
169
|
def initialize(entry)
|
170
|
+
if entry.name != "entry"
|
171
|
+
# We are inlined.
|
172
|
+
super(entry)
|
173
|
+
return
|
174
|
+
end
|
175
|
+
|
148
176
|
@uuid = entry.elements["id"]&.text
|
149
177
|
@published = Time.xmlschema(entry.elements["published"]&.text)
|
150
178
|
link = entry.elements["link[@rel='SELF']"]
|
@@ -154,6 +182,13 @@ module IbmPowerHmc
|
|
154
182
|
@content_type = content.attributes["type"]
|
155
183
|
super(content.elements.first)
|
156
184
|
end
|
185
|
+
|
186
|
+
def to_s
|
187
|
+
str = super
|
188
|
+
str << " uuid: '#{uuid}'\n" if defined?(@uuid)
|
189
|
+
str << " published: '#{published}'\n" if defined?(@published)
|
190
|
+
str
|
191
|
+
end
|
157
192
|
end
|
158
193
|
|
159
194
|
# HMC information
|
@@ -161,12 +196,17 @@ module IbmPowerHmc
|
|
161
196
|
ATTRS = {
|
162
197
|
:name => "ManagementConsoleName",
|
163
198
|
:build_level => "VersionInfo/BuildLevel",
|
164
|
-
:version => "BaseVersion"
|
199
|
+
:version => "BaseVersion",
|
200
|
+
:ssh_pubkey => "PublicSSHKeyValue"
|
165
201
|
}.freeze
|
166
202
|
|
167
203
|
def managed_systems_uuids
|
168
|
-
|
169
|
-
|
204
|
+
uuids_from_links("ManagedSystems")
|
205
|
+
end
|
206
|
+
|
207
|
+
def ssh_authkeys
|
208
|
+
xml.get_elements("AuthorizedKeysValue/AuthorizedKey").map do |elem|
|
209
|
+
elem.text&.strip
|
170
210
|
end.compact
|
171
211
|
end
|
172
212
|
end
|
@@ -185,22 +225,50 @@ module IbmPowerHmc
|
|
185
225
|
:avail_cpus => "AssociatedSystemProcessorConfiguration/CurrentAvailableSystemProcessorUnits",
|
186
226
|
:mtype => "MachineTypeModelAndSerialNumber/MachineType",
|
187
227
|
:model => "MachineTypeModelAndSerialNumber/Model",
|
188
|
-
:serial => "MachineTypeModelAndSerialNumber/SerialNumber"
|
228
|
+
:serial => "MachineTypeModelAndSerialNumber/SerialNumber",
|
229
|
+
:vtpm_version => "AssociatedSystemSecurity/VirtualTrustedPlatformModuleVersion",
|
230
|
+
:vtpm_lpars => "AssociatedSystemSecurity/AvailableVirtualTrustedPlatformModulePartitions"
|
189
231
|
}.freeze
|
190
232
|
|
191
|
-
def
|
192
|
-
xml.get_elements("
|
193
|
-
|
233
|
+
def cpu_compat_modes
|
234
|
+
xml.get_elements("AssociatedSystemProcessorConfiguration/SupportedPartitionProcessorCompatibilityModes").map do |elem|
|
235
|
+
elem.text&.strip
|
194
236
|
end.compact
|
195
237
|
end
|
196
238
|
|
239
|
+
def lpars_uuids
|
240
|
+
uuids_from_links("AssociatedLogicalPartitions")
|
241
|
+
end
|
242
|
+
|
197
243
|
def vioses_uuids
|
198
|
-
|
199
|
-
|
200
|
-
|
244
|
+
uuids_from_links("AssociatedVirtualIOServers")
|
245
|
+
end
|
246
|
+
|
247
|
+
def io_adapters
|
248
|
+
collection_of("AssociatedSystemIOConfiguration/IOSlots/IOSlot/RelatedIOAdapter", "IOAdapter")
|
249
|
+
end
|
250
|
+
|
251
|
+
def vswitches_uuids
|
252
|
+
uuids_from_links("AssociatedSystemIOConfiguration/AssociatedSystemVirtualNetwork/VirtualSwitches")
|
253
|
+
end
|
254
|
+
|
255
|
+
def networks_uuids
|
256
|
+
uuids_from_links("AssociatedSystemIOConfiguration/AssociatedSystemVirtualNetwork/VirtualNetworks")
|
201
257
|
end
|
202
258
|
end
|
203
259
|
|
260
|
+
# I/O Adapter information
|
261
|
+
class IOAdapter < AbstractNonRest
|
262
|
+
ATTRS = {
|
263
|
+
:id => "AdapterID",
|
264
|
+
:description => "Description",
|
265
|
+
:name => "DeviceName",
|
266
|
+
:type => "DeviceType",
|
267
|
+
:dr_name => "DynamicReconfigurationConnectorName",
|
268
|
+
:udid => "UniqueDeviceID"
|
269
|
+
}.freeze
|
270
|
+
end
|
271
|
+
|
204
272
|
# Common class for LPAR and VIOS
|
205
273
|
class BasePartition < AbstractRest
|
206
274
|
ATTRS = {
|
@@ -220,16 +288,24 @@ module IbmPowerHmc
|
|
220
288
|
}.freeze
|
221
289
|
|
222
290
|
def sys_uuid
|
223
|
-
|
224
|
-
|
291
|
+
href = singleton("AssociatedManagedSystem", "href")
|
292
|
+
uuid_from_href(href) unless href.nil?
|
225
293
|
end
|
226
294
|
|
227
295
|
def net_adap_uuids
|
228
|
-
|
229
|
-
|
230
|
-
|
296
|
+
uuids_from_links("ClientNetworkAdapters")
|
297
|
+
end
|
298
|
+
|
299
|
+
def lhea_ports
|
300
|
+
collection_of("HostEthernetAdapterLogicalPorts", "HostEthernetAdapterLogicalPort")
|
301
|
+
end
|
302
|
+
|
303
|
+
def sriov_elp_uuids
|
304
|
+
uuids_from_links("SRIOVEthernetLogicalPorts")
|
231
305
|
end
|
232
306
|
|
307
|
+
# Setters
|
308
|
+
|
233
309
|
def name=(name)
|
234
310
|
xml.elements[ATTRS[:name]].text = name
|
235
311
|
@name = name
|
@@ -238,17 +314,94 @@ module IbmPowerHmc
|
|
238
314
|
|
239
315
|
# Logical Partition information
|
240
316
|
class LogicalPartition < BasePartition
|
317
|
+
def vnic_dedicated_uuids
|
318
|
+
uuids_from_links("DedicatedVirtualNICs")
|
319
|
+
end
|
320
|
+
|
321
|
+
def vscsi_client_uuids
|
322
|
+
uuids_from_links("VirtualSCSIClientAdapters")
|
323
|
+
end
|
324
|
+
|
325
|
+
def vfc_client_uuids
|
326
|
+
uuids_from_links("VirtualFibreChannelClientAdapters")
|
327
|
+
end
|
241
328
|
end
|
242
329
|
|
243
330
|
# VIOS information
|
244
331
|
class VirtualIOServer < BasePartition
|
332
|
+
def pvs
|
333
|
+
collection_of("PhysicalVolumes", "PhysicalVolume")
|
334
|
+
end
|
335
|
+
|
336
|
+
def rep
|
337
|
+
elem = xml.elements["MediaRepositories/VirtualMediaRepository"]
|
338
|
+
VirtualMediaRepository.new(elem) unless elem.nil?
|
339
|
+
end
|
340
|
+
|
341
|
+
def vscsi_mappings
|
342
|
+
collection_of("VirtualSCSIMappings", "VirtualSCSIMapping")
|
343
|
+
end
|
344
|
+
|
345
|
+
def vfc_mappings
|
346
|
+
collection_of("VirtualFibreChannelMappings", "VirtualFibreChannelMapping")
|
347
|
+
end
|
348
|
+
end
|
349
|
+
|
350
|
+
# Empty parent class to match K2 schema definition
|
351
|
+
class VirtualSCSIStorage < AbstractNonRest; end
|
352
|
+
|
353
|
+
# Physical Volume information
|
354
|
+
class PhysicalVolume < VirtualSCSIStorage
|
355
|
+
ATTRS = {
|
356
|
+
:location => "LocationCode",
|
357
|
+
:description => "Description",
|
358
|
+
:is_available => "AvailableForUsage",
|
359
|
+
:capacity => "VolumeCapacity",
|
360
|
+
:name => "VolumeName",
|
361
|
+
:is_fc => "IsFibreChannelBacked",
|
362
|
+
:udid => "VolumeUniqueID"
|
363
|
+
}.freeze
|
364
|
+
end
|
365
|
+
|
366
|
+
# Logical Volume information
|
367
|
+
class VirtualDisk < VirtualSCSIStorage
|
368
|
+
ATTRS = {
|
369
|
+
:name => "DiskName",
|
370
|
+
:label => "DiskLabel",
|
371
|
+
:capacity => "DiskCapacity", # In GiB
|
372
|
+
:psize => "PartitionSize",
|
373
|
+
:vg => "VolumeGroup",
|
374
|
+
:udid => "UniqueDeviceID"
|
375
|
+
}.freeze
|
376
|
+
end
|
377
|
+
|
378
|
+
# Virtual CD-ROM information
|
379
|
+
class VirtualOpticalMedia < VirtualSCSIStorage
|
380
|
+
ATTRS = {
|
381
|
+
:name => "MediaName",
|
382
|
+
:udid => "MediaUDID",
|
383
|
+
:mount_opts => "MountType",
|
384
|
+
:size => "Size" # in GiB
|
385
|
+
}.freeze
|
386
|
+
end
|
387
|
+
|
388
|
+
# Virtual Media Repository information
|
389
|
+
class VirtualMediaRepository < AbstractNonRest
|
390
|
+
ATTRS = {
|
391
|
+
:name => "RepositoryName",
|
392
|
+
:size => "RepositorySize" # in GiB
|
393
|
+
}.freeze
|
394
|
+
|
395
|
+
def vopts
|
396
|
+
collection_of("OpticalMedia", "VirtualOpticalMedia")
|
397
|
+
end
|
245
398
|
end
|
246
399
|
|
247
400
|
# Virtual Switch information
|
248
401
|
class VirtualSwitch < AbstractRest
|
249
402
|
ATTRS = {
|
250
403
|
:id => "SwitchID",
|
251
|
-
:mode => "SwitchMode",
|
404
|
+
:mode => "SwitchMode", # "VEB", "VEPA"
|
252
405
|
:name => "SwitchName"
|
253
406
|
}.freeze
|
254
407
|
|
@@ -257,9 +410,7 @@ module IbmPowerHmc
|
|
257
410
|
end
|
258
411
|
|
259
412
|
def networks_uuids
|
260
|
-
|
261
|
-
extract_uuid_from_href(link.attributes["href"])
|
262
|
-
end.compact
|
413
|
+
uuids_from_links("VirtualNetworks")
|
263
414
|
end
|
264
415
|
end
|
265
416
|
|
@@ -274,13 +425,11 @@ module IbmPowerHmc
|
|
274
425
|
|
275
426
|
def vswitch_uuid
|
276
427
|
href = singleton("AssociatedSwitch", "href")
|
277
|
-
|
428
|
+
uuid_from_href(href) unless href.nil?
|
278
429
|
end
|
279
430
|
|
280
431
|
def lpars_uuids
|
281
|
-
|
282
|
-
extract_uuid_from_href(link.attributes["href"])
|
283
|
-
end.compact
|
432
|
+
uuids_from_links("ConnectedPartitions")
|
284
433
|
end
|
285
434
|
end
|
286
435
|
|
@@ -299,26 +448,380 @@ module IbmPowerHmc
|
|
299
448
|
ATTRS = ATTRS.merge({
|
300
449
|
:macaddr => "MACAddress",
|
301
450
|
:vswitch_id => "VirtualSwitchID",
|
302
|
-
:vlan_id => "PortVLANID"
|
451
|
+
:vlan_id => "PortVLANID",
|
452
|
+
:location => "LocationCode"
|
303
453
|
}.freeze)
|
304
454
|
|
305
455
|
def vswitch_uuid
|
306
|
-
|
307
|
-
extract_uuid_from_href(href)
|
456
|
+
uuids_from_links("AssociatedVirtualSwitch").first
|
308
457
|
end
|
309
458
|
end
|
310
459
|
|
311
460
|
# Client Network Adapter information
|
312
461
|
class ClientNetworkAdapter < VirtualEthernetAdapter
|
313
462
|
def networks_uuids
|
314
|
-
|
315
|
-
|
463
|
+
uuids_from_links("VirtualNetworks")
|
464
|
+
end
|
465
|
+
end
|
466
|
+
|
467
|
+
# LP-HEA information
|
468
|
+
class EthernetBackingDevice < IOAdapter; end
|
469
|
+
class HostEthernetAdapterLogicalPort < EthernetBackingDevice
|
470
|
+
ATTRS = ATTRS.merge({
|
471
|
+
:macaddr => "MACAddress",
|
472
|
+
:port_id => "LogicalPortID",
|
473
|
+
:state => "PortState",
|
474
|
+
:location => "HEALogicalPortPhysicalLocation"
|
475
|
+
}.freeze)
|
476
|
+
end
|
477
|
+
|
478
|
+
# Virtual NIC dedicated information
|
479
|
+
class VirtualNICDedicated < VirtualIOAdapter
|
480
|
+
ATTRS = ATTRS.merge({
|
481
|
+
:location => "DynamicReconfigurationConnectorName", # overrides VirtualIOAdapter
|
482
|
+
:macaddr => "Details/MACAddress",
|
483
|
+
:os_devname => "Details/OSDeviceName",
|
484
|
+
:port_vlan_id => "Details/PortVLANID"
|
485
|
+
}.freeze)
|
486
|
+
end
|
487
|
+
|
488
|
+
# SR-IOV Configured Logical Port information
|
489
|
+
class SRIOVConfiguredLogicalPort < AbstractRest
|
490
|
+
ATTRS = {
|
491
|
+
:port_id => "LogicalPortID",
|
492
|
+
:port_vlan_id => "PortVLANID",
|
493
|
+
:location => "LocationCode",
|
494
|
+
:dr_name => "DynamicReconfigurationConnectorName",
|
495
|
+
:devname => "DeviceName",
|
496
|
+
:capacity => "ConfiguredCapacity"
|
497
|
+
}.freeze
|
498
|
+
|
499
|
+
def lpars_uuids
|
500
|
+
uuids_from_links("AssociatedLogicalPartitions")
|
501
|
+
end
|
502
|
+
end
|
503
|
+
|
504
|
+
# SR-IOV Ethernet Logical Port information
|
505
|
+
class SRIOVEthernetLogicalPort < SRIOVConfiguredLogicalPort
|
506
|
+
ATTRS = ATTRS.merge({
|
507
|
+
:macaddr => "MACAddress"
|
508
|
+
}.freeze)
|
509
|
+
end
|
510
|
+
|
511
|
+
# Virtual SCSI mapping information
|
512
|
+
class VirtualSCSIMapping < AbstractNonRest
|
513
|
+
def lpar_uuid
|
514
|
+
href = singleton("AssociatedLogicalPartition", "href")
|
515
|
+
uuid_from_href(href) unless href.nil?
|
516
|
+
end
|
517
|
+
|
518
|
+
def client
|
519
|
+
elem = xml.elements["ClientAdapter"]
|
520
|
+
VirtualSCSIClientAdapter.new(elem) unless elem.nil?
|
521
|
+
end
|
522
|
+
|
523
|
+
def server
|
524
|
+
elem = xml.elements["ServerAdapter"]
|
525
|
+
VirtualSCSIServerAdapter.new(elem) unless elem.nil?
|
526
|
+
end
|
527
|
+
|
528
|
+
def storage
|
529
|
+
# Possible storage types are:
|
530
|
+
# LogicalUnit, PhysicalVolume, VirtualDisk, VirtualOpticalMedia
|
531
|
+
elem = xml.elements["Storage/*[1]"]
|
532
|
+
Module.const_get("IbmPowerHmc::#{elem.name}").new(elem) unless elem.nil?
|
533
|
+
end
|
534
|
+
|
535
|
+
def device
|
536
|
+
# Possible backing device types are:
|
537
|
+
# LogicalVolumeVirtualTargetDevice, PhysicalVolumeVirtualTargetDevice,
|
538
|
+
# SharedStoragePoolLogicalUnitVirtualTargetDevice, VirtualOpticalTargetDevice
|
539
|
+
elem = xml.elements["TargetDevice/*[1]"]
|
540
|
+
Module.const_get("IbmPowerHmc::#{elem.name}").new(elem) unless elem.nil?
|
541
|
+
end
|
542
|
+
end
|
543
|
+
|
544
|
+
# Virtual SCSI adapter (common class for Client and Server)
|
545
|
+
class VirtualSCSIAdapter < VirtualIOAdapter
|
546
|
+
ATTRS = ATTRS.merge({
|
547
|
+
:name => "AdapterName",
|
548
|
+
:backdev => "BackingDeviceName",
|
549
|
+
:remote_backdev => "RemoteBackingDeviceName",
|
550
|
+
:remote_lpar_id => "RemoteLogicalPartitionID",
|
551
|
+
:remote_slot => "RemoteSlotNumber",
|
552
|
+
:server_location => "ServerLocationCode",
|
553
|
+
:udid => "UniqueDeviceID"
|
554
|
+
}.freeze)
|
555
|
+
end
|
556
|
+
|
557
|
+
# Virtual SCSI client adapter information
|
558
|
+
class VirtualSCSIClientAdapter < VirtualSCSIAdapter
|
559
|
+
def server
|
560
|
+
elem = xml.elements["ServerAdapter"]
|
561
|
+
VirtualSCSIServerAdapter.new(elem) unless elem.nil?
|
562
|
+
end
|
563
|
+
|
564
|
+
def vios_uuid
|
565
|
+
href = singleton("ConnectingPartition", "href")
|
566
|
+
uuid_from_href(href) unless href.nil?
|
567
|
+
end
|
568
|
+
end
|
569
|
+
|
570
|
+
# Virtual SCSI server adapter information
|
571
|
+
class VirtualSCSIServerAdapter < VirtualSCSIAdapter; end
|
572
|
+
|
573
|
+
# Virtual target device information
|
574
|
+
class VirtualTargetDevice < AbstractNonRest
|
575
|
+
ATTRS = {
|
576
|
+
:lun => "LogicalUnitAddress",
|
577
|
+
:parent => "ParentName",
|
578
|
+
:target => "TargetName",
|
579
|
+
:udid => "UniqueDeviceID"
|
580
|
+
}.freeze
|
581
|
+
end
|
582
|
+
|
583
|
+
# LV backing device information
|
584
|
+
class LogicalVolumeVirtualTargetDevice < VirtualTargetDevice; end
|
585
|
+
|
586
|
+
# PV backing device information
|
587
|
+
class PhysicalVolumeVirtualTargetDevice < VirtualTargetDevice; end
|
588
|
+
|
589
|
+
# LU backing device information
|
590
|
+
class SharedStoragePoolLogicalUnitVirtualTargetDevice < VirtualTargetDevice
|
591
|
+
ATTRS = ATTRS.merge({
|
592
|
+
:cluster_id => "ClusterID",
|
593
|
+
:path => "PathName",
|
594
|
+
:raid_level => "RAIDLevel"
|
595
|
+
}.freeze)
|
596
|
+
end
|
597
|
+
|
598
|
+
# Virtual CD backing device information
|
599
|
+
class VirtualOpticalTargetDevice < VirtualTargetDevice
|
600
|
+
def media
|
601
|
+
elem = xml.elements["VirtualOpticalMedia"]
|
602
|
+
VirtualOpticalMedia.new(elem) unless elem.nil?
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
# VFC mapping information
|
607
|
+
class VirtualFibreChannelMapping < AbstractNonRest
|
608
|
+
def lpar_uuid
|
609
|
+
href = singleton("AssociatedLogicalPartition", "href")
|
610
|
+
uuid_from_href(href) unless href.nil?
|
611
|
+
end
|
612
|
+
|
613
|
+
def client
|
614
|
+
elem = xml.elements["ClientAdapter"]
|
615
|
+
VirtualFibreChannelClientAdapter.new(elem) unless elem.nil?
|
616
|
+
end
|
617
|
+
|
618
|
+
def server
|
619
|
+
elem = xml.elements["ServerAdapter"]
|
620
|
+
VirtualFibreChannelServerAdapter.new(elem) unless elem.nil?
|
621
|
+
end
|
622
|
+
|
623
|
+
def port
|
624
|
+
elem = xml.elements["Port"]
|
625
|
+
PhysicalFibreChannelPort.new(elem) unless elem.nil?
|
626
|
+
end
|
627
|
+
end
|
628
|
+
|
629
|
+
# VFC adapter information
|
630
|
+
class VirtualFibreChannelAdapter < VirtualIOAdapter
|
631
|
+
ATTRS = ATTRS.merge({
|
632
|
+
:name => "AdapterName",
|
633
|
+
:lpar_id => "ConnectingPartitionID",
|
634
|
+
:slot => "ConnectingVirtualSlotNumber",
|
635
|
+
:udid => "UniqueDeviceID"
|
636
|
+
}.freeze)
|
637
|
+
|
638
|
+
def lpar_uuid
|
639
|
+
href = singleton("ConnectingPartition", "href")
|
640
|
+
uuid_from_href(href) unless href.nil?
|
641
|
+
end
|
642
|
+
end
|
643
|
+
|
644
|
+
# VFC client information
|
645
|
+
class VirtualFibreChannelClientAdapter < VirtualFibreChannelAdapter
|
646
|
+
def nport_loggedin
|
647
|
+
collection_of("NportLoggedInStatus", "VirtualFibreChannelNPortLoginStatus")
|
648
|
+
end
|
649
|
+
|
650
|
+
def server
|
651
|
+
elem = xml.elements["ServerAdapter"]
|
652
|
+
VirtualFibreChannelServerAdapter.new(elem) unless elem.nil?
|
653
|
+
end
|
654
|
+
|
655
|
+
def wwpns
|
656
|
+
singleton("WWPNs")&.split
|
657
|
+
end
|
658
|
+
|
659
|
+
def os_disks
|
660
|
+
xml.get_elements("OperatingSystemDisks/OperatingSystemDisk/Name").map do |elem|
|
661
|
+
elem.text&.strip
|
316
662
|
end.compact
|
317
663
|
end
|
318
664
|
end
|
319
665
|
|
666
|
+
# VFC port status
|
667
|
+
class VirtualFibreChannelNPortLoginStatus < AbstractNonRest
|
668
|
+
ATTRS = {
|
669
|
+
:wwpn => "WWPN",
|
670
|
+
:wwpn_status => "WWPNStatus",
|
671
|
+
:loggedin_by => "LoggedInBy",
|
672
|
+
:reason => "StatusReason"
|
673
|
+
}.freeze
|
674
|
+
end
|
675
|
+
|
676
|
+
# VFC server information
|
677
|
+
class VirtualFibreChannelServerAdapter < VirtualFibreChannelAdapter
|
678
|
+
ATTRS = ATTRS.merge({
|
679
|
+
:map_port => "MapPort"
|
680
|
+
}.freeze)
|
681
|
+
|
682
|
+
def port
|
683
|
+
elem = xml.elements["PhysicalPort"]
|
684
|
+
PhysicalFibreChannelPort.new(elem) unless elem.nil?
|
685
|
+
end
|
686
|
+
end
|
687
|
+
|
688
|
+
# FC port information
|
689
|
+
class PhysicalFibreChannelPort < AbstractNonRest
|
690
|
+
ATTRS = {
|
691
|
+
:location => "LocationCode",
|
692
|
+
:name => "PortName",
|
693
|
+
:udid => "UniqueDeviceID",
|
694
|
+
:wwpn => "WWPN",
|
695
|
+
:wwnn => "WWNN",
|
696
|
+
:avail_ports => "AvailablePorts",
|
697
|
+
:total_ports => "TotalPorts"
|
698
|
+
}.freeze
|
699
|
+
|
700
|
+
def pvs
|
701
|
+
collection_of("PhysicalVolumes", "PhysicalVolume")
|
702
|
+
end
|
703
|
+
end
|
704
|
+
|
705
|
+
# Cluster information
|
706
|
+
class Cluster < AbstractRest
|
707
|
+
ATTRS = {
|
708
|
+
:name => "ClusterName",
|
709
|
+
:id => "ClusterID",
|
710
|
+
:tier_capable => "ClusterCapabilities/IsTierCapable"
|
711
|
+
}.freeze
|
712
|
+
|
713
|
+
def repopvs
|
714
|
+
collection_of("RepositoryDisk", "PhysicalVolume")
|
715
|
+
end
|
716
|
+
|
717
|
+
def ssp_uuid
|
718
|
+
href = singleton("ClusterSharedStoragePool", "href")
|
719
|
+
uuid_from_href(href) unless href.nil?
|
720
|
+
end
|
721
|
+
|
722
|
+
def nodes
|
723
|
+
collection_of("Node", "Node")
|
724
|
+
end
|
725
|
+
end
|
726
|
+
|
727
|
+
# Cluster node information
|
728
|
+
class Node < AbstractNonRest
|
729
|
+
ATTRS = {
|
730
|
+
:hostname => "HostName",
|
731
|
+
:lpar_id => "PartitionID",
|
732
|
+
:state => "State",
|
733
|
+
:ioslevel => "VirtualIOServerLevel"
|
734
|
+
}.freeze
|
735
|
+
|
736
|
+
def vios_uuid
|
737
|
+
href = singleton("VirtualIOServer", "href")
|
738
|
+
uuid_from_href(href) unless href.nil?
|
739
|
+
end
|
740
|
+
end
|
741
|
+
|
742
|
+
# SSP information
|
743
|
+
class SharedStoragePool < AbstractRest
|
744
|
+
ATTRS = {
|
745
|
+
:id => "SharedStoragePoolID",
|
746
|
+
:name => "StoragePoolName",
|
747
|
+
:udid => "UniqueDeviceID",
|
748
|
+
:capacity => "Capacity",
|
749
|
+
:free_space => "FreeSpace",
|
750
|
+
:overcommit => "OverCommitSpace",
|
751
|
+
:total_lu_size => "TotalLogicalUnitSize",
|
752
|
+
:alert_threshold => "AlertThreshold"
|
753
|
+
}.freeze
|
754
|
+
|
755
|
+
def cluster_uuid
|
756
|
+
href = singleton("AssociatedCluster", "href")
|
757
|
+
uuid_from_href(href) unless href.nil?
|
758
|
+
end
|
759
|
+
|
760
|
+
def pvs
|
761
|
+
collection_of("PhysicalVolumes", "PhysicalVolume")
|
762
|
+
end
|
763
|
+
|
764
|
+
def tiers_uuids
|
765
|
+
uuids_from_links("AssociatedTiers")
|
766
|
+
end
|
767
|
+
|
768
|
+
def lus
|
769
|
+
collection_of("LogicalUnits", "LogicalUnit")
|
770
|
+
end
|
771
|
+
end
|
772
|
+
|
773
|
+
# SSP tier information
|
774
|
+
class Tier < AbstractRest
|
775
|
+
ATTRS = {
|
776
|
+
:name => "Name",
|
777
|
+
:udid => "UniqueDeviceID",
|
778
|
+
:type => "Type",
|
779
|
+
:capacity => "Capacity",
|
780
|
+
:total_lu_size => "TotalLogicalUnitSize",
|
781
|
+
:is_default => "IsDefault",
|
782
|
+
:free_space => "FreeSpace"
|
783
|
+
}.freeze
|
784
|
+
|
785
|
+
def ssp_uuid
|
786
|
+
href = singleton("AssociatedSharedStoragePool", "href")
|
787
|
+
uuid_from_href(href) unless href.nil?
|
788
|
+
end
|
789
|
+
|
790
|
+
def lus_uuids
|
791
|
+
uuids_from_links("AssociatedLogicalUnits")
|
792
|
+
end
|
793
|
+
end
|
794
|
+
|
795
|
+
# SSP LU information
|
796
|
+
class LogicalUnit < VirtualSCSIStorage
|
797
|
+
ATTRS = {
|
798
|
+
:name => "UnitName",
|
799
|
+
:capacity => "UnitCapacity",
|
800
|
+
:udid => "UniqueDeviceID",
|
801
|
+
:thin => "ThinDevice",
|
802
|
+
:type => "LogicalUnitType",
|
803
|
+
:in_use => "InUse"
|
804
|
+
}.freeze
|
805
|
+
end
|
806
|
+
|
807
|
+
class PartitionTemplateSummary < AbstractRest
|
808
|
+
ATTRS = {
|
809
|
+
:name => "partitionTemplateName"
|
810
|
+
}.freeze
|
811
|
+
end
|
812
|
+
|
813
|
+
class PartitionTemplate < AbstractRest
|
814
|
+
ATTRS = {
|
815
|
+
:name => "partitionTemplateName",
|
816
|
+
:description => "description",
|
817
|
+
:os => "logicalPartitionConfig/osVersion",
|
818
|
+
:memory => "logicalPartitionConfig/memoryConfiguration/currMemory"
|
819
|
+
}.freeze
|
820
|
+
end
|
821
|
+
|
320
822
|
# HMC Event
|
321
823
|
class Event < AbstractRest
|
824
|
+
attr_accessor :usertask
|
322
825
|
ATTRS = {
|
323
826
|
:id => "EventID",
|
324
827
|
:type => "EventType",
|
data/lib/ibm_power_hmc/pcm.rb
CHANGED
File without changes
|
data/lib/ibm_power_hmc.rb
CHANGED
File without changes
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ibm_power_hmc
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.8.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- IBM Power
|
8
|
-
autorequire:
|
8
|
+
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2022-02-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -25,7 +25,7 @@ dependencies:
|
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '2.1'
|
27
27
|
description: A Ruby gem for interacting with the IBM Hardware Management Console (HMC).
|
28
|
-
email:
|
28
|
+
email:
|
29
29
|
executables: []
|
30
30
|
extensions: []
|
31
31
|
extra_rdoc_files: []
|
@@ -55,7 +55,7 @@ metadata:
|
|
55
55
|
homepage_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby
|
56
56
|
source_code_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby
|
57
57
|
changelog_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby/blob/master/CHANGELOG.md
|
58
|
-
post_install_message:
|
58
|
+
post_install_message:
|
59
59
|
rdoc_options: []
|
60
60
|
require_paths:
|
61
61
|
- lib
|
@@ -70,8 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
70
70
|
- !ruby/object:Gem::Version
|
71
71
|
version: '0'
|
72
72
|
requirements: []
|
73
|
-
rubygems_version: 3.1.
|
74
|
-
signing_key:
|
73
|
+
rubygems_version: 3.1.2
|
74
|
+
signing_key:
|
75
75
|
specification_version: 4
|
76
76
|
summary: IBM Power HMC Ruby gem.
|
77
77
|
test_files: []
|