ibm_power_hmc 0.19.0 → 0.21.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: 8e8b824464b658e795023dba5c23ec80a7b90e830c204d7184a786029d37f276
4
- data.tar.gz: 5eb6491fd0d3f7d465acc0a8bbdac0063ceb1e028ad4c7b14b3ac92e7f79d622
3
+ metadata.gz: 2a66a6b3ab2a70a1c398c51dae01828b936b6f859d34bc957ad22101e9314e11
4
+ data.tar.gz: 0f92d6cafc9348975d179b17e6451d31edae23d96a3314f6c4b3d9bc76d97cfa
5
5
  SHA512:
6
- metadata.gz: 1a13e2dc82679cadc1ee2de5029aa30346402bf4d41e26932ab16325e097b63814d482ffcdd2d9e1fd14cb21e771231ca3ec52e5c5af6b2317fc1e43c3fd4adf
7
- data.tar.gz: 1e502b797270f3b71bb9d01280dc40a3f60e81ed2782027273ca75e045347872b641499622f915ed36f1dc75605468c6b86caa5c4bbd1894cff38189b6023ded
6
+ metadata.gz: 996802e21a82bfaf391a84fb1872998ecd662b19f0a600315c0445ad817d3220b723879a99272ff79ff15f7add22d12bef6be275ff8106816fe3289e2113ad61
7
+ data.tar.gz: a4dd65ac732a8e4cda2377df1d87b575c9947e1c5a7a41bff19a4eda333ed49c0f92a754a4e864e2d00d93f55a4e47e6862ab5a701c5f0f2091a6e5cbcf05522
data/CHANGELOG.md CHANGED
@@ -1,3 +1,16 @@
1
+ ## v0.21.0
2
+ * Add methods to create/delete LPAR client network adapters
3
+ * Add methods and schema definitions for volume groups
4
+ * Add label and page83 schema definitions for PVs
5
+ * Add schema definitions for capabilities of lpars and vioses
6
+ ## v0.20.0
7
+ * Add permissive option (`ignoreError=true`) for cluster APIs
8
+ * Fix `modify_object` method when URI has a query part
9
+ * Add `chcomgmt` method
10
+ * Add `grow_lu` method
11
+ * Add `shared_memory_pool` method
12
+ * Improve schema definitions for CPU and memory
13
+ * Add schema definition for shared memory pool
1
14
  ## v0.19.0
2
15
  * Major code refactoring
3
16
  * Add `serviceable_events` method
data/README.md CHANGED
@@ -70,6 +70,14 @@ Shutting down a logical partition:
70
70
  hc.poweroff_lpar(lpar_uuid, { "operation" => "shutdown" })
71
71
  ```
72
72
 
73
+ Setting the memory of a logical partition to 32GB:
74
+
75
+ ```ruby
76
+ hc.modify_object do
77
+ hc.lpar(lpar_uuid).tap { |lpar| lpar.desired_memory = 32_768 }
78
+ end
79
+ ```
80
+
73
81
  Listing serviceable events:
74
82
 
75
83
  ```ruby
@@ -2,6 +2,9 @@
2
2
 
3
3
  # Module for IBM HMC Rest API Client
4
4
  module IbmPowerHmc
5
+ WEB_XMLNS = "http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/"
6
+ UOM_XMLNS = "http://www.ibm.com/xmlns/systems/power/firmware/uom/mc/2012_10/"
7
+
5
8
  class Error < StandardError; end
6
9
 
7
10
  ##
@@ -37,7 +40,7 @@ module IbmPowerHmc
37
40
  }
38
41
  doc = REXML::Document.new("")
39
42
  doc.add_element("LogonRequest", "schemaVersion" => "V1_1_0")
40
- doc.root.add_namespace("http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/")
43
+ doc.root.add_namespace(WEB_XMLNS)
41
44
  doc.root.add_element("UserID").text = @username
42
45
  doc.root.add_element("Password").text = @password
43
46
 
@@ -122,7 +125,7 @@ module IbmPowerHmc
122
125
  end
123
126
 
124
127
  def to_s
