morpheus-cli 0.1.1 → 0.9.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (49) hide show
  1. checksums.yaml +4 -4
  2. data/lib/morpheus/api/accounts_interface.rb +55 -0
  3. data/lib/morpheus/api/api_client.rb +48 -3
  4. data/lib/morpheus/api/apps_interface.rb +13 -13
  5. data/lib/morpheus/api/{zones_interface.rb → clouds_interface.rb} +10 -10
  6. data/lib/morpheus/api/deploy_interface.rb +4 -4
  7. data/lib/morpheus/api/groups_interface.rb +3 -3
  8. data/lib/morpheus/api/instance_types_interface.rb +2 -2
  9. data/lib/morpheus/api/instances_interface.rb +35 -19
  10. data/lib/morpheus/api/key_pairs_interface.rb +60 -0
  11. data/lib/morpheus/api/license_interface.rb +29 -0
  12. data/lib/morpheus/api/load_balancers_interface.rb +72 -0
  13. data/lib/morpheus/api/logs_interface.rb +37 -0
  14. data/lib/morpheus/api/options_interface.rb +20 -0
  15. data/lib/morpheus/api/provision_types_interface.rb +27 -0
  16. data/lib/morpheus/api/roles_interface.rb +73 -0
  17. data/lib/morpheus/api/security_group_rules_interface.rb +3 -3
  18. data/lib/morpheus/api/security_groups_interface.rb +5 -5
  19. data/lib/morpheus/api/servers_interface.rb +67 -3
  20. data/lib/morpheus/api/task_sets_interface.rb +46 -0
  21. data/lib/morpheus/api/tasks_interface.rb +72 -0
  22. data/lib/morpheus/api/users_interface.rb +72 -0
  23. data/lib/morpheus/cli.rb +27 -4
  24. data/lib/morpheus/cli/accounts.rb +306 -0
  25. data/lib/morpheus/cli/apps.rb +58 -1
  26. data/lib/morpheus/cli/cli_command.rb +87 -0
  27. data/lib/morpheus/cli/cli_registry.rb +6 -1
  28. data/lib/morpheus/cli/{zones.rb → clouds.rb} +99 -70
  29. data/lib/morpheus/cli/credentials.rb +23 -11
  30. data/lib/morpheus/cli/error_handler.rb +31 -11
  31. data/lib/morpheus/cli/groups.rb +1 -0
  32. data/lib/morpheus/cli/hosts.rb +567 -0
  33. data/lib/morpheus/cli/instances.rb +588 -292
  34. data/lib/morpheus/cli/key_pairs.rb +393 -0
  35. data/lib/morpheus/cli/license.rb +118 -0
  36. data/lib/morpheus/cli/load_balancers.rb +366 -0
  37. data/lib/morpheus/cli/mixins/accounts_helper.rb +193 -0
  38. data/lib/morpheus/cli/option_types.rb +260 -0
  39. data/lib/morpheus/cli/roles.rb +164 -0
  40. data/lib/morpheus/cli/security_group_rules.rb +4 -9
  41. data/lib/morpheus/cli/shell.rb +108 -0
  42. data/lib/morpheus/cli/tasks.rb +370 -0
  43. data/lib/morpheus/cli/users.rb +325 -0
  44. data/lib/morpheus/cli/version.rb +1 -1
  45. data/lib/morpheus/cli/workflows.rb +100 -0
  46. data/lib/morpheus/formatters.rb +43 -0
  47. data/morpheus-cli.gemspec +1 -1
  48. metadata +33 -10
  49. data/lib/morpheus/cli/servers.rb +0 -265
@@ -12,21 +12,37 @@ class Morpheus::Cli::Instances
12
12
  include Term::ANSIColor
13
13
  def initialize()
14
14
  @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
15
- @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials()
15
+
16
+ end
17
+
18
+ def connect(opts)
19
+ if opts[:remote]
20
+ @appliance_url = opts[:remote]
21
+ @appliance_name = opts[:remote]
22
+ @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials(opts)
23
+ else
24
+ @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials(opts)
25
+ end
26
+ @api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url)
16
27
  @instances_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).instances
28
+ @task_sets_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).task_sets
29
+ @logs_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).logs
30
+ @tasks_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).tasks
17
31
  @instance_types_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).instance_types
18
32
  @groups_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).groups
33
+ @provision_types_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).provision_types
34
+ @options_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).options
19
35
  @active_groups = ::Morpheus::Cli::Groups.load_group_file
36
+ if @access_token.empty?
37
+ print red,bold, "\nInvalid Credentials. Unable to acquire access token. Please verify your credentials and try again.\n\n",reset
38
+ exit 1
39
+ end
20
40
  end
21
41
 
22
42
 
23
43
  def handle(args)
24
- if @access_token.empty?
25
- print red,bold, "\nInvalid Credentials. Unable to acquire access token. Please verify your credentials and try again.\n\n",reset
26
- return 1
27
- end
28
44
  if args.empty?
29
- puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,resize,upgrade,clone,envs,setenv,delenv,firewall_disable,firewall_enable,security_groups,apply_security_groups] [name]\n\n"
45
+ puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,backup,run-workflow,resize,upgrade,clone,envs,setenv,delenv,firewall_disable,firewall_enable,security_groups,apply_security_groups] [name]\n\n"
30
46
  return
31
47
  end
32
48
 
@@ -43,8 +59,18 @@ class Morpheus::Cli::Instances
43
59
  start(args[1..-1])
44
60
  when 'restart'
45
61
  restart(args[1..-1])
62
+ when 'stop-service'
63
+ stop_service(args[1..-1])
64
+ when 'start-service'
65
+ start_service(args[1..-1])
66
+ when 'restart-service'
67
+ restart_service(args[1..-1])
68
+ when 'run-workflow'
69
+ run_workflow(args[1..-1])
46
70
  when 'stats'
