ibm_power_hmc 0.4.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: c19305b95374164ab2a6e6168a4a292ea0666065cbcbe8f05dea30483b622055
4
- data.tar.gz: be50d67e7c462cc17f20be3f643c6029e4f2ba7d43f872f1821bbe428f0e11fe
3
+ metadata.gz: caf9b3a9dcb79bb47bbe628afda5c77ecf94ec6627dc469b8e1a2f564196c8a3
4
+ data.tar.gz: 031cf0f7f98a8800203281e6d7b27b83adce11651363ac3ce01d06d8c9a69865
5
5
  SHA512:
6
- metadata.gz: 1191f64dd2f5c550d25a372b4a0502dd4e7b5a8e779a2dacdf079a22f3a8b8092af6e4ddff514b0e06dddf8239985033034959e385f951f2f535f092866cbd12
7
- data.tar.gz: d6af992547d99624f59e6eb5ec3404768c91d1b9c9809e9542966fee15b4a350e8b8803e6fd25a597c48699b630171b7cae8327108f0ec6616e2329c5441bf1c
6
+ metadata.gz: 305a5f34bb64be2962d639b38df77fed119de4bb4800db6c0c3d0343af5ac04b336020d3ad0c58a91176ed8601d45a06ab0c6e439592accb5759a7e6924739d2
7
+ data.tar.gz: 40e6fa63028817a280c26d75a7e0777cb3da60a801ec9dc742fa99405da1fb23343bc79e4b2d81ea145047a6ed1ad06ce72dd681bdc544a685b672a3b92b1805
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
- puts hc.lpars(sys.uuid)
57
- puts hc.vioses(sys.uuid)
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
  ```
@@ -157,7 +157,6 @@ module IbmPowerHmc
157
157
  # @param new_name [String] The new name of the logical partition.
158
158
  def rename_lpar(lpar_uuid, new_name)
159
159
  method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}"
160
-
161
160
  modify_object(method_url) { |lpar| lpar.name = new_name }
162
161
  end
163
162
 
@@ -197,12 +196,58 @@ module IbmPowerHmc
197
196
  Parser.new(response.body).object(:VirtualIOServer)
198
197
  end
199
198
 
199
+ ##
200
+ # @!method virtual_switches(sys_uuid)
201
+ # Retrieve the list of virtual switches from a specified managed system.
202
+ # @param sys_uuid [String] The UUID of the managed system.
203
+ # @return [Array<IbmPowerHmc::VirtualSwitch>] The list of virtual switches.
204
+ def virtual_switches(sys_uuid)
205
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch"
206
+ response = request(:get, method_url)
207
+ FeedParser.new(response.body).objects(:VirtualSwitch)
208
+ end
209
+
210
+ ##
211
+ # @!method virtual_switch(vswitch_uuid, sys_uuid)
212
+ # Retrieve information about a virtual switch.
213
+ # @param vswitch_uuid [String] The UUID of the virtual switch.
214
+ # @param sys_uuid [String] The UUID of the managed system.
215
+ # @return [IbmPowerHmc::VirtualSwitch] The virtual switch.
216
+ def virtual_switch(vswitch_uuid, sys_uuid)
217
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch/#{vswitch_uuid}"
218
+ response = request(:get, method_url)
219
+ Parser.new(response.body).object(:VirtualSwitch)
220
+ end
221
+
222
+ ##
223
+ # @!method virtual_networks(sys_uuid)
224
+ # Retrieve the list of virtual networks from a specified managed system.
225
+ # @param sys_uuid [String] The UUID of the managed system.
226
+ # @return [Array<IbmPowerHmc::VirtualNetwork>] The list of virtual networks.
227
+ def virtual_networks(sys_uuid)
228
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualNetwork"
229
+ response = request(:get, method_url)
230
+ FeedParser.new(response.body).objects(:VirtualNetwork)
231
+ end
232
+
233
+ ##
234
+ # @!method virtual_network(vnet_uuid, sys_uuid)
235
+ # Retrieve information about a virtual network.
236
+ # @param vnet_uuid [String] The UUID of the virtual network.
237
+ # @param sys_uuid [String] The UUID of the managed system.
238
+ # @return [IbmPowerHmc::VirtualNetwork] The virtual network.
239
+ def virtual_network(vnet_uuid, sys_uuid)
240
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualNetwork/#{vnet_uuid}"
241
+ response = request(:get, method_url)
242
+ Parser.new(response.body).object(:VirtualNetwork)
243
+ end
244
+
200
245
  ##
201
246
  # @!method network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
202
247
  # Retrieve one or all virtual ethernet network adapters attached to a logical partition.
203
248
  # @param lpar_uuid [String] UUID of the logical partition.
204
249
  # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if omitted).
205
- # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
250
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>, IbmPowerHmc::ClientNetworkAdapter] The list of network adapters.
206
251
  def network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
207
252
  network_adapter("LogicalPartition", lpar_uuid, netadap_uuid)
208
253
  end
@@ -212,11 +257,176 @@ module IbmPowerHmc
212
257
  # Retrieve one or all virtual ethernet network adapters attached to a Virtual I/O Server.
213
258
  # @param vios_uuid [String] UUID of the Virtual I/O Server.
214
259
  # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if omitted).
215
- # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
260
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>, IbmPowerHmc::ClientNetworkAdapter] The list of network adapters.
216
261
  def network_adapter_vios(vios_uuid, netadap_uuid = nil)
217
262
  network_adapter("VirtualIOServer", vios_uuid, netadap_uuid)
218
263
  end
219
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
+
220
430
  ##
221
431
  # @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
222
432
  # Power on a logical partition.
@@ -335,29 +545,6 @@ module IbmPowerHmc
335
545
  job
336
546
  end
337
547
 
338
- ##
339
- # @!method virtual_switches(sys_uuid)
340
- # Retrieve the list of virtual switches from a specified managed system.
341
- # @param sys_uuid [String] The UUID of the managed system.
342
- # @return [Array<IbmPowerHmc::VirtualSwitch>] The list of virtual switches.
343
- def virtual_switches(sys_uuid)
344
- method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch"
345
- response = request(:get, method_url)
346
- FeedParser.new(response.body).objects(:VirtualSwitch)
347
- end
348
-
349
- ##
350
- # @!method virtual_switch(vswitch_uuid, sys_uuid)
351
- # Retrieve information about a virtual switch.
352
- # @param vswitch_uuid [String] The UUID of the virtual switch.
353
- # @param sys_uuid [String] The UUID of the managed system.
354
- # @return [IbmPowerHmc::VirtualSwitch] The virtual switch.
355
- def virtual_switch(vswitch_uuid, sys_uuid)
356
- method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch/#{vswitch_uuid}"
357
- response = request(:get, method_url)
358
- Parser.new(response.body).object(:VirtualSwitch)
359
- end
360
-
361
548
  ##
362
549
  # @!method next_events(wait = true)
363
550
  # Retrieve a list of events that occured since last call.
@@ -372,7 +559,31 @@ module IbmPowerHmc
372
559
  # No need to sleep as the HMC already waits a bit before returning 204
373
560
  break if response.code != 204 || !wait
374
561
  end
375
- FeedParser.new(response.body).objects(:Event)
562
+ FeedParser.new(response.body).objects(:Event).map do |e|
563
+ data = e.data.split("/")
564
+ if 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.select { |t| t.name.eql?(j['labelParams'].first) }.first&.uuid
584
+ end
585
+ end
586
+ j
376
587
  end
377
588
 
378
589
  ##
@@ -479,21 +690,41 @@ module IbmPowerHmc
479
690
  end
480
691
 
481
692
  ##
482
- # @!method network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
693
+ # @!method network_adapter(vm_type, lpar_uuid, netadap_uuid)
483
694
  # Retrieve one or all virtual ethernet network adapters attached to a Logical Partition or a Virtual I/O Server.
484
- # @param vm_type [String] "Logical Partition" or "VirtualIOServer".
695
+ # @param vm_type [String] "LogicalPartition" or "VirtualIOServer".
485
696
  # @param lpar_uuid [String] UUID of the Logical Partition or the Virtual I/O Server.
486
697
  # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if nil).
487
- # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
698
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>, IbmPowerHmc::ClientNetworkAdapter] The list of network adapters.
488
699
  def network_adapter(vm_type, lpar_uuid, netadap_uuid)
489
700
  if netadap_uuid.nil?
490
701
  method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter"
702
+ response = request(:get, method_url)
703
+ FeedParser.new(response.body).objects(:ClientNetworkAdapter)
491
704
  else
492
705
  method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter/#{netadap_uuid}"
706
+ response = request(:get, method_url)
707
+ Parser.new(response.body).object(:ClientNetworkAdapter)
493
708
  end
709
+ end
494
710
 
495
- response = request(:get, method_url)
496
- Parser.new(response.body).object(:ClientNetworkAdapter)
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
497
728
  end
498
729
  end
499
730
  end
@@ -26,7 +26,7 @@ module IbmPowerHmc
26
26
  ##
27
27
  # @!method start
28
28
  # Start the job asynchronously.
29
- # @return [String] The ID of the job.
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
- @id = jobresp.id
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?(@id)
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, method_url, headers)
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?(@id)
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?(@id)
110
+ raise JobNotStarted unless defined?(@href)
111
111
 
112
- method_url = "/rest/api/uom/jobs/#{@id}"
113
- @conn.request(:delete, method_url)
112
+ @conn.request(:delete, @href)
114
113
  # Returns HTTP 204 if ok
115
114
  end
116
115
  end
@@ -78,39 +78,16 @@ module IbmPowerHmc
78
78
  private_constant :FeedParser
79
79
 
80
80
  ##
81
- # HMC generic K2 XML entry.
82
- # Encapsulate data for a single object.
83
- # The XML looks like this:
84
- # <entry>
85
- # <id>uuid</id>
86
- # <published>timestamp</published>
87
- # <etag:etag>ETag</etag:etag>
88
- # <content type="type">
89
- # <!-- actual content here -->
90
- # </content>
91
- # </entry>
92
- #
81
+ # HMC generic K2 non-REST object.
93
82
  # @abstract
94
- # @attr_reader [String] uuid The UUID of the object contained in the entry.
95
- # @attr_reader [URI::HTTPS] href The URL of the object itself.
96
- # @attr_reader [Time] published The time at which the entry was published.
97
- # @attr_reader [String] etag The entity tag of the entry.
98
- # @attr_reader [String] content_type The content type of the object contained in the entry.
99
83
  # @attr_reader [REXML::Document] xml The XML document representing this object.
100
- class AbstractRest
84
+ class AbstractNonRest
101
85
  ATTRS = {}.freeze
102
- attr_reader :uuid, :href, :published, :etag, :content_type, :xml
86
+ attr_reader :xml
103
87
 
104
- def initialize(doc)
105
- @uuid = doc.elements["id"]&.text
106
- link = doc.elements["link[@rel='SELF']"]
107
- @href = URI(link.attributes["href"]) unless link.nil?
108
- @published = Time.xmlschema(doc.elements["published"]&.text)
109
- @etag = doc.elements["etag:etag"]&.text&.strip
110
- content = doc.elements["content"]
111
- @content_type = content.attributes["type"]
112
- @xml = content.elements.first
113
- define_attrs(self.class::ATTRS)
88
+ def initialize(xml)
89
+ @xml = xml
90
+ self.class::ATTRS.each { |varname, xpath| define_attr(varname, xpath) }
114
91
  end
115
92
 
116
93
  ##
@@ -123,17 +100,7 @@ module IbmPowerHmc
123
100
  self.class.__send__(:attr_reader, varname)
124
101
  instance_variable_set("@#{varname}", value)
125
102
  end
126
-
127
- ##
128
- # @!method define_attrs(hash)
129
- # Define instance variables using the texts of XML elements as values.
130
- # @param hash [Hash] The name of the instance variables and the XPaths
131
- # of the XML elements containing the values.
132
- def define_attrs(hash)
133
- hash.each do |key, value|
134
- define_attr(key, value)
135
- end
136
- end
103
+ private :define_attr
137
104
 
138
105
  ##
139
106
  # @!method singleton(xpath, attr = nil)
@@ -149,8 +116,72 @@ module IbmPowerHmc
149
116
  attr.nil? ? elem.text&.strip : elem.attributes[attr]
150
117
  end
151
118
 
152
- def extract_uuid_from_href(href)
153
- URI(href).path.split('/').last
119
+ def to_s
120
+ str = +"#{self.class.name}:\n"
121
+ self.class::ATTRS.each do |varname, _|
122
+ value = instance_variable_get("@#{varname}")
123
+ value = value.nil? ? "null" : "'#{value}'"
124
+ str << " #{varname}: #{value}\n"
125
+ end
126
+ str
127
+ end
128
+
129
+ def uuid_from_href(href, index = -1)
130
+ URI(href).path.split('/')[index]
131
+ end
132
+
133
+ def uuids_from_links(elem, index = -1)
134
+ xml.get_elements("#{elem}/link[@href]").map do |link|
135
+ uuid_from_href(link.attributes["href"], index)
136
+ end.compact
137
+ end
138
+ end
139
+
140
+ ##
141
+ # HMC generic K2 REST object.
142
+ # Encapsulate data for a single REST object.
143
+ # The XML looks like this:
144
+ # <entry>
145
+ # <id>uuid</id>
146
+ # <published>timestamp</published>
147
+ # <link rel="SELF" href="https://..."/>
148
+ # <etag:etag>ETag</etag:etag>
149
+ # <content type="type">
150
+ # <!-- actual content here -->
151
+ # </content>
152
+ # </entry>
153
+ #
154
+ # @abstract
155
+ # @attr_reader [String] uuid The UUID of the object contained in the entry.
156
+ # @attr_reader [Time] published The time at which the entry was published.
157
+ # @attr_reader [URI::HTTPS] href The URL of the object itself.
158
+ # @attr_reader [String] etag The entity tag of the entry.
159
+ # @attr_reader [String] content_type The content type of the object contained in the entry.
160
+ class AbstractRest < AbstractNonRest
161
+ attr_reader :uuid, :published, :href, :etag, :content_type
162
+
163
+ def initialize(entry)
164
+ if entry.name != "entry"
165
+ # We are inlined.
166
+ super(entry)
167
+ return
168
+ end
169
+
170
+ @uuid = entry.elements["id"]&.text
171
+ @published = Time.xmlschema(entry.elements["published"]&.text)
172
+ link = entry.elements["link[@rel='SELF']"]
173
+ @href = URI(link.attributes["href"]) unless link.nil?
174
+ @etag = entry.elements["etag:etag"]&.text&.strip
175
+ content = entry.elements["content"]
176
+ @content_type = content.attributes["type"]
177
+ super(content.elements.first)
178
+ end
179
+
180
+ def to_s
181
+ str = super
182
+ str << " uuid: '#{uuid}'\n" if defined?(@uuid)
183
+ str << " published: '#{published}'\n" if defined?(@published)
184
+ str
154
185
  end
155
186
  end
156
187
 
@@ -163,9 +194,7 @@ module IbmPowerHmc
163
194
  }.freeze
164
195
 
165
196
  def managed_systems_uuids
166
- xml.get_elements("ManagedSystems/link").map do |link|
167
- extract_uuid_from_href(link.attributes["href"])
168
- end.compact
197
+ uuids_from_links("ManagedSystems")
169
198
  end
170
199
  end
171
200
 
@@ -183,22 +212,52 @@ module IbmPowerHmc
183
212
  :avail_cpus => "AssociatedSystemProcessorConfiguration/CurrentAvailableSystemProcessorUnits",
184
213
  :mtype => "MachineTypeModelAndSerialNumber/MachineType",
185
214
  :model => "MachineTypeModelAndSerialNumber/Model",
186
- :serial => "MachineTypeModelAndSerialNumber/SerialNumber"
215
+ :serial => "MachineTypeModelAndSerialNumber/SerialNumber",
216
+ :vtpm_version => "AssociatedSystemSecurity/VirtualTrustedPlatformModuleVersion",
217
+ :vtpm_lpars => "AssociatedSystemSecurity/AvailableVirtualTrustedPlatformModulePartitions"
187
218
  }.freeze
188
219
 
189
- def lpars_uuids
190
- xml.get_elements("AssociatedLogicalPartitions/link").map do |link|
191
- extract_uuid_from_href(link.attributes["href"])
220
+ def cpu_compat_modes
221
+ xml.get_elements("AssociatedSystemProcessorConfiguration/SupportedPartitionProcessorCompatibilityModes").map do |elem|
222
+ elem.text&.strip
192
223
  end.compact
193
224
  end
194
225
 
226
+ def lpars_uuids
227
+ uuids_from_links("AssociatedLogicalPartitions")
228
+ end
229
+
195
230
  def vioses_uuids
196
- xml.get_elements("AssociatedVirtualIOServers/link").map do |link|
197
- extract_uuid_from_href(link.attributes["href"])
198
- end.compact
231
+ uuids_from_links("AssociatedVirtualIOServers")
232
+ end
233
+
234
+ def io_adapters
235
+ xml.get_elements("AssociatedSystemIOConfiguration/IOSlots/IOSlot/RelatedIOAdapter/IOAdapter").map do |elem|
236
+ IOAdapter.new(elem)
237
+ end
238
+ end
239
+
240
+ def vswitches_uuids
241
+ uuids_from_links("AssociatedSystemIOConfiguration/AssociatedSystemVirtualNetwork/VirtualSwitches")
242
+ end
243
+
244
+ def networks_uuids
245
+ uuids_from_links("AssociatedSystemIOConfiguration/AssociatedSystemVirtualNetwork/VirtualNetworks")
199
246
  end
200
247
  end
201
248
 
249
+ # I/O Adapter information
250
+ class IOAdapter < AbstractNonRest
251
+ ATTRS = {
252
+ :id => "AdapterID",
253
+ :description => "Description",
254
+ :name => "DeviceName",
255
+ :type => "DeviceType",
256
+ :dr_name => "DynamicReconfigurationConnectorName",
257
+ :udid => "UniqueDeviceID"
258
+ }.freeze
259
+ end
260
+
202
261
  # Common class for LPAR and VIOS
203
262
  class BasePartition < AbstractRest
204
263
  ATTRS = {
@@ -211,20 +270,33 @@ module IbmPowerHmc
211
270
  :rmc_state => "ResourceMonitoringControlState",
212
271
  :rmc_ipaddr => "ResourceMonitoringIPAddress",
213
272
  :os => "OperatingSystemVersion",
214
- :ref_code => "ReferenceCode"
273
+ :ref_code => "ReferenceCode",
274
+ :procs => "PartitionProcessorConfiguration/CurrentDedicatedProcessorConfiguration/CurrentProcessors",
275
+ :proc_units => "PartitionProcessorConfiguration/CurrentSharedProcessorConfiguration/CurrentProcessingUnits",
276
+ :vprocs => "PartitionProcessorConfiguration/CurrentSharedProcessorConfiguration/AllocatedVirtualProcessors"
215
277
  }.freeze
216
278
 
217
279
  def sys_uuid
218
280
  sys_href = singleton("AssociatedManagedSystem", "href")
219
- extract_uuid_from_href(sys_href)
281
+ uuid_from_href(sys_href)
220
282
  end
221
283
 
222
284
  def net_adap_uuids
223
- xml.get_elements("ClientNetworkAdapters/link").map do |link|
224
- extract_uuid_from_href(link.attributes["href"])
285
+ uuids_from_links("ClientNetworkAdapters")
286
+ end
287
+
288
+ def lhea_ports
289
+ xml.get_elements("HostEthernetAdapterLogicalPorts/HostEthernetAdapterLogicalPort").map do |elem|
290
+ HostEthernetAdapterLogicalPort.new(elem)
225
291
  end
226
292
  end
227
293
 
294
+ def sriov_elp_uuids
295
+ uuids_from_links("SRIOVEthernetLogicalPorts")
296
+ end
297
+
298
+ # Setters
299
+
228
300
  def name=(name)
229
301
  xml.elements[ATTRS[:name]].text = name
230
302
  @name = name
@@ -233,27 +305,527 @@ module IbmPowerHmc
233
305
 
234
306
  # Logical Partition information
235
307
  class LogicalPartition < BasePartition
308
+ def vnic_dedicated_uuids
309
+ uuids_from_links("DedicatedVirtualNICs")
310
+ end
311
+
312
+ def vscsi_client_uuids
313
+ uuids_from_links("VirtualSCSIClientAdapters")
314
+ end
315
+
316
+ def vfc_client_uuids
317
+ uuids_from_links("VirtualFibreChannelClientAdapters")
318
+ end
236
319
  end
237
320
 
238
321
  # VIOS information
239
322
  class VirtualIOServer < BasePartition
323
+ def pvs
324
+ xml.get_elements("PhysicalVolumes/PhysicalVolume").map do |elem|
325
+ PhysicalVolume.new(elem)
326
+ end
327
+ end
328
+
329
+ def rep
330
+ elem = xml.elements["MediaRepositories/VirtualMediaRepository"]
331
+ VirtualMediaRepository.new(elem) unless elem.nil?
332
+ end
333
+
334
+ def vscsi_mappings
335
+ xml.get_elements("VirtualSCSIMappings/VirtualSCSIMapping").map do |elem|
336
+ VirtualSCSIMapping.new(elem)
337
+ end
338
+ end
339
+
340
+ def vfc_mappings
341
+ xml.get_elements("VirtualFibreChannelMappings/VirtualFibreChannelMapping").map do |elem|
342
+ VirtualFibreChannelMapping.new(elem)
343
+ end
344
+ end
345
+ end
346
+
347
+ # Empty parent class to match K2 schema definition
348
+ class VirtualSCSIStorage < AbstractNonRest; end
349
+
350
+ # Physical Volume information
351
+ class PhysicalVolume < VirtualSCSIStorage
352
+ ATTRS = {
353
+ :location => "LocationCode",
354
+ :description => "Description",
355
+ :is_available => "AvailableForUsage",
356
+ :capacity => "VolumeCapacity",
357
+ :name => "VolumeName",
358
+ :is_fc => "IsFibreChannelBacked",
359
+ :udid => "VolumeUniqueID"
360
+ }.freeze
361
+ end
362
+
363
+ # Logical Volume information
364
+ class VirtualDisk < VirtualSCSIStorage
365
+ ATTRS = {
366
+ :name => "DiskName",
367
+ :label => "DiskLabel",
368
+ :capacity => "DiskCapacity", # In GiB
369
+ :psize => "PartitionSize",
370
+ :vg => "VolumeGroup",
371
+ :udid => "UniqueDeviceID"
372
+ }.freeze
373
+ end
374
+
375
+ # Virtual CD-ROM information
376
+ class VirtualOpticalMedia < VirtualSCSIStorage
377
+ ATTRS = {
378
+ :name => "MediaName",
379
+ :udid => "MediaUDID",
380
+ :mount_opts => "MountType",
381
+ :size => "Size" # in GiB
382
+ }.freeze
383
+ end
384
+
385
+ # Virtual Media Repository information
386
+ class VirtualMediaRepository < AbstractNonRest
387
+ ATTRS = {
388
+ :name => "RepositoryName",
389
+ :size => "RepositorySize" # in GiB
390
+ }.freeze
391
+
392
+ def vopts
393
+ xml.get_elements("OpticalMedia/VirtualOpticalMedia").map do |elem|
394
+ VirtualOpticalMedia.new(elem)
395
+ end
396
+ end
240
397
  end
241
398
 
242
399
  # Virtual Switch information
243
400
  class VirtualSwitch < AbstractRest
244
401
  ATTRS = {
245
402
  :id => "SwitchID",
246
- :mode => "SwitchMode",
403
+ :mode => "SwitchMode", # "VEB", "VEPA"
247
404
  :name => "SwitchName"
248
405
  }.freeze
249
406
 
250
407
  def sys_uuid
251
408
  href.path.split('/')[-3]
252
409
  end
410
+
411
+ def networks_uuids
412
+ uuids_from_links("VirtualNetworks")
413
+ end
414
+ end
415
+
416
+ # Virtual Network information
417
+ class VirtualNetwork < AbstractRest
418
+ ATTRS = {
419
+ :name => "NetworkName",
420
+ :vlan_id => "NetworkVLANID",
421
+ :vswitch_id => "VswitchID",
422
+ :tagged => "TaggedNetwork"
423
+ }.freeze
424
+
425
+ def vswitch_uuid
426
+ href = singleton("AssociatedSwitch", "href")
427
+ uuid_from_href(href)
428
+ end
429
+
430
+ def lpars_uuids
431
+ uuids_from_links("ConnectedPartitions")
432
+ end
433
+ end
434
+
435
+ # Virtual I/O Adapter information
436
+ class VirtualIOAdapter < AbstractRest
437
+ ATTRS = {
438
+ :type => "AdapterType", # "Server", "Client", "Unknown"
439
+ :location => "LocationCode",
440
+ :slot => "VirtualSlotNumber",
441
+ :required => "RequiredAdapter"
442
+ }.freeze
443
+ end
444
+
445
+ # Virtual Ethernet Adapter information
446
+ class VirtualEthernetAdapter < VirtualIOAdapter
447
+ ATTRS = ATTRS.merge({
448
+ :macaddr => "MACAddress",
449
+ :vswitch_id => "VirtualSwitchID",
450
+ :vlan_id => "PortVLANID",
451
+ :location => "LocationCode"
452
+ }.freeze)
453
+
454
+ def vswitch_uuid
455
+ uuids_from_links("AssociatedVirtualSwitch").first
456
+ end
457
+ end
458
+
459
+ # Client Network Adapter information
460
+ class ClientNetworkAdapter < VirtualEthernetAdapter
461
+ def networks_uuids
462
+ uuids_from_links("VirtualNetworks")
463
+ end
464
+ end
465
+
466
+ # LP-HEA information
467
+ class EthernetBackingDevice < IOAdapter; end
468
+ class HostEthernetAdapterLogicalPort < EthernetBackingDevice
469
+ ATTRS = ATTRS.merge({
470
+ :macaddr => "MACAddress",
471
+ :port_id => "LogicalPortID",
472
+ :state => "PortState",
473
+ :location => "HEALogicalPortPhysicalLocation"
474
+ }.freeze)
475
+ end
476
+
477
+ # Virtual NIC dedicated information
478
+ class VirtualNICDedicated < VirtualIOAdapter
479
+ ATTRS = ATTRS.merge({
480
+ :location => "DynamicReconfigurationConnectorName", # overrides VirtualIOAdapter
481
+ :macaddr => "Details/MACAddress",
482
+ :os_devname => "Details/OSDeviceName",
483
+ :port_vlan_id => "Details/PortVLANID"
484
+ }.freeze)
485
+ end
486
+
487
+ # SR-IOV Configured Logical Port information
488
+ class SRIOVConfiguredLogicalPort < AbstractRest
489
+ ATTRS = {
490
+ :port_id => "LogicalPortID",
491
+ :port_vlan_id => "PortVLANID",
492
+ :location => "LocationCode",
493
+ :dr_name => "DynamicReconfigurationConnectorName",
494
+ :devname => "DeviceName",
495
+ :capacity => "ConfiguredCapacity"
496
+ }.freeze
497
+
498
+ def lpars_uuids
499
+ uuids_from_links("AssociatedLogicalPartitions")
500
+ end
501
+ end
502
+
503
+ # SR-IOV Ethernet Logical Port information
504
+ class SRIOVEthernetLogicalPort < SRIOVConfiguredLogicalPort
505
+ ATTRS = ATTRS.merge({
506
+ :macaddr => "MACAddress"
507
+ }.freeze)
508
+ end
509
+
510
+ # Virtual SCSI mapping information
511
+ class VirtualSCSIMapping < AbstractNonRest
512
+ def lpar_uuid
513
+ href = singleton("AssociatedLogicalPartition", "href")
514
+ uuid_from_href(href)
515
+ end
516
+
517
+ def client
518
+ elem = xml.elements["ClientAdapter"]
519
+ VirtualSCSIClientAdapter.new(elem) unless elem.nil?
520
+ end
521
+
522
+ def server
523
+ elem = xml.elements["ServerAdapter"]
524
+ VirtualSCSIServerAdapter.new(elem) unless elem.nil?
525
+ end
526
+
527
+ def storage
528
+ # Possible storage types are:
529
+ # LogicalUnit, PhysicalVolume, VirtualDisk, VirtualOpticalMedia
530
+ elem = xml.elements["Storage/*[1]"]
531
+ Module.const_get("IbmPowerHmc::#{elem.name}").new(elem) unless elem.nil?
532
+ end
533
+
534
+ def device
535
+ # Possible backing device types are:
536
+ # LogicalVolumeVirtualTargetDevice, PhysicalVolumeVirtualTargetDevice,
537
+ # SharedStoragePoolLogicalUnitVirtualTargetDevice, VirtualOpticalTargetDevice
538
+ elem = xml.elements["TargetDevice/*[1]"]
539
+ Module.const_get("IbmPowerHmc::#{elem.name}").new(elem) unless elem.nil?
540
+ end
541
+ end
542
+
543
+ # Virtual SCSI adapter (common class for Client and Server)
544
+ class VirtualSCSIAdapter < VirtualIOAdapter
545
+ ATTRS = ATTRS.merge({
546
+ :name => "AdapterName",
547
+ :backdev => "BackingDeviceName",
548
+ :remote_backdev => "RemoteBackingDeviceName",
549
+ :remote_lpar_id => "RemoteLogicalPartitionID",
550
+ :remote_slot => "RemoteSlotNumber",
551
+ :server_location => "ServerLocationCode",
552
+ :udid => "UniqueDeviceID"
553
+ }.freeze)
554
+ end
555
+
556
+ # Virtual SCSI client adapter information
557
+ class VirtualSCSIClientAdapter < VirtualSCSIAdapter
558
+ def server
559
+ elem = xml.elements["ServerAdapter"]
560
+ VirtualSCSIServerAdapter.new(elem) unless elem.nil?
561
+ end
562
+
563
+ def vios_uuid
564
+ href = singleton("ConnectingPartition", "href")
565
+ uuid_from_href(href)
566
+ end
567
+ end
568
+
569
+ # Virtual SCSI server adapter information
570
+ class VirtualSCSIServerAdapter < VirtualSCSIAdapter; end
571
+
572
+ # Virtual target device information
573
+ class VirtualTargetDevice < AbstractNonRest
574
+ ATTRS = {
575
+ :lun => "LogicalUnitAddress",
576
+ :parent => "ParentName",
577
+ :target => "TargetName",
578
+ :udid => "UniqueDeviceID"
579
+ }.freeze
580
+ end
581
+
582
+ # LV backing device information
583
+ class LogicalVolumeVirtualTargetDevice < VirtualTargetDevice; end
584
+
585
+ # PV backing device information
586
+ class PhysicalVolumeVirtualTargetDevice < VirtualTargetDevice; end
587
+
588
+ # LU backing device information
589
+ class SharedStoragePoolLogicalUnitVirtualTargetDevice < VirtualTargetDevice
590
+ ATTRS = ATTRS.merge({
591
+ :cluster_id => "ClusterID",
592
+ :path => "PathName",
593
+ :raid_level => "RAIDLevel"
594
+ }.freeze)
595
+ end
596
+
597
+ # Virtual CD backing device information
598
+ class VirtualOpticalTargetDevice < VirtualTargetDevice
599
+ def media
600
+ elem = xml.elements["VirtualOpticalMedia"]
601
+ VirtualOpticalMedia.new(elem) unless elem.nil?
602
+ end
603
+ end
604
+
605
+ # VFC mapping information
606
+ class VirtualFibreChannelMapping < AbstractNonRest
607
+ def lpar_uuid
608
+ href = singleton("AssociatedLogicalPartition", "href")
609
+ uuid_from_href(href)
610
+ end
611
+
612
+ def client
613
+ elem = xml.elements["ClientAdapter"]
614
+ VirtualFibreChannelClientAdapter.new(elem) unless elem.nil?
615
+ end
616
+
617
+ def server
618
+ elem = xml.elements["ServerAdapter"]
619
+ VirtualFibreChannelServerAdapter.new(elem) unless elem.nil?
620
+ end
621
+
622
+ def port
623
+ elem = xml.elements["Port"]
624
+ PhysicalFibreChannelPort.new(elem) unless elem.nil?
625
+ end
626
+ end
627
+
628
+ # VFC adapter information
629
+ class VirtualFibreChannelAdapter < VirtualIOAdapter
630
+ ATTRS = ATTRS.merge({
631
+ :name => "AdapterName",
632
+ :lpar_id => "ConnectingPartitionID",
633
+ :slot => "ConnectingVirtualSlotNumber",
634
+ :udid => "UniqueDeviceID"
635
+ }.freeze)
636
+
637
+ def lpar_uuid
638
+ href = singleton("ConnectingPartition", "href")
639
+ uuid_from_href(href)
640
+ end
641
+ end
642
+
643
+ # VFC client information
644
+ class VirtualFibreChannelClientAdapter < VirtualFibreChannelAdapter
645
+ def nport_loggedin
646
+ xml.get_elements("NportLoggedInStatus/VirtualFibreChannelNPortLoginStatus").map do |elem|
647
+ VirtualFibreChannelNPortLoginStatus.new(elem)
648
+ end
649
+ end
650
+
651
+ def server
652
+ elem = xml.elements["ServerAdapter"]
653
+ VirtualFibreChannelServerAdapter.new(elem) unless elem.nil?
654
+ end
655
+
656
+ def wwpns
657
+ singleton("WWPNs")&.split
658
+ end
659
+
660
+ def os_disks
661
+ xml.get_elements("OperatingSystemDisks/OperatingSystemDisk/Name").map do |elem|
662
+ elem.text&.strip
663
+ end.compact
664
+ end
665
+ end
666
+
667
+ # VFC port status
668
+ class VirtualFibreChannelNPortLoginStatus < AbstractNonRest
669
+ ATTRS = {
670
+ :wwpn => "WWPN",
671
+ :wwpn_status => "WWPNStatus",
672
+ :loggedin_by => "LoggedInBy",
673
+ :reason => "StatusReason"
674
+ }.freeze
675
+ end
676
+
677
+ # VFC server information
678
+ class VirtualFibreChannelServerAdapter < VirtualFibreChannelAdapter
679
+ ATTRS = ATTRS.merge({
680
+ :map_port => "MapPort"
681
+ }.freeze)
682
+
683
+ def port
684
+ elem = xml.elements["PhysicalPort"]
685
+ PhysicalFibreChannelPort.new(elem) unless elem.nil?
686
+ end
687
+ end
688
+
689
+ # FC port information
690
+ class PhysicalFibreChannelPort < AbstractNonRest
691
+ ATTRS = {
692
+ :location => "LocationCode",
693
+ :name => "PortName",
694
+ :udid => "UniqueDeviceID",
695
+ :wwpn => "WWPN",
696
+ :wwnn => "WWNN",
697
+ :avail_ports => "AvailablePorts",
698
+ :total_ports => "TotalPorts"
699
+ }.freeze
700
+
701
+ def pvs
702
+ xml.get_elements("PhysicalVolumes/PhysicalVolume").map do |elem|
703
+ PhysicalVolume.new(elem)
704
+ end
705
+ end
706
+ end
707
+
708
+ # Cluster information
709
+ class Cluster < AbstractRest
710
+ ATTRS = {
711
+ :name => "ClusterName",
712
+ :id => "ClusterID",
713
+ :tier_capable => "ClusterCapabilities/IsTierCapable"
714
+ }.freeze
715
+
716
+ def ssp_uuid
717
+ href = singleton("ClusterSharedStoragePool", "href")
718
+ uuid_from_href(href)
719
+ end
720
+
721
+ def nodes
722
+ xml.get_elements("Node/Node").map do |elem|
723
+ Node.new(elem)
724
+ end
725
+ end
726
+ end
727
+
728
+ # Cluster node information
729
+ class Node < AbstractNonRest
730
+ ATTRS = {
731
+ :hostname => "HostName",
732
+ :lpar_id => "PartitionID",
733
+ :state => "State",
734
+ :ioslevel => "VirtualIOServerLevel"
735
+ }.freeze
736
+
737
+ def vios_uuid
738
+ href = singleton("VirtualIOServer", "href")
739
+ uuid_from_href(href)
740
+ end
741
+ end
742
+
743
+ # SSP information
744
+ class SharedStoragePool < AbstractRest
745
+ ATTRS = {
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)
758
+ end
759
+
760
+ def pvs
761
+ xml.get_elements("PhysicalVolumes/PhysicalVolume").map do |elem|
762
+ PhysicalVolume.new(elem)
763
+ end
764
+ end
765
+
766
+ def tiers_uuids
767
+ uuids_from_links("AssociatedTiers")
768
+ end
769
+
770
+ def lus
771
+ xml.get_elements("LogicalUnits/LogicalUnit").map do |elem|
772
+ LogicalUnit.new(elem)
773
+ end
774
+ end
775
+ end
776
+
777
+ # SSP tier information
778
+ class Tier < AbstractRest
779
+ ATTRS = {
780
+ :name => "Name",
781
+ :udid => "UniqueDeviceID",
782
+ :type => "Type",
783
+ :capacity => "Capacity",
784
+ :total_lu_size => "TotalLogicalUnitSize",
785
+ :is_default => "IsDefault",
786
+ :free_space => "FreeSpace"
787
+ }.freeze
788
+
789
+ def ssp_uuid
790
+ href = singleton("AssociatedSharedStoragePool", "href")
791
+ uuid_from_href(href)
792
+ end
793
+
794
+ def lus_uuids
795
+ uuids_from_links("AssociatedLogicalUnits")
796
+ end
797
+ end
798
+
799
+ # SSP LU information
800
+ class LogicalUnit < VirtualSCSIStorage
801
+ ATTRS = {
802
+ :name => "UnitName",
803
+ :capacity => "UnitCapacity",
804
+ :udid => "UniqueDeviceID",
805
+ :thin => "ThinDevice",
806
+ :type => "LogicalUnitType",
807
+ :in_use => "InUse"
808
+ }.freeze
809
+ end
810
+
811
+ class PartitionTemplateSummary < AbstractRest
812
+ ATTRS = {
813
+ :name => "partitionTemplateName"
814
+ }.freeze
815
+ end
816
+
817
+ class PartitionTemplate < AbstractRest
818
+ ATTRS = {
819
+ :name => "partitionTemplateName",
820
+ :description => "description",
821
+ :os => "logicalPartitionConfig/osVersion",
822
+ :memory => "logicalPartitionConfig/memoryConfiguration/currMemory"
823
+ }.freeze
253
824
  end
254
825
 
255
826
  # HMC Event
256
827
  class Event < AbstractRest
828
+ attr_accessor :usertask
257
829
  ATTRS = {
258
830
  :id => "EventID",
259
831
  :type => "EventType",
@@ -262,15 +834,6 @@ module IbmPowerHmc
262
834
  }.freeze
263
835
  end
264
836
 
265
- # Network adapter information
266
- class ClientNetworkAdapter < AbstractRest
267
- ATTRS = {
268
- :macaddr => "MACAddress",
269
- :vswitch_id => "VirtualSwitchID",
270
- :vlan_id => "PortVLANID"
271
- }.freeze
272
- end
273
-
274
837
  # Error response from HMC
275
838
  class HttpErrorResponse < AbstractRest
276
839
  ATTRS = {
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IbmPowerHmc
4
- VERSION = "0.4.0"
4
+ VERSION = "0.8.0"
5
5
  end
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.0
4
+ version: 0.8.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - IBM Power
8
8
  autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-26 00:00:00.000000000 Z
11
+ date: 2021-12-02 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client