125
- "msg=\"#{@message}\" status=\"#{@status}\" reason=\"#{@reason}\" uri=#{@uri}"
128
+ %(msg="#{@message}" status="#{@status}" reason="#{@reason}" uri=#{@uri})
126
129
  end
127
130
  end
128
131
 
@@ -184,7 +187,7 @@ module IbmPowerHmc
184
187
  # Use ETag to ensure object has not changed.
185
188
  headers = headers.merge("If-Match" => obj.etag, :content_type => obj.content_type)
186
189
  begin
187
- request(:post, method_url.nil? ? obj.href.path : method_url, headers, obj.xml.to_s)
190
+ request(:post, method_url.nil? ? obj.href.to_s : method_url, headers, obj.xml.to_s)
188
191
  break
189
192
  rescue HttpError => e
190
193
  attempts -= 1
@@ -7,13 +7,15 @@ module IbmPowerHmc
7
7
  class JobNotStarted < StandardError; end
8
8
 
9
9
  class JobFailed < StandardError
10
+ attr_reader :job
11
+
10
12
  def initialize(job)
11
13
  super
12
14
  @job = job
13
15
  end
14
16
 
15
17
  def to_s
16
- "id=\"#{@job.id}\" operation=\"#{@job.group}/#{@job.operation}\" status=\"#{@job.status}\" message=\"#{@job.message}\" exception_text=\"#{@job.results['ExceptionText']}\""
18
+ %(#{job.status} err="#{job.results["result"]}" rc=#{job.results["returnCode"]} msg="#{job.message}" exception="#{job.results["ExceptionText"]}" url=#{job.url} id=#{job.id})
17
19
  end
18
20
  end
19
21
 
@@ -42,21 +44,8 @@ module IbmPowerHmc
42
44
  headers = {
43
45
  :content_type => "application/vnd.ibm.powervm.web+xml; type=JobRequest"
44
46
  }
45
- doc = REXML::Document.new("")
46
- doc.add_element("JobRequest:JobRequest", "schemaVersion" => "V1_1_0")
47
- doc.root.add_namespace("http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/")
48
- doc.root.add_namespace("JobRequest", "http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/")
49
- op = doc.root.add_element("RequestedOperation", "schemaVersion" => "V1_1_0")
50
- op.add_element("OperationName").text = @operation
51
- op.add_element("GroupName").text = @group
52
-
53
- jobparams = doc.root.add_element("JobParameters", "schemaVersion" => "V1_1_0")
54
- @params.each do |key, value|
55
- jobparam = jobparams.add_element("JobParameter", "schemaVersion" => "V1_1_0")
56
- jobparam.add_element("ParameterName").text = key
57
- jobparam.add_element("ParameterValue").text = value
58
- end
59
- response = @conn.request(:put, @method_url, headers, doc.to_s)
47
+ jobreq = JobRequest.marshal({:operation => @operation, :group => @group, :params => @params}, WEB_XMLNS)
48
+ response = @conn.request(:put, @method_url, headers, jobreq.xml.to_s)
60
49
  jobresp = Parser.new(response.body).object(:JobResponse)
61
50
  # Save the URL of the job (JobID is not sufficient as not all jobs are in uom).
62
51
  @href = jobresp.href.path
@@ -193,8 +193,8 @@ module IbmPowerHmc
193
193
  method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualIOServer"
194
194
  end
195
195
  query = {}
196
- query["ignoreError"] = "true" if permissive
197
196
  query["group"] = group_name unless group_name.nil?
197
+ query["ignoreError"] = "true" if permissive
198
198
  method_url += "?" + query.map { |h| h.join("=") }.join("&") unless query.empty?
199
199
 
200
200
  response = request(:get, method_url)
@@ -234,6 +234,29 @@ module IbmPowerHmc
234
234
  JSON.parse(response.body)
235
235
  end
236
236
 
237
+ ##
238
+ # @!method volume_groups(vios_uuid)
239
+ # Retrieve the list of volume groups available on a virtual I/O server.
240
+ # @param vios_uuid [String] The UUID of the virtual I/O server.
241
+ # @return [Array<IbmPowerHmc::VolumeGroup>] The list of volume groups.
242
+ def volume_groups(vios_uuid)
243
+ method_url = "/rest/api/uom/VirtualIOServer/#{vios_uuid}/VolumeGroup"
244
+ response = request(:get, method_url)
245
+ FeedParser.new(response.body).objects(:VolumeGroup)
246
+ end
247
+
248
+ ##
249
+ # @!method volume_group(vios_uuid, vg_uuid)
250
+ # Retrieve information about a volume group on a virtual I/O server.
251
+ # @param vios_uuid [String] The UUID of the virtual I/O server.
252
+ # @param vg_uuid [String] The UUID of the volume group.
253
+ # @return [IbmPowerHmc::VolumeGroup] The volume groups.
254
+ def volume_group(vios_uuid, vg_uuid)
255
+ method_url = "/rest/api/uom/VirtualIOServer/#{vios_uuid}/VolumeGroup/#{vg_uuid}"
256
+ response = request(:get, method_url)
257
+ Parser.new(response.body).object(:VolumeGroup)
258
+ end
259
+
237
260
  ##
238
261
  # @!method groups
239
262
  # Retrieve the list of groups defined on the HMC.
@@ -325,6 +348,36 @@ module IbmPowerHmc
325
348
  end
326
349
  private :network_adapter
327
350
 
351
+ ##
352
+ # @!method network_adapter_lpar_create(lpar_uuid, sys_uuid, vswitch_uuid, **args)
353
+ # Create a virtual ethernet network adapter attached to a logical partition.
354
+ # @param lpar_uuid [String] UUID of the logical partition.
355
+ # @param sys_uuid [String] UUID of the managed system of the virtual switch.
356
+ # @param vswitch_uuid [String] UUID of the virtual switch.
357
+ # @param args [Hash] The network adapter properties.
358
+ # @return [IbmPowerHmc::ClientNetworkAdapter] The created network adapter.
359
+ def network_adapter_lpar_create(lpar_uuid, sys_uuid, vswitch_uuid, **args)
360
+ method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}/ClientNetworkAdapter"
361
+ headers = {
362
+ :content_type => "application/vnd.ibm.powervm.uom+xml; type=ClientNetworkAdapter"
363
+ }
364
+ args[:vswitch_href] = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch/#{vswitch_uuid}"
365
+ netadap = ClientNetworkAdapter.marshal(args)
366
+ response = request(:put, method_url, headers, netadap.xml.to_s)
367
+ Parser.new(response.body).object(:ClientNetworkAdapter)
368
+ end
369
+
370
+ ##
371
+ # @!method network_adapter_lpar_delete(lpar_uuid, netadap_uuid)
372
+ # Delete a virtual ethernet network adapter attached to a logical partition.
373
+ # @param lpar_uuid [String] UUID of the logical partition.
374
+ # @param netadap_uuid [String] UUID of the adapter to delete.
375
+ def network_adapter_lpar_delete(lpar_uuid, netadap_uuid)
376
+ method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}/ClientNetworkAdapter/#{netadap_uuid}"
377
+ request(:delete, method_url)
378
+ # Returns HTTP 204 if ok
379
+ end
380
+
328
381
  ##