47
71
  stats(args[1..-1])
72
+ when 'logs'
73
+ logs(args[1..-1])
48
74
  when 'details'
49
75
  details(args[1..-1])
50
76
  when 'envs'
@@ -53,37 +79,76 @@ class Morpheus::Cli::Instances
53
79
  setenv(args[1..-1])
54
80
  when 'delenv'
55
81
  delenv(args[1..-1])
56
- when 'firewall_disable'
82
+ when 'firewall-disable'
57
83
  firewall_disable(args[1..-1])
58
- when 'firewall_enable'
84
+ when 'firewall-enable'
59
85
  firewall_enable(args[1..-1])
60
- when 'security_groups'
86
+ when 'security-groups'
61
87
  security_groups(args[1..-1])
62
- when 'apply_security_groups'
88
+ when 'apply-security-groups'
63
89
  apply_security_groups(args[1..-1])
90
+ when 'backup'
91
+ backup(args[1..-1])
64
92
  else
65
- puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,resize,upgrade,clone,envs,setenv,delenv] [name]\n\n"
93
+ puts "\nUsage: morpheus instances [list,add,remove,stop,start,restart,backup,run-workflow,stop-service,start-service,restart-service,resize,upgrade,clone,envs,setenv,delenv] [name]\n\n"
94
+ exit 127
66
95
  end
67
96
  end
68
97
 
69
98
  def add(args)
99
+ options = {}
100
+ optparse = OptionParser.new do|opts|
101
+ opts.banner = "Usage: morpheus instances add TYPE NAME"
102
+ opts.on( '-g', '--group GROUP', "Group" ) do |val|
103
+ options[:group] = val
104
+ end
105
+ opts.on( '-c', '--cloud CLOUD', "Cloud" ) do |val|
106
+ options[:cloud] = val
107
+ end
108
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
109
+
110
+ end
111
+
70
112
  if args.count < 2
71
- puts "\nUsage: morpheus instances add NAME TYPE\n\n"
113
+ puts "\n#{optparse}\n\n"
72
114
  return
73
115
  end
74
-
75
- instance_name = args[0]
76
- instance_type_code = args[1]
116
+ optparse.parse(args)
117
+ connect(options)
118
+ instance_name = args[1]
119
+ instance_type_code = args[0]
77
120
  instance_type = find_instance_type_by_code(instance_type_code)
78
121
  if instance_type.nil?
79
- print reset,"\n\n"
80
- return
122
+ exit 1
123
+ end
124
+ groupId = nil
125
+ if !options[:group].nil?
126
+ group = find_group_by_name(options[:group])
127
+ if !group.nil?
128
+ groupId = group
129
+ end
130
+ else
131
+ groupId = @active_groups[@appliance_name.to_sym]
81
132
  end
82
133
 
83
- groupId = @active_groups[@appliance_name.to_sym]
134
+ if groupId.nil?
135
+ puts "Group not found or specified! \n #{optparse}"
136
+ exit 1
137
+ end
138
+
139
+ if options[:cloud].nil?
140
+ puts "Cloud not specified! \n #{optparse}"
141
+ exit 1
142
+ end
143
+ cloud = find_cloud_by_name(groupId,options[:cloud])
144
+ if cloud.nil?
145
+ puts "Cloud not found! \n #{optparse}"
146
+ exit 1
147
+ end
84
148
 
85
- options = {
149
+ payload = {
86
150
  :servicePlan => nil,
151
+ zoneId: cloud,
87
152
  :instance => {
88
153
  :name => instance_name,
89
154
  :site => {
@@ -95,77 +160,60 @@ class Morpheus::Cli::Instances
95
160
  }
96
161
  }
97
162
 
163
+ version_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'version', 'type' => 'select', 'fieldLabel' => 'Version', 'optionSource' => 'instanceVersions', 'required' => true, 'skipSingleOption':true, 'description' => 'Select which version of the instance type to be provisioned.'}],options[:options],@api_client,{groupId: groupId, cloudId: cloud, instanceTypeId: instance_type['id']})
164
+ layout_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'layout', 'type' => 'select', 'fieldLabel' => 'Layout', 'optionSource' => 'layoutsForCloud', 'required' => true, 'description' => 'Select which configuration of the instance type to be provisioned.'}],options[:options],@api_client,{groupId: groupId, cloudId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
165
+ layout_id = layout_prompt['layout']
166
+ plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'Plan', 'optionSource' => 'instanceServicePlans', 'required' => true, 'description' => 'Choose the appropriately sized plan for this instance'}],options[:options],@api_client,{groupId: groupId, zoneId: cloud, instanceTypeId: instance_type['id'], layoutId: layout_id, version: version_prompt['version']})
167
+ payload[:servicePlan] = plan_prompt['servicePlan']
168
+ layout = instance_type['instanceTypeLayouts'].find{ |lt| lt['id'].to_i == layout_id.to_i}
98
169
  instance_type['instanceTypeLayouts'].sort! { |x,y| y['sortOrder'] <=> x['sortOrder'] }
