morpheus-cli 7.0.7 → 8.0.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 +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +11 -0
- data/lib/morpheus/api/clusters_interface.rb +25 -0
- data/lib/morpheus/api/datastores_interface.rb +6 -0
- data/lib/morpheus/api/library_operating_systems_interface.rb +63 -0
- data/lib/morpheus/api/processes_interface.rb +17 -5
- data/lib/morpheus/cli/commands/backup_jobs_command.rb +50 -17
- data/lib/morpheus/cli/commands/backups_command.rb +36 -9
- data/lib/morpheus/cli/commands/clusters.rb +380 -6
- data/lib/morpheus/cli/commands/hosts.rb +3 -0
- data/lib/morpheus/cli/commands/instances.rb +33 -4
- data/lib/morpheus/cli/commands/library_container_types_command.rb +6 -0
- data/lib/morpheus/cli/commands/library_operating_systems_command.rb +671 -0
- data/lib/morpheus/cli/commands/license.rb +11 -1
- data/lib/morpheus/cli/commands/processes_command.rb +71 -1
- data/lib/morpheus/cli/commands/setup.rb +32 -18
- data/lib/morpheus/cli/commands/virtual_images.rb +10 -2
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +28 -2
- data/lib/morpheus/cli/option_types.rb +3 -0
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/formatters.rb +12 -0
- metadata +5 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 49afeaaa11ed794659cc20a46d3fc145990269dc96f1394a1cd95160bbc2f786
|
4
|
+
data.tar.gz: cdcf88755b1638f3d1816dde28dcfea8f8c6be27b9300bdfc3c6e4798d3937dd
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 56f27f9ab0323061846e4b3df32d570efff1b944083fe27700a9d729540ad605a1a39a5c2005cc5a0e19880d5f039a7aa3dbc12ff2c31c9b511426ec736f83a7
|
7
|
+
data.tar.gz: 7d98ac1e35e7929f3f73ff3968d3a2d1221629d1a2c07d7cdd916b2aa184ca2d30041eaeaf2ac5d53c653650a0a36e0c39a33bebbb9bf02bdcf3e4f84e5173c8
|
data/Dockerfile
CHANGED
@@ -950,6 +950,14 @@ class Morpheus::APIClient
|
|
950
950
|
Morpheus::NetworkServerGroupsInterface.new(common_interface_options).setopts(@options)
|
951
951
|
end
|
952
952
|
|
953
|
+
def network_server_services
|
954
|
+
Morpheus::NetworkServerServicesInterface.new(common_interface_options).setopts(@options)
|
955
|
+
end
|
956
|
+
|
957
|
+
def network_resource_types
|
958
|
+
Morpheus::NetworkResourceTypesInterface.new(common_interface_options).setopts(@options)
|
959
|
+
end
|
960
|
+
|
953
961
|
def network_edge_clusters
|
954
962
|
Morpheus::NetworkEdgeClustersInterface.new(common_interface_options).setopts(@options)
|
955
963
|
end
|
@@ -1002,6 +1010,9 @@ class Morpheus::APIClient
|
|
1002
1010
|
Morpheus::EmailTemplatesInterface.new(common_interface_options).setopts(@options)
|
1003
1011
|
end
|
1004
1012
|
|
1013
|
+
def library_operating_systems
|
1014
|
+
Morpheus::LibraryOperatingSystemsInterface.new(common_interface_options).setopts(@options)
|
1015
|
+
end
|
1005
1016
|
|
1006
1017
|
def rest(endpoint)
|
1007
1018
|
Morpheus::RestInterface.new(common_interface_options).setopts(@options.merge({base_path: "#{@base_url}/api/#{endpoint}"}))
|
@@ -228,6 +228,12 @@ class Morpheus::ClustersInterface < Morpheus::APIClient
|
|
228
228
|
execute(method: :get, url: url, headers: headers)
|
229
229
|
end
|
230
230
|
|
231
|
+
def get_container_group(cluster_id, resource_type, id, params={})
|
232
|
+
url = "#{base_path}/#{cluster_id}/#{resource_type}s/#{id}"
|
233
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
234
|
+
execute(method: :get, url: url, headers: headers)
|
235
|
+
end
|
236
|
+
|
231
237
|
def restart_container_group(id, container_group_id, resource_type, params={})
|
232
238
|
url = "#{base_path}/#{id}/#{resource_type}s/#{container_group_id}/restart"
|
233
239
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
@@ -259,12 +265,24 @@ class Morpheus::ClustersInterface < Morpheus::APIClient
|
|
259
265
|
execute(method: :get, url: url, headers: headers)
|
260
266
|
end
|
261
267
|
|
268
|
+
def create_datastore(id, payload)
|
269
|
+
url = "#{base_path}/#{id}/data-stores"
|
270
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
271
|
+
execute(method: :post, url: url, headers: headers, payload: payload.to_json)
|
272
|
+
end
|
273
|
+
|
262
274
|
def update_datastore(id, datastore_id, payload)
|
263
275
|
url = "#{base_path}/#{id}/datastores/#{datastore_id}"
|
264
276
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
265
277
|
execute(method: :put, url: url, headers: headers, payload: payload.to_json)
|
266
278
|
end
|
267
279
|
|
280
|
+
def destroy_datastore(id, datastore_id, params={})
|
281
|
+
url = "#{base_path}/#{id}/datastores/#{datastore_id}"
|
282
|
+
headers = { :params => params, :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
283
|
+
execute(method: :delete, url: url, headers: headers)
|
284
|
+
end
|
285
|
+
|
268
286
|
def wiki(id, params)
|
269
287
|
url = "#{@base_url}/api/clusters/#{id}/wiki"
|
270
288
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
@@ -320,4 +338,11 @@ class Morpheus::ClustersInterface < Morpheus::APIClient
|
|
320
338
|
opts = {method: :get, url: url, headers: headers}
|
321
339
|
execute(opts)
|
322
340
|
end
|
341
|
+
|
342
|
+
def list_resources(id, resources, params={})
|
343
|
+
url = "#{base_path}/#{id}/#{resources}"
|
344
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
345
|
+
execute(method: :get, url: url, headers: headers)
|
346
|
+
end
|
347
|
+
|
323
348
|
end
|
@@ -12,4 +12,10 @@ class Morpheus::DatastoresInterface < Morpheus::APIClient
|
|
12
12
|
execute(method: :get, url: url, headers: headers)
|
13
13
|
end
|
14
14
|
|
15
|
+
def types(params={})
|
16
|
+
url = "/api/data-store-types"
|
17
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
18
|
+
opts = {method: :get, url: url, headers: headers}
|
19
|
+
execute(opts)
|
20
|
+
end
|
15
21
|
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'morpheus/api/api_client'
|
2
|
+
|
3
|
+
class Morpheus::LibraryOperatingSystemsInterface < Morpheus::APIClient
|
4
|
+
|
5
|
+
def list_os_types(params={})
|
6
|
+
url = "#{@base_url}/api/library/operating-systems/os-types"
|
7
|
+
params['pageConfig'] = { sort:'owner,name', order:'desc,asc' }
|
8
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
9
|
+
opts = {method: :get, url: url, headers: headers}
|
10
|
+
execute(opts)
|
11
|
+
end
|
12
|
+
|
13
|
+
def get(id, params={})
|
14
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
15
|
+
url = "#{@base_url}/api/library/operating-systems/os-types/#{id}"
|
16
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
17
|
+
opts = {method: :get, url: url, headers: headers}
|
18
|
+
execute(opts)
|
19
|
+
end
|
20
|
+
|
21
|
+
def update(id, payload)
|
22
|
+
url = "#{@base_url}/api/library/operating-systems/#{id}"
|
23
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
24
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
25
|
+
execute(opts)
|
26
|
+
end
|
27
|
+
|
28
|
+
def get_image(id, params={})
|
29
|
+
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
30
|
+
url = "#{@base_url}/api/library/operating-systems/os-types/images/#{id}"
|
31
|
+
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
32
|
+
opts = {method: :get, url: url, headers: headers}
|
33
|
+
execute(opts)
|
34
|
+
end
|
35
|
+
|
36
|
+
def create_image(payload)
|
37
|
+
url = "#{@base_url}/api/library/operating-systems/os-types/create-image"
|
38
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
39
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
40
|
+
execute(opts)
|
41
|
+
end
|
42
|
+
|
43
|
+
def create(payload)
|
44
|
+
url = "#{@base_url}/api/library/operating-systems"
|
45
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
46
|
+
opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
|
47
|
+
execute(opts)
|
48
|
+
end
|
49
|
+
|
50
|
+
def destroy_image(id, payload={})
|
51
|
+
url = "#{@base_url}/api/library/operating-systems/os-types/images/#{id}"
|
52
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
53
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
54
|
+
execute(opts)
|
55
|
+
end
|
56
|
+
|
57
|
+
def destroy(id, payload={})
|
58
|
+
url = "#{@base_url}/api/library/operating-systems/#{id}"
|
59
|
+
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
60
|
+
opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
|
61
|
+
execute(opts)
|
62
|
+
end
|
63
|
+
end
|
@@ -2,8 +2,12 @@ require 'morpheus/api/api_client'
|
|
2
2
|
|
3
3
|
class Morpheus::ProcessesInterface < Morpheus::APIClient
|
4
4
|
|
5
|
+
def base_path
|
6
|
+
"/api/processes"
|
7
|
+
end
|
8
|
+
|
5
9
|
def list(params={})
|
6
|
-
url =
|
10
|
+
url = base_path
|
7
11
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
8
12
|
opts = {method: :get, url: url, headers: headers}
|
9
13
|
execute(opts)
|
@@ -11,18 +15,26 @@ class Morpheus::ProcessesInterface < Morpheus::APIClient
|
|
11
15
|
|
12
16
|
def get(id, params={})
|
13
17
|
raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
|
14
|
-
url = "#{
|
18
|
+
url = "#{base_path}/#{CGI::escape(id.to_s)}"
|
15
19
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
16
20
|
opts = {method: :get, url: url, headers: headers}
|
17
21
|
execute(opts)
|
18
22
|
end
|
19
23
|
|
20
|
-
def get_event(
|
21
|
-
raise "#{self.class}.get() passed a blank id!" if
|
22
|
-
url = "#{
|
24
|
+
def get_event(event_id, params={})
|
25
|
+
raise "#{self.class}.get() passed a blank event id!" if event_id.to_s == ''
|
26
|
+
url = "#{base_path}/events/#{CGI::escape(event_id.to_s)}"
|
23
27
|
headers = { params: params, authorization: "Bearer #{@access_token}" }
|
24
28
|
opts = {method: :get, url: url, headers: headers}
|
25
29
|
execute(opts)
|
26
30
|
end
|
27
31
|
|
32
|
+
def retry(id, payload={}, params={}, headers={})
|
33
|
+
execute(method: :post, url: "#{base_path}/#{CGI::escape(id.to_s)}/retry", params: params, payload: payload, headers: headers)
|
34
|
+
end
|
35
|
+
|
36
|
+
def cancel(id, payload={}, params={}, headers={})
|
37
|
+
execute(method: :post, url: "#{base_path}/#{CGI::escape(id.to_s)}/cancel", params: params, payload: payload, headers: headers)
|
38
|
+
end
|
39
|
+
|
28
40
|
end
|
@@ -16,6 +16,8 @@ class Morpheus::Cli::BackupJobsCommand
|
|
16
16
|
@api_client = establish_remote_appliance_connection(opts)
|
17
17
|
@backups_interface = @api_client.backups
|
18
18
|
@backup_jobs_interface = @api_client.backup_jobs
|
19
|
+
@backup_settings_interface = @api_client.backup_settings
|
20
|
+
@options_interface = @api_client.options
|
19
21
|
end
|
20
22
|
|
21
23
|
def handle(args)
|
@@ -107,6 +109,9 @@ EOT
|
|
107
109
|
columns = backup_job_column_definitions
|
108
110
|
columns.delete("Provider") if backup_job['backupProvider'].nil?
|
109
111
|
columns.delete("Repository") if backup_job['backupRepository'].nil?
|
112
|
+
columns.delete("Synthetic Full Enabled") if backup_job['syntheticFull'].nil?
|
113
|
+
columns.delete("Synthetic Full Schedule") if backup_job['syntheticFull'].nil?
|
114
|
+
columns.delete("Synthetic Full Next") if backup_job['syntheticFull'].nil?
|
110
115
|
print_description_list(columns, backup_job)
|
111
116
|
# print reset,"\n"
|
112
117
|
print_h2 "Backups", options
|
@@ -123,10 +128,10 @@ EOT
|
|
123
128
|
def add(args)
|
124
129
|
options = {}
|
125
130
|
params = {}
|
131
|
+
|
126
132
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
127
133
|
opts.banner = "Usage: #{prog_name} backups add-job [name]"
|
128
134
|
build_option_type_options(opts, options, add_backup_job_option_types)
|
129
|
-
build_option_type_options(opts, options, add_backup_job_advanced_option_types)
|
130
135
|
build_standard_add_options(opts, options)
|
131
136
|
opts.footer = <<-EOT
|
132
137
|
Create a new backup job
|
@@ -142,14 +147,23 @@ EOT
|
|
142
147
|
payload.deep_merge!({'job' => parse_passed_options(options)})
|
143
148
|
else
|
144
149
|
payload.deep_merge!({'job' => parse_passed_options(options)})
|
145
|
-
|
150
|
+
|
151
|
+
avail_job_types = @options_interface.options_for_source('backupJobTypes',{})['data']
|
152
|
+
if avail_job_types.empty?
|
153
|
+
raise_command_error "No available backup job types found"
|
154
|
+
else
|
155
|
+
params["jobTypeId"] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'jobTypeId', 'fieldLabel' => 'Type', 'type' => 'select', 'selectOptions' => avail_job_types, 'defaultValue' => avail_job_types[0] ? avail_job_types[0]['name'] : nil, 'required' => true}], options[:options], @api_client)["jobTypeId"]
|
156
|
+
end
|
157
|
+
|
158
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt(add_backup_job_option_types, options[:options], @api_client, options[:params])
|
146
159
|
params.deep_merge!(v_prompt)
|
147
160
|
if params['scheduleId'] == 'manual' || params['scheduleId'] == ''
|
148
161
|
params['scheduleId'] = nil
|
149
162
|
end
|
150
|
-
|
151
|
-
|
152
|
-
|
163
|
+
|
164
|
+
job_type_config = Morpheus::Cli::OptionTypes.prompt(add_backup_job_type_option_types("new", params["jobTypeId"], options), options[:options].deep_merge({ :context_map => { 'domain' => ''}}), @api_client, options[:params])
|
165
|
+
job_type_config.deep_compact!
|
166
|
+
params.deep_merge!(job_type_config)
|
153
167
|
payload['job'].deep_merge!(params)
|
154
168
|
end
|
155
169
|
@backup_jobs_interface.setopts(options)
|
@@ -173,7 +187,6 @@ EOT
|
|
173
187
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
174
188
|
opts.banner = "Usage: #{prog_name} backups update-job [job]"
|
175
189
|
build_option_type_options(opts, options, update_backup_job_option_types)
|
176
|
-
build_option_type_options(opts, options, update_backup_job_advanced_option_types)
|
177
190
|
build_standard_update_options(opts, options)
|
178
191
|
opts.footer = <<-EOT
|
179
192
|
Update a backup job.
|
@@ -197,7 +210,7 @@ EOT
|
|
197
210
|
v_prompt['scheduleId'] = nil
|
198
211
|
end
|
199
212
|
params.deep_merge!(v_prompt)
|
200
|
-
advanced_config = Morpheus::Cli::OptionTypes.no_prompt(
|
213
|
+
advanced_config = Morpheus::Cli::OptionTypes.no_prompt(update_backup_job_type_option_types("new", get_object_value(backup_job, "jobType.id"), options[:params]), options[:options], @api_client, options[:params])
|
201
214
|
advanced_config.deep_compact!
|
202
215
|
params.deep_merge!(advanced_config)
|
203
216
|
payload.deep_merge!({'job' => params})
|
@@ -278,6 +291,9 @@ EOT
|
|
278
291
|
"Schedule" => lambda {|it| it['schedule']['name'] rescue '' },
|
279
292
|
"Next" => lambda {|it| format_local_dt(it['nextFire']) },
|
280
293
|
"Retention Count" => lambda {|it| it['retentionCount'] rescue '' },
|
294
|
+
"Synthetic Full Enabled" => lambda {|it| it['syntheticFull']['enabled'] rescue ''},
|
295
|
+
"Synthetic Full Schedule" => lambda {|it| it['syntheticFull']['schedule']['name'] rescue ''},
|
296
|
+
"Synthetic Full Next" => lambda {|it| format_local_dt(it['syntheticFull']['nextFire']) rescue ''},
|
281
297
|
"Provider" => lambda {|it| it['backupProvider']['name'] rescue '' },
|
282
298
|
"Repository" => lambda {|it| it['backupRepository']['name'] rescue '' },
|
283
299
|
"Source" => lambda {|it| it['source'] },
|
@@ -301,17 +317,34 @@ EOT
|
|
301
317
|
def add_backup_job_option_types
|
302
318
|
[
|
303
319
|
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
|
304
|
-
{'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'required' => false, 'displayOrder' => 2}
|
305
|
-
{'fieldName' => 'retentionCount', 'fieldLabel' => 'Retention Count', 'type' => 'number', 'displayOrder' => 3},
|
306
|
-
{'fieldName' => 'scheduleId', 'fieldLabel' => 'Schedule', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
|
307
|
-
schedules = api_client.options.options_for_source('executeSchedules',{})['data']
|
308
|
-
[{"name" => "Manual", "value" => "manual"}] + schedules
|
309
|
-
}, 'displayOrder' => 4},
|
320
|
+
{'fieldName' => 'code', 'fieldLabel' => 'Code', 'type' => 'text', 'required' => false, 'displayOrder' => 2}
|
310
321
|
]
|
311
322
|
end
|
312
323
|
|
313
|
-
def
|
314
|
-
[]
|
324
|
+
def add_backup_job_type_option_types(job_action, backup_job_type, options)
|
325
|
+
backup_settings = @backup_settings_interface.get(options)["backupSettings"] || {}
|
326
|
+
# get job defaults
|
327
|
+
default_retention_count = options&.dig('backupJob', 'retentionCount') || get_object_value(backup_settings, "retentionCount")
|
328
|
+
default_schedule = options&.dig('backupJob', 'scheduleTypeId') || get_object_value(backup_settings, "defaultSchedule.id")
|
329
|
+
default_synthetic_enabled = options&.dig('backupJob', 'syntheticFullEnabled') || get_object_value(backup_settings, "defaultSyntheticFullBackupsEnabled")
|
330
|
+
default_synthetic_schedule = options&.dig('backupJob', 'syntheticFullSchedule') || get_object_value(backup_settings, "defaultSyntheticFullBackupSchedule.id")
|
331
|
+
job_input_params = {jobAction: job_action, id: backup_job_type}
|
332
|
+
job_inputs = @options_interface.options_for_source('backupJobOptionTypes', job_input_params)['data']['optionTypes']
|
333
|
+
job_inputs.each do | input |
|
334
|
+
# set input defaults from global settings
|
335
|
+
input['defaultValue'] = case input['fieldName']
|
336
|
+
when "retentionCount"
|
337
|
+
default_retention_count
|
338
|
+
when "scheduleTypeId"
|
339
|
+
default_schedule
|
340
|
+
when "syntheticFullEnabled"
|
341
|
+
default_synthetic_enabled
|
342
|
+
when "syntheticFullSchedule"
|
343
|
+
default_synthetic_schedule
|
344
|
+
end
|
345
|
+
end
|
346
|
+
|
347
|
+
job_inputs
|
315
348
|
end
|
316
349
|
|
317
350
|
def update_backup_job_option_types
|
@@ -322,8 +355,8 @@ EOT
|
|
322
355
|
}
|
323
356
|
end
|
324
357
|
|
325
|
-
def
|
326
|
-
|
358
|
+
def update_backup_job_type_option_types(job_action, backup_job_type, options)
|
359
|
+
add_backup_job_type_option_types(job_action, backup_job_type, options).collect {|it|
|
327
360
|
it.delete('required')
|
328
361
|
it.delete('defaultValue')
|
329
362
|
it
|
@@ -22,6 +22,7 @@ class Morpheus::Cli::BackupsCommand
|
|
22
22
|
@backup_restores_interface = @api_client.backup_restores
|
23
23
|
@instances_interface = @api_client.instances
|
24
24
|
@servers_interface = @api_client.servers
|
25
|
+
@options_interface = @api_client.options
|
25
26
|
end
|
26
27
|
|
27
28
|
def handle(args)
|
@@ -188,15 +189,6 @@ EOT
|
|
188
189
|
params['jobAction'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'jobAction', 'fieldLabel' => 'Backup Job Type', 'type' => 'select', 'optionSource' => 'backupJobActions', 'required' => true, 'defaultValue' => 'new'}], options[:options], @api_client)['jobAction']
|
189
190
|
if params['jobAction'] == 'new'
|
190
191
|
params['jobName'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'jobName', 'fieldLabel' => 'Job Name', 'type' => 'text', 'required' => false, 'defaultValue' => nil}], options[:options], @api_client)['jobName']
|
191
|
-
default_retention_count = (create_results['backup'] && create_results['backup']['retentionCount']) ? create_results['backup']['retentionCount'] : ((create_results['backupSettings'] && create_results['backupSettings']['retentionCount']) ? create_results['backupSettings']['retentionCount'] : nil)
|
192
|
-
params['retentionCount'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'retentionCount', 'fieldLabel' => 'Retention Count', 'type' => 'number', 'required' => false, 'defaultValue' => default_retention_count}], options[:options], @api_client)['retentionCount']
|
193
|
-
params['jobSchedule'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'jobSchedule', 'fieldLabel' => 'Backup Schedule', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
|
194
|
-
schedules = api_client.options.options_for_source('executeSchedules',{})['data']
|
195
|
-
[{"name" => "Manual", "value" => "manual"}] + schedules
|
196
|
-
}, 'required' => false}], options[:options], @api_client)['jobSchedule']
|
197
|
-
if params['jobSchedule'] == 'manual' || params['jobSchedule'] == ''
|
198
|
-
params.delete('jobSchedule')
|
199
|
-
end
|
200
192
|
elsif params['jobAction'] == 'clone'
|
201
193
|
params['jobId'] = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'jobId', 'fieldLabel' => 'Backup Job', 'type' => 'select', 'optionSource' => lambda { |api_client, api_params|
|
202
194
|
@backup_jobs_interface.list({max:10000})['jobs'].collect {|backup_job|
|
@@ -211,9 +203,20 @@ EOT
|
|
211
203
|
}
|
212
204
|
}, 'required' => true}], options[:options], @api_client)['jobId']
|
213
205
|
end
|
206
|
+
|
207
|
+
# new job option types
|
208
|
+
job_inputs = build_backup_job_option_types(params['jobAction'], params['backupType'], create_results)
|
209
|
+
job_opt_parser = Morpheus::Cli::OptionParser.new do |opts|
|
210
|
+
build_option_type_options(opts, options, job_inputs)
|
211
|
+
end
|
212
|
+
job_opt_parser.parse!(args)
|
213
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt(job_inputs, options[:options].deep_merge({:context_map => {'domain' => 'backupJob'}}), @api_client)
|
214
|
+
v_prompt.deep_compact!.booleanize! # remove empty values and convert checkbox "on" and "off" to true and false
|
215
|
+
params.deep_merge!(v_prompt)
|
214
216
|
end
|
215
217
|
payload['backup'].deep_merge!(params)
|
216
218
|
end
|
219
|
+
#options[:payload] = payload
|
217
220
|
execute_api(@backups_interface, :create, [], options, 'backup') do |json_response|
|
218
221
|
backup = json_response['backup']
|
219
222
|
print_green_success "Added backup #{backup['name']}"
|
@@ -482,6 +485,30 @@ EOT
|
|
482
485
|
private
|
483
486
|
|
484
487
|
## Backups
|
488
|
+
def build_backup_job_option_types(job_action, backup_type, config_opts)
|
489
|
+
# get job defaults
|
490
|
+
default_retention_count = config_opts.dig('backup', 'retentionCount') || config_opts.dig('backupSettings', 'retentionCount')
|
491
|
+
default_schedule = config_opts.dig('backup', 'scheduleTypeId') || config_opts.dig('backup', 'backupJob', 'scheduleTypeId') || config_opts.dig('backupSettings', 'defaultBackupSchedule')
|
492
|
+
default_synthetic_enabled = config_opts.dig('backup', 'backupJob', 'syntheticFullEnabled') || config_opts.dig('backupSettings', 'defaultSyntheticFullBackupsEnabled')
|
493
|
+
default_synthetic_schedule = config_opts.dig('backup', 'backupJob', 'syntheticFullSchedule') || config_opts.dig('backupSettings', 'defaultSyntheticFullBackupSchedule')
|
494
|
+
job_input_params = {jobAction: job_action, backupTypeCode: backup_type}
|
495
|
+
job_inputs = @options_interface.options_for_source('backupJobOptionTypes', job_input_params)['data']['optionTypes']
|
496
|
+
job_inputs.each do | input |
|
497
|
+
# set input defaults from global settings
|
498
|
+
input['defaultValue'] = case input['fieldName']
|
499
|
+
when "retentionCount"
|
500
|
+
default_retention_count
|
501
|
+
when "scheduleTypeId"
|
502
|
+
default_schedule
|
503
|
+
when "syntheticFullEnabled"
|
504
|
+
default_synthetic_enabled
|
505
|
+
when "syntheticFullSchedule"
|
506
|
+
default_synthetic_schedule
|
507
|
+
end
|
508
|
+
end
|
509
|
+
|
510
|
+
job_inputs
|
511
|
+
end
|
485
512
|
|
486
513
|
def backup_list_column_definitions()
|
487
514
|
{
|