329
382
  # @!method sriov_elp_lpar(lpar_uuid, sriov_elp_uuid = nil)
330
383
  # Retrieve one or all SR-IOV ethernet logical ports attached to a logical partition.
@@ -413,11 +466,12 @@ module IbmPowerHmc
413
466
  end
414
467
 
415
468
  ##
416
- # @!method clusters
469
+ # @!method clusters(permissive = true)
417
470
  # Retrieve the list of clusters managed by the HMC.
471
+ # @param permissive [Boolean] Ignore errors generated from bad clusters.
418
472
  # @return [Array<IbmPowerHmc::Cluster>] The list of clusters.
419
- def clusters
420
- method_url = "/rest/api/uom/Cluster"
473
+ def clusters(permissive = true)
474
+ method_url = "/rest/api/uom/Cluster#{'?ignoreError=true' if permissive}"
421
475
  response = request(:get, method_url)
422
476
  FeedParser.new(response.body).objects(:Cluster)
423
477
  end
@@ -434,11 +488,12 @@ module IbmPowerHmc
434
488
  end
435
489
 
436
490
  ##
437
- # @!method ssps
491
+ # @!method ssps(permissive = true)
438
492
  # Retrieve the list of shared storage pools managed by the HMC.
493
+ # @param permissive [Boolean] Ignore errors generated from bad clusters.
439
494
  # @return [Array<IbmPowerHmc::SharedStoragePool>] The list of shared storage pools.
