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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 5e2f97549864e50c22d2a7f9e04ccf0cafb76ed6b833aef1271a8e0003716d90
4
- data.tar.gz: a8924722ef5ab2feeb455ea7008f9681a374bf5f739a34b15131748371848889
3
+ metadata.gz: 49afeaaa11ed794659cc20a46d3fc145990269dc96f1394a1cd95160bbc2f786
4
+ data.tar.gz: cdcf88755b1638f3d1816dde28dcfea8f8c6be27b9300bdfc3c6e4798d3937dd
5
5
  SHA512:
6
- metadata.gz: d7fafa4ba44a2c600055b47bc5178c3b667ca238b5080d355c01682679124ee71b12991d5b52bd85958b429ab2747f680e27a47fe1192179b8c5ff417b486035
7
- data.tar.gz: 50d06718a2b68a42ac4997a1bf6248c0ae4ce9b975747f972bfa4e718b4c6514af31a06a59bc70ad2e1642b8252896ead095b1a93b512f7d7c6d9cc963807c5e
6
+ metadata.gz: 56f27f9ab0323061846e4b3df32d570efff1b944083fe27700a9d729540ad605a1a39a5c2005cc5a0e19880d5f039a7aa3dbc12ff2c31c9b511426ec736f83a7
7
+ data.tar.gz: 7d98ac1e35e7929f3f73ff3968d3a2d1221629d1a2c07d7cdd916b2aa184ca2d30041eaeaf2ac5d53c653650a0a36e0c39a33bebbb9bf02bdcf3e4f84e5173c8
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  FROM ruby:2.7.5
2
2
 
3
- RUN gem install morpheus-cli -v 7.0.7
3
+ RUN gem install morpheus-cli -v 8.0.0
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
@@ -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 = "#{@base_url}/api/processes"
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 = "#{@base_url}/api/processes/#{id}"
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(id, params={})
21
- raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
22
- url = "#{@base_url}/api/processes/events/#{id}"
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
- v_prompt = Morpheus::Cli::OptionTypes.prompt(add_backup_job_option_types(), options[:options], @api_client, options[:params])
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
- advanced_config = Morpheus::Cli::OptionTypes.no_prompt(add_backup_job_advanced_option_types, options[:options], @api_client, options[:params])
151
- advanced_config.deep_compact!
152
- params.deep_merge!(advanced_config)
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(update_backup_job_advanced_option_types, options[:options], @api_client, options[:params])
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 add_backup_job_advanced_option_types
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 update_backup_job_advanced_option_types
326
- add_backup_job_advanced_option_types.collect {|it|
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
  {