ibm_power_hmc 0.3.0 → 0.4.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: e42aa4d6eaa8915b8c37ce96aab995801533b81d8fa70b1e351bc550cc6eaa02
4
- data.tar.gz: 6022fb088c67eeb0c20e8435c20567ef62fb34e365419cfa20f6fb9bc1e769f5
3
+ metadata.gz: c19305b95374164ab2a6e6168a4a292ea0666065cbcbe8f05dea30483b622055
4
+ data.tar.gz: be50d67e7c462cc17f20be3f643c6029e4f2ba7d43f872f1821bbe428f0e11fe
5
5
  SHA512:
6
- metadata.gz: 7ca0280aaeff1a1a0ce0cf5c53c40b6f0ddfc94725536e53d19031b1b107de4c8b44919580eaf1716e60f302bf339363508597b9188634412511bcc7869e4f83
7
- data.tar.gz: b0251d621a729e2b7d97c7655709fd68bd1e796466967f2021924ab7658a12c2dc13c34dfe71597f96f6ed2114e24c405362232c4dab2e88b653afbe2b7d679a
6
+ metadata.gz: 1191f64dd2f5c550d25a372b4a0502dd4e7b5a8e779a2dacdf079a22f3a8b8092af6e4ddff514b0e06dddf8239985033034959e385f951f2f535f092866cbd12
7
+ data.tar.gz: d6af992547d99624f59e6eb5ec3404768c91d1b9c9809e9542966fee15b4a350e8b8803e6fd25a597c48699b630171b7cae8327108f0ec6616e2329c5441bf1c
data/.gitignore CHANGED
File without changes
data/.rubocop.yml CHANGED
File without changes
data/.rubocop_local.yml CHANGED
@@ -5,3 +5,5 @@ Layout/HashAlignment:
5
5
  Enabled: false
6
6
  Style/ConditionalAssignment:
7
7
  Enabled: false
8
+ Style/OptionalBooleanParameter:
9
+ Enabled: false
data/CHANGELOG.md CHANGED
File without changes
data/Gemfile CHANGED
File without changes
data/LICENSE CHANGED
File without changes
data/README.md CHANGED
File without changes
data/Rakefile CHANGED
File without changes
File without changes
@@ -8,15 +8,15 @@ module IbmPowerHmc
8
8
  # HMC REST Client connection.
9
9
  class Connection
10
10
  ##
11
- # @!method initialize(host:, username: "hscroot", password:, port: 12_443, validate_ssl: true)
11
+ # @!method initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true)
12
12
  # Create a new HMC connection.
13
13
  #
14
14
  # @param host [String] Hostname of the HMC.
15
- # @param username [String] User name.
16
15
  # @param password [String] Password.
16
+ # @param username [String] User name.
17
17
  # @param port [Integer] TCP port number.
18
18
  # @param validate_ssl [Boolean] Verify SSL certificates.
19
- def initialize(host:, username: "hscroot", password:, port: 12_443, validate_ssl: true)
19
+ def initialize(host:, password:, username: "hscroot", port: 12_443, validate_ssl: true)
20
20
  @hostname = "#{host}:#{port}"
21
21
  @username = username
22
22
  @password = password
@@ -151,18 +151,14 @@ module IbmPowerHmc
151
151
  end
152
152
 
153
153
  ##
154
- # @!method rename_lpar(lpar_uuid, newname)
154
+ # @!method rename_lpar(lpar_uuid, new_name)
155
155
  # Rename a logical partition.
156
156
  # @param lpar_uuid [String] The UUID of the logical partition.
157
- # @param newname [String] The new name of the logical partition.
158
- def rename_lpar(lpar_uuid, newname)
157
+ # @param new_name [String] The new name of the logical partition.
158
+ def rename_lpar(lpar_uuid, new_name)
159
159
  method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}"
160
- headers = {
161
- :content_type => "application/vnd.ibm.powervm.uom+xml; type=LogicalPartition",
162
- }
163
- modify_object(method_url, headers) do |lpar|
164
- lpar.xml.elements["PartitionName"].text = newname
165
- end
160
+
161
+ modify_object(method_url) { |lpar| lpar.name = new_name }
166
162
  end
