morpheus-cli 2.10.0 → 2.10.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (80) hide show
  1. checksums.yaml +4 -4
  2. data/bin/morpheus +27 -32
  3. data/lib/morpheus/api/accounts_interface.rb +36 -47
  4. data/lib/morpheus/api/api_client.rb +141 -110
  5. data/lib/morpheus/api/app_templates_interface.rb +56 -72
  6. data/lib/morpheus/api/apps_interface.rb +111 -132
  7. data/lib/morpheus/api/auth_interface.rb +30 -0
  8. data/lib/morpheus/api/clouds_interface.rb +71 -76
  9. data/lib/morpheus/api/custom_instance_types_interface.rb +21 -46
  10. data/lib/morpheus/api/dashboard_interface.rb +10 -17
  11. data/lib/morpheus/api/deploy_interface.rb +60 -72
  12. data/lib/morpheus/api/deployments_interface.rb +53 -71
  13. data/lib/morpheus/api/groups_interface.rb +55 -45
  14. data/lib/morpheus/api/instance_types_interface.rb +19 -23
  15. data/lib/morpheus/api/instances_interface.rb +179 -177
  16. data/lib/morpheus/api/key_pairs_interface.rb +11 -17
  17. data/lib/morpheus/api/license_interface.rb +18 -23
  18. data/lib/morpheus/api/load_balancers_interface.rb +54 -69
  19. data/lib/morpheus/api/logs_interface.rb +25 -29
  20. data/lib/morpheus/api/options_interface.rb +13 -17
  21. data/lib/morpheus/api/provision_types_interface.rb +19 -22
  22. data/lib/morpheus/api/roles_interface.rb +75 -94
  23. data/lib/morpheus/api/security_group_rules_interface.rb +28 -37
  24. data/lib/morpheus/api/security_groups_interface.rb +39 -51
  25. data/lib/morpheus/api/servers_interface.rb +113 -115
  26. data/lib/morpheus/api/setup_interface.rb +31 -0
  27. data/lib/morpheus/api/task_sets_interface.rb +36 -38
  28. data/lib/morpheus/api/tasks_interface.rb +56 -69
  29. data/lib/morpheus/api/users_interface.rb +67 -76
  30. data/lib/morpheus/api/virtual_images_interface.rb +61 -61
  31. data/lib/morpheus/api/whoami_interface.rb +12 -15
  32. data/lib/morpheus/cli.rb +71 -60
  33. data/lib/morpheus/cli/accounts.rb +254 -315
  34. data/lib/morpheus/cli/alias_command.rb +219 -0
  35. data/lib/morpheus/cli/app_templates.rb +264 -272
  36. data/lib/morpheus/cli/apps.rb +608 -671
  37. data/lib/morpheus/cli/cli_command.rb +259 -21
  38. data/lib/morpheus/cli/cli_registry.rb +99 -14
  39. data/lib/morpheus/cli/clouds.rb +599 -372
  40. data/lib/morpheus/cli/config_file.rb +126 -0
  41. data/lib/morpheus/cli/credentials.rb +141 -117
  42. data/lib/morpheus/cli/dashboard_command.rb +48 -56
  43. data/lib/morpheus/cli/deployments.rb +254 -268
  44. data/lib/morpheus/cli/deploys.rb +150 -142
  45. data/lib/morpheus/cli/error_handler.rb +38 -0
  46. data/lib/morpheus/cli/groups.rb +551 -179
  47. data/lib/morpheus/cli/hosts.rb +862 -617
  48. data/lib/morpheus/cli/instance_types.rb +103 -95
  49. data/lib/morpheus/cli/instances.rb +1335 -1009
  50. data/lib/morpheus/cli/key_pairs.rb +82 -90
  51. data/lib/morpheus/cli/library.rb +498 -499
  52. data/lib/morpheus/cli/license.rb +83 -101
  53. data/lib/morpheus/cli/load_balancers.rb +314 -300
  54. data/lib/morpheus/cli/login.rb +66 -44
  55. data/lib/morpheus/cli/logout.rb +47 -46
  56. data/lib/morpheus/cli/mixins/accounts_helper.rb +69 -31
  57. data/lib/morpheus/cli/mixins/infrastructure_helper.rb +106 -0
  58. data/lib/morpheus/cli/mixins/print_helper.rb +181 -17
  59. data/lib/morpheus/cli/mixins/provisioning_helper.rb +535 -458
  60. data/lib/morpheus/cli/mixins/whoami_helper.rb +2 -2
  61. data/lib/morpheus/cli/option_parser.rb +35 -0
  62. data/lib/morpheus/cli/option_types.rb +232 -192
  63. data/lib/morpheus/cli/recent_activity_command.rb +61 -65
  64. data/lib/morpheus/cli/remote.rb +446 -199
  65. data/lib/morpheus/cli/roles.rb +884 -906
  66. data/lib/morpheus/cli/security_group_rules.rb +213 -203
  67. data/lib/morpheus/cli/security_groups.rb +237 -192
  68. data/lib/morpheus/cli/shell.rb +338 -231
  69. data/lib/morpheus/cli/tasks.rb +326 -308
  70. data/lib/morpheus/cli/users.rb +457 -462
  71. data/lib/morpheus/cli/version.rb +1 -1
  72. data/lib/morpheus/cli/version_command.rb +16 -18
  73. data/lib/morpheus/cli/virtual_images.rb +526 -345
  74. data/lib/morpheus/cli/whoami.rb +125 -111
  75. data/lib/morpheus/cli/workflows.rb +338 -185
  76. data/lib/morpheus/formatters.rb +8 -1
  77. data/lib/morpheus/logging.rb +1 -1
  78. data/lib/morpheus/rest_client.rb +17 -8
  79. metadata +9 -3
  80. data/lib/morpheus/api/custom_instance_types.rb +0 -55