440
- def ssps
441
- method_url = "/rest/api/uom/SharedStoragePool"
495
+ def ssps(permissive = true)
496
+ method_url = "/rest/api/uom/SharedStoragePool#{'?ignoreError=true' if permissive}"
442
497
  response = request(:get, method_url)
443
498
  FeedParser.new(response.body).objects(:SharedStoragePool)
444
499
  end
@@ -455,13 +510,17 @@ module IbmPowerHmc
455
510
  end
456
511
 
457
512
  ##
458
- # @!method tiers(group_name = nil)
513
+ # @!method tiers(group_name = nil, permissive = true)
459
514
  # Retrieve the list of tiers that are part of shared storage pools managed by the HMC.
460
515
  # @param group_name [String] The extended group attributes.
516
+ # @param permissive [Boolean] Ignore errors generated from bad clusters.
461
517
  # @return [Array<IbmPowerHmc::Tier>] The list of tiers.
462
- def tiers(group_name = nil)
518
+ def tiers(group_name = nil, permissive = true)
463
519
  method_url = "/rest/api/uom/Tier"
464
- method_url += "?group=#{group_name}" unless group_name.nil?
520
+ query = {}
521
+ query["group"] = group_name unless group_name.nil?
522
+ query["ignoreError"] = "true" if permissive
523
+ method_url += "?" + query.map { |h| h.join("=") }.join("&") unless query.empty?
465
524
  response = request(:get, method_url)
466
525
  FeedParser.new(response.body).objects(:Tier)
467
526
  end
@@ -503,6 +562,24 @@ module IbmPowerHmc
503
562
  end
504
563
  end
505
564
 
565
+ ##
566
+ # @!method shared_memory_pool(sys_uuid, pool_uuid = nil)
567
+ # Retrieve information about Shared Memory Pools.
568
+ # @param sys_uuid [String] The UUID of the managed system.
569
+ # @param pool_uuid [String] The UUID of the shared memory pool (return all pools if omitted)
570
+ # @return [Array<IbmPowerHmc::SharedMemoryPool>, IbmPowerHmc::SharedMemoryPool] The list of shared memory pools.
571
+ def shared_memory_pool(sys_uuid, pool_uuid = nil)
572
+ if pool_uuid.nil?
573
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/SharedMemoryPool"
574
+ response = request(:get, method_url)
575
+ FeedParser.new(response.body).objects(:SharedMemoryPool)
576
+ else
577
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/SharedMemoryPool/#{pool_uuid}"
578
+ response = request(:get, method_url)
579
+ Parser.new(response.body).object(:SharedMemoryPool)
580
+ end
581
+ end
582
+
506
583
  ##
507
584
  # @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
508
585
  # Power on a logical partition.
@@ -602,6 +679,21 @@ module IbmPowerHmc
602
679
  job
603
680
  end
604
681
 
682
+ ##
683
+ # @!method chcomgmt(sys_uuid, status)
684
+ # Change the co-management settings for a managed system.
685
+ # @param sys_uuid [String] The UUID of the managed system.
686
+ # @param status [String] The new co-management status ("rel", "norm", "keep").
687
+ # @return [IbmPowerHmc::HmcJob] The HMC job.
688
+ def chcomgmt(sys_uuid, status)
689
+ operation = status == "rel" ? "ReleaseController" : "RequestController"
690
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/do/#{operation}"
691
+
692
+ params = {}
693
+ params["coManagementControllerStatus"] = status unless status == "rel"
694
+ HmcJob.new(self, method_url, operation, "ManagedSystem", params).tap(&:run)
695
+ end
696
+
605
697
  ##
606
698
  # @!method cli_run(hmc_uuid, cmd, sync = true)
607
699
  # Run a CLI command on the HMC as a job.
@@ -621,6 +713,23 @@ module IbmPowerHmc
621
713
  job
