xclarity_client 0.6.1 → 0.6.2

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
  SHA1:
3
- metadata.gz: 714241cc9417ae4ab27aab39a98b1b1618f154fc
4
- data.tar.gz: a73d88ab737024ee116444c4927ba503e7c427e0
3
+ metadata.gz: 46c74492a0ba842bb4252ace8c8a29eb6ff3eb0b
4
+ data.tar.gz: adaddc2302e33b60d7b4246fc0ffb19b2aeb1912
5
5
  SHA512:
6
- metadata.gz: 40844b7e6df453eb351141f13ca950becdafa967807524c03df999b2cdda2fd8c9ee03b48f92434765a002ee8a761ac1bcf2d47c5b011ac1b791f01024981b4d
7
- data.tar.gz: 6db55eecaaf8a2d5764df2da2b1b58e7d5d8937445115803efb29274752035f49927dd58a99621726a9d4e92c122272f23ec27295b351f3dcc2a5d3b582b55b3
6
+ metadata.gz: db19eeba154a7afa8b8d33491ce33792fa461e54d2b714c40ded82e7e48eeef9d4e5c3ecbd8e918e427da6839c09abf40fae2e03fe842d7a0d6ba5fc1d88fbc4
7
+ data.tar.gz: 8475d380d21a2bfd08fb0f5c57cfb81d3248e096e7e72071c8da6d781b6502b3b8b39f5a03ae78e79f2c0fa167540a95ed82b9f5e49096d93820dd9a694a0db0
data/README.md CHANGED
@@ -1,57 +1,11 @@
1
- # XClarity Client
1
+ <p align="center"><a href="https://www3.lenovo.com/us/en/data-center/software/systems-management/xclarity/" target="_blank" rel="noopener noreferrer"><img width="200" src="https://www3.lenovo.com/medias/lenovo-systems-software-management-xclarity-intro.png?context=bWFzdGVyfHJvb3R8NjY0OXxpbWFnZS9wbmd8aDI2L2hlMS85NDQ4OTkwODAxOTUwLnBuZ3xjZTdiOWJhNDViMTVhMjJjNTFiMWRmNzlhMDFkYzRmN2NkNGJjMzk1NTUxN2ZhYjExYWU1MDJlYmUyNGJkYjIw" alt="Lenovo Xclarity Logo"></a></p>
2
2
 