@@ -6,334 +6,352 @@ require 'table_print'
6
6
  require 'morpheus/cli/cli_command'
7
7
 
8
8
  class Morpheus::Cli::Tasks
9
- include Morpheus::Cli::CliCommand
9
+ include Morpheus::Cli::CliCommand
10
10
 
11
- def initialize()
12
- @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
13
- end
11
+ register_subcommands :list, :get, :add, :update, :remove, :'task-types'
12
+ alias_subcommand :details, :get
13
+ alias_subcommand :types, :'task-types'
14
+ set_default_subcommand :list
15
+
16
+ def connect(opts)
17
+ @api_client = establish_remote_appliance_connection(opts)
18
+ @tasks_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).tasks
19
+ @task_sets_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).task_sets
20
+ end
14
21
 
15
- def connect(opts)
16
- if opts[:remote]
17
- @appliance_url = opts[:remote]
18
- @appliance_name = opts[:remote]
19
- @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials(opts)
20
- else
21
- @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials(opts)
22
- end
23
- @api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url)
24
- @tasks_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).tasks
25
- @task_sets_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).task_sets
26
- if @access_token.empty?
27
- print_red_alert "Invalid Credentials. Unable to acquire access token. Please verify your credentials and try again."
28
- exit 1
29
- end
30
- end
22
+ def handle(args)
23
+ handle_subcommand(args)
24
+ end
31
25
 