622
714
  end
623
715
 
716
+ ##
717
+ # @!method grow_lu(cl_uuid, lu_uuid, capacity)
718
+ # Increase the size of a logical unit in a cluster.
719
+ # @param cl_uuid [String] The UUID of the cluster.
720
+ # @param lu_uuid [String] The UUID of the logical unit.
721
+ # @param capacity [Float] The new logical unit size (in GB).
722
+ # @return [IbmPowerHmc::HmcJob] The HMC job.
723
+ def grow_lu(cl_uuid, lu_uuid, capacity)
724
+ method_url = "/rest/api/uom/Cluster/#{cl_uuid}/do/GrowLogicalUnit"
725
+
726
+ params = {
727
+ "LogicalUnitUDID" => lu_uuid,
728
+ "Capacity" => capacity
729
+ }
730
+ HmcJob.new(self, method_url, "GrowLogicalUnit", "Cluster", params).tap(&:run)
731
+ end
732
+
624
733
  ##
625
734
  # @!method next_events(wait = true)
626
735
  # Retrieve a list of events that occured since last call.
@@ -0,0 +1,83 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IbmPowerHmc
4
+ # Job Request
5
+ class JobRequest < AbstractRest
6
+ def operation
7
+ singleton("RequestedOperation/OperationName")
8
+ end
9
+
10
+ def operation=(operation)
11
+ elem = xml.elements["RequestedOperation"]
12
+ elem = xml.add_element("RequestedOperation", "schemaVersion" => "V1_1_0") if elem.nil?
13
+ elem.add_element("OperationName").text = operation
14
+ end
15
+
16
+ def group
17
+ singleton("RequestedOperation/GroupName")
18
+ end
19
+
20
+ def group=(group)
21
+ elem = xml.elements["RequestedOperation"]
22
+ elem = xml.add_element("RequestedOperation", "schemaVersion" => "V1_1_0") if elem.nil?
23
+ elem.add_element("GroupName").text = group
24
+ end
25
+
26
+ def params
27
+ params = {}
28
+ xml.each_element("JobParameters/JobParameter") do |jobparam|
29
+ name = jobparam.elements["ParameterName"]&.text&.strip
30
+ value = jobparam.elements["ParameterValue"]&.text&.strip
31
+ params[name] = value unless name.nil?
32
+ end
33
+ params
34
+ end
35
+
36
+ def params=(params)
37
+ jobparams = xml.add_element("JobParameters", "schemaVersion" => "V1_1_0")
38
+ params.each do |key, value|
39
+ jobparam = jobparams.add_element("JobParameter", "schemaVersion" => "V1_1_0")
40
+ jobparam.add_element("ParameterName").text = key
41
+ jobparam.add_element("ParameterValue").text = value
42
+ end
43
+ end
44
+ end
45
+
46
+ # Job Response
47
+ class JobResponse < AbstractRest
48
+ ATTRS = {
49
+ :id => "JobID",
50
+ :status => "Status",
51
+ :message => "ResponseException/Message",
52
+ :target_uuid => "TargetUuid",
53
+ :linear_progress => "Progress/LinearProgress"
54
+ }.freeze
55
+
56
+ def url
57
+ singleton("RequestURL", "href")
58
+ end
59
+
60
+ def request
61
+ elem = xml.elements["JobRequestInstance"]
62
+ JobRequest.new(elem) unless elem.nil?
63
+ end
64
+
65
+ def started_at
66
+ timestamp("TimeStarted")
67
+ end
68
+
69
+ def completed_at
70
+ timestamp("TimeCompleted")
71
+ end
72
+
73
+ def results
74
+ results = {}
75
+ xml.each_element("Results/JobParameter") do |jobparam|
76
+ name = jobparam.elements["ParameterName"]&.text&.strip
77
+ value = jobparam.elements["ParameterValue"]&.text&.strip
78
+ results[name] = value unless name.nil?
79
+ end
80
+ results
81
+ end
82
+ end
83
+ end
@@ -87,6 +87,23 @@ module IbmPowerHmc
87
87
  self.class::ATTRS.each { |varname, xpath| define_attr(varname, xpath) }