167
163
 
168
164
  ##
@@ -201,6 +197,26 @@ module IbmPowerHmc
201
197
  Parser.new(response.body).object(:VirtualIOServer)
202
198
  end
203
199
 
200
+ ##
201
+ # @!method network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
202
+ # Retrieve one or all virtual ethernet network adapters attached to a logical partition.
203
+ # @param lpar_uuid [String] UUID of the logical partition.
204
+ # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if omitted).
205
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
206
+ def network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
207
+ network_adapter("LogicalPartition", lpar_uuid, netadap_uuid)
208
+ end
209
+
210
+ ##
211
+ # @!method network_adapter_vios(vios_uuid, netadap_uuid = nil)
212
+ # Retrieve one or all virtual ethernet network adapters attached to a Virtual I/O Server.
213
+ # @param vios_uuid [String] UUID of the Virtual I/O Server.
214
+ # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if omitted).
215
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
216
+ def network_adapter_vios(vios_uuid, netadap_uuid = nil)
217
+ network_adapter("VirtualIOServer", vios_uuid, netadap_uuid)
218
+ end
219
+
204
220
  ##
205
221
  # @!method poweron_lpar(lpar_uuid, params = {}, sync = true)
206
222
  # Power on a logical partition.
@@ -219,9 +235,7 @@ module IbmPowerHmc
219
235
  ##
220
236
  # @!method poweroff_lpar(lpar_uuid, params = {}, sync = true)
221
237
  # Power off a logical partition.
222
- # @param lpar_uuid [String] The UUID of the logical partition.
223
- # @param params [Hash] Job parameters.
224
- # @param sync [Boolean] Start the job and wait for its completion.
238
+ # @param (see #poweron_lpar)
225
239
  # @return [IbmPowerHmc::HmcJob] The HMC job.
226
240
  def poweroff_lpar(lpar_uuid, params = {}, sync = true)
227
241
  method_url = "/rest/api/uom/LogicalPartition/#{lpar_uuid}/do/PowerOff"
@@ -249,9 +263,7 @@ module IbmPowerHmc
249
263
  ##
250
264
  # @!method poweroff_vios(vios_uuid, params = {}, sync = true)
251
265
  # Power off a virtual I/O server.
252
- # @param vios_uuid [String] The UUID of the virtual I/O server.
253
- # @param params [Hash] Job parameters.
254
- # @param sync [Boolean] Start the job and wait for its completion.
266
+ # @param (see #poweron_vios)
255
267
  # @return [IbmPowerHmc::HmcJob] The HMC job.
256
268
  def poweroff_vios(vios_uuid, params = {}, sync = true)
257
269
  method_url = "/rest/api/uom/VirtualIOServer/#{vios_uuid}/do/PowerOff"
@@ -279,9 +291,7 @@ module IbmPowerHmc
279
291
  ##
280
292
  # @!method poweroff_managed_system(sys_uuid, params = {}, sync = true)
281
293
  # Power off a managed system.
282
- # @param sys_uuid [String] The UUID of the managed system.
283
- # @param params [Hash] Job parameters.
284
- # @param sync [Boolean] Start the job and wait for its completion.
294
+ # @param (see #poweron_managed_system)
285
295
  # @return [IbmPowerHmc::HmcJob] The HMC job.
286
296
  def poweroff_managed_system(sys_uuid, params = {}, sync = true)
287
297
  method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/do/PowerOff"
@@ -325,6 +335,29 @@ module IbmPowerHmc
325
335
  job
326
336
  end
327
337
 