26
+ def list(args)
27
+ options = {}
28
+ optparse = OptionParser.new do|opts|
29
+ opts.banner = subcommand_usage()
30
+ build_common_options(opts, options, [:list, :json, :dry_run, :remote])
31
+ end
32
+ optparse.parse!(args)
33
+ connect(options)
34
+ begin
35
+ params = {}
36
+ [:phrase, :offset, :max, :sort, :direction].each do |k|
37
+ params[k] = options[k] unless options[k].nil?
38
+ end
39
+ if options[:dry_run]
40
+ print_dry_run @tasks_interface.dry.get(params)
41
+ return
42
+ end
43
+ json_response = @tasks_interface.get(params)
44
+ if options[:json]
45
+ print JSON.pretty_generate(json_response)
46
+ else
47
+ tasks = json_response['tasks']
48
+ print "\n" ,cyan, bold, "Morpheus Tasks\n","==================", reset, "\n\n"
49
+ if tasks.empty?
50
+ puts yellow,"No tasks currently configured.",reset
51
+ else
52
+ print cyan
53
+ tasks_table_data = tasks.collect do |task|
54
+ {name: task['name'], id: task['id'], type: task['taskType']['name']}
55
+ end
56
+ tp tasks_table_data, :id, :name, :type
57
+ print_results_pagination(json_response)
58
+ end
59
+ print reset,"\n"
60
+ end
61
+ rescue RestClient::Exception => e
62
+ print_rest_exception(e, options)
63
+ exit 1
64
+ end
65
+ end
32
66
 
33
- def handle(args)
34
- if args.empty?
35
- puts "\nUsage: morpheus tasks [list,add, update,remove, details, task-types]\n\n"
36
- return
37
- end
67
+ def get(args)
68
+ options = {}
69
+ optparse = OptionParser.new do|opts|
70
+ opts.banner = subcommand_usage("[task]")
71
+ build_common_options(opts, options, [:json, :dry_run, :remote])
72
+ end
73
+ optparse.parse!(args)
74
+ if args.count < 1
75
+ puts optparse
76
+ exit 1
77
+ end
78
+ task_name = args[0]
79
+ connect(options)
80
+ begin
81
+ if options[:dry_run]
82
+ if task_name.to_s =~ /\A\d{1,}\Z/
83
+ print_dry_run @tasks_interface.dry.get(task_name.to_i)
84
+ else
85
+ print_dry_run @tasks_interface.dry.get({name: task_name})
86
+ end
87
+ return
88
+ end
89
+ task = find_task_by_name_or_id(task_name)
90
+ exit 1 if task.nil?
91
+ task_type = find_task_type_by_name(task['taskType']['name'])
92
+ if options[:json]
93
+ puts JSON.pretty_generate({task:task})
94
+ print "\n"
95
+ else
96
+ #print "\n", cyan, "Task #{task['name']} - #{task['taskType']['name']}\n\n"
97
+ print "\n" ,cyan, bold, "Task Details\n","==================", reset, "\n\n"
98
+ print cyan
99
+ puts "ID: #{task['id']}"
100
+ puts "Name: #{task['name']}"
101
+ puts "Type: #{task['taskType']['name']}"
102
+ #puts "Description: #{workflow['description']}"
103
+ # print "\n", cyan, "Config:\n"
104
+ task_type['optionTypes'].sort { |x,y| x['displayOrder'].to_i <=> y['displayOrder'].to_i }.each do |optionType|
105
+ if optionType['fieldLabel'].to_s.downcase == 'script'
106
+ print cyan,bold,"Script:","\n",reset,bright_black,"#{task['taskOptions'][optionType['fieldName']]}","\n",reset
107
+ else
108
+ print cyan,("#{optionType['fieldLabel']} : " + (optionType['type'] == 'password' ? "#{task['taskOptions'][optionType['fieldName']] ? '************' : ''}" : "#{task['taskOptions'][optionType['fieldName']] || optionType['defaultValue']}")),"\n"
109
+ end
110
+ end
111
+ print reset,"\n"
112
+ end
113
+ rescue RestClient::Exception => e
114
+ print_rest_exception(e, options)
115
+ exit 1
116
+ end
117
+ end
38
118
 