88
88
  end
89
89
 
90
+ ##
91
+ # @!method marshal(attrs = {}, namespace = UOM_XMLNS, version = "V1_1_0")
92
+ # XML marshaling of object.
93
+ # @param attrs [Hash] The initial properties of the object.
94
+ # @param namespace [String] The XML namespace to use.
95
+ # @param version [String] The XML schema version to use.
96
+ def self.marshal(attrs = {}, namespace = UOM_XMLNS, version = "V1_1_0")
97
+ doc = REXML::Document.new("")
98
+ doc.add_element(name.split("::").last, "schemaVersion" => version)
99
+ doc.root.add_namespace(namespace)
100
+ obj = new(doc.root)
101
+ attrs.each do |varname, value|
102
+ obj.send("#{varname}=", value)
103
+ end
104
+ obj
105
+ end
106
+
90
107
  ##
91
108
  # @!method define_attr(varname, xpath)
92
109
  # Define an instance variable using the text of an XML element as value.
@@ -1,5 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ require 'base64'
4
+
3
5
  module IbmPowerHmc
4
6
  # HMC information
5
7
  class ManagementConsole < AbstractRest
@@ -74,7 +76,7 @@ module IbmPowerHmc
74
76
 
75
77
  def capabilities
76
78
  xml.get_elements("AssociatedSystemCapabilities/*").map do |elem|
77
- elem.name unless elem.text&.strip != "true"
79
+ elem.name if elem.text&.strip == "true"
78
80
  end.compact
79
81
  end
80
82
 
@@ -129,8 +131,13 @@ module IbmPowerHmc
129
131
  :state => "PartitionState",
130
132
  :type => "PartitionType",
131
133
  :memory => "PartitionMemoryConfiguration/CurrentMemory",
134
+ :desired_memory => "PartitionMemoryConfiguration/DesiredMemory",
135
+ :min_memory => "PartitionMemoryConfiguration/MinimumMemory",
136
+ :max_memory => "PartitionMemoryConfiguration/MaximumMemory",
132
137
  :dedicated => "PartitionProcessorConfiguration/CurrentHasDedicatedProcessors",
133
138
  :sharing_mode => "PartitionProcessorConfiguration/CurrentSharingMode",
139
+ :uncapped_weight => "PartitionProcessorConfiguration/CurrentSharedProcessorConfiguration/CurrentUncappedWeight",
140
+ :desired_uncapped_weight => "PartitionProcessorConfiguration/SharedProcessorConfiguration/UncappedWeight",
134
141
  :rmc_state => "ResourceMonitoringControlState",
135
142
  :rmc_ipaddr => "ResourceMonitoringIPAddress",
136
143
  :os => "OperatingSystemVersion",
@@ -138,6 +145,12 @@ module IbmPowerHmc
138
145
  :procs => "PartitionProcessorConfiguration/CurrentDedicatedProcessorConfiguration/CurrentProcessors",
139
146
  :proc_units => "PartitionProcessorConfiguration/CurrentSharedProcessorConfiguration/CurrentProcessingUnits",
140
147
  :vprocs => "PartitionProcessorConfiguration/CurrentSharedProcessorConfiguration/AllocatedVirtualProcessors",
148
+ :desired_proc_units => "PartitionProcessorConfiguration/SharedProcessorConfiguration/DesiredProcessingUnits",
149
+ :desired_vprocs => "PartitionProcessorConfiguration/SharedProcessorConfiguration/DesiredVirtualProcessors",
150
+ :minimum_proc_units => "PartitionProcessorConfiguration/SharedProcessorConfiguration/MinimumProcessingUnits",
151
+ :minimum_vprocs => "PartitionProcessorConfiguration/SharedProcessorConfiguration/MinimumVirtualProcessors",
152
+ :maximum_proc_units => "PartitionProcessorConfiguration/SharedProcessorConfiguration/MaximumProcessingUnits",
153
+ :maximum_vprocs => "PartitionProcessorConfiguration/SharedProcessorConfiguration/MaximumVirtualProcessors",
141
154
  :cpu_compat_mode => "CurrentProcessorCompatibilityMode",
142
155
  :description => "Description"
