ibm_power_hmc 0.18.0 → 0.20.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/CHANGELOG.md +84 -1
- data/README.md +15 -1
- data/lib/ibm_power_hmc/apis/connection.rb +197 -0
- data/lib/ibm_power_hmc/{job.rb → apis/job.rb} +0 -0
- data/lib/ibm_power_hmc/{pcm.rb → apis/pcm.rb} +0 -0
- data/lib/ibm_power_hmc/apis/sem.rb +20 -0
- data/lib/ibm_power_hmc/apis/templates.rb +171 -0
- data/lib/ibm_power_hmc/{connection.rb → apis/uom.rb} +100 -400
- data/lib/ibm_power_hmc/schema/parser.rb +232 -0
- data/lib/ibm_power_hmc/schema/pcm.rb +31 -0
- data/lib/ibm_power_hmc/schema/sem.rb +92 -0
- data/lib/ibm_power_hmc/schema/templates.rb +108 -0
- data/lib/ibm_power_hmc/{parser.rb → schema/uom.rb} +33 -345
- data/lib/ibm_power_hmc/version.rb +1 -1
- data/lib/ibm_power_hmc.rb +11 -4
- metadata +13 -6
@@ -2,72 +2,8 @@
|
|
2
2
|
|
3
3
|
require 'erb'
|
4
4
|
|
5
|
-
# Module for IBM HMC Rest API Client
|
6
5
|
module IbmPowerHmc
|
7
|
-
class Error < StandardError; end
|
8
|
-
|
9
|
-
##
|
10
|
-
# HMC REST Client connection.
|
11
6
|
class Connection
|
12
|
-
##
|
13
|
-
# @!method initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true, timeout: 60)
|
14
|
-
# Create a new HMC connection.
|
15
|
-
#
|
16
|
-
# @param host [String] Hostname of the HMC.
|
17
|
-
# @param password [String] Password.
|
18
|
-
# @param username [String] User name.
|
19
|
-
# @param port [Integer] TCP port number.
|
20
|
-
# @param validate_ssl [Boolean] Verify SSL certificates.
|
21
|
-
# @param timeout [Integer] The default HTTP timeout in seconds.
|
22
|
-
def initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true, timeout: 60)
|
23
|
-
@hostname = "#{host}:#{port}"
|
24
|
-
@username = username
|
25
|
-
@password = password
|
26
|
-
@verify_ssl = validate_ssl
|
27
|
-
@api_session_token = nil
|
28
|
-
@timeout = timeout
|
29
|
-
end
|
30
|
-
|
31
|
-
##
|
32
|
-
# @!method logon
|
33
|
-
# Establish a trusted session with the Web Services APIs.
|
34
|
-
# @return [String] The X-API-Session token.
|
35
|
-
def logon
|
36
|
-
method_url = "/rest/api/web/Logon"
|
37
|
-
headers = {
|
38
|
-
:content_type => "application/vnd.ibm.powervm.web+xml; type=LogonRequest"
|
39
|
-
}
|
40
|
-
doc = REXML::Document.new("")
|
41
|
-
doc.add_element("LogonRequest", "schemaVersion" => "V1_1_0")
|
42
|
-
doc.root.add_namespace("http://www.ibm.com/xmlns/systems/power/firmware/web/mc/2012_10/")
|
43
|
-
doc.root.add_element("UserID").text = @username
|
44
|
-
doc.root.add_element("Password").text = @password
|
45
|
-
|
46
|
-
@api_session_token = ""
|
47
|
-
response = request(:put, method_url, headers, doc.to_s)
|
48
|
-
doc = REXML::Document.new(response.body)
|
49
|
-
elem = doc.elements["LogonResponse/X-API-Session"]
|
50
|
-
raise Error, "LogonResponse/X-API-Session not found" if elem.nil?
|
51
|
-
|
52
|
-
@api_session_token = elem.text
|
53
|
-
end
|
54
|
-
|
55
|
-
##
|
56
|
-
# @!method logoff
|
57
|
-
# Close the session.
|
58
|
-
def logoff
|
59
|
-
# Don't want to trigger automatic logon here!
|
60
|
-
return if @api_session_token.nil?
|
61
|
-
|
62
|
-
method_url = "/rest/api/web/Logon"
|
63
|
-
begin
|
64
|
-
request(:delete, method_url)
|
65
|
-
rescue
|
66
|
-
# Ignore exceptions as this is best effort attempt to log off.
|
67
|
-
end
|
68
|
-
@api_session_token = nil
|
69
|
-
end
|
70
|
-
|
71
7
|
##
|
72
8
|
# @!method management_console
|
73
9
|
# Retrieve information about the management console.
|
@@ -231,6 +167,16 @@ module IbmPowerHmc
|
|
231
167
|
end
|
232
168
|
end
|
233
169
|
|
170
|
+
##
|
171
|
+
# @!method lpar_delete(lpar_uuid)
|
172
|
+
# Delete a logical partition.
|
173
|
+
# @param lpar_uuid [String] The UUID of the logical partition to delete.
|
174
|
+
def lpar_delete(lpar_uuid)
|
175
|
+
method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}"
|
176
|
+
request(:delete, method_url)
|
177
|
+
# Returns HTTP 204 if ok
|
178
|
+
end
|
179
|
+
|
234
180
|
##
|
235
181
|
# @!method vioses(sys_uuid = nil, search = nil, group_name = nil, permissive = true)
|
236
182
|
# Retrieve the list of virtual I/O servers managed by the HMC.
|
@@ -247,8 +193,8 @@ module IbmPowerHmc
|
|
247
193
|
method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualIOServer"
|
248
194
|
end
|
249
195
|
query = {}
|
250
|
-
query["ignoreError"] = "true" if permissive
|
251
196
|
query["group"] = group_name unless group_name.nil?
|
197
|
+
query["ignoreError"] = "true" if permissive
|
252
198
|
method_url += "?" + query.map { |h| h.join("=") }.join("&") unless query.empty?
|
253
199
|
|
254
200
|
response = request(:get, method_url)
|
@@ -366,6 +312,19 @@ module IbmPowerHmc
|
|
366
312
|
network_adapter("VirtualIOServer", vios_uuid, netadap_uuid)
|
367
313
|
end
|
368
314
|
|
315
|
+
def network_adapter(obj_type, lpar_uuid, netadap_uuid)
|
316
|
+
if netadap_uuid.nil?
|
317
|
+
method_url = "/rest/api/uom/#{obj_type}/#{lpar_uuid}/ClientNetworkAdapter"
|
318
|
+
response = request(:get, method_url)
|
319
|
+
FeedParser.new(response.body).objects(:ClientNetworkAdapter)
|
320
|
+
else
|
321
|
+
method_url = "/rest/api/uom/#{obj_type}/#{lpar_uuid}/ClientNetworkAdapter/#{netadap_uuid}"
|
322
|
+
response = request(:get, method_url)
|
323
|
+
Parser.new(response.body).object(:ClientNetworkAdapter)
|
324
|
+
end
|
325
|
+
end
|
326
|
+
private :network_adapter
|
327
|
+
|
369
328
|
##
|
370
329
|
# @!method sriov_elp_lpar(lpar_uuid, sriov_elp_uuid = nil)
|
371
330
|
# Retrieve one or all SR-IOV ethernet logical ports attached to a logical partition.
|
@@ -373,18 +332,31 @@ module IbmPowerHmc
|
|
373
332
|
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if omitted).
|
374
333
|
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
375
334
|
def sriov_elp_lpar(lpar_uuid, sriov_elp_uuid = nil)
|
376
|
-
|
335
|
+
sriov_elp("LogicalPartition", lpar_uuid, sriov_elp_uuid)
|
377
336
|
end
|
378
337
|
|
379
338
|
##
|
380
|
-
# @!method
|
339
|
+
# @!method sriov_elp_vios(vios_uuid, sriov_elp_uuid = nil)
|
381
340
|
# Retrieve one or all SR-IOV ethernet logical ports attached to a Virtual I/O Server.
|
382
341
|
# @param vios_uuid [String] UUID of the Virtual I/O Server.
|
383
342
|
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if omitted).
|
384
343
|
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
385
344
|
def sriov_elp_vios(vios_uuid, sriov_elp_uuid = nil)
|
386
|
-
|
345
|
+
sriov_elp("VirtualIOServer", vios_uuid, sriov_elp_uuid)
|
346
|
+
end
|
347
|
+
|
348
|
+
def sriov_elp(obj_type, lpar_uuid, sriov_elp_uuid)
|
349
|
+
if sriov_elp_uuid.nil?
|
350
|
+
method_url = "/rest/api/uom/#{obj_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort"
|
351
|
+
response = request(:get, method_url)
|
352
|
+
FeedParser.new(response.body).objects(:SRIOVEthernetLogicalPort)
|
353
|
+
else
|
354
|
+
method_url = "/rest/api/uom/#{obj_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort/#{sriov_elp_uuid}"
|
355
|
+
response = request(:get, method_url)
|
356
|
+
Parser.new(response.body).object(:SRIOVEthernetLogicalPort)
|
357
|
+
end
|
387
358
|
end
|
359
|
+
private :sriov_elp
|
388
360
|
|
389
361
|
##
|
390
362
|
# @!method vnic_dedicated(lpar_uuid, vnic_uuid = nil)
|
@@ -441,11 +413,12 @@ module IbmPowerHmc
|
|
441
413
|
end
|
442
414
|
|
443
415
|
##
|
444
|
-
# @!method clusters
|
416
|
+
# @!method clusters(permissive = true)
|
445
417
|
# Retrieve the list of clusters managed by the HMC.
|
418
|
+
# @param permissive [Boolean] Ignore errors generated from bad clusters.
|
446
419
|
# @return [Array<IbmPowerHmc::Cluster>] The list of clusters.
|
447
|
-
def clusters
|
448
|
-
method_url = "/rest/api/uom/Cluster"
|
420
|
+
def clusters(permissive = true)
|
421
|
+
method_url = "/rest/api/uom/Cluster#{'?ignoreError=true' if permissive}"
|
449
422
|
response = request(:get, method_url)
|
450
423
|
FeedParser.new(response.body).objects(:Cluster)
|
451
424
|
end
|
@@ -462,11 +435,12 @@ module IbmPowerHmc
|
|
462
435
|
end
|
463
436
|
|
464
437
|
##
|
465
|
-
# @!method ssps
|
438
|
+
# @!method ssps(permissive = true)
|
466
439
|
# Retrieve the list of shared storage pools managed by the HMC.
|
440
|
+
# @param permissive [Boolean] Ignore errors generated from bad clusters.
|
467
441
|
# @return [Array<IbmPowerHmc::SharedStoragePool>] The list of shared storage pools.
|
468
|
-
def ssps
|
469
|
-
method_url = "/rest/api/uom/SharedStoragePool"
|
442
|
+
def ssps(permissive = true)
|
443
|
+
method_url = "/rest/api/uom/SharedStoragePool#{'?ignoreError=true' if permissive}"
|
470
444
|
response = request(:get, method_url)
|
471
445
|
FeedParser.new(response.body).objects(:SharedStoragePool)
|
472
446
|
end
|
@@ -483,13 +457,17 @@ module IbmPowerHmc
|
|
483
457
|
end
|
484
458
|
|
485
459
|
##
|
486
|
-
# @!method tiers(group_name = nil)
|
460
|
+
# @!method tiers(group_name = nil, permissive = true)
|
487
461
|
# Retrieve the list of tiers that are part of shared storage pools managed by the HMC.
|
488
462
|
# @param group_name [String] The extended group attributes.
|
463
|
+
# @param permissive [Boolean] Ignore errors generated from bad clusters.
|
489
464
|
# @return [Array<IbmPowerHmc::Tier>] The list of tiers.
|
490
|
-
def tiers(group_name = nil)
|
465
|
+
def tiers(group_name = nil, permissive = true)
|
491
466
|
method_url = "/rest/api/uom/Tier"
|
492
|
-
|
467
|
+
query = {}
|
468
|
+
query["group"] = group_name unless group_name.nil?
|
469
|
+
query["ignoreError"] = "true" if permissive
|
470
|
+
method_url += "?" + query.map { |h| h.join("=") }.join("&") unless query.empty?
|
493
471
|
response = request(:get, method_url)
|
494
472
|
FeedParser.new(response.body).objects(:Tier)
|
495
473
|
end
|
@@ -532,171 +510,23 @@ module IbmPowerHmc
|
|
532
510
|
end
|
533
511
|
|
534
512
|
##
|
535
|
-
# @!method
|
536
|
-
# Retrieve
|
537
|
-
# @param draft [Boolean] Retrieve draft templates as well
|
538
|
-
# @return [Array<IbmPowerHmc::PartitionTemplateSummary>] The list of partition template summaries.
|
539
|
-
def templates_summary(draft = false)
|
540
|
-
method_url = "/rest/api/templates/PartitionTemplate#{'?draft=false' unless draft}"
|
541
|
-
response = request(:get, method_url)
|
542
|
-
FeedParser.new(response.body).objects(:PartitionTemplateSummary)
|
543
|
-
end
|
544
|
-
|
545
|
-
##
|
546
|
-
# @!method templates(draft = false)
|
547
|
-
# Retrieve the list of partition templates.
|
548
|
-
# @param draft [Boolean] Retrieve draft templates as well
|
549
|
-
# @return [Array<IbmPowerHmc::PartitionTemplate>] The list of partition templates.
|
550
|
-
def templates(draft = false)
|
551
|
-
method_url = "/rest/api/templates/PartitionTemplate?detail=full#{'&draft=false' unless draft}"
|
552
|
-
response = request(:get, method_url)
|
553
|
-
FeedParser.new(response.body).objects(:PartitionTemplate)
|
554
|
-
end
|
555
|
-
|
556
|
-
##
|
557
|
-
# @!method template(template_uuid)
|
558
|
-
# Retrieve details for a particular partition template.
|
559
|
-
# @param template_uuid [String] UUID of the partition template.
|
560
|
-
# @return [IbmPowerHmc::PartitionTemplate] The partition template.
|
561
|
-
def template(template_uuid)
|
562
|
-
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
563
|
-
response = request(:get, method_url)
|
564
|
-
Parser.new(response.body).object(:PartitionTemplate)
|
565
|
-
end
|
566
|
-
|
567
|
-
##
|
568
|
-
# @!method capture_lpar(lpar_uuid, sys_uuid, template_name, sync = true)
|
569
|
-
# Capture partition configuration as template.
|
570
|
-
# @param lpar_uuid [String] The UUID of the logical partition.
|
513
|
+
# @!method shared_memory_pool(sys_uuid, pool_uuid = nil)
|
514
|
+
# Retrieve information about Shared Memory Pools.
|
571
515
|
# @param sys_uuid [String] The UUID of the managed system.
|
572
|
-
# @param
|
573
|
-
# @
|
574
|
-
|
575
|
-
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
|
580
|
-
"
|
581
|
-
|
582
|
-
|
583
|
-
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
584
|
-
}
|
585
|
-
job = HmcJob.new(self, method_url, "Capture", "PartitionTemplate", params)
|
586
|
-
job.run if sync
|
587
|
-
job
|
588
|
-
end
|
589
|
-
|
590
|
-
##
|
591
|
-
# @!method template_check(template_uuid, target_sys_uuid, sync = true)
|
592
|
-
# Start Template Check job (first of three steps to deploy an LPAR from a Template).
|
593
|
-
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
594
|
-
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
595
|
-
# @param sync [Boolean] Start the job and wait for its completion.
|
596
|
-
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
597
|
-
def template_check(template_uuid, target_sys_uuid, sync = true)
|
598
|
-
# Need to include session token in payload so make sure we are logged in
|
599
|
-
logon if @api_session_token.nil?
|
600
|
-
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}/do/check"
|
601
|
-
params = {
|
602
|
-
"TargetUuid" => target_sys_uuid,
|
603
|
-
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
604
|
-
}
|
605
|
-
job = HmcJob.new(self, method_url, "Check", "PartitionTemplate", params)
|
606
|
-
job.run if sync
|
607
|
-
job
|
608
|
-
end
|
609
|
-
|
610
|
-
##
|
611
|
-
# @!method template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
612
|
-
# Start Template Transform job (second of three steps to deploy an LPAR from a Template).
|
613
|
-
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
614
|
-
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
615
|
-
# @param sync [Boolean] Start the job and wait for its completion.
|
616
|
-
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
617
|
-
def template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
618
|
-
# Need to include session token in payload so make sure we are logged in
|
619
|
-
logon if @api_session_token.nil?
|
620
|
-
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/transform"
|
621
|
-
params = {
|
622
|
-
"TargetUuid" => target_sys_uuid,
|
623
|
-
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
624
|
-
}
|
625
|
-
job = HmcJob.new(self, method_url, "Transform", "PartitionTemplate", params)
|
626
|
-
job.run if sync
|
627
|
-
job
|
628
|
-
end
|
629
|
-
|
630
|
-
##
|
631
|
-
# @!method template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
632
|
-
# Start Template Deploy job (last of three steps to deploy an LPAR from a Template).
|
633
|
-
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
634
|
-
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
635
|
-
# @param sync [Boolean] Start the job and wait for its completion.
|
636
|
-
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
637
|
-
def template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
638
|
-
# Need to include session token in payload so make sure we are logged in
|
639
|
-
logon if @api_session_token.nil?
|
640
|
-
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/deploy"
|
641
|
-
params = {
|
642
|
-
"TargetUuid" => target_sys_uuid,
|
643
|
-
"TemplateUuid" => draft_template_uuid,
|
644
|
-
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
645
|
-
}
|
646
|
-
job = HmcJob.new(self, method_url, "Deploy", "PartitionTemplate", params)
|
647
|
-
job.run if sync
|
648
|
-
job
|
649
|
-
end
|
650
|
-
|
651
|
-
##
|
652
|
-
# @!method template_provision(template_uuid, target_sys_uuid, changes)
|
653
|
-
# Deploy Logical Partition from a Template (performs Check, Transform and Deploy steps in a single method).
|
654
|
-
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
655
|
-
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
656
|
-
# @param changes [Hash] Modifications to apply to the Template before deploying Logical Partition.
|
657
|
-
# @return [String] The UUID of the deployed Logical Partition.
|
658
|
-
def template_provision(template_uuid, target_sys_uuid, changes)
|
659
|
-
draft_uuid = template_check(template_uuid, target_sys_uuid).results["TEMPLATE_UUID"]
|
660
|
-
template_transform(draft_uuid, target_sys_uuid)
|
661
|
-
template_modify(draft_uuid, changes)
|
662
|
-
template_deploy(draft_uuid, target_sys_uuid).results["PartitionUuid"]
|
663
|
-
end
|
664
|
-
|
665
|
-
##
|
666
|
-
# @!method template_modify(template_uuid, changes)
|
667
|
-
# Modify a template.
|
668
|
-
# @param template_uuid [String] UUID of the partition template to modify.
|
669
|
-
# @param changes [Hash] Hash of changes to make.
|
670
|
-
def template_modify(template_uuid, changes)
|
671
|
-
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
672
|
-
|
673
|
-
# Templates have no href so need to use modify_object_url.
|
674
|
-
modify_object_url(method_url) do
|
675
|
-
template(template_uuid).tap do |obj|
|
676
|
-
changes.each do |key, value|
|
677
|
-
obj.send("#{key}=", value)
|
678
|
-
end
|
679
|
-
end
|
516
|
+
# @param pool_uuid [String] The UUID of the shared memory pool (return all pools if omitted)
|
517
|
+
# @return [Array<IbmPowerHmc::SharedMemoryPool>, IbmPowerHmc::SharedMemoryPool] The list of shared memory pools.
|
518
|
+
def shared_memory_pool(sys_uuid, pool_uuid = nil)
|
519
|
+
if pool_uuid.nil?
|
520
|
+
method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/SharedMemoryPool"
|
521
|
+
response = request(:get, method_url)
|
522
|
+
FeedParser.new(response.body).objects(:SharedMemoryPool)
|
523
|
+
else
|
524
|
+
method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/SharedMemoryPool/#{pool_uuid}"
|
525
|
+
response = request(:get, method_url)
|
526
|
+
Parser.new(response.body).object(:SharedMemoryPool)
|
680
527
|
end
|
681
528
|
end
|
682
529
|
|
683
|
-
##
|
684
|
-
# @!method template_copy(template_uuid, new_name)
|
685
|
-
# Copy existing template to a new one.
|
686
|
-
# @param template_uuid [String] UUID of the partition template to copy.
|
687
|
-
# @param new_name [String] Name of the new template.
|
688
|
-
# @return [IbmPowerHmc::PartitionTemplate] The new partition template.
|
689
|
-
def template_copy(template_uuid, new_name)
|
690
|
-
method_url = "/rest/api/templates/PartitionTemplate"
|
691
|
-
headers = {
|
692
|
-
:content_type => "application/vnd.ibm.powervm.templates+xml;type=PartitionTemplate"
|
693
|
-
}
|
694
|
-
original = template(template_uuid)
|
695
|
-
original.name = new_name
|
696
|
-
response = request(:put, method_url, headers, original.xml.to_s)
|
697
|
-
Parser.new(response.body).object(:PartitionTemplate)
|
698
|
-
end
|
699
|
-
|
700
530
|
##
|
701
531
|
# @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
|
702
532
|
# Power on a logical partition.
|
@@ -796,6 +626,21 @@ module IbmPowerHmc
|
|
796
626
|
job
|
797
627
|
end
|
798
628
|
|
629
|
+
##
|
630
|
+
# @!method chcomgmt(sys_uuid, status)
|
631
|
+
# Change the co-management settings for a managed system.
|
632
|
+
# @param sys_uuid [String] The UUID of the managed system.
|
633
|
+
# @param status [String] The new co-management status ("rel", "norm", "keep").
|
634
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
635
|
+
def chcomgmt(sys_uuid, status)
|
636
|
+
operation = status == "rel" ? "ReleaseController" : "RequestController"
|
637
|
+
method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/do/#{operation}"
|
638
|
+
|
639
|
+
params = {}
|
640
|
+
params["coManagementControllerStatus"] = status unless status == "rel"
|
641
|
+
HmcJob.new(self, method_url, operation, "ManagedSystem", params).tap(&:run)
|
642
|
+
end
|
643
|
+
|
799
644
|
##
|
800
645
|
# @!method cli_run(hmc_uuid, cmd, sync = true)
|
801
646
|
# Run a CLI command on the HMC as a job.
|
@@ -815,6 +660,23 @@ module IbmPowerHmc
|
|
815
660
|
job
|
816
661
|
end
|
817
662
|
|
663
|
+
##
|
664
|
+
# @!method grow_lu(cl_uuid, lu_uuid, capacity)
|
665
|
+
# Increase the size of a logical unit in a cluster.
|
666
|
+
# @param cl_uuid [String] The UUID of the cluster.
|
667
|
+
# @param lu_uuid [String] The UUID of the logical unit.
|
668
|
+
# @param capacity [Float] The new logical unit size (in GB).
|
669
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
670
|
+
def grow_lu(cl_uuid, lu_uuid, capacity)
|
671
|
+
method_url = "/rest/api/uom/Cluster/#{cl_uuid}/do/GrowLogicalUnit"
|
672
|
+
|
673
|
+
params = {
|
674
|
+
"LogicalUnitUDID" => lu_uuid,
|
675
|
+
"Capacity" => capacity
|
676
|
+
}
|
677
|
+
HmcJob.new(self, method_url, "GrowLogicalUnit", "Cluster", params).tap(&:run)
|
678
|
+
end
|
679
|
+
|
818
680
|
##
|
819
681
|
# @!method next_events(wait = true)
|
820
682
|
# Retrieve a list of events that occured since last call.
|
@@ -840,167 +702,5 @@ module IbmPowerHmc
|
|
840
702
|
e
|
841
703
|
end.compact
|
842
704
|
end
|
843
|
-
|
844
|
-
##
|
845
|
-
# @!method usertask(uuid = true)
|
846
|
-
# Retrieve details of an event of type "user task".
|
847
|
-
# @param uuid [String] UUID of user task.
|
848
|
-
# @return [Hash] Hash of user task attributes.
|
849
|
-
def usertask(uuid)
|
850
|
-
method_url = "/rest/api/ui/UserTask/#{uuid}"
|
851
|
-
response = request(:get, method_url)
|
852
|
-
j = JSON.parse(response.body)
|
853
|
-
if j['status'].eql?("Completed")
|
854
|
-
case j['key']
|
855
|
-
when "TEMPLATE_PARTITION_SAVE", "TEMPLATE_PARTITION_SAVE_AS", "TEMPLATE_PARTITION_CAPTURE"
|
856
|
-
j['template_uuid'] = templates_summary.find { |t| t.name.eql?(j['labelParams'].first) }&.uuid
|
857
|
-
end
|
858
|
-
end
|
859
|
-
j
|
860
|
-
end
|
861
|
-
|
862
|
-
##
|
863
|
-
# @!method schema(type)
|
864
|
-
# Retrieve the XML schema file for a given object type.
|
865
|
-
# @param type [String] The object type (e.g. "LogicalPartition", "inc/Types")
|
866
|
-
# @return [REXML::Document] The XML schema file.
|
867
|
-
def schema(type)
|
868
|
-
method_url = "/rest/api/web/schema/#{type}.xsd"
|
869
|
-
response = request(:get, method_url)
|
870
|
-
REXML::Document.new(response.body)
|
871
|
-
end
|
872
|
-
|
873
|
-
class HttpError < Error
|
874
|
-
attr_reader :status, :uri, :reason, :message, :original_exception
|
875
|
-
|
876
|
-
##
|
877
|
-
# @!method initialize(err)
|
878
|
-
# Create a new HttpError exception.
|
879
|
-
# @param err [RestClient::Exception] The REST client exception.
|
880
|
-
def initialize(err)
|
881
|
-
super
|
882
|
-
@original_exception = err
|
883
|
-
@status = err.http_code
|
884
|
-
@message = err.message
|
885
|
-
|
886
|
-
# Try to parse body as an HttpErrorResponse.
|
887
|
-
unless err.response.nil?
|
888
|
-
begin
|
889
|
-
resp = Parser.new(err.response.body).object(:HttpErrorResponse)
|
890
|
-
@uri = resp.uri
|
891
|
-
@reason = resp.reason
|
892
|
-
@message = resp.message
|
893
|
-
rescue
|
894
|
-
# not an XML body
|
895
|
-
end
|
896
|
-
end
|
897
|
-
end
|
898
|
-
|
899
|
-
def to_s
|
900
|
-
"msg=\"#{@message}\" status=\"#{@status}\" reason=\"#{@reason}\" uri=#{@uri}"
|
901
|
-
end
|
902
|
-
end
|
903
|
-
|
904
|
-
##
|
905
|
-
# @!method request(method, url, headers = {}, payload = nil)
|
906
|
-
# Perform a REST API request.
|
907
|
-
# @param method [String] The HTTP method.
|
908
|
-
# @param url [String] The method URL.
|
909
|
-
# @param headers [Hash] HTTP headers.
|
910
|
-
# @param payload [String] HTTP request payload.
|
911
|
-
# @return [RestClient::Response] The response from the HMC.
|
912
|
-
def request(method, url, headers = {}, payload = nil)
|
913
|
-
logon if @api_session_token.nil?
|
914
|
-
reauth = false
|
915
|
-
# Check for relative URLs
|
916
|
-
url = "https://#{@hostname}#{url}" if url.start_with?("/")
|
917
|
-
begin
|
918
|
-
headers = headers.merge("X-API-Session" => @api_session_token)
|
919
|
-
RestClient::Request.execute(
|
920
|
-
:method => method,
|
921
|
-
:url => url,
|
922
|
-
:verify_ssl => @verify_ssl,
|
923
|
-
:payload => payload,
|
924
|
-
:headers => headers,
|
925
|
-
:timeout => @timeout
|
926
|
-
)
|
927
|
-
rescue RestClient::Exception => e
|
928
|
-
# Do not retry on failed logon attempts.
|
929
|
-
if e.http_code == 401 && @api_session_token != "" && !reauth
|
930
|
-
# Try to reauth.
|
931
|
-
reauth = true
|
932
|
-
logon
|
933
|
-
retry
|
934
|
-
end
|
935
|
-
raise HttpError.new(e), "REST request failed"
|
936
|
-
end
|
937
|
-
end
|
938
|
-
|
939
|
-
# @!method modify_object(headers = {}, attempts = 5)
|
940
|
-
# Post an IbmPowerHmc::AbstractRest object iteratively using ETag.
|
941
|
-
# @param headers [Hash] HTTP headers.
|
942
|
-
# @param attempts [Integer] Maximum number of retries.
|
943
|
-
# @yieldreturn [IbmPowerHmc::AbstractRest] The object to modify.
|
944
|
-
def modify_object(headers = {}, attempts = 5, &block)
|
945
|
-
modify_object_url(nil, headers, attempts, &block)
|
946
|
-
end
|
947
|
-
|
948
|
-
private
|
949
|
-
|
950
|
-
def modify_object_url(method_url = nil, headers = {}, attempts = 5)
|
951
|
-
while attempts > 0
|
952
|
-
obj = yield
|
953
|
-
raise "object has no href" if method_url.nil? && (!obj.kind_of?(AbstractRest) || obj.href.nil?)
|
954
|
-
|
955
|
-
# Use ETag to ensure object has not changed.
|
956
|
-
headers = headers.merge("If-Match" => obj.etag, :content_type => obj.content_type)
|
957
|
-
begin
|
958
|
-
request(:post, method_url.nil? ? obj.href.path : method_url, headers, obj.xml.to_s)
|
959
|
-
break
|
960
|
-
rescue HttpError => e
|
961
|
-
attempts -= 1
|
962
|
-
# Will get 412 ("Precondition Failed") if ETag mismatches.
|
963
|
-
raise if e.status != 412 || attempts == 0
|
964
|
-
end
|
965
|
-
end
|
966
|
-
end
|
967
|
-
|
968
|
-
##
|
969
|
-
# @!method network_adapter(vm_type, lpar_uuid, netadap_uuid)
|
970
|
-
# Retrieve one or all virtual ethernet network adapters attached to a Logical Partition or a Virtual I/O Server.
|
971
|
-
# @param vm_type [String] "LogicalPartition" or "VirtualIOServer".
|
972
|
-
# @param lpar_uuid [String] UUID of the Logical Partition or the Virtual I/O Server.
|
973
|
-
# @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if nil).
|
974
|
-
# @return [Array<IbmPowerHmc::ClientNetworkAdapter>, IbmPowerHmc::ClientNetworkAdapter] The list of network adapters.
|
975
|
-
def network_adapter(vm_type, lpar_uuid, netadap_uuid)
|
976
|
-
if netadap_uuid.nil?
|
977
|
-
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter"
|
978
|
-
response = request(:get, method_url)
|
979
|
-
FeedParser.new(response.body).objects(:ClientNetworkAdapter)
|
980
|
-
else
|
981
|
-
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter/#{netadap_uuid}"
|
982
|
-
response = request(:get, method_url)
|
983
|
-
Parser.new(response.body).object(:ClientNetworkAdapter)
|
984
|
-
end
|
985
|
-
end
|
986
|
-
|
987
|
-
##
|
988
|
-
# @!method sriov_ethernet_port(vm_type, lpar_uuid, sriov_elp_uuid)
|
989
|
-
# Retrieve one or all SR-IOV Ethernet loical ports attached to a Logical Partition or a Virtual I/O Server.
|
990
|
-
# @param vm_type [String] "LogicalPartition" or "VirtualIOServer".
|
991
|
-
# @param lpar_uuid [String] UUID of the Logical Partition or the Virtual I/O Server.
|
992
|
-
# @param sriov_elp_uuid [String] UUID of the port to match (returns all ports if nil).
|
993
|
-
# @return [Array<IbmPowerHmc::SRIOVEthernetLogicalPort>, IbmPowerHmc::SRIOVEthernetLogicalPort] The list of ports.
|
994
|
-
def sriov_ethernet_port(vm_type, lpar_uuid, sriov_elp_uuid)
|
995
|
-
if sriov_elp_uuid.nil?
|
996
|
-
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort"
|
997
|
-
response = request(:get, method_url)
|
998
|
-
FeedParser.new(response.body).objects(:SRIOVEthernetLogicalPort)
|
999
|
-
else
|
1000
|
-
method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/SRIOVEthernetLogicalPort/#{sriov_elp_uuid}"
|
1001
|
-
response = request(:get, method_url)
|
1002
|
-
Parser.new(response.body).object(:SRIOVEthernetLogicalPort)
|
1003
|
-
end
|
1004
|
-
end
|
1005
705
|
end
|
1006
706
|
end
|