39
- case args[0]
40
- when 'list'
41
- list(args[1..-1])
42
- when 'add'
43
- add(args[1..-1])
44
- when 'update'
45
- update(args[1..-1])
46
- when 'details'
47
- details(args[1..-1])
48
- when 'remove'
49
- remove(args[1..-1])
50
- when 'task-types'
51
- task_types(args[1..-1])
52
- else
53
- puts "\nUsage: morpheus tasks [list,add, update,remove, details, task-types]\n\n"
54
- exit 127
55
- end
56
- end
119
+ def update(args)
120
+ options = {}
121
+ account_name = nil
122
+ optparse = OptionParser.new do|opts|
123
+ opts.banner = subcommand_usage("[task] [options]")
124
+ build_common_options(opts, options, [:options, :json, :dry_run, :remote])
125
+ end
126
+ optparse.parse!(args)
127
+ if args.count < 1
128
+ puts optparse
129
+ exit 1
130
+ end
131
+ task_name = args[0]
132
+ connect(options)
133
+ begin
57
134
 
58
- def list(args)
59
- options = {}
60
- optparse = OptionParser.new do|opts|
61
- opts.banner = "Usage: morpheus tasks list [-s] [-o] [-m]"
62
- build_common_options(opts, options, [:list, :json, :remote])
63
- end
64
- optparse.parse(args)
65
- connect(options)
66
- begin
67
- params = {}
68
- [:phrase, :offset, :max, :sort, :direction].each do |k|
69
- params[k] = options[k] unless options[k].nil?
70
- end
71
- json_response = @tasks_interface.get(params)
72
- if options[:json]
73
- print JSON.pretty_generate(json_response)
74
- else
75
- tasks = json_response['tasks']
76
- print "\n" ,cyan, bold, "Morpheus Tasks\n","==================", reset, "\n\n"
77
- if tasks.empty?
78
- puts yellow,"No tasks currently configured.",reset
79
- else
80
- print cyan
81
- tasks_table_data = tasks.collect do |task|
82
- {name: task['name'], id: task['id'], type: task['taskType']['name']}
83
- end
84
- tp tasks_table_data, :id, :name, :type
85
- end
86
- print reset,"\n\n"
87
- end
88
-
89
-
90
- rescue RestClient::Exception => e
91
- print_rest_exception(e, options)
92
- exit 1
93
- end
94
- end
95
135
 
96
- def details(args)
97
- task_name = args[0]
98
- options = {}
99
- optparse = OptionParser.new do|opts|
100
- opts.banner = "Usage: morpheus tasks details [task]"
101
- build_common_options(opts, options, [:json, :remote])
102
- end
103
- if args.count < 1
104
- puts "\n#{optparse.banner}\n\n"
105
- exit 1
106
- end
107
- optparse.parse(args)
108
- connect(options)
109
- begin
110
- task = find_task_by_name_or_code_or_id(task_name)
136
+ task = find_task_by_name_or_id(task_name)
137
+ exit 1 if task.nil?
138
+ task_type = find_task_type_by_name(task['taskType']['name'])
111
139
 
112
- exit 1 if task.nil?
113
- task_type = find_task_type_by_name(task['taskType']['name'])
114
- if options[:json]
115
- puts JSON.pretty_generate({task:task})
116
- else
117
- print "\n", cyan, "Task #{task['name']} - #{task['taskType']['name']}\n\n"
118
- task_type['optionTypes'].sort { |x,y| x['displayOrder'].to_i <=> y['displayOrder'].to_i }.each do |optionType|
119
- puts " #{optionType['fieldLabel']} : " + (optionType['type'] == 'password' ? "#{task['taskOptions'][optionType['fieldName']] ? '************' : ''}" : "#{task['taskOptions'][optionType['fieldName']] || optionType['defaultValue']}")
120
- end
121
- print reset,"\n\n"
122
- end
123
- rescue RestClient::Exception => e
124
- print_rest_exception(e, options)
125
- exit 1
126
- end
127
- end
140
+ #params = Morpheus::Cli::OptionTypes.prompt(add_user_option_types, options[:options], @api_client, options[:params]) # options[:params] is mysterious
141
+ params = options[:options] || {}
128
142
 
