xclarity_client 0.6.3 → 0.6.8
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 +5 -5
- data/docs/apib/discover_request.apib +3 -1
- data/docs/apib/event.apib +0 -1
- data/docs/apib/manage_request.apib +359 -0
- data/docs/apib/storages.apib +3 -3
- data/docs/apib/update_comp.apib +426 -0
- data/docs/apib/update_repo.apib +0 -57
- data/lib/xclarity_client.rb +0 -1
- data/lib/xclarity_client/client.rb +3 -0
- data/lib/xclarity_client/connection/connection.rb +73 -35
- data/lib/xclarity_client/endpoints/endpoints.rb +3 -0
- data/lib/xclarity_client/endpoints/manage_request.rb +11 -0
- data/lib/xclarity_client/endpoints/management_server.rb +5 -0
- data/lib/xclarity_client/endpoints/storage.rb +7 -6
- data/lib/xclarity_client/endpoints/update_comp.rb +18 -0
- data/lib/xclarity_client/mixins/job_mixin.rb +0 -4
- data/lib/xclarity_client/mixins/manage_request_mixin.rb +54 -0
- data/lib/xclarity_client/mixins/management_server_mixin.rb +40 -0
- data/lib/xclarity_client/mixins/mixins.rb +3 -0
- data/lib/xclarity_client/mixins/node_mixin.rb +42 -0
- data/lib/xclarity_client/mixins/update_comp_mixin.rb +37 -0
- data/lib/xclarity_client/mixins/update_repo_mixin.rb +107 -7
- data/lib/xclarity_client/services/job_management.rb +2 -4
- data/lib/xclarity_client/services/manage_request_management.rb +62 -0
- data/lib/xclarity_client/services/management_server_management.rb +86 -0
- data/lib/xclarity_client/services/node_management.rb +46 -0
- data/lib/xclarity_client/services/osimage_management.rb +3 -2
- data/lib/xclarity_client/services/remote_access_management.rb +6 -4
- data/lib/xclarity_client/services/services.rb +3 -0
- data/lib/xclarity_client/services/update_comp_management.rb +111 -0
- data/lib/xclarity_client/services/update_repo_management.rb +100 -47
- data/lib/xclarity_client/services/virtual_appliance_management.rb +13 -16
- data/lib/xclarity_client/services/xclarity_service.rb +2 -3
- data/lib/xclarity_client/version.rb +1 -1
- data/lib/xclarity_client/xclarity_credentials_validator.rb +8 -11
- data/xclarity_client.gemspec +2 -2
- metadata +26 -11
- data/lib/xclarity_client/xclarity_base.rb +0 -88
@@ -18,8 +18,9 @@ module XClarityClient
|
|
18
18
|
request_body = JSON.generate(opts)
|
19
19
|
image_name = path.split(File::SEPARATOR).last
|
20
20
|
begin
|
21
|
-
response = @connection.do_post(
|
22
|
-
|
21
|
+
response = @connection.do_post('/files'\
|
22
|
+
+ '#{OsImage::BASE_URI}?jobId=#{job_id}'\
|
23
|
+
'&imageType=OS&imageName=' + image_name,
|
23
24
|
request_body)
|
24
25
|
response
|
25
26
|
rescue Faraday::TimeoutError => e
|
@@ -1,15 +1,17 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module XClarityClient
|
4
|
-
class RemoteAccessManagement
|
4
|
+
class RemoteAccessManagement
|
5
5
|
|
6
6
|
def initialize(conf)
|
7
|
-
|
7
|
+
@connection = XClarityClient::Connection.new(conf)
|
8
8
|
end
|
9
9
|
|
10
10
|
def remote_control(uuid)
|
11
11
|
raise 'UUID must not be blank' if uuid.nil? || uuid.empty?
|
12
|
-
con = connection(
|
12
|
+
con = @connection.do_get(
|
13
|
+
"#{RemoteAccess::BASE_URI}/remoteControl", :query => { :uuid => uuid }
|
14
|
+
)
|
13
15
|
|
14
16
|
unless con.success?
|
15
17
|
$lxca_log.error "XClarityClient::RemoteAccessManagement remote_control", "Request failed"
|
@@ -54,4 +56,4 @@ module XClarityClient
|
|
54
56
|
})
|
55
57
|
end
|
56
58
|
end
|
57
|
-
end
|
59
|
+
end
|
@@ -34,6 +34,9 @@ require 'xclarity_client/services/scalable_complex_management'
|
|
34
34
|
require 'xclarity_client/services/switch_management'
|
35
35
|
require 'xclarity_client/services/storage_management'
|
36
36
|
require 'xclarity_client/services/unmanage_request_management'
|
37
|
+
require 'xclarity_client/services/manage_request_management'
|
37
38
|
require 'xclarity_client/services/update_repo_management'
|
39
|
+
require 'xclarity_client/services/update_comp_management'
|
38
40
|
require 'xclarity_client/services/user_management'
|
39
41
|
require 'xclarity_client/services/virtual_appliance_management'
|
42
|
+
require 'xclarity_client/services/management_server_management'
|
@@ -0,0 +1,111 @@
|
|
1
|
+
require 'json'
|
2
|
+
|
3
|
+
module XClarityClient
|
4
|
+
# update component management class
|
5
|
+
class UpdateCompManagement < Services::XClarityService
|
6
|
+
manages_endpoint UpdateComp
|
7
|
+
|
8
|
+
def updatable_device_comp
|
9
|
+
response = @connection.do_get(UpdateComp::BASE_URI\
|
10
|
+
+ '?action=getComponents')
|
11
|
+
return [] unless response.success?
|
12
|
+
body = JSON.parse(response.body)
|
13
|
+
body = { UpdateComp::LIST_NAME => body } if body.kind_of?(Array)
|
14
|
+
j = body.key?(UpdateComp::LIST_NAME)
|
15
|
+
body = { UpdateComp::LIST_NAME => [body] } unless j
|
16
|
+
body[UpdateComp::LIST_NAME].map do |resource_params|
|
17
|
+
UpdateComp.new(resource_params)
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def apply_firmware_update(opts, activation_mode, force_update_mode,
|
22
|
+
onerror_mode)
|
23
|
+
validate_arguments(activation_mode, force_update_mode, onerror_mode)
|
24
|
+
|
25
|
+
uri = create_uri(activation_mode, force_update_mode, onerror_mode)
|
26
|
+
|
27
|
+
apply_req = create_req_json(opts['server'], opts['switch'],
|
28
|
+
opts['storage'], opts['cmm'])
|
29
|
+
response = @connection.do_put(UpdateComp::BASE_URI + '?action=apply'\
|
30
|
+
+ uri, apply_req)
|
31
|
+
response.body
|
32
|
+
end
|
33
|
+
|
34
|
+
def cancel_firmware_update(server, switch, storage, cmm)
|
35
|
+
cancel_req = create_req_json(server, switch, storage, cmm)
|
36
|
+
response = @connection.do_put(UpdateComp::BASE_URI\
|
37
|
+
+ '?action=cancelApply',
|
38
|
+
cancel_req)
|
39
|
+
response.body
|
40
|
+
end
|
41
|
+
|
42
|
+
def modify_power_state(server, switch, storage, cmm)
|
43
|
+
power_state_req = create_req_json(server, switch, storage, cmm)
|
44
|
+
response = @connection.do_put(UpdateComp::BASE_URI + '?action=powerState',
|
45
|
+
power_state_req)
|
46
|
+
response.body
|
47
|
+
end
|
48
|
+
|
49
|
+
def validate_activation_mode(activation_mode)
|
50
|
+
if !activation_mode.nil? && !activation_mode.casecmp('immediate').zero? &&
|
51
|
+
!activation_mode.casecmp('delayed').zero?
|
52
|
+
|
53
|
+
raise 'Invalid argument specified. Operation apply_firmware_update'\
|
54
|
+
+ ' can have activationMode as either immediare or delayed.'
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
def validate_forceupdate_mode(forceupdate_mode)
|
59
|
+
if !forceupdate_mode.nil? && !forceupdate_mode.casecmp('true').zero? &&
|
60
|
+
!forceupdate_mode.casecmp('false').zero?
|
61
|
+
|
62
|
+
raise 'Invalid argument specified. Value for forceUpdateMode on'\
|
63
|
+
+ ' operation apply_firmware_update should have a value'\
|
64
|
+
+ ' of either true or false'
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
def validate_onerror_mode(onerror_mode)
|
69
|
+
if !onerror_mode.nil? && !onerror_mode.eql?('stopOnError') &&
|
70
|
+
!onerror_mode.eql?('stopdeviceOnError') &&
|
71
|
+
!onerror_mode.eql?('continueOnError')
|
72
|
+
|
73
|
+
raise 'Invalid argument specified. Operation apply_firmware_update'\
|
74
|
+
+ " should have onErrorMode as : 'stopOnError' or"\
|
75
|
+
+ " 'stopdeviceOnError' or 'continueOnError'"
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
79
|
+
def validate_arguments(activation_mode, forceupdate_mode, onerror_mode)
|
80
|
+
validate_activation_mode(activation_mode)
|
81
|
+
validate_forceupdate_mode(forceupdate_mode)
|
82
|
+
validate_onerror_mode(onerror_mode)
|
83
|
+
end
|
84
|
+
|
85
|
+
# splitted create_uri just to fix codeclimate error
|
86
|
+
def add_uri(force_update_mode, onerror_mode, uri)
|
87
|
+
fmode = force_update_mode.nil?
|
88
|
+
uri += '&forceUpdateMode=' + force_update_mode unless fmode
|
89
|
+
uri += '&onErrorMode=' + onerror_mode unless onerror_mode.nil?
|
90
|
+
uri
|
91
|
+
end
|
92
|
+
|
93
|
+
def create_uri(activation_mode, force_update_mode, onerror_mode)
|
94
|
+
uri = ''
|
95
|
+
amode = activation_mode.nil?
|
96
|
+
uri += '&activationMode=' + activation_mode unless amode
|
97
|
+
add_uri(force_update_mode, onerror_mode, uri)
|
98
|
+
end
|
99
|
+
|
100
|
+
def create_req_json(server, switch, storage, cmm)
|
101
|
+
server_json = JSON.generate(:ServerList => server)
|
102
|
+
switch_json = JSON.generate(:SwitchList => switch)
|
103
|
+
storage_json = JSON.generate(:StorageList => storage)
|
104
|
+
cmm_json = JSON.generate(:CMMList => cmm)
|
105
|
+
|
106
|
+
req_json = "{\"DeviceList\": [#{server_json},#{switch_json},"\
|
107
|
+
+ "#{storage_json},#{cmm_json}]}"
|
108
|
+
req_json
|
109
|
+
end
|
110
|
+
end
|
111
|
+
end
|
@@ -13,11 +13,8 @@ module XClarityClient
|
|
13
13
|
err_missing_key = 'Option key must be provided for update_repo resource'
|
14
14
|
err_wrong_key = 'The value for option key should be one of these : '\
|
15
15
|
"#{allowed_keys.join(', ')}"
|
16
|
-
|
17
16
|
raise err_missing_key if opts.empty? || !(opts[:key] || opts['key'])
|
18
|
-
|
19
17
|
repo_key = opts[:key] || opts['key']
|
20
|
-
|
21
18
|
raise err_wrong_key unless allowed_keys.include?(repo_key)
|
22
19
|
end
|
23
20
|
|
@@ -36,60 +33,116 @@ module XClarityClient
|
|
36
33
|
|
37
34
|
public
|
38
35
|
|
39
|
-
def
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
36
|
+
def track_task_status(taskid, tasktype)
|
37
|
+
uri = UpdateRepo::BASE_URI + '/status' + '?tasktype=' + tasktype\
|
38
|
+
+ '&taskid=' + taskid.to_s
|
39
|
+
@connection.do_get(uri)
|
40
|
+
end
|
41
|
+
|
42
|
+
def download_exported_firmware_updates(fname, dir_path_to_download)
|
43
|
+
uri = UpdateRepo::BASE_URI + '?action=export&exportRepoFilename=' + fname
|
44
|
+
file_path = File.join(dir_path_to_download, fname)
|
45
|
+
@connection.do_get_file_download(uri, file_path)
|
44
46
|
end
|
45
47
|
|
46
48
|
def read_update_repo
|
47
|
-
|
48
|
-
response.body
|
49
|
+
@connection.do_put(UpdateRepo::BASE_URI + '?action=read')
|
49
50
|
end
|
50
51
|
|
51
|
-
def
|
52
|
-
|
52
|
+
def refresh_update_repo_catalog(scope, mt, uxsp = false)
|
53
|
+
unless %w(all latest).include?(scope)
|
53
54
|
raise 'Invalid argument combination of action and scope. Action'\
|
54
55
|
+ ' refresh can have scope as either all or latest'
|
55
56
|
end
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
57
|
+
req_body = JSON.generate(:mt => mt, :os => '', :type => 'catalog')
|
58
|
+
uri = UpdateRepo::BASE_URI
|
59
|
+
uri += '/uxsps' if uxsp
|
60
|
+
uri += '?action=refresh&with=' + scope
|
61
|
+
@connection.do_put(uri, req_body)
|
61
62
|
end
|
62
63
|
|
63
|
-
def
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
end
|
84
|
-
|
85
|
-
def
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
64
|
+
def refresh_uxsp_update_repo_catalog(scope, mt)
|
65
|
+
refresh_update_repo_catalog(scope, mt, true)
|
66
|
+
end
|
67
|
+
|
68
|
+
def updates_info_by_machine_types(mt, uxsp = false)
|
69
|
+
mt = mt.join(',').to_str
|
70
|
+
uri = UpdateRepo::BASE_URI
|
71
|
+
uri += '/uxsps' if uxsp
|
72
|
+
key = 'uxspsByMt' if uxsp
|
73
|
+
key = 'updatesByMt' unless uxsp
|
74
|
+
uri += '?key=' + key + '&with=all&payload&mt=' + mt
|
75
|
+
@connection.do_get(uri)
|
76
|
+
end
|
77
|
+
|
78
|
+
def uxsp_updates_info_by_machine_types(mt)
|
79
|
+
updates_info_by_machine_types(mt, true)
|
80
|
+
end
|
81
|
+
|
82
|
+
def supported_machine_types_detail
|
83
|
+
@connection.do_get(UpdateRepo::BASE_URI + '?key=supportedMts')
|
84
|
+
end
|
85
|
+
|
86
|
+
def acquire_firmware_updates(mt, fixids)
|
87
|
+
req_body = JSON.generate(:mt => mt, :fixids => fixids, :type => 'latest')
|
88
|
+
@connection.do_put(UpdateRepo::BASE_URI\
|
89
|
+
+ '?action=acquire&with=payloads', req_body)
|
90
|
+
end
|
91
|
+
|
92
|
+
def delete_firmware_updates(file_types, fixids = [])
|
93
|
+
req_body = JSON.generate(:fixids => fixids)
|
94
|
+
@connection.do_put(UpdateRepo::BASE_URI + '?action='\
|
95
|
+
+ 'delete&filetypes=' + file_types.downcase,
|
96
|
+
req_body)
|
97
|
+
end
|
98
|
+
|
99
|
+
def export_firmware_updates(file_types, fixids = [])
|
100
|
+
req_body = JSON.generate(:fixids => fixids)
|
101
|
+
@connection.do_put(UpdateRepo::BASE_URI\
|
102
|
+
+ '?action=export&filetypes='\
|
103
|
+
+ file_types.downcase, req_body)
|
104
|
+
end
|
105
|
+
|
106
|
+
def validate_import_updates(file_path)
|
107
|
+
type = 'application/x-zip-compressed'
|
108
|
+
fname = File.basename(file_path)
|
109
|
+
opts = { :index => 0, :name => fname,
|
110
|
+
:type => type,
|
111
|
+
:size => File.size?(file_path) }
|
112
|
+
req_body = JSON.generate(opts)
|
113
|
+
uri = '/files/updateRepositories/firmware/import/validate'
|
114
|
+
@connection.do_post(uri, req_body)
|
115
|
+
end
|
116
|
+
|
117
|
+
def import_firmware_updates(file_path)
|
118
|
+
uri = '/files/updateRepositories/firmware/import'
|
119
|
+
type = 'application/x-zip-compressed'
|
120
|
+
opts = { :upload_file => Faraday::UploadIO.new(file_path, type) }
|
121
|
+
@connection.do_post(uri, opts, true)
|
122
|
+
end
|
123
|
+
|
124
|
+
def retrieve_compliance_policy_list
|
125
|
+
uri = '/compliancePolicies'
|
126
|
+
@connection.do_get(uri)
|
127
|
+
end
|
128
|
+
|
129
|
+
def export_compliance_policies(policy_names)
|
130
|
+
uri = '/compliancePolicies?action=export'
|
131
|
+
req_body = JSON.generate(:export => policy_names)
|
132
|
+
@connection.do_put(uri, req_body)
|
133
|
+
end
|
134
|
+
|
135
|
+
def download_exported_compliance_policies(fname, dir_path_for_download)
|
136
|
+
uri = '/compliancePolicies?exportDownload=' + fname
|
137
|
+
file_path = File.join(dir_path_for_download, fname)
|
138
|
+
@connection.do_get_file_download(uri, file_path)
|
139
|
+
end
|
140
|
+
|
141
|
+
def import_compliance_policies(file_path)
|
142
|
+
uri = '/files/compliancePolicies?action=import'
|
143
|
+
type = 'application/x-zip-compressed'
|
144
|
+
opts = { :upload_file => Faraday::UploadIO.new(file_path, type) }
|
145
|
+
@connection.do_post(uri, opts, true)
|
93
146
|
end
|
94
147
|
end
|
95
148
|
end
|
@@ -1,5 +1,5 @@
|
|
1
1
|
module XClarityClient
|
2
|
-
class VirtualApplianceManagement
|
2
|
+
class VirtualApplianceManagement
|
3
3
|
|
4
4
|
BASE_URI = '/aicc'.freeze
|
5
5
|
NETWORK_URI = '/network'.freeze
|
@@ -10,12 +10,11 @@ module XClarityClient
|
|
10
10
|
SUBSCRIPTIONS_URI = '/subscriptions'.freeze
|
11
11
|
|
12
12
|
def initialize(conf)
|
13
|
-
|
13
|
+
@connection = XClarityClient::Connection.new(conf)
|
14
14
|
end
|
15
15
|
|
16
16
|
def configuration_settings
|
17
|
-
|
18
|
-
response
|
17
|
+
@connection.do_get(BASE_URI)
|
19
18
|
end
|
20
19
|
|
21
20
|
def configuration_settings=()
|
@@ -24,8 +23,8 @@ module XClarityClient
|
|
24
23
|
def ip_enablement_state
|
25
24
|
uri = BASE_URI+NETWORK_URI+IPDISABLE_URI
|
26
25
|
$lxca_log.info "XclarityClient::VirtualApplianceManagement ip_enablement_state", "Action has been sent to #{uri}"
|
27
|
-
|
28
|
-
|
26
|
+
|
27
|
+
@connection.do_get(uri)
|
29
28
|
end
|
30
29
|
|
31
30
|
def ip_enablement_state=()
|
@@ -35,8 +34,8 @@ module XClarityClient
|
|
35
34
|
def host_settings
|
36
35
|
uri = BASE_URI+NETWORK_URI+IPDISABLE_URI
|
37
36
|
$lxca_log.info "XclarityClient::VirtualApplianceManagement host_settings", "Action has been sent to #{uri}"
|
38
|
-
|
39
|
-
|
37
|
+
|
38
|
+
@connection.do_get(uri)
|
40
39
|
end
|
41
40
|
|
42
41
|
def host_settings=()
|
@@ -46,8 +45,8 @@ module XClarityClient
|
|
46
45
|
def network_interface_settings(interface)
|
47
46
|
uri = BASE_URI+NETWORK_URI+INTERFACES_URI+"/#{interface}"
|
48
47
|
$lxca_log.info "XclarityClient::VirtualApplianceManagement network_interface_settings", "Action has been sent to #{uri}"
|
49
|
-
|
50
|
-
|
48
|
+
|
49
|
+
@connection.do_get(uri)
|
51
50
|
end
|
52
51
|
|
53
52
|
def host_settings=()
|
@@ -57,8 +56,8 @@ module XClarityClient
|
|
57
56
|
def route_settings
|
58
57
|
uri = BASE_URI+NETWORK_URI+ROUTES_URI
|
59
58
|
$lxca_log.info "XclarityClient::VirtualApplianceManagement route_settings", "Action has been sent to #{uri}"
|
60
|
-
|
61
|
-
|
59
|
+
|
60
|
+
@connection.do_get(uri)
|
62
61
|
end
|
63
62
|
|
64
63
|
def route_settings=()
|
@@ -68,14 +67,12 @@ module XClarityClient
|
|
68
67
|
def subscriptions
|
69
68
|
uri = BASE_URI+SUBSCRIPTIONS_URI
|
70
69
|
$lxca_log.info "XclarityClient::VirtualApplianceManagement subscriptions", "Action has been sent to #{uri}"
|
71
|
-
|
72
|
-
|
70
|
+
|
71
|
+
@connection.do_get(uri)
|
73
72
|
end
|
74
73
|
|
75
74
|
def subscriptions=()
|
76
75
|
|
77
76
|
end
|
78
|
-
|
79
|
-
|
80
77
|
end
|
81
78
|
end
|
@@ -85,9 +85,8 @@ module XClarityClient
|
|
85
85
|
end
|
86
86
|
|
87
87
|
def do_request_with_opts(uri, opts)
|
88
|
-
|
89
|
-
|
90
|
-
headers = opts['headers'] || Hash.new(0)
|
88
|
+
query = opts.reject { |key| 'headers'.eql?(key) }
|
89
|
+
headers = opts['headers'] || {}
|
91
90
|
|
92
91
|
@connection.do_get(uri, :query => query, :headers => headers)
|
93
92
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
require 'json'
|
2
2
|
|
3
3
|
module XClarityClient
|
4
|
-
class XClarityCredentialsValidator
|
4
|
+
class XClarityCredentialsValidator
|
5
5
|
BASE_URI = '/sessions'.freeze
|
6
6
|
|
7
7
|
def initialize(conf)
|
8
|
-
|
8
|
+
@connection = XClarityClient::Connection.new(conf)
|
9
9
|
@configuration = conf
|
10
10
|
end
|
11
11
|
|
@@ -33,19 +33,16 @@ module XClarityClient
|
|
33
33
|
end
|
34
34
|
|
35
35
|
def build_session(conf)
|
36
|
-
@response = @
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
36
|
+
@response = @connection.do_post(BASE_URI, {
|
37
|
+
:UserId => conf.username,
|
38
|
+
:password => conf.password
|
39
|
+
}.to_json)
|
40
|
+
|
41
41
|
raise Faraday::Error::ConnectionFailed unless @response.success?
|
42
42
|
end
|
43
43
|
|
44
44
|
def close_session(id_session)
|
45
|
-
@
|
46
|
-
request.url "#{BASE_URI}/#{id_session}"
|
47
|
-
request.headers['Content-Type'] = 'application/json'
|
48
|
-
end
|
45
|
+
@connection.do_delete("#{BASE_URI}/#{id_session}")
|
49
46
|
end
|
50
47
|
end
|
51
48
|
end
|