338
+ ##
339
+ # @!method virtual_switches(sys_uuid)
340
+ # Retrieve the list of virtual switches from a specified managed system.
341
+ # @param sys_uuid [String] The UUID of the managed system.
342
+ # @return [Array<IbmPowerHmc::VirtualSwitch>] The list of virtual switches.
343
+ def virtual_switches(sys_uuid)
344
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch"
345
+ response = request(:get, method_url)
346
+ FeedParser.new(response.body).objects(:VirtualSwitch)
347
+ end
348
+
349
+ ##
350
+ # @!method virtual_switch(vswitch_uuid, sys_uuid)
351
+ # Retrieve information about a virtual switch.
352
+ # @param vswitch_uuid [String] The UUID of the virtual switch.
353
+ # @param sys_uuid [String] The UUID of the managed system.
354
+ # @return [IbmPowerHmc::VirtualSwitch] The virtual switch.
355
+ def virtual_switch(vswitch_uuid, sys_uuid)
356
+ method_url = "/rest/api/uom/ManagedSystem/#{sys_uuid}/VirtualSwitch/#{vswitch_uuid}"
357
+ response = request(:get, method_url)
358
+ Parser.new(response.body).object(:VirtualSwitch)
359
+ end
360
+
328
361
  ##
329
362
  # @!method next_events(wait = true)
330
363
  # Retrieve a list of events that occured since last call.
@@ -418,6 +451,13 @@ module IbmPowerHmc
418
451
 
419
452
  private
420
453
 
454
+ # @!method modify_object(method_url, headers = {}, attempts = 5)
455
+ # Modify an object at a specified URI.
456
+ # @param method_url [String] The URL of the object to modify.
457
+ # @param headers [Hash] HTTP headers.
458
+ # @param attempts [Integer] Maximum number of retries.
459
+ # @yield [obj] The object to modify.
460
+ # @yieldparam obj [IbmPowerHmc::AbstractRest] The object to modify.
421
461
  def modify_object(method_url, headers = {}, attempts = 5)
422
462
  while attempts > 0
423
463
  response = request(:get, method_url)
@@ -426,16 +466,34 @@ module IbmPowerHmc
426
466
  yield obj
427
467
 
428
468
  # Use ETag to ensure object has not changed.
429
- headers = headers.merge("If-Match" => obj.etag)
469
+ headers = headers.merge("If-Match" => obj.etag, :content_type => obj.content_type)
430
470
  begin
431
471
  request(:post, method_url, headers, obj.xml.to_s)
432
472
  break
433
473
  rescue HttpError => e
434
474
  attempts -= 1
435
- # Will get 412 ("Precondition Failed" if ETag mismatches)
475
+ # Will get 412 ("Precondition Failed") if ETag mismatches
436
476
  raise if e.status != 412 || attempts == 0
437
477
  end
438
478
  end
439
479
  end
480
+
481
+ ##
482
+ # @!method network_adapter_lpar(lpar_uuid, netadap_uuid = nil)
483
+ # Retrieve one or all virtual ethernet network adapters attached to a Logical Partition or a Virtual I/O Server.
484
+ # @param vm_type [String] "Logical Partition" or "VirtualIOServer".
485
+ # @param lpar_uuid [String] UUID of the Logical Partition or the Virtual I/O Server.
486
+ # @param netadap_uuid [String] UUID of the adapter to match (returns all adapters if nil).
487
+ # @return [Array<IbmPowerHmc::ClientNetworkAdapter>] The list of network adapters.
488
+ def network_adapter(vm_type, lpar_uuid, netadap_uuid)
489
+ if netadap_uuid.nil?
490
+ method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter"
491
+ else
492
+ method_url = "/rest/api/uom/#{vm_type}/#{lpar_uuid}/ClientNetworkAdapter/#{netadap_uuid}"
493
+ end
494
+
495
+ response = request(:get, method_url)
496
+ Parser.new(response.body).object(:ClientNetworkAdapter)
497
+ end
440
498
  end
441
499
  end
File without changes
@@ -4,16 +4,26 @@ require 'time'
4
4
  require 'uri'
5
5
 
6
6
  module IbmPowerHmc
7
- # Parser for HMC feeds and entries.
7
+ ##
8
+ # Generic parser for HMC K2 XML responses.
8
9
  class Parser
9
10
  def initialize(body)