129
- def update(args)
130
- task_name = args[0]
131
- options = {}
132
- account_name = nil
133
- optparse = OptionParser.new do|opts|
134
- opts.banner = "Usage: morpheus tasks update [task] [options]"
135
- build_common_options(opts, options, [:options, :json, :remote])
136
- end
137
- if args.count < 1
138
- puts "\n#{optparse.banner}\n\n"
139
- exit 1
140
- end
141
- optparse.parse(args)
143
+ if params.empty?
144
+ puts optparse.banner
145
+ option_lines = update_task_option_types(task_type).collect {|it| "\t-O #{it['fieldContext'] ? (it['fieldContext'] + '.') : ''}#{it['fieldName']}=\"value\"" }.join("\n")
146
+ puts "\nAvailable Options:\n#{option_lines}\n\n"
147
+ exit 1
148
+ end
142
149
 
143
- connect(options)
144
-
145
- begin
150
+ #puts "parsed params is : #{params.inspect}"
151
+ task_keys = ['name']
152
+ changes_payload = (params.select {|k,v| task_keys.include?(k) })
153
+ task_payload = task
154
+ if changes_payload
155
+ task_payload.merge!(changes_payload)
156
+ end
157
+ if params['taskOptions']
158
+ task_payload['taskOptions'].merge!(params['taskOptions'])
159
+ end
146
160
 
161
+ payload = {task: task_payload}
162
+ if options[:dry_run]
163
+ print_dry_run @tasks_interface.dry.update(task['id'], payload)
164
+ return
165
+ end
166
+ response = @tasks_interface.update(task['id'], payload)
167
+ if options[:json]
168
+ print JSON.pretty_generate(json_response)
169
+ if !response['success']
170
+ exit 1
171
+ end
172
+ else
173
+ print "\n", cyan, "Task #{response['task']['name']} updated", reset, "\n\n"
174
+ get([task['id']])
175
+ end
176
+ rescue RestClient::Exception => e
177
+ print_rest_exception(e, options)
178
+ exit 1
179
+ end
180
+ end
147
181
 
148
- task = find_task_by_name_or_code_or_id(task_name)
149
- exit 1 if task.nil?
150
- task_type = find_task_type_by_name(task['taskType']['name'])
151
182
 
152
- #params = Morpheus::Cli::OptionTypes.prompt(add_user_option_types, options[:options], @api_client, options[:params]) # options[:params] is mysterious
153
- params = options[:options] || {}
183
+ def task_types(args)
184
+ options = {}
185
+ optparse = OptionParser.new do|opts|
186
+ opts.banner = subcommand_usage()
187
+ build_common_options(opts, options, [:json, :dry_run, :remote])
188
+ end
189
+ optparse.parse!(args)
190
+ connect(options)
191
+ begin
192
+ if options[:dry_run]
193
+ print_dry_run @tasks_interface.dry.task_types()
194
+ return
195
+ end
196
+ json_response = @tasks_interface.task_types()
197
+ if options[:json]
198
+ print JSON.pretty_generate(json_response)
199
+ else
200
+ task_types = json_response['taskTypes']
201
+ print "\n" ,cyan, bold, "Morpheus Task Types\n","==================", reset, "\n\n"
202
+ if task_types.nil? || task_types.empty?
203
+ puts yellow,"No task types currently exist on this appliance. This could be a seed issue.",reset
204
+ else
205
+ print cyan
206
+ tasks_table_data = task_types.collect do |task_type|
207
+ {name: task_type['name'], id: task_type['id'], code: task_type['code'], description: task_type['description']}
208
+ end
209
+ tp tasks_table_data, :id, :name, :code, :description
210
+ end
154
211
 
