morpheus-cli 0.1.1 → 0.9.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.
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)