10
11
  @doc = REXML::Document.new(body)
11
12
  end
12
13
 
14
+ ##
15
+ # @!method entry
16
+ # Return the first K2 entry element in the response.
17
+ # @return [REXML::Element, nil] The first entry element.
13
18
  def entry
14
19
  @doc.elements["entry"]
15
20
  end
16
21
 
22
+ ##
23
+ # @!method object(filter_type = nil)
24
+ # Parse the first K2 entry element into an object.
25
+ # @param filter_type [String] Entry type must match the specified type.
26
+ # @return [IbmPowerHmc::AbstractRest, nil] The parsed object.
17
27
  def object(filter_type = nil)
18
28
  self.class.to_obj(entry, filter_type)
19
29
  end
@@ -21,19 +31,28 @@ module IbmPowerHmc
21
31
  def self.to_obj(entry, filter_type = nil)
22
32
  return if entry.nil?
23
33
 
24
- content = entry.elements["content"]
34
+ content = entry.elements["content[@type]"]
25
35
  return if content.nil?
26
36
 
27
- type = content.attributes["type"]
28
- return if type.nil?
29
-
30
- type = type.split("=").last
37
+ type = content.attributes["type"].split("=").last
31
38
  return unless filter_type.nil? || filter_type.to_s == type
32
39
 
33
40
  Module.const_get("IbmPowerHmc::#{type}").new(entry)
34
41
  end
35
42
  end
36
43
 
44
+ ##
45
+ # Parser for HMC K2 feeds.
46
+ # A feed encapsulates a list of entries like this:
47
+ # <feed>
48
+ # <entry>
49
+ # <!-- entry #1 -->
50
+ # </entry>
51
+ # <entry>
52
+ # <!-- entry #2 -->
53
+ # </entry>
54
+ # ...
55
+ # </feed>
37
56
  class FeedParser < Parser
38
57
  def entries
39
58
  objs = []
@@ -43,6 +62,11 @@ module IbmPowerHmc
43
62
  objs
44
63
  end
45
64
 
65
+ ##
66
+ # @!method objects(filter_type = nil)
67
+ # Parse feed entries into objects.
68
+ # @param filter_type [String] Filter entries based on content type.
69
+ # @return [Array<IbmPowerHmc::AbstractRest>] The list of objects.
46
70
  def objects(filter_type = nil)
47
71
  entries do |entry|
48
72
  self.class.to_obj(entry, filter_type)
@@ -53,34 +77,76 @@ module IbmPowerHmc
53
77
  private_constant :Parser
54
78
  private_constant :FeedParser
55
79
 
56
- # HMC generic XML entry
80
+ ##
81
+ # HMC generic K2 XML entry.
82
+ # Encapsulate data for a single object.
83
+ # The XML looks like this:
84
+ # <entry>
85
+ # <id>uuid</id>
86
+ # <published>timestamp</published>
87
+ # <etag:etag>ETag</etag:etag>
88
+ # <content type="type">
89
+ # <!-- actual content here -->
90
+ # </content>
91
+ # </entry>
92
+ #
93
+ # @abstract
94
+ # @attr_reader [String] uuid The UUID of the object contained in the entry.
95
+ # @attr_reader [URI::HTTPS] href The URL of the object itself.
96
+ # @attr_reader [Time] published The time at which the entry was published.
97
+ # @attr_reader [String] etag The entity tag of the entry.
98
+ # @attr_reader [String] content_type The content type of the object contained in the entry.
99
+ # @attr_reader [REXML::Document] xml The XML document representing this object.
57
100
  class AbstractRest
58
101
  ATTRS = {}.freeze
59
- attr_reader :uuid, :published, :etag, :xml
102
+ attr_reader :uuid, :href, :published, :etag, :content_type, :xml
60
103
 
61
104
  def initialize(doc)
62
105
  @uuid = doc.elements["id"]&.text
106
+ link = doc.elements["link[@rel='SELF']"]
107
+ @href = URI(link.attributes["href"]) unless link.nil?
63
108
  @published = Time.xmlschema(doc.elements["published"]&.text)