155
- if params.empty?
156
- puts "\n#{optparse.banner}\n\n"
157
- option_lines = update_task_option_types(task_type).collect {|it| "\t-O #{it['fieldContext'] ? (it['fieldContext'] + '.') : ''}#{it['fieldName']}=\"value\"" }.join("\n")
158
- puts "\nAvailable Options:\n#{option_lines}\n\n"
159
- exit 1
160
- end
212
+ print reset,"\n"
213
+ end
214
+ rescue RestClient::Exception => e
215
+ print_rest_exception(e, options)
216
+ exit 1
217
+ end
218
+ end
161
219
 
162
- #puts "parsed params is : #{params.inspect}"
163
- task_keys = ['name']
164
- changes_payload = (params.select {|k,v| task_keys.include?(k) })
165
- task_payload = task
166
- if changes_payload
167
- task_payload.merge!(changes_payload)
168
- end
169
- if params['taskOptions']
170
- task_payload['taskOptions'].merge!(params['taskOptions'])
171
- end
220
+ def add(args)
221
+ options = {}
222
+ task_type_name = nil
223
+ optparse = OptionParser.new do|opts|
224
+ opts.banner = subcommand_usage("[name] -t TASK_TYPE")
225
+ opts.on( '-t', '--type TASK_TYPE', "Task Type" ) do |val|
226
+ task_type_name = val
227
+ end
228
+ build_common_options(opts, options, [:options, :json, :dry_run, :quiet, :remote])
229
+ end
230
+ optparse.parse!(args)
231
+ task_name = args[0]
232
+ if args.count < 1 || task_type_name.nil?
233
+ puts optparse
234
+ exit 1
235
+ end
236
+ connect(options)
237
+ begin
238
+ task_type = find_task_type_by_name(task_type_name)
239
+ if task_type.nil?
240
+ puts "Task Type not found!"
241
+ exit 1
242
+ end
243
+ input_options = Morpheus::Cli::OptionTypes.prompt(task_type['optionTypes'],options[:options],@api_client, options[:params])
244
+ payload = {task: {name: task_name, taskOptions: input_options['taskOptions'], taskType: {code: task_type['code'], id: task_type['id']}}}
245
+ if options[:dry_run]
246
+ print_dry_run @tasks_interface.dry.create(payload)
247
+ return
248
+ end
249
+ json_response = @tasks_interface.create(payload)
250
+ if options[:json]
251
+ print JSON.pretty_generate(json_response)
252
+ elsif !options[:quiet]
253
+ print "\n", cyan, "Task #{json_response['task']['name']} created successfully", reset, "\n\n"
254
+ list([])
255
+ end
256
+ rescue RestClient::Exception => e
257
+ print_rest_exception(e, options)
258
+ exit 1
259
+ end
260
+ end
172
261
 
173
- request_payload = {task: task_payload}
174
- response = @tasks_interface.update(task['id'], request_payload)
175
- if options[:json]
176
- print JSON.pretty_generate(json_response)
177
- if !response['success']
178
- exit 1
179
- end
180
- else
181
- print "\n", cyan, "Task #{response['task']['name']} updated", reset, "\n\n"
182
- end
183
- rescue RestClient::Exception => e
184
- print_rest_exception(e, options)
185
- exit 1
186
- end
187
- end
262
+ def remove(args)
263
+ task_name = args[0]
264
+ options = {}
265
+ optparse = OptionParser.new do|opts|
266
+ opts.banner = subcommand_usage("[task]")
267
+ build_common_options(opts, options, [:auto_confirm, :json, :dry_run, :quiet, :remote])
268
+ end
269
+ optparse.parse!(args)
270
+ if args.count < 1
271
+ puts optparse
272
+ exit 1
273
+ end
274
+ connect(options)
275
+ begin
276
+ task = find_task_by_name_or_id(task_name)
277
+ exit 1 if task.nil?
278
+ unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the task #{task['name']}?")
279
+ exit
280
+ end
281
+ if options[:dry_run]
282
+ print_dry_run @tasks_interface.dry.destroy(task['id'])
283
+ return
284
+ end
285
+ json_response = @tasks_interface.destroy(task['id'])
286
+ if options[:json]
287
+ print JSON.pretty_generate(json_response)
288
+ elsif !options[:quiet]
289
+ print "\n", cyan, "Task #{task['name']} removed", reset, "\n\n"
290
+ end
291
+ rescue RestClient::Exception => e
292
+ print_rest_exception(e, options)
293
+ exit 1
294
+ end
295
+ end
188
296
 
