ibm_power_hmc 0.18.0 → 0.19.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +76 -1
- data/README.md +7 -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} +39 -395
- 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} +3 -358
- data/lib/ibm_power_hmc/version.rb +1 -1
- data/lib/ibm_power_hmc.rb +11 -4
- metadata +13 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8e8b824464b658e795023dba5c23ec80a7b90e830c204d7184a786029d37f276
|
4
|
+
data.tar.gz: 5eb6491fd0d3f7d465acc0a8bbdac0063ceb1e028ad4c7b14b3ac92e7f79d622
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 1a13e2dc82679cadc1ee2de5029aa30346402bf4d41e26932ab16325e097b63814d482ffcdd2d9e1fd14cb21e771231ca3ec52e5c5af6b2317fc1e43c3fd4adf
|
7
|
+
data.tar.gz: 1e502b797270f3b71bb9d01280dc40a3f60e81ed2782027273ca75e045347872b641499622f915ed36f1dc75605468c6b86caa5c4bbd1894cff38189b6023ded
|
data/CHANGELOG.md
CHANGED
@@ -1,2 +1,77 @@
|
|
1
|
-
|
1
|
+
## v0.19.0
|
2
|
+
* Major code refactoring
|
3
|
+
* Add `serviceable_events` method
|
4
|
+
* Add schema definitions for serviceable events
|
5
|
+
* Add `lpar_delete` method
|
6
|
+
* Add HttpNotFound exception for 404 errors
|
7
|
+
## v0.18.0
|
8
|
+
* Remove deprecated `rename_lpar` method (replaced by `modify_object`)
|
9
|
+
* Add schema definition for SEA
|
10
|
+
* Add schema definition for trunk adapters
|
11
|
+
* Add schema definition for IPInterface
|
12
|
+
## v0.17.0
|
13
|
+
* Add extended group attributes to lpars and vioses methods
|
14
|
+
* Add `lpars_quick` and `vioses_quick` methods
|
15
|
+
## v0.16.0
|
16
|
+
* Add timeout parameter for `IbmPowerHmc::Connection`
|
17
|
+
* Export `modify_object` method
|
18
|
+
* Add more attributes to ManagementConsole schema definition
|
19
|
+
* Add schema definitions for more IOAdapters
|
20
|
+
## v0.15.0
|
21
|
+
* Add `managed_systems_quick` and `managed_system_quick` methods
|
22
|
+
## v0.14.0
|
23
|
+
* Make search parameter a string instead of a hash
|
24
|
+
* Add `is_classic_hmc_mgmt` and `is_hmc_mgmt_master` to schema definitions
|
25
|
+
## v0.13.0
|
26
|
+
* Add `lpar_migrate_validate` and `lpar_migrate` methods
|
27
|
+
* Add `vscsi_client_adapter` and `vfc_client_adapter` methods
|
28
|
+
* Add schema definition for SharedProcessorPool
|
29
|
+
## 0.12.0
|
30
|
+
* Add permissive parameter to vioses method
|
31
|
+
* Add draft parameter to templates and `templates_summary` methods
|
32
|
+
* Add `template_copy` method
|
33
|
+
* Add `sys_uuid` parameter to `managed_system_pcm_preferences` method
|
34
|
+
## v0.11.0
|
35
|
+
* Add `template_check`, `template_transform` and `template_provision` methods
|
36
|
+
* Add JobFailed exception
|
37
|
+
* Add vfc, vlans, vscsi setters to schema definition for templates
|
38
|
+
## v0.10.0
|
39
|
+
* Add `managed_system_pcm_preferences` method
|
40
|
+
* Add schema definitions for PCM
|
41
|
+
## v0.9.0
|
42
|
+
* Add groups method
|
43
|
+
* Add SSH public keys to ManagementConsole schema definition
|
44
|
+
* Add schema definitions for groups
|
45
|
+
* Add schema definition for SharedFileSystemFile
|
46
|
+
* Fix parsing of unknown backing devices
|
47
|
+
## v0.8.0
|
48
|
+
* Add templates method
|
49
|
+
## v0.7.0
|
50
|
+
* Add cluster, SSP and tier methods
|
51
|
+
* Add template methods
|
52
|
+
* Add `capture_lpar` method
|
53
|
+
* Add usertask method
|
54
|
+
* Add schema definition for IOAdapter
|
55
|
+
* Add schema definitions for disks
|
56
|
+
* Add schema definitions for VSCSI and VFC
|
57
|
+
* Add schema definitions for cluster, SSP and tier
|
58
|
+
* Add schema definitions for templates
|
59
|
+
## v0.6.0
|
60
|
+
* Add SRIOV and VNIC methods
|
61
|
+
* Add schema definitions for SRIOVEthernetLogicalPort and VirtualNICDedicated
|
62
|
+
## v0.5.0
|
63
|
+
* Add `virtual_networks` method for VLANs
|
64
|
+
* Add schema definitions for VirtualNetwork, VirtualIOAdapter, VirtualEthernetAdapter
|
65
|
+
## v0.4.0
|
66
|
+
* Add `network_adapter_lpar` and `network_adapter_vios` methods
|
67
|
+
* Add `virtual_switches` and `virtual_switch` methods
|
68
|
+
* Add schema definitions for VirtualSwitch and ClientNetworkAdapter
|
69
|
+
## v0.3.0
|
70
|
+
* Add `rename_lpar` method
|
71
|
+
* Add `remove_connection` method
|
72
|
+
## v0.2.0
|
73
|
+
* Add rubocop local overrides
|
74
|
+
* Add PCM APIs
|
75
|
+
* Add search parameter
|
76
|
+
## v0.1.0
|
2
77
|
* Initial release
|
data/README.md
CHANGED
@@ -70,7 +70,13 @@ Shutting down a logical partition:
|
|
70
70
|
hc.poweroff_lpar(lpar_uuid, { "operation" => "shutdown" })
|
71
71
|
```
|
72
72
|
|
73
|
-
|
73
|
+
Listing serviceable events:
|
74
|
+
|
75
|
+
```ruby
|
76
|
+
puts hc.serviceable_events
|
77
|
+
```
|
78
|
+
|
79
|
+
Processing HMC events:
|
74
80
|
|
75
81
|
```ruby
|
76
82
|
loop do
|
@@ -0,0 +1,197 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
# Module for IBM HMC Rest API Client
|
4
|
+
module IbmPowerHmc
|
5
|
+
class Error < StandardError; end
|
6
|
+
|
7
|
+
##
|
8
|
+
# HMC REST Client connection.
|
9
|
+
class Connection
|
10
|
+
##
|
11
|
+
# @!method initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true, timeout: 60)
|
12
|
+
# Create a new HMC connection.
|
13
|
+
#
|
14
|
+
# @param host [String] Hostname of the HMC.
|
15
|
+
# @param password [String] Password.
|
16
|
+
# @param username [String] User name.
|
17
|
+
# @param port [Integer] TCP port number.
|
18
|
+
# @param validate_ssl [Boolean] Verify SSL certificates.
|
19
|
+
# @param timeout [Integer] The default HTTP timeout in seconds.
|
20
|
+
def initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true, timeout: 60)
|
21
|
+
@hostname = "#{host}:#{port}"
|
22
|
+
@username = username
|
23
|
+
@password = password
|
24
|
+
@verify_ssl = validate_ssl
|
25
|
+
@api_session_token = nil
|
26
|
+
@timeout = timeout
|
27
|
+
end
|
28
|
+
|
29
|
+
##
|
30
|
+
# @!method logon
|
31
|
+
# Establish a trusted session with the Web Services APIs.
|
32
|
+
# @return [String] The X-API-Session token.
|
33
|
+
def logon
|
34
|
+
method_url = "/rest/api/web/Logon"
|
35
|
+
headers = {
|
36
|
+
:content_type => "application/vnd.ibm.powervm.web+xml; type=LogonRequest"
|
37
|
+
}
|
38
|
+
doc = REXML::Document.new("")
|
39
|
+
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/")
|
41
|
+
doc.root.add_element("UserID").text = @username
|
42
|
+
doc.root.add_element("Password").text = @password
|
43
|
+
|
44
|
+
@api_session_token = ""
|
45
|
+
response = request(:put, method_url, headers, doc.to_s)
|
46
|
+
doc = REXML::Document.new(response.body)
|
47
|
+
elem = doc.elements["LogonResponse/X-API-Session"]
|
48
|
+
raise Error, "LogonResponse/X-API-Session not found" if elem.nil?
|
49
|
+
|
50
|
+
@api_session_token = elem.text
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# @!method logoff
|
55
|
+
# Close the session.
|
56
|
+
def logoff
|
57
|
+
# Don't want to trigger automatic logon here!
|
58
|
+
return if @api_session_token.nil?
|
59
|
+
|
60
|
+
method_url = "/rest/api/web/Logon"
|
61
|
+
begin
|
62
|
+
request(:delete, method_url)
|
63
|
+
rescue
|
64
|
+
# Ignore exceptions as this is best effort attempt to log off.
|
65
|
+
end
|
66
|
+
@api_session_token = nil
|
67
|
+
end
|
68
|
+
|
69
|
+
##
|
70
|
+
# @!method usertask(uuid = true)
|
71
|
+
# Retrieve details of an event of type "user task".
|
72
|
+
# @param uuid [String] UUID of user task.
|
73
|
+
# @return [Hash] Hash of user task attributes.
|
74
|
+
def usertask(uuid)
|
75
|
+
method_url = "/rest/api/ui/UserTask/#{uuid}"
|
76
|
+
response = request(:get, method_url)
|
77
|
+
j = JSON.parse(response.body)
|
78
|
+
if j['status'].eql?("Completed")
|
79
|
+
case j['key']
|
80
|
+
when "TEMPLATE_PARTITION_SAVE", "TEMPLATE_PARTITION_SAVE_AS", "TEMPLATE_PARTITION_CAPTURE"
|
81
|
+
j['template_uuid'] = templates_summary.find { |t| t.name.eql?(j['labelParams'].first) }&.uuid
|
82
|
+
end
|
83
|
+
end
|
84
|
+
j
|
85
|
+
end
|
86
|
+
|
87
|
+
##
|
88
|
+
# @!method schema(type)
|
89
|
+
# Retrieve the XML schema file for a given object type.
|
90
|
+
# @param type [String] The object type (e.g. "LogicalPartition", "inc/Types")
|
91
|
+
# @return [REXML::Document] The XML schema file.
|
92
|
+
def schema(type)
|
93
|
+
method_url = "/rest/api/web/schema/#{type}.xsd"
|
94
|
+
response = request(:get, method_url)
|
95
|
+
REXML::Document.new(response.body)
|
96
|
+
end
|
97
|
+
|
98
|
+
class HttpError < Error
|
99
|
+
attr_reader :status, :uri, :reason, :message, :original_exception
|
100
|
+
|
101
|
+
##
|
102
|
+
# @!method initialize(err)
|
103
|
+
# Create a new HttpError exception.
|
104
|
+
# @param err [RestClient::Exception] The REST client exception.
|
105
|
+
def initialize(err)
|
106
|
+
super
|
107
|
+
@original_exception = err
|
108
|
+
@status = err.http_code
|
109
|
+
@message = err.message
|
110
|
+
|
111
|
+
# Try to parse body as an HttpErrorResponse.
|
112
|
+
unless err.response.nil?
|
113
|
+
begin
|
114
|
+
resp = Parser.new(err.response.body).object(:HttpErrorResponse)
|
115
|
+
@uri = resp.uri
|
116
|
+
@reason = resp.reason
|
117
|
+
@message = resp.message
|
118
|
+
rescue
|
119
|
+
# not an XML body
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def to_s
|
125
|
+
"msg=\"#{@message}\" status=\"#{@status}\" reason=\"#{@reason}\" uri=#{@uri}"
|
126
|
+
end
|
127
|
+
end
|
128
|
+
|
129
|
+
class HttpNotFound < HttpError; end
|
130
|
+
|
131
|
+
##
|
132
|
+
# @!method request(method, url, headers = {}, payload = nil)
|
133
|
+
# Perform a REST API request.
|
134
|
+
# @param method [String] The HTTP method.
|
135
|
+
# @param url [String] The method URL.
|
136
|
+
# @param headers [Hash] HTTP headers.
|
137
|
+
# @param payload [String] HTTP request payload.
|
138
|
+
# @return [RestClient::Response] The response from the HMC.
|
139
|
+
def request(method, url, headers = {}, payload = nil)
|
140
|
+
logon if @api_session_token.nil?
|
141
|
+
reauth = false
|
142
|
+
# Check for relative URLs
|
143
|
+
url = "https://#{@hostname}#{url}" if url.start_with?("/")
|
144
|
+
begin
|
145
|
+
headers = headers.merge("X-API-Session" => @api_session_token)
|
146
|
+
RestClient::Request.execute(
|
147
|
+
:method => method,
|
148
|
+
:url => url,
|
149
|
+
:verify_ssl => @verify_ssl,
|
150
|
+
:payload => payload,
|
151
|
+
:headers => headers,
|
152
|
+
:timeout => @timeout
|
153
|
+
)
|
154
|
+
rescue RestClient::Exception => e
|
155
|
+
raise HttpNotFound.new(e), "Not found" if e.http_code == 404
|
156
|
+
|
157
|
+
# Do not retry on failed logon attempts.
|
158
|
+
if e.http_code == 401 && @api_session_token != "" && !reauth
|
159
|
+
# Try to reauth.
|
160
|
+
reauth = true
|
161
|
+
logon
|
162
|
+
retry
|
163
|
+
end
|
164
|
+
raise HttpError.new(e), "REST request failed"
|
165
|
+
end
|
166
|
+
end
|
167
|
+
|
168
|
+
# @!method modify_object(headers = {}, attempts = 5)
|
169
|
+
# Post an IbmPowerHmc::AbstractRest object iteratively using ETag.
|
170
|
+
# @param headers [Hash] HTTP headers.
|
171
|
+
# @param attempts [Integer] Maximum number of retries.
|
172
|
+
# @yieldreturn [IbmPowerHmc::AbstractRest] The object to modify.
|
173
|
+
def modify_object(headers = {}, attempts = 5, &block)
|
174
|
+
modify_object_url(nil, headers, attempts, &block)
|
175
|
+
end
|
176
|
+
|
177
|
+
private
|
178
|
+
|
179
|
+
def modify_object_url(method_url = nil, headers = {}, attempts = 5)
|
180
|
+
while attempts > 0
|
181
|
+
obj = yield
|
182
|
+
raise "object has no href" if method_url.nil? && (!obj.kind_of?(AbstractRest) || obj.href.nil?)
|
183
|
+
|
184
|
+
# Use ETag to ensure object has not changed.
|
185
|
+
headers = headers.merge("If-Match" => obj.etag, :content_type => obj.content_type)
|
186
|
+
begin
|
187
|
+
request(:post, method_url.nil? ? obj.href.path : method_url, headers, obj.xml.to_s)
|
188
|
+
break
|
189
|
+
rescue HttpError => e
|
190
|
+
attempts -= 1
|
191
|
+
# Will get 412 ("Precondition Failed") if ETag mismatches.
|
192
|
+
raise if e.status != 412 || attempts == 0
|
193
|
+
end
|
194
|
+
end
|
195
|
+
end
|
196
|
+
end
|
197
|
+
end
|
File without changes
|
File without changes
|
@@ -0,0 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
##
|
4
|
+
# Serviceable Events Manager.
|
5
|
+
|
6
|
+
module IbmPowerHmc
|
7
|
+
class Connection
|
8
|
+
##
|
9
|
+
# @!method serviceable_events(status = nil)
|
10
|
+
# Retrieve serviceable events from the HMC.
|
11
|
+
# @param status [String] Query only events in that state.
|
12
|
+
# @return [Array<IbmPowerHmc::ServiceableEvent>] The list of serviceable events.
|
13
|
+
def serviceable_events(status = nil)
|
14
|
+
method_url = "/rest/api/sem/ServiceableEvent"
|
15
|
+
method_url += "?status=#{status}" unless status.nil?
|
16
|
+
response = request(:get, method_url)
|
17
|
+
FeedParser.new(response.body).objects(:ServiceableEvent)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,171 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module IbmPowerHmc
|
4
|
+
class Connection
|
5
|
+
##
|
6
|
+
# @!method templates_summary(draft = false)
|
7
|
+
# Retrieve the list of partition template summaries.
|
8
|
+
# @param draft [Boolean] Retrieve draft templates as well
|
9
|
+
# @return [Array<IbmPowerHmc::PartitionTemplateSummary>] The list of partition template summaries.
|
10
|
+
def templates_summary(draft = false)
|
11
|
+
method_url = "/rest/api/templates/PartitionTemplate#{'?draft=false' unless draft}"
|
12
|
+
response = request(:get, method_url)
|
13
|
+
FeedParser.new(response.body).objects(:PartitionTemplateSummary)
|
14
|
+
end
|
15
|
+
|
16
|
+
##
|
17
|
+
# @!method templates(draft = false)
|
18
|
+
# Retrieve the list of partition templates.
|
19
|
+
# @param draft [Boolean] Retrieve draft templates as well
|
20
|
+
# @return [Array<IbmPowerHmc::PartitionTemplate>] The list of partition templates.
|
21
|
+
def templates(draft = false)
|
22
|
+
method_url = "/rest/api/templates/PartitionTemplate?detail=full#{'&draft=false' unless draft}"
|
23
|
+
response = request(:get, method_url)
|
24
|
+
FeedParser.new(response.body).objects(:PartitionTemplate)
|
25
|
+
end
|
26
|
+
|
27
|
+
##
|
28
|
+
# @!method template(template_uuid)
|
29
|
+
# Retrieve details for a particular partition template.
|
30
|
+
# @param template_uuid [String] UUID of the partition template.
|
31
|
+
# @return [IbmPowerHmc::PartitionTemplate] The partition template.
|
32
|
+
def template(template_uuid)
|
33
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
34
|
+
response = request(:get, method_url)
|
35
|
+
Parser.new(response.body).object(:PartitionTemplate)
|
36
|
+
end
|
37
|
+
|
38
|
+
##
|
39
|
+
# @!method capture_lpar(lpar_uuid, sys_uuid, template_name, sync = true)
|
40
|
+
# Capture partition configuration as template.
|
41
|
+
# @param lpar_uuid [String] The UUID of the logical partition.
|
42
|
+
# @param sys_uuid [String] The UUID of the managed system.
|
43
|
+
# @param template_name [String] The name to be given for the new template.
|
44
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
45
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
46
|
+
def capture_lpar(lpar_uuid, sys_uuid, template_name, sync = true)
|
47
|
+
# Need to include session token in payload so make sure we are logged in
|
48
|
+
logon if @api_session_token.nil?
|
49
|
+
method_url = "/rest/api/templates/PartitionTemplate/do/capture"
|
50
|
+
params = {
|
51
|
+
"TargetUuid" => lpar_uuid,
|
52
|
+
"NewTemplateName" => template_name,
|
53
|
+
"ManagedSystemUuid" => sys_uuid,
|
54
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
55
|
+
}
|
56
|
+
job = HmcJob.new(self, method_url, "Capture", "PartitionTemplate", params)
|
57
|
+
job.run if sync
|
58
|
+
job
|
59
|
+
end
|
60
|
+
|
61
|
+
##
|
62
|
+
# @!method template_check(template_uuid, target_sys_uuid, sync = true)
|
63
|
+
# Start Template Check job (first of three steps to deploy an LPAR from a Template).
|
64
|
+
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
65
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
66
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
67
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
68
|
+
def template_check(template_uuid, target_sys_uuid, sync = true)
|
69
|
+
# Need to include session token in payload so make sure we are logged in
|
70
|
+
logon if @api_session_token.nil?
|
71
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}/do/check"
|
72
|
+
params = {
|
73
|
+
"TargetUuid" => target_sys_uuid,
|
74
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
75
|
+
}
|
76
|
+
job = HmcJob.new(self, method_url, "Check", "PartitionTemplate", params)
|
77
|
+
job.run if sync
|
78
|
+
job
|
79
|
+
end
|
80
|
+
|
81
|
+
##
|
82
|
+
# @!method template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
83
|
+
# Start Template Transform job (second of three steps to deploy an LPAR from a Template).
|
84
|
+
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
85
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
86
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
87
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
88
|
+
def template_transform(draft_template_uuid, target_sys_uuid, sync = true)
|
89
|
+
# Need to include session token in payload so make sure we are logged in
|
90
|
+
logon if @api_session_token.nil?
|
91
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/transform"
|
92
|
+
params = {
|
93
|
+
"TargetUuid" => target_sys_uuid,
|
94
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
95
|
+
}
|
96
|
+
job = HmcJob.new(self, method_url, "Transform", "PartitionTemplate", params)
|
97
|
+
job.run if sync
|
98
|
+
job
|
99
|
+
end
|
100
|
+
|
101
|
+
##
|
102
|
+
# @!method template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
103
|
+
# Start Template Deploy job (last of three steps to deploy an LPAR from a Template).
|
104
|
+
# @param draft_template_uuid [String] The UUID of the Draft Template created by the Template Check job.
|
105
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
106
|
+
# @param sync [Boolean] Start the job and wait for its completion.
|
107
|
+
# @return [IbmPowerHmc::HmcJob] The HMC job.
|
108
|
+
def template_deploy(draft_template_uuid, target_sys_uuid, sync = true)
|
109
|
+
# Need to include session token in payload so make sure we are logged in
|
110
|
+
logon if @api_session_token.nil?
|
111
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{draft_template_uuid}/do/deploy"
|
112
|
+
params = {
|
113
|
+
"TargetUuid" => target_sys_uuid,
|
114
|
+
"TemplateUuid" => draft_template_uuid,
|
115
|
+
"K_X_API_SESSION_MEMENTO" => @api_session_token
|
116
|
+
}
|
117
|
+
job = HmcJob.new(self, method_url, "Deploy", "PartitionTemplate", params)
|
118
|
+
job.run if sync
|
119
|
+
job
|
120
|
+
end
|
121
|
+
|
122
|
+
##
|
123
|
+
# @!method template_provision(template_uuid, target_sys_uuid, changes)
|
124
|
+
# Deploy Logical Partition from a Template (performs Check, Transform and Deploy steps in a single method).
|
125
|
+
# @param template_uuid [String] The UUID of the Template to deploy an LPAR from.
|
126
|
+
# @param target_sys_uuid [String] The UUID of the Managed System to deploy the LPAR on.
|
127
|
+
# @param changes [Hash] Modifications to apply to the Template before deploying Logical Partition.
|
128
|
+
# @return [String] The UUID of the deployed Logical Partition.
|
129
|
+
def template_provision(template_uuid, target_sys_uuid, changes)
|
130
|
+
draft_uuid = template_check(template_uuid, target_sys_uuid).results["TEMPLATE_UUID"]
|
131
|
+
template_transform(draft_uuid, target_sys_uuid)
|
132
|
+
template_modify(draft_uuid, changes)
|
133
|
+
template_deploy(draft_uuid, target_sys_uuid).results["PartitionUuid"]
|
134
|
+
end
|
135
|
+
|
136
|
+
##
|
137
|
+
# @!method template_modify(template_uuid, changes)
|
138
|
+
# Modify a template.
|
139
|
+
# @param template_uuid [String] UUID of the partition template to modify.
|
140
|
+
# @param changes [Hash] Hash of changes to make.
|
141
|
+
def template_modify(template_uuid, changes)
|
142
|
+
method_url = "/rest/api/templates/PartitionTemplate/#{template_uuid}"
|
143
|
+
|
144
|
+
# Templates have no href so need to use modify_object_url.
|
145
|
+
modify_object_url(method_url) do
|
146
|
+
template(template_uuid).tap do |obj|
|
147
|
+
changes.each do |key, value|
|
148
|
+
obj.send("#{key}=", value)
|
149
|
+
end
|
150
|
+
end
|
151
|
+
end
|
152
|
+
end
|
153
|
+
|
154
|
+
##
|
155
|
+
# @!method template_copy(template_uuid, new_name)
|
156
|
+
# Copy existing template to a new one.
|
157
|
+
# @param template_uuid [String] UUID of the partition template to copy.
|
158
|
+
# @param new_name [String] Name of the new template.
|
159
|
+
# @return [IbmPowerHmc::PartitionTemplate] The new partition template.
|
160
|
+
def template_copy(template_uuid, new_name)
|
161
|
+
method_url = "/rest/api/templates/PartitionTemplate"
|
162
|
+
headers = {
|
163
|
+
:content_type => "application/vnd.ibm.powervm.templates+xml;type=PartitionTemplate"
|
164
|
+
}
|
165
|
+
original = template(template_uuid)
|
166
|
+
original.name = new_name
|
167
|
+
response = request(:put, method_url, headers, original.xml.to_s)
|
168
|
+
Parser.new(response.body).object(:PartitionTemplate)
|
169
|
+
end
|
170
|
+
end
|
171
|
+
end
|