64
109
  @etag = doc.elements["etag:etag"]&.text&.strip
65
- type = self.class.name.split("::").last
66
- @xml = doc.elements["content/#{type}:#{type}"]
110
+ content = doc.elements["content"]
111
+ @content_type = content.attributes["type"]
112
+ @xml = content.elements.first
67
113
  define_attrs(self.class::ATTRS)
68
114
  end
69
115
 
116
+ ##
117
+ # @!method define_attr(varname, xpath)
118
+ # Define an instance variable using the text of an XML element as value.
119
+ # @param varname [String] The name of the instance variable.
120
+ # @param xpath [String] The XPath of the XML element containing the text.
70
121
  def define_attr(varname, xpath)
71
- value = text_element(xpath)
122
+ value = singleton(xpath)
72
123
  self.class.__send__(:attr_reader, varname)
73
124
  instance_variable_set("@#{varname}", value)
74
125
  end
75
126
 
127
+ ##
128
+ # @!method define_attrs(hash)
129
+ # Define instance variables using the texts of XML elements as values.
130
+ # @param hash [Hash] The name of the instance variables and the XPaths
131
+ # of the XML elements containing the values.
76
132
  def define_attrs(hash)
77
133
  hash.each do |key, value|
78
134
  define_attr(key, value)
79
135
  end
80
136
  end
81
137
 
82
- def text_element(xpath)
83
- xml.elements[xpath]&.text&.strip
138
+ ##
139
+ # @!method singleton(xpath, attr = nil)
140
+ # Get the text (or the value of a specified attribute) of an XML element.
141
+ # @param xpath [String] The XPath of the XML element.
142
+ # @param attr [String] The name of the attribute.
143
+ # @return [String, nil] The text or attribute value of the XML element or nil.
144
+ # @example lpar.singleton("PartitionProcessorConfiguration/*/MaximumVirtualProcessors").to_i
145
+ def singleton(xpath, attr = nil)
146
+ elem = xml.elements[xpath]
147
+ return if elem.nil?
148
+
149
+ attr.nil? ? elem.text&.strip : elem.attributes[attr]
84
150
  end
85
151
 
86
152
  def extract_uuid_from_href(href)
@@ -136,7 +202,6 @@ module IbmPowerHmc
136
202
  # Common class for LPAR and VIOS
137
203
  class BasePartition < AbstractRest
138
204
  ATTRS = {
139
- :os => "OperatingSystemVersion",
140
205
  :name => "PartitionName",
141
206
  :id => "PartitionID",
142
207
  :state => "PartitionState",
@@ -145,13 +210,25 @@ module IbmPowerHmc
145
210
  :dedicated => "PartitionProcessorConfiguration/HasDedicatedProcessors",
146
211
  :rmc_state => "ResourceMonitoringControlState",
147
212
  :rmc_ipaddr => "ResourceMonitoringIPAddress",
213
+ :os => "OperatingSystemVersion",
148
214
  :ref_code => "ReferenceCode"
149
215
  }.freeze
150
216
 
151
217
  def sys_uuid
152
- sys_href = xml.elements["AssociatedManagedSystem"].attributes["href"]
218
+ sys_href = singleton("AssociatedManagedSystem", "href")
153
219
  extract_uuid_from_href(sys_href)
154
220
  end
221
+
222
+ def net_adap_uuids
223
+ xml.get_elements("ClientNetworkAdapters/link").map do |link|
224
+ extract_uuid_from_href(link.attributes["href"])
225
+ end
226
+ end
227
+
228
+ def name=(name)
229
+ xml.elements[ATTRS[:name]].text = name
230
+ @name = name
231
+ end
155
232
  end
156
233
 
157
234
  # Logical Partition information
@@ -162,6 +239,19 @@ module IbmPowerHmc
162
239
  class VirtualIOServer < BasePartition
163
240
  end
164
241
 