189
297
 
190
- def task_types(args)
191
- options = {}
192
- optparse = OptionParser.new do|opts|
193
- opts.banner = "Usage: morpheus tasks task-types"
194
- build_common_options(opts, options, [:json, :remote])
195
- end
196
- optparse.parse(args)
197
- connect(options)
198
- begin
199
- json_response = @tasks_interface.task_types()
200
- if options[:json]
201
- print JSON.pretty_generate(json_response)
202
- else
203
- task_types = json_response['taskTypes']
204
- print "\n" ,cyan, bold, "Morpheus Task Types\n","==================", reset, "\n\n"
205
- if task_types.nil? || task_types.empty?
206
- puts yellow,"No task types currently exist on this appliance. This could be a seed issue.",reset
207
- else
208
- print cyan
209
- tasks_table_data = task_types.collect do |task_type|
210
- {name: task_type['name'], id: task_type['id'], code: task_type['code'], description: task_type['description']}
211
- end
212
- tp tasks_table_data, :id, :name, :code, :description
213
- end
298
+ private
299
+ def find_task_by_name_or_id(val)
300
+ if val.to_s =~ /\A\d{1,}\Z/
301
+ return find_task_by_id(val)
302
+ else
303
+ return find_task_by_name(val)
304
+ end
305
+ end
214
306
 
215
- print reset,"\n\n"
216
- end
217
-
218
-
219
- rescue RestClient::Exception => e
220
- print_rest_exception(e, options)
221
- exit 1
222
- end
223
- end
307
+ def find_task_by_id(id)
308
+ begin
309
+ json_response = @tasks_interface.get(id.to_i)
310
+ return json_response['task']
311
+ rescue RestClient::Exception => e
312
+ if e.response && e.response.code == 404
313
+ print_red_alert "Task not found by id #{id}"
314
+ else
315
+ raise e
316
+ end
317
+ end
318
+ end
224
319
 
225
- def add(args)
226
- task_name = args[0]
227
- task_type_name = nil
228
- options = {}
229
- optparse = OptionParser.new do|opts|
230
- opts.banner = "Usage: morpheus tasks add [task] -t TASK_TYPE"
231
- opts.on( '-t', '--type TASK_TYPE', "Task Type" ) do |val|
232
- task_type_name = val
233
- end
234
- build_common_options(opts, options, [:options, :json, :remote])
235
- end
236
- if args.count < 1
237
- puts "\n#{optparse.banner}\n\n"
238
- exit 1
239
- end
240
- optparse.parse(args)
241
- connect(options)
320
+ def find_task_by_name(name)
321
+ tasks = @tasks_interface.get({name: name.to_s})['tasks']
322
+ if tasks.empty?
323
+ print_red_alert "Task not found by name #{name}"
324
+ return nil
325
+ elsif tasks.size > 1
326
+ print_red_alert "#{tasks.size} tasks by name #{name}"
327
+ print_tasks_table(tasks, {color: red})
328
+ print reset,"\n\n"
329
+ return nil
330
+ else
331
+ return tasks[0]
332
+ end
333
+ end
242
334
 