143
156
  }.freeze
@@ -163,6 +176,12 @@ module IbmPowerHmc
163
176
  uuids_from_links("SRIOVEthernetLogicalPorts")
164
177
  end
165
178
 
179
+ def capabilities
180
+ xml.get_elements("PartitionCapabilities/*").map do |elem|
181
+ elem.name if elem.text&.strip == "true"
182
+ end.compact
183
+ end
184
+
166
185
  def io_adapters
167
186
  collection_of("PartitionIOConfiguration/ProfileIOSlots/ProfileIOSlot/AssociatedIOSlot/RelatedIOAdapter", "*[1]")
168
187
  end
@@ -190,10 +209,20 @@ module IbmPowerHmc
190
209
 
191
210
  # VIOS information
192
211
  class VirtualIOServer < BasePartition
212
+ def capabilities
213
+ xml.get_elements("VirtualIOServerCapabilities/*").map do |elem|
214
+ elem.name if elem.text&.strip == "true"
215
+ end.compact.concat(super)
216
+ end
217
+
193
218
  def pvs
194
219
  collection_of("PhysicalVolumes", "PhysicalVolume")
195
220
  end
196
221
 
222
+ def vg_uuids
223
+ uuids_from_links("StoragePools")
224
+ end
225
+
197
226
  def rep
198
227
  elem = xml.elements["MediaRepositories/VirtualMediaRepository"]
199
228
  VirtualMediaRepository.new(elem) unless elem.nil?
@@ -284,6 +313,33 @@ module IbmPowerHmc
284
313
  }.freeze
285
314
  end
286
315
 
316
+ # Volume Group information
317
+ class VolumeGroup < AbstractRest
318
+ ATTRS = {
319
+ :udid => "UniqueDeviceID",
320
+ :size => "AvailableSize", # in GiB
321
+ :dev_count => "BackingDeviceCount",
322
+ :free_space => "FreeSpace", # in GiB
323
+ :capacity => "GroupCapacity",
324
+ :name => "GroupName",
325
+ :serial => "GroupSerialID",
326
+ :state => "GroupState",
327
+ :max_lvs => "MaximumLogicalVolumes"
328
+ }.freeze
329
+
330
+ def reps
331
+ collection_of("MediaRepositories", "VirtualMediaRepository")
332
+ end
333
+
334
+ def pvs
335
+ collection_of("PhysicalVolumes", "PhysicalVolume")
336
+ end
337
+
338
+ def lvs
339
+ collection_of("VirtualDisks", "VirtualDisk")
340
+ end
341
+ end
342
+
287
343
  # Empty parent class to match K2 schema definition
288
344
  class VirtualSCSIStorage < AbstractNonRest; end
289
345
 
@@ -296,8 +352,19 @@ module IbmPowerHmc
296
352
  :capacity => "VolumeCapacity", # in MiB
297
353
  :name => "VolumeName",
298
354
  :is_fc => "IsFibreChannelBacked",
355
+ :is_iscsi => "IsISCSIBacked",
299
356
  :udid => "VolumeUniqueID"
300
357
  }.freeze
358
+
359
+ def label
360
+ str = singleton("StorageLabel")
361
+ Base64.decode64(str) unless str.nil?
362
+ end
363
+
364
+ def page83
365
+ str = singleton("DescriptorPage83")
366
+ Base64.decode64(str) unless str.nil?
367
+ end
301
368
  end
302
369
 
303
370
  # Logical Volume information
@@ -307,9 +374,13 @@ module IbmPowerHmc
307
374
  :label => "DiskLabel",
308
375
  :capacity => "DiskCapacity", # in GiB
309
376
  :psize => "PartitionSize",
310
- :vg => "VolumeGroup",
311
377
  :udid => "UniqueDeviceID"
312
378
  }.freeze
379
+
380
+ def vg_uuid
381
+ href = singleton("VolumeGroup", "href")
382
+ uuid_from_href(href) unless href.nil?
383
+ end
313
384
  end
314
385
 
315
386
  # Virtual CD-ROM information
@@ -404,6 +475,10 @@ module IbmPowerHmc
404
475
  def vswitch_uuid