242
+ # Virtual Switch information
243
+ class VirtualSwitch < AbstractRest
244
+ ATTRS = {
245
+ :id => "SwitchID",
246
+ :mode => "SwitchMode",
247
+ :name => "SwitchName"
248
+ }.freeze
249
+
250
+ def sys_uuid
251
+ href.path.split('/')[-3]
252
+ end
253
+ end
254
+
165
255
  # HMC Event
166
256
  class Event < AbstractRest
167
257
  ATTRS = {
@@ -172,6 +262,15 @@ module IbmPowerHmc
172
262
  }.freeze
173
263
  end
174
264
 
265
+ # Network adapter information
266
+ class ClientNetworkAdapter < AbstractRest
267
+ ATTRS = {
268
+ :macaddr => "MACAddress",
269
+ :vswitch_id => "VirtualSwitchID",
270
+ :vlan_id => "PortVLANID"
271
+ }.freeze
272
+ end
273
+
175
274
  # Error response from HMC
176
275
  class HttpErrorResponse < AbstractRest
177
276
  ATTRS = {
@@ -192,9 +291,9 @@ module IbmPowerHmc
192
291
 
193
292
  def results
194
293
  results = {}
195
- xml.each_element("Results/JobParameter") do |result|
196
- name = result.elements["ParameterName"]&.text&.strip
197
- value = result.elements["ParameterValue"]&.text&.strip
294
+ xml.each_element("Results/JobParameter") do |jobparam|
295
+ name = jobparam.elements["ParameterName"]&.text&.strip
296
+ value = jobparam.elements["ParameterValue"]&.text&.strip
198
297
  results[name] = value unless name.nil?
199
298
  end
200
299
  results
File without changes
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IbmPowerHmc
4
- VERSION = "0.3.0"
4
+ VERSION = "0.4.0"
5
5
  end
data/lib/ibm_power_hmc.rb CHANGED
@@ -7,8 +7,8 @@ require "ibm_power_hmc/version"
7
7
 
8
8
  # Module for IBM HMC Rest API Client
9
9
  module IbmPowerHmc
10
- require_relative "./ibm_power_hmc/parser.rb"
11
- require_relative "./ibm_power_hmc/job.rb"
12
- require_relative "./ibm_power_hmc/connection.rb"
13
- require_relative "./ibm_power_hmc/pcm.rb"
10
+ require_relative "./ibm_power_hmc/parser"
11
+ require_relative "./ibm_power_hmc/job"
12
+ require_relative "./ibm_power_hmc/connection"
13
+ require_relative "./ibm_power_hmc/pcm"
14
14
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ibm_power_hmc
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.3.0
4
+ version: 0.4.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - IBM Power
8
- autorequire:
8
+ autorequire:
9
9
  bindir: exe
10
10
  cert_chain: []
11
- date: 2021-10-15 00:00:00.000000000 Z
11
+ date: 2021-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rest-client
@@ -25,7 +25,7 @@ dependencies:
25
25
  - !ruby/object:Gem::Version
26
26
  version: '2.1'
27
27
  description: A Ruby gem for interacting with the IBM Hardware Management Console (HMC).
28
- email:
28
+ email:
29
29
  executables: []
30
30
  extensions: []
31
31
  extra_rdoc_files: []
@@ -55,7 +55,7 @@ metadata:
55
55
  homepage_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby
56
56
  source_code_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby
57
57
  changelog_uri: http://github.com/IBM/ibm_power_hmc_sdk_ruby/blob/master/CHANGELOG.md
58
- post_install_message:
58
+ post_install_message:
59
59
  rdoc_options: []
60
60
  require_paths:
61
61
  - lib
@@ -70,8 +70,8 @@ required_rubygems_version: !ruby/object:Gem::Requirement
70
70
  - !ruby/object:Gem::Version
71
71
  version: '0'
72
72
  requirements: []
73
- rubygems_version: 3.1.2
74
- signing_key:
73
+ rubygems_version: 3.1.4
74
+ signing_key:
75
75
  specification_version: 4
76
76
  summary: IBM Power HMC Ruby gem.
77
77
  test_files: []