3
- [![Build Status](https://travis-ci.org/lenovo/xclarity_client.svg)](https://travis-ci.org/lenovo/xclarity_client)
4
-
5
- Welcome to your new gem! In this directory, you'll find the files you need to be able to package up your Ruby library into a gem. Put your Ruby code in the file `lib/xclarity_client`. To experiment with that code, run `bin/console` for an interactive prompt.
6
-
7
- TODO: Delete this and the text above, and describe your gem
8
-
9
- ## Pre Configuration for Connection with LXCA
10
-
11
-
12
- Get up and running mongo database
13
-
14
- Execute rails console:
15
-
16
- ```ruby
17
- $ bundle exec rails console
18
- ```
19
-
20
- Add resources to your database:
21
-
22
- Nodes:
23
-
24
- ```ruby
25
- $ FactoryGirl.create(:node)
26
- ```
27
- Switches:
28
-
29
- ```ruby
30
- $ FactoryGirl.create(:switch)
31
- ```
32
- Scalable Complexes:
33
-
34
- ```ruby
35
- $ FactoryGirl.create(:scalable_complex)
36
- ```
37
-
38
- Power Supplies:
39
-
40
- ```ruby
41
- $ FactoryGirl.create(:power_supply)
42
- ```
3
+ xclarity_client
4
+ ===
43
5
 
44
- Chassis:
45
-
46
- ```ruby
47
- $ FactoryGirl.create(:chassi)
48
- ```
49
-
50
- Get up LXCA-Mock server:
6
+ [![Build Status](https://travis-ci.org/lenovo/xclarity_client.svg)](https://travis-ci.org/lenovo/xclarity_client)
51
7
 
52
- ```ruby
53
- $ bundle exec rails s
54
- ```
8
+ Ruby gem to interact with Lenovo XClarity.
55
9
 
56
10
  ## Installation
57
11
 
@@ -71,27 +25,46 @@ Or install it yourself as:
71
25
 
72
26
  ## Usage
73
27
 
74
- To get basic information from the virtual appliance
28
+ To configure your appliance access:
75
29
 
76
30
  ```ruby
77
31
  require 'xclarity_client'
78
32
 
79
33
  conf = XClarityClient::Configuration.new(
80
- :username => 'admin',
81
- :password => 'pass',
82
- :host => 'http://example.com'
83
- :auth_type => 'token'
34
+ :host => 'http://lxca_host.com'
35
+ :username => 'username',
36
+ :password => 'password',
37
+ :port => 'lxca_port',
38
+ :auth_type => 'auth_type', # ('token', 'basic_auth')
39
+ :verify_ssl => 'verify_ssl', # ('PEER', 'NONE')
40
+ :user_agent_label => 'user_agent' # Api gem client identification
84
41
  )
85
42
 
86
- virtual_appliance = XClarityClient::VirtualApplianceManagement.new(conf)
43
+ client = XClarityClient::Client.new(conf)
44
+ ```
87
45
 
88
- puts virtual_appliance.configuration_settings
46
+ To access the appliance data:
89
47
 
90
- client = XClarityClient::Client.new(conf)
48
+ ```ruby
49
+ client.discover_aicc # get AICC informations
50
+
51
+ client.discover_cabinet # get Cabinets from LXCA appliance
91
52
 
92
- puts client.discover_nodes
53
+ # get the cabinets with the specifieds UUIDs,
54
+ # and retrive just `storageList` and `height` attributes.
55
+ client.fetch_cabinet(
56
+ uuids = ['590b2546bbbc457f-bf801661018c408e', 'd27e57aa278c49a9b57e34a8e6c6e8ae'],
57
+ include_attributes = ['storageList', 'height']
58
+ )
59
+
60
+ # get the cabinets with the specifieds UUIDs,
61
+ # and retrive all attributes except `height`.
62
+ client.fetch_cabinet(
63
+ uuids = ['590b2546bbbc457f-bf801661018c408e', 'd27e57aa278c49a9b57e34a8e6c6e8ae'],
64
+ exclude_attributes = ['height']
65
+ )
93
66
  ```
94
- NOTE: `auth_type` variable must have 'token' or 'basic_auth' as value.
67
+ > To see how to interact with other LXCA resources, please take a look at `lib/xclarity_client/mixins` folder.
95
68
 
96
69
  ## Development
97
70
 
@@ -101,4 +74,4 @@ To install this gem onto your local machine, run `bundle exec rake install`. To
101
74
 
102
75
  ## Contributing
103
76
 
104
- Bug reports and pull requests are welcome on GitHub at https://github.com/juliancheal/xclarity_client. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
77
+ Bug reports and pull requests are welcome on GitHub at https://github.com/lenovo/xclarity_client. This project is intended to be a safe, welcoming space for collaboration, and contributors are expected to adhere to the [Contributor Covenant](http://contributor-covenant.org) code of conduct.
@@ -75,3 +75,7 @@ FORMAT: 1A
75
75
  + Response 404
76
76
  + Response 409
77
77
  + Response 500
78
+
79
+ # PUT /chassis/7F3E7E375B5747E0938969896B1CFDF5
80
+
81
+ + Response 200 (application/json)
@@ -147,7 +147,54 @@ FORMAT: 1A
147
147
  }
148
148
  ],
149
149
  "drives":[
150
-
150
+ {
151
+ "model": "ST9300653SS",
152
+ "vendorName": "IBM-ESXS",
153
+ "status": "Up",
154
+ "location": "0.22",
155
+ "serialNumber": "6XN43QX50000B349D4LY",
156
+ "healthReason": "",
157
+ "health": "OK",
158
+ "type": "SAS",
159
+ "healthRecommendation": "",
160
+ "size": "300.0GB"
161
+ },
162
+ {
163
+ "model": "ST9300605SS",
164
+ "vendorName": "IBM-ESXS",
165
+ "status": "Up",
166
+ "location": "0.17",
167
+ "serialNumber": "6XP5L6ZE0000B344HRZG",
168
+ "healthReason": "",
169
+ "health": "OK",
170
+ "type": "SAS",
171
+ "healthRecommendation": "",
172
+ "size": "300.0GB"
173
+ },
174
+ {
175
+ "model": "ST9300653SS",
176
+ "vendorName": "IBM-ESXS",
177
+ "status": "Up",
178
+ "location": "0.23",
179
+ "serialNumber": "6XN43QR90000B350B5G2",
180
+ "healthReason": "A disk that was previously a member of a disk group has been detected.",
181
+ "health": "Degraded",
182
+ "type": "SAS",
183
+ "healthRecommendation": "- If the associated disk group is offline or quarantined, contact technical support. Otherwise, clear the disk metadata to reuse the disk.",
184
+ "size": "300.0GB"
185
+ },
186
+ {
187
+ "model": "ST9300605SS",
188
+ "vendorName": "IBM-ESXS",
189
+ "status": "Up",
190
+ "location": "0.16",
191
+ "serialNumber": "6XP5L7QP0000B344HS0E",
192
+ "healthReason": "",
193
+ "health": "OK",
194
+ "type": "SAS",
195
+ "healthRecommendation": "",
196
+ "size": "300.0GB"
197
+ }
151
198
  ],
152
199
  "canisters":[
153
200
  {
@@ -1,8 +1,15 @@
1
1
  module XClarityClient
2
2
  class Chassi < Endpoints::XclarityEndpoint
3
3
  BASE_URI = '/chassis'.freeze
4
+
4
5
  LIST_NAME = 'chassisList'.freeze
5
6
 
7
+ LED_STATES = %w(
8
+ Blinking
9
+ On
10
+ Off
11
+ ).freeze
12
+
6
13
  attr_accessor :accessState, :activationKeys, :activeAlerts, :backedBy,
7
14
  :bladeSlots, :cmmDisplayName, :cmmHealthState, :cmms, :complex,
8
15
  :contact, :dataHandle, :description, :displayName, :domainName,
@@ -1,7 +1,9 @@
1
1
  module XClarityClient
2
2
  class Node < Endpoints::XclarityEndpoint
3
3
  BASE_URI = '/nodes'.freeze
4
+
4
5
  LIST_NAME = 'nodeList'.freeze
6
+
5
7
  POWER_ACTIONS = %i(
6
8
  powerOn
7
9
  powerOffSoftGraceful
@@ -11,6 +13,12 @@ module XClarityClient
11
13
  bootToF1
12
14
  ).freeze
13
15
 
16
+ LED_STATES = %w(
17
+ Blinking
18
+ On
19
+ Off
20
+ ).freeze
21
+
14
22
  attr_accessor :accessState, :activationKeys, :addinCards, :addinCardSlots, :arch, :backedBy, :bladeState, :bladeState_health,
15
23
  :bladeState_string, :bootMode, :bootOrder, :cmmDisplayName, :cmmHealthState, :complexID, :contact, :dataHandle,
16
24
  :description, :displayName, :dnsHostnames, :domainName, :driveBays, :drives, :embeddedHypervisorPresence, :encapsulation,
@@ -10,9 +10,10 @@ module XClarityClient
10
10
  LIST_NAME = 'storageList'.freeze
11
11
 
12
12
  attr_accessor :uuid, :name, :type, :accessState, :cmmHealthState,
13
- :overallHealthState, :driveBays, :enclosureCount,
14
- :canisterSlots, :productName, :machineType, :model,
15
- :serialNumber, :contact, :description, :location,
16
- :room, :rack, :lowestRackUnit, :mgmtProcIPaddress
13
+ :enclosures, :overallHealthState, :driveBays,
14
+ :enclosureCount, :canisterSlots, :productName,
15
+ :machineType, :model, :serialNumber, :contact,
16
+ :description, :location, :room, :rack,
17
+ :lowestRackUnit, :mgmtProcIPaddress
17
18
  end
18
19
  end
@@ -4,17 +4,35 @@ module XClarityClient
4
4
  #
5
5
  module Mixins::ChassiMixin
6
6
  def discover_chassis(opts = {})
7
- ChassiManagement.new(@config).fetch_all(opts)
7
+ chassi_management.fetch_all(opts)
8
8
  end
9
9
 
10
10
  def fetch_chassis(uuids = nil,
11
11
  include_attributes = nil,
12
12
  exclude_attributes = nil)
13
- ChassiManagement.new(@config).get_object(
13
+ chassi_management.get_object(
14
14
  uuids,
15
15
  include_attributes,
16
16
  exclude_attributes
17
17
  )
18
18
  end
19
+
20
+ def blink_loc_led_chassis(uuid = '', name = 'Location')
21
+ chassi_management.set_loc_led_state(uuid, 'Blinking', name)
22
+ end
23
+
24
+ def turn_on_loc_led_chassis(uuid = '', name = 'Location')
25
+ chassi_management.set_loc_led_state(uuid, 'On', name)
26
+ end
27
+
28
+ def turn_off_loc_led_chassis(uuid = '', name = 'Location')
29
+ chassi_management.set_loc_led_state(uuid, 'Off', name)
30
+ end
31
+
32
+ private
33
+
34
+ def chassi_management
35
+ ChassiManagement.new(@config)
36
+ end
19
37
  end
20
38
  end
@@ -17,16 +17,16 @@ module XClarityClient
17
17
  )
18
18
  end
19
19
 
20
- def blink_loc_led(uuid = '')
21
- node_management.set_loc_led_state(uuid, 'Blinking')
20
+ def blink_loc_led(uuid = '', name = 'Identify')
21
+ node_management.set_loc_led_state(uuid, 'Blinking', name)
22
22
  end
23
23
 
24
- def turn_on_loc_led(uuid = '')
25
- node_management.set_loc_led_state(uuid, 'On')
24
+ def turn_on_loc_led(uuid = '', name = 'Identify')
25
+ node_management.set_loc_led_state(uuid, 'On', name)
26
26
  end
27
27
 
28
- def turn_off_loc_led(uuid = '')
29
- node_management.set_loc_led_state(uuid, 'Off')
28
+ def turn_off_loc_led(uuid = '', name = 'Identify')
29
+ node_management.set_loc_led_state(uuid, 'Off', name)
30
30
  end
31
31
 
32
32
  def power_on_node(uuid = '')
@@ -1,5 +1,9 @@
1
+ require 'xclarity_client/services/mixins/power_action_sender_mixin'
2
+
1
3
  module XClarityClient
2
4
  class ChassiManagement < Services::XClarityService
5
+ include Services::PowerActionSenderMixin
6
+
3
7
  manages_endpoint Chassi
4
8
  end
5
9
  end
@@ -4,6 +4,10 @@ module XClarityClient
4
4
  # A Power Action Sender is capable to send power
5
5
  # operation request for its managed endpoint.
6
6
  #
7
+ # An XclarityEndpoint that supports power or LED operations
8
+ # must configure the supported operations through `POWER_ACTIONS` and
9
+ # `LED_STATES` constants.
10
+ #
7
11
  module PowerActionSenderMixin
8
12
  #
9
13
  # Changes the power state for some resource.
@@ -15,21 +19,46 @@ module XClarityClient
15
19
  # @return the LXCA response.
16
20
  #
17
21
  def set_power_state(uuid, state)
18
- unless valid_arguments?(uuid, state)
22
+ unless valid_arguments?(uuid, state, managed_resource::POWER_ACTIONS)
19
23
  error = 'Invalid target or power state requested'
20
24
  source = "#{self.class.name} set_power_state"
21
25
  $lxca_log.info(source, error)
22
26
  raise ArgumentError, error
23
27
  end
24
28
 
25
- send_power_request(managed_resource::BASE_URI + '/' + uuid, state)
29
+ send_power_request(
30
+ "#{managed_resource::BASE_URI}/#{uuid}", state
31
+ )
32
+ end
33
+
34
+ #
35
+ # Changes the state of a LED of some resource.
36
+ #
37
+ # @param [String] uuid - resource identifier
38
+ # @param [String] state - the new LED state
39
+ # it must be listed on `managed_resource::LED_STATES`
40
+ # @param [String] name - name of the LED that must have it state changed
41
+ #
42
+ # @return the LXCA response
43
+ #
44
+ def set_loc_led_state(uuid, state, name = 'Identify')
45
+ unless valid_arguments?(uuid, state, managed_resource::LED_STATES)
46
+ error = 'Invalid target or power state requested'
47
+ source = "#{self.class.name} set_loc_led_state"
48
+ $lxca_log.info(source, error)
49
+ raise ArgumentError, error
50
+ end
51
+
52
+ send_led_state_request(
53
+ "#{managed_resource::BASE_URI}/#{uuid}", state, name
54
+ )
26
55
  end
27
56
 
28
57
  #
29
58
  # Do a change power state request for an endpoint
30
59
  #
31
- # @param [String] uri - the URI of the endpoint that must
32
- # have its power state changed.
60
+ # @param [String] uri
61
+ # - the URI of the endpoint that must have its power state changed.
33
62
  # @param [symbol] requested_state - the new power state.
34
63
  #
35
64
  # @return the LXCA response.
@@ -43,6 +72,31 @@ module XClarityClient
43
72
  response
44
73
  end
45
74
 
75
+ #
76
+ # Do a change LED state request for an endpoint
77
+ #
78
+ # @param [String] uri
79
+ # - The URI that must receive the request.
80
+ # @param [String] requested_state
81
+ # - The new LED state.
82
+ # @param [String] led_name
83
+ # - name of the LED that must have it state changed.
84
+ #
85
+ # @return the LXCA response.
86
+ #
87
+ def send_led_state_request(uri,
88
+ requested_state = nil,
89
+ led_name = 'Identify')
90
+ request = JSON.generate(
91
+ :leds => [{ :name => led_name, :state => requested_state }]
92
+ )
93
+ response = @connection.do_put(uri, request)
94
+ msg = "LED state request has been sent with request #{request}"
95
+
96
+ $lxca_log.info("#{self.class.name} send_led_state_request", msg)
97
+ response
98
+ end
99
+
46
100
  private
47
101
 
48
102
  #
@@ -50,9 +104,9 @@ module XClarityClient
50
104
  # Verifies if the uuid is not blank
51
105
  # Verifies if the endpoint supports the new state
52
106
  #
53
- def valid_arguments?(uuid, state)
107
+ def valid_arguments?(uuid, desired_state, allowed_states)
54
108
  uuid ||= ''
55
- !uuid.empty? && managed_resource::POWER_ACTIONS.include?(state)
109
+ !uuid.empty? && allowed_states.include?(desired_state)
56
110
  end
57
111
  end
58
112
  end
@@ -20,13 +20,5 @@ module XClarityClient
20
20
 
21
21
  send_power_request(managed_resource::BASE_URI + '/' + uuid + '/bmc', requested_state)
22
22
  end
23
-
24
- def set_loc_led_state(uuid, state, name = 'Identify')
25
- request = JSON.generate(leds: [{ name: name, state: state }])
26
-
27
- $lxca_log.info "XclarityClient::ManagementMixin set_loc_led_state", "Loc led state action has been sent"
28
-
29
- @connection.do_put("#{managed_resource::BASE_URI}/#{uuid}", request)
30
- end
31
23
  end
32
24
  end
@@ -1,3 +1,3 @@
1
1
  module XClarityClient
2
- VERSION = "0.6.1"
2
+ VERSION = "0.6.2"
3
3
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: xclarity_client
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.6.1
4
+ version: 0.6.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Manasa Rao
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: exe
11
11
  cert_chain: []
12
- date: 2018-06-06 00:00:00.000000000 Z
12
+ date: 2018-07-16 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: bundler