ibm_power_hmc 0.9.0 → 0.12.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 +4 -4
- data/lib/ibm_power_hmc/connection.rb +138 -15
- data/lib/ibm_power_hmc/job.rb +16 -4
- data/lib/ibm_power_hmc/parser.rb +152 -15
- data/lib/ibm_power_hmc/pcm.rb +14 -1
- data/lib/ibm_power_hmc/version.rb +1 -1
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e162db8e4002c4b1fbee71faceaa8c4a859f5e7e92e33e4cbbdb59862da9cde6
|
4
|
+
data.tar.gz: 97bc18d7e606bddd79f6ed83b9f2f5b562f5121c433d613085e7da5e695f71df
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 3a36c85b010b6e67bd91e67fa380c4edb6cc27a34aee732237b5c95eaee2f6a983ee1c461bc6ab5830d4952743360f848a1228f85121f9ac8cf150b194440dac
|
7
|
+
data.tar.gz: 741c9dedab5f6bd5fd7af0038e8bdab555c6b71274f3cecded7aaf4cabb21371b744e3fd355140e61bc9c7a36128a473a81fffd6983662d2def0c0e22ac1fcc5
|
@@ -157,19 +157,21 @@ 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
|
-
|
160
|
+
modify_object_attributes(method_url, {:name => new_name})
|
161
161
|
end
|
162
162
|
|
163
163
|
##
|
164
|
-
# @!method vioses(sys_uuid = nil, search = {})
|
164
|
+
# @!method vioses(sys_uuid = nil, search = {}, permissive = true)
|
165
165
|
# Retrieve the list of virtual I/O servers managed by the HMC.
|
166
166
|
# @param sys_uuid [String] The UUID of the managed system.
|
167
167
|
# @param search [Hash] The optional property name and value to match.
|
168
|
+
# @param permissive [Boolean] Skip virtual I/O servers that have error conditions.
|
168
169
|
# @return [Array<IbmPowerHmc::VirtualIOServer>] The list of virtual I/O servers.
|
169
|
-
def vioses(sys_uuid = nil, search = {})
|
170
|
+
def vioses(sys_uuid = nil, search = {}, permissive = true)
|
170
171
|
if sys_uuid.nil?
|
171
172
|
method_url = "/rest/api/uom/VirtualIOServer"
|
172
173
|
search.each { |key, value| method_url += "/search/(#{key}==#{value})" }
|
174
|
+
method_url += "?ignoreError=true" if permissive
|
173
175
|
else
|
174
176
|
method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualIOServer"
|
175
177
|
end
|
@@ -386,21 +388,23 @@ module IbmPowerHmc
|
|
386
388
|
end
|
387
389
|
|
388
390
|
##
|
389
|
-
# @!method templates_summary
|
391
|
+
# @!method templates_summary(draft = false)
|
390
392
|
# Retrieve the list of partition template summaries.
|
393
|
+
# @param draft [Boolean] Retrieve draft templates as well
|
391
394
|
# @return [Array<IbmPowerHmc::PartitionTemplateSummary>] The list of partition template summaries.
|
392
|
-
def templates_summary
|
393
|
-
method_url = "/rest/api/templates/PartitionTemplate"
|
395
|
+
def templates_summary(draft = false)
|
396
|
+
method_url = "/rest/api/templates/PartitionTemplate#{'?draft=false' unless draft}"
|
394
397
|
response = request(:get, method_url)
|
395
398
|
FeedParser.new(response.body).objects(:PartitionTemplateSummary)
|
396
399
|
end
|
397
400
|
|
398
401
|
##
|
399
|
-
# @!method templates
|
402
|
+
# @!method templates(draft = false)
|
400
403
|
# Retrieve the list of partition templates.
|
404
|
+
# @param draft [Boolean] Retrieve draft templates as well
|
401
405
|
# @return [Array<IbmPowerHmc::PartitionTemplate>] The list of partition templates.
|
402
|
-
def templates
|
403
|
-
method_url = "/rest/api/templates/PartitionTemplate?detail=full"
|
406
|
+
def templates(draft = false)
|
407
|
+
method_url = "/rest/api/templates/PartitionTemplate?detail=full#{'&draft=false' unless draft}"
|
404
408
|
response = request(:get, method_url)
|
405
409
|
FeedParser.new(response.body).objects(:PartitionTemplate)
|
406
410
|
end
|
@@ -439,6 +443,109 @@ module IbmPowerHmc
|
|
439
443
|
job
|
440
444
|
end
|
441
445
|
|
446
|
+
##
|
447
|
+
# @!method template_check(template_uuid, target_sys_uuid, sync = true)
|
448
|
+
# Start Template Check job (first of three steps to deploy an LPAR from a Template).
|
449
|
+
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
450
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
451
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
452
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
453
|
+
def template_check(template_uuid, target_sys_uuid, sync = true)
|
454
|
+
# Need to include session token in payload so make sure we are logged in
|
455
|
+
logon if @api_session_token.nil?
|
456
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}/do/check"
|
457
|
+
params = {
|
458
|
+
"TargetUuid" => target_sys_uuid,
|
459
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
460
|
+
}
|
461
|
+
job = HmcJob.new(self, method_url, "Check", "PartitionTemplate", params)
|
462
|
+
job.run if sync
|
463
|
+
job
|
464
|
+
end
|
465
|
+
|
466
|
+
##
|
467
|
+
# @!method template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
468
|
+
# Start Template Transform job (second of three steps to deploy an LPAR from a Template).
|
469
|
+
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
470
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
471
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
472
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
473
|
+
def template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
474
|
+
# Need to include session token in payload so make sure we are logged in
|
475
|
+
logon if @api_session_token.nil?
|
476
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/transform"
|
477
|
+
params = {
|
478
|
+
"TargetUuid" => target_sys_uuid,
|
479
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
480
|
+
}
|
481
|
+
job = HmcJob.new(self, method_url, "Transform", "PartitionTemplate", params)
|
482
|
+
job.run if sync
|
483
|
+
job
|
484
|
+
end
|
485
|
+
|
486
|
+
##
|
487
|
+
# @!method template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
488
|
+
# Start Template Deploy job (last of three steps to deploy an LPAR from a Template).
|
489
|
+
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
490
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
491
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
492
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
493
|
+
def template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
494
|
+
# Need to include session token in payload so make sure we are logged in
|
495
|
+
logon if @api_session_token.nil?
|
496
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/deploy"
|
497
|
+
params = {
|
498
|
+
"TargetUuid" => target_sys_uuid,
|
499
|
+
"TemplateUuid" => draft_template_uuid,
|
500
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
501
|
+
}
|
502
|
+
job = HmcJob.new(self, method_url, "Deploy", "PartitionTemplate", params)
|
503
|
+
job.run if sync
|
504
|
+
job
|
505
|
+
end
|
506
|
+
|
507
|
+
##
|
508
|
+
# @!method template_provision(template_uuid, target_sys_uuid, changes)
|
509
|
+
# Deploy Logical Partition from a Template (performs Check, Transform and Deploy steps in a single method).
|
510
|
+
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
511
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
512
|
+
# @param changes [Hash] Modifications to apply to the Template before deploying Logical Partition.
|
513
|
+
# @return [String] The UUID of the deployed Logical Partition.
|
514
|
+
def template_provision(template_uuid, target_sys_uuid, changes)
|
515
|
+
draft_uuid = template_check(template_uuid, target_sys_uuid).results["TEMPLATE_UUID"]
|
516
|
+
template_transform(draft_uuid, target_sys_uuid)
|
517
|
+
template_modify(draft_uuid, changes)
|
518
|
+
template_deploy(draft_uuid, target_sys_uuid).results["PartitionUuid"]
|
519
|
+
end
|
520
|
+
|
521
|
+
##
|
522
|
+
# @!method template(template_uuid, changes)
|
523
|
+
# modify_object_attributes wrapper for templates.
|
524
|
+
# @param template_uuid [String] UUID of the partition template to modify.
|
525
|
+
# @param changes [Hash] Hash of changes to make.
|
526
|
+
# @return [IbmPowerHmc::PartitionTemplate] The partition template.
|
527
|
+
def template_modify(template_uuid, changes)
|
528
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
529
|
+
modify_object_attributes(method_url, changes)
|
530
|
+
end
|
531
|
+
|
532
|
+
##
|
533
|
+
# @!method template_copy(template_uuid, new_name)
|
534
|
+
# Copy existing template to a new one.
|
535
|
+
# @param template_uuid [String] UUID of the partition template to copy.
|
536
|
+
# @param new_name [String] Name of the new template.
|
537
|
+
# @return [IbmPowerHmc::PartitionTemplate] The new partition template.
|
538
|
+
def template_copy(template_uuid, new_name)
|
539
|
+
method_url = "/rest/api/templates/PartitionTemplate"
|
540
|
+
headers = {
|
541
|
+
:content_type => "application/vnd.ibm.powervm.templates+xml;type=PartitionTemplate"
|
542
|
+
}
|
543
|
+
original = template(template_uuid)
|
544
|
+
original.name = new_name
|
545
|
+
response = request(:put, method_url, headers, original.xml.to_s)
|
546
|
+
Parser.new(response.body).object(:PartitionTemplate)
|
547
|
+
end
|
548
|
+
|
442
549
|
##
|
443
550
|
# @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
|
444
551
|
# Power on a logical partition.
|
@@ -622,13 +729,15 @@ module IbmPowerHmc
|
|
622
729
|
@status = err.http_code
|
623
730
|
@message = err.message
|
624
731
|
|
625
|
-
# Try to parse body as an HttpErrorResponse
|
732
|
+
# Try to parse body as an HttpErrorResponse.
|
626
733
|
unless err.response.nil?
|
627
|
-
|
628
|
-
|
734
|
+
begin
|
735
|
+
resp = Parser.new(err.response.body).object(:HttpErrorResponse)
|
629
736
|
@uri = resp.uri
|
630
737
|
@reason = resp.reason
|
631
738
|
@message = resp.message
|
739
|
+
rescue
|
740
|
+
# not an XML body
|
632
741
|
end
|
633
742
|
end
|
634
743
|
end
|
@@ -661,9 +770,9 @@ module IbmPowerHmc
|
|
661
770
|
:headers => headers
|
662
771
|
)
|
663
772
|
rescue RestClient::Exception => e
|
664
|
-
# Do not retry on failed logon attempts
|
773
|
+
# Do not retry on failed logon attempts.
|
665
774
|
if e.http_code == 401 && @api_session_token != "" && !reauth
|
666
|
-
# Try to reauth
|
775
|
+
# Try to reauth.
|
667
776
|
reauth = true
|
668
777
|
logon
|
669
778
|
retry
|
@@ -695,12 +804,26 @@ module IbmPowerHmc
|
|
695
804
|
break
|
696
805
|
rescue HttpError => e
|
697
806
|
attempts -= 1
|
698
|
-
# Will get 412 ("Precondition Failed") if ETag mismatches
|
807
|
+
# Will get 412 ("Precondition Failed") if ETag mismatches.
|
699
808
|
raise if e.status != 412 || attempts == 0
|
700
809
|
end
|
701
810
|
end
|
702
811
|
end
|
703
812
|
|
813
|
+
# @!method modify_object_attributes(method_url, changes, headers = {}, attempts = 5)
|
814
|
+
# Modify an object at a specified URI.
|
815
|
+
# @param method_url [String] The URL of the object to modify.
|
816
|
+
# @param changes [Hash] Hash of changes to make. Key is the attribute modify/create (as defined in the AbstractNonRest subclass). A value of nil removes the attribute.
|
817
|
+
# @param headers [Hash] HTTP headers.
|
818
|
+
# @param attempts [Integer] Maximum number of retries.
|
819
|
+
def modify_object_attributes(method_url, changes, headers = {}, attempts = 5)
|
820
|
+
modify_object(method_url, headers, attempts) do |obj|
|
821
|
+
changes.each do |key, value|
|
822
|
+
obj.send("#{key}=", value)
|
823
|
+
end
|
824
|
+
end
|
825
|
+
end
|
826
|
+
|
704
827
|
##
|
705
828
|
# @!method network_adapter(vm_type, lpar_uuid, netadap_uuid)
|
706
829
|
# Retrieve one or all virtual ethernet network adapters attached to a Logical Partition or a Virtual I/O Server.
|
data/lib/ibm_power_hmc/job.rb
CHANGED
@@ -6,6 +6,17 @@ module IbmPowerHmc
|
|
6
6
|
class HmcJob
|
7
7
|
class JobNotStarted < StandardError; end
|
8
8
|
|
9
|
+
class JobFailed < StandardError
|
10
|
+
def initialize(job)
|
11
|
+
super
|
12
|
+
@job = job
|
13
|
+
end
|
14
|
+
|
15
|
+
def to_s
|
16
|
+
"id=\"#{@job.id}\" operation=\"#{@job.group}/#{@job.operation}\" status=\"#{@job.status}\" message=\"#{@job.message}\" exception_text=\"#{@job.results['ExceptionText']}\""
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
9
20
|
##
|
10
21
|
# @!method initialize(conn, method_url, operation, group, params = {})
|
11
22
|
# Construct a new HMC Job.
|
@@ -52,7 +63,7 @@ module IbmPowerHmc
|
|
52
63
|
end
|
53
64
|
|
54
65
|
# @return [Hash] The job results returned by the HMC.
|
55
|
-
attr_reader :results
|
66
|
+
attr_reader :results, :last_status
|
56
67
|
|
57
68
|
##
|
58
69
|
# @!method status
|
@@ -65,9 +76,9 @@ module IbmPowerHmc
|
|
65
76
|
:content_type => "application/vnd.ibm.powervm.web+xml; type=JobRequest"
|
66
77
|
}
|
67
78
|
response = @conn.request(:get, @href, headers)
|
68
|
-
|
69
|
-
@results =
|
70
|
-
|
79
|
+
@last_status = Parser.new(response.body).object(:JobResponse)
|
80
|
+
@results = @last_status.results
|
81
|
+
@last_status.status
|
71
82
|
end
|
72
83
|
|
73
84
|
##
|
@@ -99,6 +110,7 @@ module IbmPowerHmc
|
|
99
110
|
def run(timeout = 120, poll_interval = 0)
|
100
111
|
start
|
101
112
|
wait(timeout, poll_interval)
|
113
|
+
raise JobFailed.new(@last_status), "Job failed" unless @last_status.status.eql?("COMPLETED_OK")
|
102
114
|
ensure
|
103
115
|
delete if defined?(@href)
|
104
116
|
end
|
data/lib/ibm_power_hmc/parser.rb
CHANGED
@@ -34,7 +34,7 @@ module IbmPowerHmc
|
|
34
34
|
content = entry.elements["content[@type]"]
|
35
35
|
return if content.nil?
|
36
36
|
|
37
|
-
type = content.attributes["type"].split("=").
|
37
|
+
type = content.attributes["type"].split("=")[1] || filter_type.to_s
|
38
38
|
return unless filter_type.nil? || filter_type.to_s == type
|
39
39
|
|
40
40
|
Module.const_get("IbmPowerHmc::#{type}").new(entry)
|
@@ -95,10 +95,35 @@ module IbmPowerHmc
|
|
95
95
|
def define_attr(varname, xpath)
|
96
96
|
value = singleton(xpath)
|
97
97
|
self.class.__send__(:attr_reader, varname)
|
98
|
+
self.class.__send__(:define_method, "#{varname}=") do |v|
|
99
|
+
if v.nil?
|
100
|
+
xml.elements.delete(xpath)
|
101
|
+
else
|
102
|
+
create_element(xpath) if xml.elements[xpath].nil?
|
103
|
+
xml.elements[xpath].text = v
|
104
|
+
end
|
105
|
+
instance_variable_set("@#{varname}", v)
|
106
|
+
end
|
98
107
|
instance_variable_set("@#{varname}", value)
|
99
108
|
end
|
100
109
|
private :define_attr
|
101
110
|
|
111
|
+
##
|
112
|
+
# @!method create_element(xpath)
|
113
|
+
# Create a new XML element.
|
114
|
+
# @param xpath [String] The XPath of the XML element to create.
|
115
|
+
def create_element(xpath)
|
116
|
+
cur = xml
|
117
|
+
xpath.split("/").each do |el|
|
118
|
+
p = cur.elements[el]
|
119
|
+
if p.nil?
|
120
|
+
cur = cur.add_element(el)
|
121
|
+
else
|
122
|
+
cur = p
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
102
127
|
##
|
103
128
|
# @!method singleton(xpath, attr = nil)
|
104
129
|
# Get the text (or the value of a specified attribute) of an XML element.
|
@@ -135,7 +160,7 @@ module IbmPowerHmc
|
|
135
160
|
|
136
161
|
def collection_of(name, type)
|
137
162
|
objtype = Module.const_get("IbmPowerHmc::#{type}")
|
138
|
-
xml.get_elements(
|
163
|
+
xml.get_elements([name, type].compact.join("/")).map do |elem|
|
139
164
|
objtype.new(elem)
|
140
165
|
end
|
141
166
|
rescue
|
@@ -198,9 +223,15 @@ module IbmPowerHmc
|
|
198
223
|
:build_level => "VersionInfo/BuildLevel",
|
199
224
|
:version => "BaseVersion",
|
200
225
|
:ssh_pubkey => "PublicSSHKeyValue",
|
201
|
-
:uvmid => "UVMID"
|
226
|
+
:uvmid => "UVMID",
|
227
|
+
:tz => "CurrentTimezone",
|
228
|
+
:uptime => "ManagementConsoleUpTime"
|
202
229
|
}.freeze
|
203
230
|
|
231
|
+
def time
|
232
|
+
Time.at(0, singleton("ManagementConsoleTime").to_i, :millisecond).utc
|
233
|
+
end
|
234
|
+
|
204
235
|
def managed_systems_uuids
|
205
236
|
uuids_from_links("ManagedSystems")
|
206
237
|
end
|
@@ -327,13 +358,6 @@ module IbmPowerHmc
|
|
327
358
|
def sriov_elp_uuids
|
328
359
|
uuids_from_links("SRIOVEthernetLogicalPorts")
|
329
360
|
end
|
330
|
-
|
331
|
-
# Setters
|
332
|
-
|
333
|
-
def name=(name)
|
334
|
-
xml.elements[ATTRS[:name]].text = name
|
335
|
-
@name = name
|
336
|
-
end
|
337
361
|
end
|
338
362
|
|
339
363
|
# Logical Partition information
|
@@ -401,7 +425,7 @@ module IbmPowerHmc
|
|
401
425
|
:location => "LocationCode",
|
402
426
|
:description => "Description",
|
403
427
|
:is_available => "AvailableForUsage",
|
404
|
-
:capacity => "VolumeCapacity",
|
428
|
+
:capacity => "VolumeCapacity", # in MiB
|
405
429
|
:name => "VolumeName",
|
406
430
|
:is_fc => "IsFibreChannelBacked",
|
407
431
|
:udid => "VolumeUniqueID"
|
@@ -413,7 +437,7 @@ module IbmPowerHmc
|
|
413
437
|
ATTRS = {
|
414
438
|
:name => "DiskName",
|
415
439
|
:label => "DiskLabel",
|
416
|
-
:capacity => "DiskCapacity", #
|
440
|
+
:capacity => "DiskCapacity", # in GiB
|
417
441
|
:psize => "PartitionSize",
|
418
442
|
:vg => "VolumeGroup",
|
419
443
|
:udid => "UniqueDeviceID"
|
@@ -882,6 +906,8 @@ module IbmPowerHmc
|
|
882
906
|
ATTRS = {
|
883
907
|
:name => "partitionTemplateName",
|
884
908
|
:description => "description",
|
909
|
+
:lpar_name => "logicalPartitionConfig/partitionName",
|
910
|
+
:lpar_id => "logicalPartitionConfig/partitionId",
|
885
911
|
:os => "logicalPartitionConfig/osVersion",
|
886
912
|
:memory => "logicalPartitionConfig/memoryConfiguration/currMemory",
|
887
913
|
:dedicated => "logicalPartitionConfig/processorConfiguration/hasDedicatedProcessors",
|
@@ -890,6 +916,87 @@ module IbmPowerHmc
|
|
890
916
|
:proc_units => "logicalPartitionConfig/processorConfiguration/sharedProcessorConfiguration/desiredProcessingUnits",
|
891
917
|
:procs => "logicalPartitionConfig/processorConfiguration/dedicatedProcessorConfiguration/desiredProcessors"
|
892
918
|
}.freeze
|
919
|
+
|
920
|
+
def vscsi
|
921
|
+
REXML::XPath.match(xml, 'logicalPartitionConfig/virtualSCSIClientAdapters/VirtualSCSIClientAdapter').map do |adap|
|
922
|
+
{
|
923
|
+
:vios => adap.elements['connectingPartitionName']&.text,
|
924
|
+
:physvol => adap.elements['associatedPhysicalVolume/PhysicalVolume/name']&.text,
|
925
|
+
}
|
926
|
+
end
|
927
|
+
end
|
928
|
+
|
929
|
+
def vscsi=(list = [])
|
930
|
+
adaps = REXML::Element.new('virtualSCSIClientAdapters')
|
931
|
+
adaps.add_attribute('schemaVersion', 'V1_5_0')
|
932
|
+
list.each do |vscsi|
|
933
|
+
adaps.add_element('VirtualSCSIClientAdapter', {'schemaVersion' => 'V1_5_0'}).tap do |v|
|
934
|
+
v.add_element('associatedLogicalUnits', {'schemaVersion' => 'V1_5_0'})
|
935
|
+
v.add_element('associatedPhysicalVolume', {'schemaVersion' => 'V1_5_0'}).tap do |e|
|
936
|
+
e.add_element('PhysicalVolume', {'schemaVersion' => 'V1_5_0'}).add_element('name').text = vscsi[:physvol] if vscsi[:physvol]
|
937
|
+
end
|
938
|
+
v.add_element('connectingPartitionName').text = vscsi[:vios]
|
939
|
+
v.add_element('AssociatedTargetDevices', {'schemaVersion' => 'V1_5_0'})
|
940
|
+
v.add_element('associatedVirtualOpticalMedia', {'schemaVersion' => 'V1_5_0'})
|
941
|
+
end
|
942
|
+
end
|
943
|
+
if xml.elements['logicalPartitionConfig/virtualSCSIClientAdapters']
|
944
|
+
xml.elements['logicalPartitionConfig/virtualSCSIClientAdapters'] = adaps
|
945
|
+
else
|
946
|
+
xml.elements['logicalPartitionConfig'].add_element(adaps)
|
947
|
+
end
|
948
|
+
end
|
949
|
+
|
950
|
+
def vfc
|
951
|
+
REXML::XPath.match(xml, 'logicalPartitionConfig/virtualFibreChannelClientAdapters/VirtualFibreChannelClientAdapter').map do |adap|
|
952
|
+
{
|
953
|
+
:vios => adap.elements['connectingPartitionName']&.text,
|
954
|
+
:port => adap.elements['portName']&.text
|
955
|
+
}
|
956
|
+
end
|
957
|
+
end
|
958
|
+
|
959
|
+
def vfc=(list = [])
|
960
|
+
adaps = REXML::Element.new('virtualFibreChannelClientAdapters')
|
961
|
+
adaps.add_attribute('schemaVersion', 'V1_5_0')
|
962
|
+
list.each do |vfc|
|
963
|
+
adaps.add_element('VirtualFibreChannelClientAdapter', {'schemaVersion' => 'V1_5_0'}).tap do |v|
|
964
|
+
v.add_element('connectingPartitionName').text = vfc[:vios]
|
965
|
+
v.add_element('portName').text = vfc[:port]
|
966
|
+
end
|
967
|
+
end
|
968
|
+
if xml.elements['logicalPartitionConfig/virtualFibreChannelClientAdapters']
|
969
|
+
xml.elements['logicalPartitionConfig/virtualFibreChannelClientAdapters'] = adaps
|
970
|
+
else
|
971
|
+
xml.elements['logicalPartitionConfig'].add_element(adaps)
|
972
|
+
end
|
973
|
+
end
|
974
|
+
|
975
|
+
def vlans
|
976
|
+
REXML::XPath.match(xml, 'logicalPartitionConfig/clientNetworkAdapters/ClientNetworkAdapter/clientVirtualNetworks/ClientVirtualNetwork').map do |vlan|
|
977
|
+
{
|
978
|
+
:name => vlan.elements['name']&.text,
|
979
|
+
:vlan_id => vlan.elements['vlanId']&.text,
|
980
|
+
:switch => vlan.elements['associatedSwitchName']&.text
|
981
|
+
}
|
982
|
+
end
|
983
|
+
end
|
984
|
+
|
985
|
+
def vlans=(list = [])
|
986
|
+
adaps = REXML::Element.new('clientNetworkAdapters')
|
987
|
+
adaps.add_attribute('schemaVersion', 'V1_5_0')
|
988
|
+
list.each do |vlan|
|
989
|
+
adaps.add_element('ClientNetworkAdapter', {'schemaVersion' => 'V1_5_0'})
|
990
|
+
.add_element('clientVirtualNetworks', {'schemaVersion' => 'V1_5_0'})
|
991
|
+
.add_element('ClientVirtualNetwork', {'schemaVersion' => 'V1_5_0'})
|
992
|
+
.tap do |v|
|
993
|
+
v.add_element('name').text = vlan[:name]
|
994
|
+
v.add_element('vlanId').text = vlan[:vlan_id]
|
995
|
+
v.add_element('associatedSwitchName').text = vlan[:switch]
|
996
|
+
end
|
997
|
+
end
|
998
|
+
xml.elements['logicalPartitionConfig/clientNetworkAdapters'] = adaps
|
999
|
+
end
|
893
1000
|
end
|
894
1001
|
|
895
1002
|
# HMC Event
|
@@ -917,9 +1024,11 @@ module IbmPowerHmc
|
|
917
1024
|
# Job Response
|
918
1025
|
class JobResponse < AbstractRest
|
919
1026
|
ATTRS = {
|
920
|
-
:id
|
921
|
-
:status
|
922
|
-
:
|
1027
|
+
:id => "JobID",
|
1028
|
+
:status => "Status",
|
1029
|
+
:operation => "JobRequestInstance/RequestedOperation/OperationName",
|
1030
|
+
:group => "JobRequestInstance/RequestedOperation/GroupName",
|
1031
|
+
:message => "ResponseException/Message"
|
923
1032
|
}.freeze
|
924
1033
|
|
925
1034
|
def results
|
@@ -932,4 +1041,32 @@ module IbmPowerHmc
|
|
932
1041
|
results
|
933
1042
|
end
|
934
1043
|
end
|
1044
|
+
|
1045
|
+
# Performance and Capacity Monitoring preferences
|
1046
|
+
class ManagementConsolePcmPreference < AbstractRest
|
1047
|
+
ATTRS = {
|
1048
|
+
:max_ltm => "MaximumManagedSystemsForLongTermMonitor",
|
1049
|
+
:max_compute_ltm => "MaximumManagedSystemsForComputeLTM",
|
1050
|
+
:max_aggregation => "MaximumManagedSystemsForAggregation",
|
1051
|
+
:max_stm => "MaximumManagedSystemsForShortTermMonitor",
|
1052
|
+
:max_em => "MaximumManagedSystemsForEnergyMonitor",
|
1053
|
+
:aggregated_storage_duration => "AggregatedMetricsStorageDuration"
|
1054
|
+
}.freeze
|
1055
|
+
|
1056
|
+
def managed_system_preferences
|
1057
|
+
collection_of(nil, "ManagedSystemPcmPreference")
|
1058
|
+
end
|
1059
|
+
end
|
1060
|
+
|
1061
|
+
class ManagedSystemPcmPreference < AbstractNonRest
|
1062
|
+
ATTRS = {
|
1063
|
+
:id => "Metadata/Atom/AtomID",
|
1064
|
+
:name => "SystemName",
|
1065
|
+
:long_term_monitor => "LongTermMonitorEnabled",
|
1066
|
+
:aggregation => "AggregationEnabled",
|
1067
|
+
:short_term_monitor => "ShortTermMonitorEnabled",
|
1068
|
+
:compute_ltm => "ComputeLTMEnabled",
|
1069
|
+
:energy_monitor => "EnergyMonitorEnabled"
|
1070
|
+
}.freeze
|
1071
|
+
end
|
935
1072
|
end
|
data/lib/ibm_power_hmc/pcm.rb
CHANGED
@@ -5,11 +5,24 @@ require 'uri'
|
|
5
5
|
|
6
6
|
module IbmPowerHmc
|
7
7
|
class Connection
|
8
|
+
##
|
9
|
+
# @!method pcm_preferences
|
10
|
+
# Retrieve global Performance and Capacity Monitor preferences for the HMC.
|
11
|
+
# @return [Array<IbmPowerHmc::ManagementConsolePcmPreference>] The PCM preferences for the HMC.
|
8
12
|
def pcm_preferences
|
9
13
|
method_url = "/rest/api/pcm/preferences"
|
10
14
|
|
11
15
|
response = request(:get, method_url)
|
12
|
-
|
16
|
+
FeedParser.new(response.body).objects(:ManagementConsolePcmPreference)
|
17
|
+
end
|
18
|
+
|
19
|
+
##
|
20
|
+
# @!method managed_system_pcm_preferences(sys_uuid)
|
21
|
+
# Return Performance and Capacity Monitor preferences for a Managed System.
|
22
|
+
# @param sys_uuid [String] The managed system UUID.
|
23
|
+
# @return [IbmPowerHmc::ManagedSystemPcmPreference] The PCM preferences for the Managed System.
|
24
|
+
def managed_system_pcm_preferences(sys_uuid)
|
25
|
+
pcm_preferences.first.managed_system_preferences.find { |p| p.id.eql?(sys_uuid) }
|
13
26
|
end
|
14
27
|
|
15
28
|
##
|
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.12.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-
|
11
|
+
date: 2022-07-18 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -84,7 +84,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
84
84
|
- !ruby/object:Gem::Version
|
85
85
|
version: '0'
|
86
86
|
requirements: []
|
87
|
-
rubygems_version: 3.
|
87
|
+
rubygems_version: 3.1.4
|
88
88
|
signing_key:
|
89
89
|
specification_version: 4
|
90
90
|
summary: IBM Power HMC Ruby gem.
|