405
476
  uuids_from_links("AssociatedVirtualSwitch").first
406
477
  end
478
+
479
+ def vswitch_href=(href)
480
+ xml.add_element("AssociatedVirtualSwitch").add_element("link", "href" => href, "rel" => "related")
481
+ end
407
482
  end
408
483
 
409
484
  # Client Network Adapter information
@@ -795,6 +870,38 @@ module IbmPowerHmc
795
870
  end
796
871
  end
797
872
 
873
+ # Shared Memory Pool
874
+ class SharedMemoryPool < AbstractRest
875
+ ATTRS = {
876
+ :pool_mb => "CurrentPoolMemory",
877
+ :available_mb => "CurrentAvailablePoolMemory",
878
+ :max_mb => "CurrentMaximumPoolMemory",
879
+ :sys_mb =>"SystemFirmwarePoolMemory",
880
+ :pool_id => "PoolID",
881
+ :dedup => "MemoryDeduplicationEnabled"
882
+ }.freeze
883
+
884
+ def paging_vios_uuids
885
+ ["PagingServicePartitionOne", "PagingServicePartitionTwo"].map do |attr|
886
+ if (vios_href = singleton(attr, "href"))
887
+ uuid_from_href(vios_href)
888
+ end
889
+ end
890
+ end
891
+
892
+ def lpar_uuids
893
+ REXML::XPath.match(xml, "PagingDevices/ReservedStorageDevice").map do |dev|
894
+ if (lpar = dev.elements["AssociatedLogicalPartition"])
895
+ uuid_from_href(lpar.attributes["href"])
896
+ end
897
+ end.compact
898
+ end
899
+
900
+ def sys_uuid
901
+ uuid_from_href(href, -3)
902
+ end
903
+ end
904
+
798
905
  # HMC Event
799
906
  class Event < AbstractRest
800
907
  attr_accessor :usertask
@@ -806,25 +913,4 @@ module IbmPowerHmc
806
913
  :detail => "EventDetail"
807
914
  }.freeze
808
915
  end
809
-
810
- # Job Response
811
- class JobResponse < AbstractRest
812
- ATTRS = {
813
- :id => "JobID",
814
- :status => "Status",
815
- :operation => "JobRequestInstance/RequestedOperation/OperationName",
816
- :group => "JobRequestInstance/RequestedOperation/GroupName",
817
- :message => "ResponseException/Message"
818
- }.freeze
819
-
820
- def results
821
- results = {}
822
- xml.each_element("Results/JobParameter") do |jobparam|
823
- name = jobparam.elements["ParameterName"]&.text&.strip
824
- value = jobparam.elements["ParameterValue"]&.text&.strip
825
- results[name] = value unless name.nil?
826
- end
827
- results
828
- end
829
- end
830
916
  end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IbmPowerHmc
4
- VERSION = "0.19.0"
4
+ VERSION = "0.21.0"
5
5
  end
data/lib/ibm_power_hmc.rb CHANGED
@@ -14,6 +14,7 @@ module IbmPowerHmc
14
14
  require_relative "./ibm_power_hmc/apis/templates"
15
15
  require_relative "./ibm_power_hmc/apis/uom"
16
16
  require_relative "./ibm_power_hmc/schema/parser"
17
+ require_relative "./ibm_power_hmc/schema/job"
17
18
  require_relative "./ibm_power_hmc/schema/pcm"
18
19
  require_relative "./ibm_power_hmc/schema/sem"
19
20
  require_relative "./ibm_power_hmc/schema/templates"
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.19.0
4
+ version: 0.21.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: 2022-10-26 00:00:00.000000000 Z
11
+ date: 2022-11-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -62,6 +62,7 @@ files:
62
62
  - lib/ibm_power_hmc/apis/sem.rb
63
63
  - lib/ibm_power_hmc/apis/templates.rb
64
64
  - lib/ibm_power_hmc/apis/uom.rb
65
+ - lib/ibm_power_hmc/schema/job.rb
65
66
  - lib/ibm_power_hmc/schema/parser.rb
66
67
  - lib/ibm_power_hmc/schema/pcm.rb
67
68
  - lib/ibm_power_hmc/schema/sem.rb