xclarity_client 0.6.3 → 0.6.8
Sign up to get free protection for your applications and to get access to all the features.
- 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
|