99
- puts "Configurations: "
100
- instance_type['instanceTypeLayouts'].each_with_index do |layout, index|
101
- puts " #{index+1}) #{layout['name']} (#{layout['code']})"
102
- end
103
- print "Selection: "
104
- layout_selection = nil
105
- layout = nil
106
- while true do
107
- layout_selection = $stdin.gets.chomp!
108
- if layout_selection.to_i.to_s == layout_selection
109
- layout_selection = layout_selection.to_i
110
- break
111
- end
170
+
171
+ payload[:instance][:layout] = {id: layout['id']}
172
+
173
+ type_payload = {}
174
+ if !layout['optionTypes'].nil? && layout['optionTypes'].empty?
175
+ type_payload = Morpheus::Cli::OptionTypes.prompt(layout['optionTypes'],options[:options],@api_client,{groupId: groupId, cloudId: cloud, zoneId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
176
+ elsif !instance_type['optionTypes'].nil? && instance_type['optionTypes'].empty?
177
+ type_payload = Morpheus::Cli::OptionTypes.prompt(instance_type['optionTypes'],options[:options],@api_client,{groupId: groupId, cloudId: cloud, zoneId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
112
178
  end
113
- layout = instance_type['instanceTypeLayouts'][layout_selection-1]['id']
114
- options[:instance][:layout] = {id: layout}
115
- print "\n"
116
- if options[:servicePlan].nil?
117
- plans = @instance_types_interface.service_plans(layout)
118
- puts "Select a Plan: "
119
- plans['servicePlans'].each_with_index do |plan, index|
120
- puts " #{index+1}) #{plan['name']}"
121
- end
122
- print "Selection: "
123
- plan_selection = nil
124
- while true do
125
- plan_selection = $stdin.gets.chomp!
126
- if plan_selection.to_i.to_s == plan_selection
127
- plan_selection = plan_selection.to_i
128
- break
129
- end
130
- end
131
- options[:servicePlan] = plans['servicePlans'][plan_selection-1]['id']
132
- print "\n"
133
- end
134
-
135
- if !instance_type['config'].nil?
136
- instance_type_config = JSON.parse(instance_type['config'])
137
- if instance_type_config['options'].nil? == false
138
- instance_type_config['options'].each do |opt|
139
- print "#{opt['label']}: "
140
- if(opt['name'].downcase.include?("password"))
141
- options[opt['name']] = STDIN.noecho(&:gets).chomp!
142
- print "\n"
143
- else
144
- options[opt['name']] = $stdin.gets.chomp!
145
- end
146
-
147
- end
148
- end
179
+ if !type_payload['config'].nil?
180
+ payload.merge!(type_payload['config'])
181
+ end
182
+
183
+ provision_payload = {}
184
+ if !layout['provisionType'].nil? && !layout['provisionType']['optionTypes'].nil? && !layout['provisionType']['optionTypes'].empty?
185
+ puts "Checking for option Types"
186
+ provision_payload = Morpheus::Cli::OptionTypes.prompt(layout['provisionType']['optionTypes'],options[:options],@api_client,{groupId: groupId, cloudId: cloud, zoneId: cloud, instanceTypeId: instance_type['id'], version: version_prompt['version']})
187
+ end
188
+
189
+ if !provision_payload.nil? && !provision_payload['config'].nil?
190
+ payload.merge!(provision_payload['config'])
191
+ end
192
+ if !provision_payload.nil? && !provision_payload['server'].nil?
193
+ payload[:server] = provision_payload['server']
149
194
  end
195
+
150
196
  begin
151
- @instances_interface.create(options)
152
- rescue => e
153
- if e.response.code == 400
154
- error = JSON.parse(e.response.to_s)
155
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
156
- else
157
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
158
- end
159
- return nil
197
+ @instances_interface.create(payload)
198
+ rescue RestClient::Exception => e
199
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
200
+ exit 1
160
201
  end
161
202
  list([])
162
203
  end
163
204
 
164
205
  def stats(args)
206
+ options = {}
207
+ optparse = OptionParser.new do|opts|
208
+ opts.banner = "Usage: morpheus instances stats [name]"
209
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
210
+ end
165
211
  if args.count < 1
166
- puts "\nUsage: morpheus instances stats [name]\n\n"
212
+ puts "\n#{optparse.banner}\n\n"
167
213
  return
168
214
  end
215
+ optparse.parse(args)
216
+ connect(options)
169
217
  begin
170
218
  instance_results = @instances_interface.get({name: args[0]})
171
219
  if instance_results['instances'].empty?
@@ -175,26 +223,85 @@ class Morpheus::Cli::Instances
175
223
  instance = instance_results['instances'][0]
176
224
  instance_id = instance['id']
177
225
  stats = instance_results['stats'][instance_id.to_s]
178
- print "\n" ,cyan, bold, "#{instance['name']} (#{instance['instanceType']['name']})\n","==================", reset, "\n\n"
179
- print cyan, "Memory: \t#{Filesize.from("#{stats['usedMemory']} B").pretty} / #{Filesize.from("#{stats['maxMemory']} B").pretty}\n"
180
- print cyan, "Storage: \t#{Filesize.from("#{stats['usedStorage']} B").pretty} / #{Filesize.from("#{stats['maxStorage']} B").pretty}\n\n",reset
181
- puts
226
+ if options[:json]
227
+ print JSON.pretty_generate(stats)
228
+ print "\n"
229
+ else
230
+ print "\n" ,cyan, bold, "#{instance['name']} (#{instance['instanceType']['name']})\n","==================", "\n\n", reset, cyan
231
+ stats_map = {}
232
+ stats_map[:memory] = "#{Filesize.from("#{stats['usedMemory']} B").pretty} / #{Filesize.from("#{stats['maxMemory']} B").pretty}"
233
+ stats_map[:storage] = "#{Filesize.from("#{stats['usedStorage']} B").pretty} / #{Filesize.from("#{stats['maxStorage']} B").pretty}"
234
+ stats_map[:cpu] = "#{stats['usedCpu'].to_f.round(2)}%"
235
+ tp [stats_map], :memory,:storage,:cpu
236
+ print reset, "\n"
237
+ end
182
238
  rescue RestClient::Exception => e
183
- if e.response.code == 400
184
- error = JSON.parse(e.response.to_s)
185
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
239
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
240
+ exit 1
241
+ end
242
+ end
243
+
244
+ def logs(args)
245
+ options = {}
246
+ optparse = OptionParser.new do|opts|
247
+ opts.banner = "Usage: morpheus instances logs [name]"
248
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
249
+ opts.on( '-n', '--node NODE_ID', "Scope logs to specific Container or VM" ) do |node_id|
250
+ options[:node_id] = node_id.to_i
251
+ end
252
+ end
253
+ if args.count < 1
254
+ puts "\n#{optparse.banner}\n\n"
255
+ return
256
+ end
257
+ optparse.parse(args)
258
+ connect(options)
259
+ begin
260
+ instance = find_instance_by_name(args[0])
261
+ container_ids = instance['containers']
262
+ if options[:node_id] && container_ids.include?(options[:node_id])
263
+ container_ids = [options[:node_id]]
264
+ end
265
+ logs = @logs_interface.container_logs(container_ids, { max: options[:max] || 100, offset: options[:offset] || 0, query: options[:phrase]})
266
+ if options[:json]
267
+ puts logs
186
268
  else
187
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
269
+ logs['data'].reverse.each do |log_entry|
270
+ log_level = ''
271
+ case log_entry['level']
272
+ when 'INFO'
273
+ log_level = "#{blue}#{bold}INFO#{reset}"
274
+ when 'DEBUG'
275
+ log_level = "#{white}#{bold}DEBUG#{reset}"
276
+ when 'WARN'
277
+ log_level = "#{yellow}#{bold}WARN#{reset}"
278
+ when 'ERROR'
279
+ log_level = "#{red}#{bold}ERROR#{reset}"
280
+ when 'FATAL'
281
+ log_level = "#{red}#{bold}FATAL#{reset}"
282
+ end
283
+ puts "[#{log_entry['ts']}] #{log_level} - #{log_entry['message']}"
284
+ end
285
+ print reset,"\n"
188
286
  end
189
- return nil
287
+ rescue RestClient::Exception => e
288
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
289
+ exit 1
190
290
  end
191
291
  end
192
292
 
193
293
  def details(args)
294
+ options = {}
295
+ optparse = OptionParser.new do|opts|
296
+ opts.banner = "Usage: morpheus instances details [name]"
297
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
298
+ end
194
299
  if args.count < 1
195
- puts "\nUsage: morpheus instances stats [name]\n\n"
300
+ puts "\n#{optparse.banner}\n\n"
196
301
  return
197
302
  end
303
+ optparse.parse(args)
304
+ connect(options)
198
305
  begin
199
306
  instance_results = @instances_interface.get({name: args[0]})
200
307
  if instance_results['instances'].empty?
@@ -209,30 +316,26 @@ class Morpheus::Cli::Instances
209
316
  print cyan, "Storage: \t#{Filesize.from("#{stats['usedStorage']} B").pretty} / #{Filesize.from("#{stats['maxStorage']} B").pretty}\n\n",reset
210
317
  puts instance
211
318
  rescue RestClient::Exception => e
212
- if e.response.code == 400
213
- error = JSON.parse(e.response.to_s)
214
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
215
- else
216
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
217
- end
218
- return nil
319
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
320
+ exit 1
219
321
  end
220
322
  end
221
323
 
222
324
  def envs(args)
325
+ options = {}
326
+ optparse = OptionParser.new do|opts|
327
+ opts.banner = "Usage: morpheus instances envs [name]"
328
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
329
+ end
223
330
  if args.count < 1
224
- puts "\nUsage: morpheus instances envs [name]\n\n"
225
- return
331
+ puts "\n#{optparse.banner}\n\n"
332
+ exit 1
226
333
  end
334
+ optparse.parse(args)
335
+ connect(options)
227
336
  begin
228
- instance_results = @instances_interface.get({name: args[0]})
229
- if instance_results['instances'].empty?
230
- puts "Instance not found by name #{args[0]}"
231
- return
232
- end
233
- instance = instance_results['instances'][0]
234
- instance_id = instance['id']
235
- env_results = @instances_interface.get_envs(instance_id)
337
+ instance = find_instance_by_name(args[0])
338
+ env_results = @instances_interface.get_envs(instance['id'])
236
339
  print "\n" ,cyan, bold, "#{instance['name']} (#{instance['instanceType']['name']})\n","==================", "\n\n", reset, cyan
237
340
  envs = env_results['envs'] || {}
238
341
  if env_results['readOnlyEnvs']
@@ -245,148 +348,245 @@ class Morpheus::Cli::Instances
245
348
  print reset, "\n"
246
349
 
247
350
  rescue RestClient::Exception => e
248
- if e.response.code == 400
249
- error = JSON.parse(e.response.to_s)
250
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
251
- else
252
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
253
- end
254
- return nil
351
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
352
+ exit 1
255
353
  end
256
354
  end
257
355
 
258
356
  def setenv(args)
357
+ options = {}
358
+
359
+ optparse = OptionParser.new do|opts|
360
+ opts.banner = "Usage: morpheus instances setenv INSTANCE NAME VALUE [-e]"
361
+ opts.on( '-e', "Exportable" ) do |exportable|
362
+ options[:export] = exportable
363
+ end
364
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
365
+ end
259
366
  if args.count < 3
260
- puts "\nUsage: morpheus instances setenv INSTANCE NAME VALUE [-e]\n\n"
261
- return
367
+ puts "\n#{optparse.banner}\n\n"
368
+ exit 1
262
369
  end
370
+ optparse.parse(args)
371
+ connect(options)
263
372
  begin
264
- instance_results = @instances_interface.get({name: args[0]})
265
- if instance_results['instances'].empty?
266
- puts "Instance not found by name #{args[0]}"
267
- return
268
- end
269
- instance = instance_results['instances'][0]
270
- instance_id = instance['id']
271
- evar = {name: args[1], value: args[2], export: false}
373
+ instance = find_instance_by_name(args[0])
374
+ evar = {name: args[1], value: args[2], export: options[:export]}
272
375
  params = {}
273
- optparse = OptionParser.new do|opts|
274
- opts.on( '-e', "Exportable" ) do |exportable|
275
- evar[:export] = exportable
276
- end
277
- end
278
- optparse.parse(args)
279
-
280
- @instances_interface.create_env(instance_id, [evar])
376
+ @instances_interface.create_env(instance['id'], [evar])
281
377
  envs([args[0]])
282
378
  rescue RestClient::Exception => e
283
- if e.response.code == 400
284
- error = JSON.parse(e.response.to_s)
285
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
286
- else
287
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
288
- end
289
- return nil
379
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
380
+ exit 1
290
381
  end
291
382
  end
292
383
 
293
384
  def delenv(args)
385
+ options = {}
386
+ optparse = OptionParser.new do|opts|
387
+ opts.banner = "Usage: morpheus instances setenv INSTANCE NAME"
388
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
389
+ end
294
390
  if args.count < 2
295
- puts "\nUsage: morpheus instances setenv INSTANCE NAME\n\n"
296
- return
391
+ puts "\n#{optparse.banner}\n\n"
392
+ exit 1
297
393
  end
394
+ optparse.parse(args)
395
+ connect(options)
298
396
  begin
299
- instance_results = @instances_interface.get({name: args[0]})
300
- if instance_results['instances'].empty?
301
- puts "Instance not found by name #{args[0]}"
302
- return
303
- end
304
- instance = instance_results['instances'][0]
305
- instance_id = instance['id']
306
- name = args[1]
307
-
308
- @instances_interface.del_env(instance_id, name)
397
+ instance = find_instance_by_name(args[0])
398
+ @instances_interface.del_env(instance['id'], args[1])
309
399
  envs([args[0]])
310
400
  rescue RestClient::Exception => e
311
- if e.response.code == 400
312
- error = JSON.parse(e.response.to_s)
313
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
314
- else
315
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
316
- end
317
- return nil
401
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
402
+ exit 1
318
403
  end
319
404
  end
320
405
 
321
406
  def stop(args)
407
+ options = {}
408
+ optparse = OptionParser.new do|opts|
409
+ opts.banner = "Usage: morpheus instances stop [name]"
410
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
411
+ end
322
412
  if args.count < 1
323
- puts "\nUsage: morpheus instances stop [name]\n\n"
324
- return
413
+ puts "\n#{optparse.banner}\n\n"
414
+ exit 1
325
415
  end
416
+ optparse.parse(args)
417
+ connect(options)
326
418
  begin
327
- instance_results = @instances_interface.get({name: args[0]})
328
- if instance_results['instances'].empty?
329
- puts "Instance not found by name #{args[0]}"
330
- return
419
+ instance = find_instance_by_name(args[0])
420
+ json_response = @instances_interface.stop(instance['id'])
421
+ if options[:json]
422
+ print JSON.pretty_generate(json_response)
423
+ print "\n"
331
424
  end
332
- @instances_interface.stop(instance_results['instances'][0]['id'])
333
- list([])
425
+ return
334
426
  rescue RestClient::Exception => e
335
- if e.response.code == 400
336
- error = JSON.parse(e.response.to_s)
337
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
338
- else
339
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
340
- end
341
- return nil
427
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
428
+ exit 1
342
429
  end
343
430
  end
344
431
 
345
432
  def start(args)
433
+ options = {}
434
+ optparse = OptionParser.new do|opts|
435
+ opts.banner = "Usage: morpheus instances start [name]"
436
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
437
+ end
346
438
  if args.count < 1
347
- puts "\nUsage: morpheus instances start [name]\n\n"
439
+ puts "\n#{optparse.banner}\n\n"
440
+ exit 1
441
+ end
442
+ optparse.parse(args)
443
+ connect(options)
444
+ begin
445
+ instance = find_instance_by_name(args[0])
446
+ json_response = @instances_interface.start(instance['id'])
447
+ if options[:json]
448
+ print JSON.pretty_generate(json_response)
449
+ print "\n"
450
+ end
348
451
  return
452
+ rescue RestClient::Exception => e
453
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
454
+ exit 1
455
+ end
456
+ end
457
+
458
+ def restart(args)
459
+ options = {}
460
+ optparse = OptionParser.new do|opts|
461
+ opts.banner = "Usage: morpheus instances restart [name]"
462
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
349
463
  end
464
+ if args.count < 1
465
+ puts "\n#{optparse.banner}\n\n"
466
+ exit 1
467
+ end
468
+ optparse.parse(args)
469
+ connect(options)
350
470
  begin
351
- instance_results = @instances_interface.get({name: args[0]})
352
- if instance_results['instances'].empty?
353
- puts "Instance not found by name #{args[0]}"
354
- return
471
+ instance = find_instance_by_name(args[0])
472
+ json_response = @instances_interface.restart(instance['id'])
473
+ if options[:json]
474
+ print JSON.pretty_generate(json_response)
475
+ print "\n"
355
476
  end
356
- @instances_interface.start(instance_results['instances'][0]['id'])
357
- list([])
477
+ return
358
478
  rescue RestClient::Exception => e
359
- if e.response.code == 400
360
- error = JSON.parse(e.response.to_s)
361
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
479
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
480
+ exit 1
481
+ end
482
+ end
483
+
484
+ def stop_service(args)
485
+ options = {}
486
+ optparse = OptionParser.new do|opts|
487
+ opts.banner = "Usage: morpheus instances stop-service [name]"
488
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
489
+ end
490
+ if args.count < 1
491
+ puts "\n#{optparse.banner}\n\n"
492
+ exit 1
493
+ end
494
+ optparse.parse(args)
495
+ connect(options)
496
+ begin
497
+ instance = find_instance_by_name(args[0])
498
+ json_response = @instances_interface.stop(instance['id'],false)
499
+ if options[:json]
500
+ print JSON.pretty_generate(json_response)
501
+ print "\n"
362
502
  else
363
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
503
+ puts "Stopping service on #{args[0]}"
364
504
  end
365
- return nil
505
+ return
506
+ rescue RestClient::Exception => e
507
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
508
+ exit 1
366
509
  end
367
510
  end
368
511
 
369
- def restart(args)
512
+ def start_service(args)
513
+ options = {}
514
+ optparse = OptionParser.new do|opts|
515
+ opts.banner = "Usage: morpheus instances start-service [name]"
516
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
517
+ end
370
518
  if args.count < 1
371
- puts "\nUsage: morpheus instances restart [name]\n\n"
519
+ puts "\n#{optparse.banner}\n\n"
520
+ exit 1
521
+ end
522
+ optparse.parse(args)
523
+ connect(options)
524
+ begin
525
+ instance = find_instance_by_name(args[0])
526
+ json_response = @instances_interface.start(instance['id'],false)
527
+ if options[:json]
528
+ print JSON.pretty_generate(json_response)
529
+ print "\n"
530
+ else
531
+ puts "Starting service on #{args[0]}"
532
+ end
372
533
  return
534
+ rescue RestClient::Exception => e
535
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
536
+ exit 1
537
+ end
538
+ end
539
+
540
+ def restart_service(args)
541
+ options = {}
542
+ optparse = OptionParser.new do|opts|
543
+ opts.banner = "Usage: morpheus instances restart-service [name]"
544
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
545
+ end
546
+ if args.count < 1
547
+ puts "\n#{optparse.banner}\n\n"
548
+ exit 1
373
549
  end
550
+ optparse.parse(args)
551
+ connect(options)
374
552
  begin
375
- instance_results = @instances_interface.get({name: args[0]})
376
- if instance_results['instances'].empty?
377
- puts "Instance not found by name #{args[0]}"
378
- return
553
+ instance = find_instance_by_name(args[0])
554
+ json_response = @instances_interface.restart(instance['id'],false)
555
+ if options[:json]
556
+ print JSON.pretty_generate(json_response)
557
+ print "\n"
558
+ else
559
+ puts "Restarting service on instance #{args[0]}"
379
560
  end
380
- @instances_interface.restart(instance_results['instances'][0]['id'])
381
- list([])
561
+ return
382
562
  rescue RestClient::Exception => e
383
- if e.response.code == 400
384
- error = JSON.parse(e.response.to_s)
385
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
563
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
564
+ exit 1
565
+ end
566
+ end
567
+
568
+ def backup(args)
569
+ options = {}
570
+ optparse = OptionParser.new do|opts|
571
+ opts.banner = "Usage: morpheus instances backup [name]"
572
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
573
+ end
574
+ puts "\n#{optparse.banner}\n\n" and exit 1 if args.count < 1
575
+ optparse.parse(args)
576
+ connect(options)
577
+ begin
578
+ instance = find_instance_by_name(args[0])
579
+ json_response = @instances_interface.backup(instance['id'])
580
+ if options[:json]
581
+ print JSON.pretty_generate(json_response)
582
+ print "\n"
386
583
  else
387
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
584
+ puts "Backup initiated."
388
585
  end
389
- return nil
586
+ return
587
+ rescue RestClient::Exception => e
588
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
589
+ exit 1
390
590
  end
391
591
  end
392
592
 
@@ -396,88 +596,124 @@ class Morpheus::Cli::Instances
396
596
  opts.on( '-g', '--group GROUP', "Group Name" ) do |group|
397
597
  options[:group] = group
398
598
  end
599
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
399
600
  end
400
601
  optparse.parse(args)
602
+ connect(options)
401
603
  begin
402
604
  params = {}
403
605
  if !options[:group].nil?
404
606
  group = find_group_by_name(options[:group])
405
607
  if !group.nil?
406
- params['site'] = group['id']
608
+ params['site'] = group
407
609
  end
408
610
  end
611
+ if !options[:max].nil?
612
+ params['max'] = options[:max]
613
+ end
614
+ if !options[:offset].nil?
615
+ params['offset'] = options[:offset]
616
+ end
617
+ if !options[:phrase].nil?
618
+ params['phrase'] = options[:phrase]
619
+ end
409
620
 
410
621
  json_response = @instances_interface.get(params)
411
- instances = json_response['instances']
412
- print "\n" ,cyan, bold, "Morpheus Instances\n","==================", reset, "\n\n"
413
- if instances.empty?
414
- puts yellow,"No instances currently configured.",reset
622
+ if options[:json]
623
+ print JSON.pretty_generate(json_response)
624
+ print "\n"
415
625
  else
416
- instances.each do |instance|
417
- print cyan, "= #{instance['name']} (#{instance['instanceType']['name']}) - #{instance['status']['name']}\n"
626
+ instances = json_response['instances']
627
+
628
+ print "\n" ,cyan, bold, "Morpheus Instances\n","==================", reset, "\n\n"
629
+ if instances.empty?
630
+ puts yellow,"No instances currently configured.",reset
631
+ else
632
+ print cyan
633
+ instance_table = instances.collect do |instance|
634
+ status_string = instance['status']
635
+ if status_string == 'running'
636
+ status_string = "#{green}#{status_string.upcase}#{cyan}"
637
+ elsif status_string == 'stopped' or status_string == 'failed'
638
+ status_string = "#{red}#{status_string.upcase}#{cyan}"
639
+ elsif status_string == 'unknown'
640
+ status_string = "#{white}#{status_string.upcase}#{cyan}"
641
+ else
642
+ status_string = "#{yellow}#{status_string.upcase}#{cyan}"
643
+ end
644
+ connection_string = ''
645
+ if !instance['connectionInfo'].nil? && instance['connectionInfo'].empty? == false
646
+ connection_string = "#{instance['connectionInfo'][0]['ip']}:#{instance['connectionInfo'][0]['port']}"
647
+ end
648
+ {id: instance['id'], name: instance['name'], connection: connection_string, environment: instance['instanceContext'], nodes: instance['containers'].count, status: status_string, type: instance['instanceType']['name']}
649
+ end
650
+ tp instance_table, :id, :name, :type, :environment, :nodes, :connection, :status
418
651
  end
652
+ print reset,"\n\n"
419
653
  end
420
- print reset,"\n\n"
421
654
 
422
- rescue => e
423
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
424
- return nil
655
+ rescue RestClient::Exception => e
656
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
657
+ exit 1
425
658
  end
426
659
  end
427
660
 
428
661
  def remove(args)
662
+ options = {}
663
+ optparse = OptionParser.new do|opts|
664
+ opts.banner = "Usage: morpheus instances remove [name]"
665
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
666
+ end
429
667
  if args.count < 1
430
- puts "\nUsage: morpheus instances remove [name]\n\n"
431
- return
668
+ puts "\n#{optparse.banner}\n\n"
669
+ exit 1
432
670
  end
671
+ optparse.parse(args)
672
+ connect(options)
433
673
  begin
434
- instance_results = @instances_interface.get({name: args[0]})
435
- if instance_results['instances'].empty?
436
- puts "Instance not found by name #{args[0]}"
437
- return
438
- end
439
- @instances_interface.destroy(instance_results['instances'][0]['id'])
674
+ instance = find_instance_by_name(args[0])
675
+ @instances_interface.destroy(instance['id'])
440
676
  list([])
441
677
  rescue RestClient::Exception => e
442
- if e.response.code == 400
443
- error = JSON.parse(e.response.to_s)
444
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
445
- else
446
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
447
- end
448
- return nil
678
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
679
+ exit 1
449
680
  end
450
681
  end
451
682
 
452
683
  def firewall_disable(args)
684
+ options = {}
685
+ optparse = OptionParser.new do|opts|
686
+ opts.banner = "Usage: morpheus instances firewall-disable [name]"
687
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
688
+ end
453
689
  if args.count < 1
454
- puts "\nUsage: morpheus instances firewall_disable [name]\n\n"
455
- return
690
+ puts "\n#{optparse.banner}\n\n"
691
+ exit 1
456
692
  end
693
+ optparse.parse(args)
694
+ connect(options)
457
695
  begin
458
- instance_results = @instances_interface.get({name: args[0]})
459
- if instance_results['instances'].empty?
460
- puts "Instance not found by name #{args[0]}"
461
- return
462
- end
463
- @instances_interface.firewall_disable(instance_results['instances'][0]['id'])
696
+ instance = find_instance_by_name(args[0])
697
+ @instances_interface.firewall_disable(instance['id'])
464
698
  security_groups([args[0]])
465
699
  rescue RestClient::Exception => e
466
- if e.response.code == 400
467
- error = JSON.parse(e.response.to_s)
468
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
469
- else
470
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
471
- end
472
- return nil
700
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
701
+ exit 1
473
702
  end
474
703
  end
475
704
 
476
705
  def firewall_enable(args)
706
+ options = {}
707
+ optparse = OptionParser.new do|opts|
708
+ opts.banner = "Usage: morpheus instances firewall-enable [name]"
709
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
710
+ end
477
711
  if args.count < 1
478
- puts "\nUsage: morpheus instances firewall_enable [name]\n\n"
479
- return
712
+ puts "\n#{optparse.banner}\n\n"
713
+ exit 1
480
714
  end
715
+ optparse.parse(args)
716
+ connect(options)
481
717
  begin
482
718
  instance_results = @instances_interface.get({name: args[0]})
483
719
  if instance_results['instances'].empty?
@@ -487,29 +723,26 @@ class Morpheus::Cli::Instances
487
723
  @instances_interface.firewall_enable(instance_results['instances'][0]['id'])
488
724
  security_groups([args[0]])
489
725
  rescue RestClient::Exception => e
490
- if e.response.code == 400
491
- error = JSON.parse(e.response.to_s)
492
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
493
- else
494
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
495
- end
496
- return nil
726
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
727
+ exit 1
497
728
  end
498
729
  end
499
730
 
500
731
  def security_groups(args)
732
+ options = {}
733
+ optparse = OptionParser.new do|opts|
734
+ opts.banner = "Usage: morpheus instances security-groups [name]"
735
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
736
+ end
501
737
  if args.count < 1
502
- puts "\nUsage: morpheus instances security_groups [name]\n\n"
503
- return
738
+ puts "\n#{optparse.banner}\n\n"
739
+ exit 1
504
740
  end
741
+ optparse.parse(args)
742
+ connect(options)
505
743
  begin
506
- instance_results = @instances_interface.get({name: args[0]})
507
- if instance_results['instances'].empty?
508
- puts "Instance not found by name #{args[0]}"
509
- return
510
- end
511
-
512
- instance_id = instance_results['instances'][0]['id']
744
+ instance = find_instance_by_name(args[0])
745
+ instance_id = instance['id']
513
746
  json_response = @instances_interface.security_groups(instance_id)
514
747
 
515
748
  securityGroups = json_response['securityGroups']
@@ -525,43 +758,32 @@ class Morpheus::Cli::Instances
525
758
  print reset,"\n\n"
526
759
 
527
760
  rescue RestClient::Exception => e
528
- if e.response.code == 400
529
- error = JSON.parse(e.response.to_s)
530
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
531
- else
532
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
533
- end
534
- return nil
761
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
762
+ exit 1
535
763
  end
536
764
  end
537
765
 
538
766
  def apply_security_groups(args)
539
- usage = <<-EOF
540
- Usage: morpheus instances apply_security_groups [name] [options]
541
- EOF
542
- if args.count < 1
543
- puts usage
544
- return
545
- end
546
-
547
767
  options = {}
548
768
  clear_or_secgroups_specified = false
549
769
  optparse = OptionParser.new do|opts|
550
- opts.banner = usage
770
+ opts.banner = "Usage: morpheus instances apply-security-groups [name] [options]"
551
771
  opts.on( '-c', '--clear', "Clear all security groups" ) do
552
772
  options[:securityGroupIds] = []
553
773
  clear_or_secgroups_specified = true
554
774
  end
555
- opts.on( '-s', '--secgroups SECGROUPS', "Apply the specified comma separated security group ids" ) do |secgroups|
775
+ opts.on( '-S', '--secgroups SECGROUPS', "Apply the specified comma separated security group ids" ) do |secgroups|
556
776
  options[:securityGroupIds] = secgroups.split(",")
557
777
  clear_or_secgroups_specified = true
558
778
  end
559
- opts.on( '-h', '--help', "Prints this help" ) do
560
- puts opts
561
- exit
562
- end
779
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
780
+ end
781
+ if args.count < 1
782
+ puts "\n#{optparse.banner}\n\n"
783
+ exit 1
563
784
  end
564
785
  optparse.parse(args)
786
+ connect(options)
565
787
 
566
788
  if !clear_or_secgroups_specified
567
789
  puts usage
@@ -569,33 +791,107 @@ EOF
569
791
  end
570
792
 
571
793
  begin
572
- instance_results = @instances_interface.get({name: args[0]})
573
- if instance_results['instances'].empty?
574
- puts "Instance not found by name #{args[0]}"
575
- return
576
- end
577
-
578
- @instances_interface.apply_security_groups(instance_results['instances'][0]['id'], options)
794
+ instance = find_instance_by_name(args[0])
795
+ @instances_interface.apply_security_groups(instance['id'], options)
579
796
  security_groups([args[0]])
580
797
  rescue RestClient::Exception => e
581
- if e.response.code == 400
582
- error = JSON.parse(e.response.to_s)
583
- ::Morpheus::Cli::ErrorHandler.new.print_errors(error)
798
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
799
+ exit 1
800
+ end
801
+ end
802
+
803
+
804
+ def run_workflow(args)
805
+ options = {}
806
+
807
+ optparse = OptionParser.new do|opts|
808
+ opts.banner = "Usage: morpheus instances run-workflow [INSTANCE] [name] [options]"
809
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
810
+ end
811
+ if args.count < 2
812
+ puts "\n#{optparse}\n\n"
813
+ exit 1
814
+ end
815
+
816
+ optparse.parse(args)
817
+ connect(options)
818
+ instance = find_instance_by_name(args[0])
819
+ workflow = find_workflow_by_name(args[1])
820
+ task_types = @tasks_interface.task_types()
821
+ editable_options = []
822
+ workflow['taskSetTasks'].sort{|a,b| a['taskOrder'] <=> b['taskOrder']}.each do |task_set_task|
823
+ task_type_id = task_set_task['task']['taskType']['id']
824
+ task_type = task_types['taskTypes'].find{ |current_task_type| current_task_type['id'] == task_type_id}
825
+ task_opts = task_type['optionTypes'].select { |otype| otype['editable']}
826
+ if !task_opts.nil? && !task_opts.empty?
827
+ editable_options += task_opts.collect do |task_opt|
828
+ new_task_opt = task_opt.clone
829
+ new_task_opt['fieldContext'] = "#{task_set_task['id']}.#{new_task_opt['fieldContext']}"
830
+ end
831
+ end
832
+ end
833
+ params = options[:options] || {}
834
+
835
+ if params.empty? && !editable_options.empty?
836
+ puts "\n#{optparse.banner}\n\n"
837
+ option_lines = editable_options.collect {|it| "\t-O #{it['fieldContext'] ? (it['fieldContext'] + '.') : ''}#{it['fieldName']}=\"value\"" }.join("\n")
838
+ puts "\nAvailable Options:\n#{option_lines}\n\n"
839
+ exit 1
840
+ end
841
+
842
+ workflow_payload = {taskSet: {"#{workflow['id']}": params }}
843
+ begin
844
+
845
+ json_response = @instances_interface.workflow(instance['id'],workflow['id'], workflow_payload)
846
+ if options[:json]
847
+ print JSON.pretty_generate(json_response)
848
+ print "\n"
584
849
  else
585
- puts "Error Communicating with the Appliance. Please try again later. #{e}"
850
+ puts "Running workflow..."
586
851
  end
587
- return nil
852
+ rescue RestClient::Exception => e
853
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
854
+ exit 1
588
855
  end
589
856
  end
590
857
 
591
858
  private
859
+
860
+ def find_instance_by_name(name)
861
+ instance_results = @instances_interface.get({name: name})
862
+ if instance_results['instances'].empty?
863
+ puts "Instance not found by name #{name}"
864
+ exit 1
865
+ end
866
+ return instance_results['instances'][0]
867
+ end
868
+ def find_workflow_by_name(name)
869
+ task_set_results = @task_sets_interface.get(name)
870
+ if !task_set_results['taskSets'].nil? && !task_set_results['taskSets'].empty?
871
+ return task_set_results['taskSets'][0]
872
+ else
873
+ puts "Workflow not found by name #{name}"
874
+ exit 1
875
+ end
876
+ end
592
877
  def find_group_by_name(name)
593
- group_results = @groups_interface.get(name)
594
- if group_results['groups'].empty?
595
- puts "Group not found by name #{name}"
878
+ option_results = @options_interface.options_for_source('groups',{})
879
+ match = option_results['data'].find { |grp| grp['value'].to_s == name.to_s || grp['name'].downcase == name.downcase}
880
+ if match.nil?
881
+ return nil
882
+ else
883
+ return match['value']
884
+ end
885
+ end
886
+
887
+ def find_cloud_by_name(groupId,name)
888
+ option_results = @options_interface.options_for_source('clouds',{groupId: groupId})
889
+ match = option_results['data'].find { |grp| grp['value'].to_s == name.to_s || grp['name'].downcase == name.downcase}
890
+ if match.nil?
596
891
  return nil
892
+ else
893
+ return match['value']
597
894
  end
598
- return group_results['groups'][0]
599
895
  end
600
896
 
601
897
  def find_instance_type_by_code(code)