243
- if task_type_name.nil?
244
- puts "Task Type must be specified...\n#{optparse.banner}"
245
- exit 1
246
- end
247
- begin
248
- task_type = find_task_type_by_name(task_type_name)
249
- if task_type.nil?
250
- puts "Task Type not found!"
251
- exit 1
252
- end
253
- input_options = Morpheus::Cli::OptionTypes.prompt(task_type['optionTypes'],options[:options],@api_client, options[:params])
254
- payload = {task: {name: task_name, taskOptions: input_options['taskOptions'], taskType: {code: task_type['code'], id: task_type['id']}}}
255
- json_response = @tasks_interface.create(payload)
256
- if options[:json]
257
- print JSON.pretty_generate(json_response)
258
- else
259
- print "\n", cyan, "Task #{json_response['task']['name']} created successfully", reset, "\n\n"
260
- end
261
- rescue RestClient::Exception => e
262
- print_rest_exception(e, options)
263
- exit 1
264
- end
265
- end
335
+ def find_task_type_by_name(val)
336
+ raise "find_task_type_by_name passed a bad name: #{val.inspect}" if val.to_s == ''
337
+ results = @tasks_interface.task_types(val)
338
+ result = nil
339
+ if !results['taskTypes'].nil? && !results['taskTypes'].empty?
340
+ result = results['taskTypes'][0]
341
+ elsif val.to_i.to_s == val
342
+ results = @tasks_interface.task_types(val.to_i)
343
+ result = results['taskType']
344
+ end
345
+ if result.nil?
346
+ print_red_alert "Task Type not found by '#{val}'"
347
+ return nil
348
+ end
349
+ return result
350
+ end
266
351
 
267
- def remove(args)
268
- task_name = args[0]
269
- options = {}
270
- optparse = OptionParser.new do|opts|
271
- opts.banner = "Usage: morpheus tasks remove [task]"
272
- build_common_options(opts, options, [:auto_confirm, :json, :remote])
273
- end
274
- if args.count < 1
275
- puts "\n#{optparse.banner}\n\n"
276
- exit 1
277
- end
278
- optparse.parse(args)
279
- connect(options)
280
- begin
281
- task = find_task_by_name_or_code_or_id(task_name)
282
- exit 1 if task.nil?
283
- unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the task #{task['name']}?")
284
- exit
285
- end
286
- json_response = @tasks_interface.destroy(task['id'])
287
- if options[:json]
288
- print JSON.pretty_generate(json_response)
289
- else
290
- print "\n", cyan, "Task #{task['name']} removed", reset, "\n\n"
291
- end
292
- rescue RestClient::Exception => e
293
- print_rest_exception(e, options)
294
- exit 1
295
- end
296
- end
297
-
298
-
299
- private
300
- def find_task_by_name_or_code_or_id(val)
301
- raise "find_task_by_name_or_code_or_id passed a bad name: #{val.inspect}" if val.to_s == ''
302
- results = @tasks_interface.get(val)
303
- result = nil
304
- if !results['tasks'].nil? && !results['tasks'].empty?
305
- result = results['tasks'][0]
306
- elsif val.to_i.to_s == val
307
- results = @tasks_interface.get(val.to_i)
308
- result = results['task']
309
- end
310
- if result.nil?
311
- print_red_alert "Task not found by '#{val}'"
312
- return nil
313
- end
314
- return result
315
- end
316
-
317
- def find_task_type_by_name(val)
318
- raise "find_task_type_by_name passed a bad name: #{val.inspect}" if val.to_s == ''
319
- results = @tasks_interface.task_types(val)
320
- result = nil
321
- if !results['taskTypes'].nil? && !results['taskTypes'].empty?
322
- result = results['taskTypes'][0]
323
- elsif val.to_i.to_s == val
324
- results = @tasks_interface.task_types(val.to_i)
325
- result = results['taskType']
326
- end
327
- if result.nil?
328
- print_red_alert "Task Type not found by '#{val}'"
329
- return nil
330
- end
331
- return result
332
- end
333
-
334
- def update_task_option_types(task_type)
335
- [
336
- {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 0}
337
- ] + task_type['optionTypes']
338
- end
352
+ def update_task_option_types(task_type)
353
+ [
354
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 0}
355
+ ] + task_type['optionTypes']
356
+ end
339
357
  end