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
@@ -0,0 +1,46 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+
4
+ class Morpheus::TaskSetsInterface < Morpheus::APIClient
5
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
6
+ @access_token = access_token
7
+ @refresh_token = refresh_token
8
+ @base_url = base_url
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def get(options=nil)
13
+ url = "#{@base_url}/api/task-sets"
14
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
15
+
16
+ if options.is_a?(Hash)
17
+ headers[:params].merge!(options)
18
+ elsif options.is_a?(Numeric)
19
+ url = "#{@base_url}/api/tasks/#{options}"
20
+ elsif options.is_a?(String)
21
+ headers[:params]['name'] = options
22
+ end
23
+ response = Morpheus::RestClient.execute(method: :get, url: url,
24
+ timeout: 30, headers: headers, verify_ssl:false)
25
+ JSON.parse(response.to_s)
26
+ end
27
+
28
+
29
+ def create(options)
30
+ url = "#{@base_url}/api/task-sets"
31
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
32
+
33
+ payload = options
34
+ response = Morpheus::RestClient.execute(method: :post, url: url,
35
+ timeout: 30, headers: headers, verify_ssl:false, payload: payload.to_json)
36
+ JSON.parse(response.to_s)
37
+ end
38
+
39
+ def destroy(id)
40
+ url = "#{@base_url}/api/task-sets/#{id}"
41
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
42
+ response = Morpheus::RestClient.execute(method: :delete, url: url,
43
+ timeout: 30, headers: headers, verify_ssl:false)
44
+ JSON.parse(response.to_s)
45
+ end
46
+ end
@@ -0,0 +1,72 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+
4
+ class Morpheus::TasksInterface < Morpheus::APIClient
5
+ def initialize(access_token, refresh_token,expires_at = nil, base_url=nil)
6
+ @access_token = access_token
7
+ @refresh_token = refresh_token
8
+ @base_url = base_url
9
+ @expires_at = expires_at
10
+ end
11
+
12
+ def task_types(options={})
13
+ url = "#{@base_url}/api/task-types"
14
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
15
+
16
+ if options.is_a?(Hash)
17
+ headers[:params].merge!(options)
18
+ elsif options.is_a?(Numeric)
19
+ url = "#{@base_url}/api/task-types/#{options}"
20
+ elsif options.is_a?(String)
21
+ headers[:params]['name'] = options
22
+ end
23
+ response = Morpheus::RestClient.execute(method: :get, url: url,
24
+ timeout: 30, headers: headers, verify_ssl:false)
25
+ JSON.parse(response.to_s)
26
+ end
27
+
28
+ def get(options=nil)
29
+ url = "#{@base_url}/api/tasks"
30
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
31
+
32
+ if options.is_a?(Hash)
33
+ headers[:params].merge!(options)
34
+ elsif options.is_a?(Numeric)
35
+ url = "#{@base_url}/api/tasks/#{options}"
36
+ elsif options.is_a?(String)
37
+ headers[:params]['name'] = options
38
+ end
39
+ response = Morpheus::RestClient.execute(method: :get, url: url,
40
+ timeout: 30, headers: headers, verify_ssl:false)
41
+ JSON.parse(response.to_s)
42
+ end
43
+
44
+ def update(id, options)
45
+ url = "#{@base_url}/api/tasks/#{id}"
46
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
47
+
48
+ payload = options
49
+ response = Morpheus::RestClient.execute(method: :put, url: url,
50
+ timeout: 10, headers: headers, payload: payload.to_json)
51
+ JSON.parse(response.to_s)
52
+ end
53
+
54
+
55
+ def create(options)
56
+ url = "#{@base_url}/api/tasks"
57
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
58
+
59
+ payload = options
60
+ response = Morpheus::RestClient.execute(method: :post, url: url,
61
+ timeout: 30, headers: headers, verify_ssl:false, payload: payload.to_json)
62
+ JSON.parse(response.to_s)
63
+ end
64
+
65
+ def destroy(id)
66
+ url = "#{@base_url}/api/tasks/#{id}"
67
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
68
+ response = Morpheus::RestClient.execute(method: :delete, url: url,
69
+ timeout: 30, headers: headers, verify_ssl:false)
70
+ JSON.parse(response.to_s)
71
+ end
72
+ end
@@ -0,0 +1,72 @@
1
+ require 'json'
2
+ require 'rest-client'
3
+
4
+ class Morpheus::UsersInterface < Morpheus::APIClient
5
+
6
+ def initialize(access_token, refresh_token, expires_at = nil, base_url=nil)
7
+ @access_token = access_token
8
+ @refresh_token = refresh_token
9
+ @base_url = base_url
10
+ @expires_at = expires_at
11
+ end
12
+
13
+ def get(account_id, id)
14
+ raise "#{self.class}.get() passed a blank id!" if id.to_s == ''
15
+ url = build_url(account_id, id)
16
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
17
+ response = Morpheus::RestClient.execute(method: :get, url: url,
18
+ timeout: 10, headers: headers)
19
+ JSON.parse(response.to_s)
20
+ end
21
+
22
+ def list(account_id, options={})
23
+ url = build_url(account_id)
24
+ headers = { params: {}, authorization: "Bearer #{@access_token}" }
25
+ headers[:params].merge!(options)
26
+ response = Morpheus::RestClient.execute(method: :get, url: url,
27
+ timeout: 10, headers: headers)
28
+ JSON.parse(response.to_s)
29
+ end
30
+
31
+ def create(account_id, options)
32
+ url = build_url(account_id)
33
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
34
+ payload = options
35
+ response = Morpheus::RestClient.execute(method: :post, url: url,
36
+ timeout: 10, headers: headers, payload: payload.to_json)
37
+ JSON.parse(response.to_s)
38
+ end
39
+
40
+ def update(account_id, id, options)
41
+ url = build_url(account_id, id)
42
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
43
+ payload = options
44
+ response = Morpheus::RestClient.execute(method: :put, url: url,
45
+ timeout: 10, headers: headers, payload: payload.to_json)
46
+ JSON.parse(response.to_s)
47
+ end
48
+
49
+ def destroy(account_id, id)
50
+ url = build_url(account_id, id)
51
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
52
+ response = Morpheus::RestClient.execute(method: :delete, url: url,
53
+ timeout: 10, headers: headers)
54
+ JSON.parse(response.to_s)
55
+ end
56
+
57
+ private
58
+
59
+ def build_url(account_id=nil, user_id=nil)
60
+ url = "#{@base_url}/api"
61
+ if account_id
62
+ url += "/accounts/#{account_id}/users"
63
+ else
64
+ url += "/users"
65
+ end
66
+ if user_id
67
+ url += "/#{user_id}"
68
+ end
69
+ url
70
+ end
71
+
72
+ end
@@ -1,30 +1,53 @@
1
1
  require "morpheus/cli/version"
2
2
  require "morpheus/rest_client"
3
+ require 'morpheus/formatters'
4
+ require 'term/ansicolor'
3
5
 
4
6
  module Morpheus
5
7
  module Cli
6
8
  require 'morpheus/api/api_client'
9
+ require 'morpheus/api/options_interface'
7
10
  require 'morpheus/api/groups_interface'
8
- require 'morpheus/api/zones_interface'
11
+ require 'morpheus/api/clouds_interface'
9
12
  require 'morpheus/api/servers_interface'
13
+ require 'morpheus/api/tasks_interface'
14
+ require 'morpheus/api/license_interface'
15
+ require 'morpheus/api/task_sets_interface'
16
+ require 'morpheus/api/load_balancers_interface'
10
17
  require 'morpheus/api/instances_interface'
11
18
  require 'morpheus/api/instance_types_interface'
19
+ require 'morpheus/api/provision_types_interface'
12
20
  require 'morpheus/api/apps_interface'
13
21
  require 'morpheus/api/deploy_interface'
14
22
  require 'morpheus/api/security_groups_interface'
15
23
  require 'morpheus/api/security_group_rules_interface'
16
- require 'morpheus/cli/credentials'
24
+ require 'morpheus/api/accounts_interface'
25
+ require 'morpheus/api/users_interface'
26
+ require 'morpheus/api/logs_interface'
27
+ require 'morpheus/api/roles_interface'
28
+ require 'morpheus/api/key_pairs_interface'
29
+
30
+ require 'morpheus/cli/credentials'
17
31
  require 'morpheus/cli/error_handler'
18
32
  require 'morpheus/cli/remote'
19
33
  require 'morpheus/cli/groups'
20
- require 'morpheus/cli/zones'
21
- require 'morpheus/cli/servers'
34
+ require 'morpheus/cli/clouds'
35
+ require 'morpheus/cli/hosts'
36
+ require 'morpheus/cli/load_balancers'
37
+ require 'morpheus/cli/shell'
38
+ require 'morpheus/cli/tasks'
39
+ require 'morpheus/cli/workflows'
22
40
  require 'morpheus/cli/instances'
23
41
  require 'morpheus/cli/apps'
24
42
  require 'morpheus/cli/deploys'
43
+ require 'morpheus/cli/license'
25
44
  require 'morpheus/cli/instance_types'
26
45
  require 'morpheus/cli/security_groups'
27
46
  require 'morpheus/cli/security_group_rules'
47
+ require 'morpheus/cli/accounts'
48
+ require 'morpheus/cli/users'
49
+ require 'morpheus/cli/roles'
50
+ require 'morpheus/cli/key_pairs'
28
51
  # Your code goes here...
29
52
  end
30
53
  end
@@ -0,0 +1,306 @@
1
+ # require 'yaml'
2
+ require 'io/console'
3
+ require 'rest_client'
4
+ require 'term/ansicolor'
5
+ require 'optparse'
6
+ require 'morpheus/cli/cli_command'
7
+ require 'morpheus/cli/option_types'
8
+ require 'morpheus/cli/mixins/accounts_helper'
9
+ require 'json'
10
+
11
+ class Morpheus::Cli::Accounts
12
+ include Term::ANSIColor
13
+ include Morpheus::Cli::CliCommand
14
+ include Morpheus::Cli::AccountsHelper
15
+
16
+ def initialize()
17
+ @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
18
+ #@active_groups = ::Morpheus::Cli::Groups.load_group_file
19
+ end
20
+
21
+ def connect(opts)
22
+ @access_token = Morpheus::Cli::Credentials.new(@appliance_name,@appliance_url).request_credentials()
23
+ if @access_token.empty?
24
+ print red,bold, "\nInvalid Credentials. Unable to acquire access token. Please verify your credentials and try again.\n\n",reset
25
+ exit 1
26
+ end
27
+ @api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url)
28
+ @users_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).users
29
+ @accounts_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).accounts
30
+ @roles_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).roles
31
+ end
32
+
33
+ def handle(args)
34
+ usage = "Usage: morpheus accounts [list,details,add,update,remove] [name]"
35
+ if args.empty?
36
+ puts "\n#{usage}\n\n"
37
+ exit 1
38
+ end
39
+
40
+ case args[0]
41
+ when 'list'
42
+ list(args[1..-1])
43
+ when 'details'
44
+ details(args[1..-1])
45
+ when 'add'
46
+ add(args[1..-1])
47
+ when 'update'
48
+ update(args[1..-1])
49
+ when 'remove'
50
+ remove(args[1..-1])
51
+ else
52
+ puts "\n#{usage}\n\n"
53
+ exit 127
54
+ end
55
+ end
56
+
57
+ def list(args)
58
+ options = {}
59
+ params = {}
60
+ optparse = OptionParser.new do|opts|
61
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
62
+ end
63
+ optparse.parse(args)
64
+ connect(options)
65
+ begin
66
+ [:phrase, :offset, :max, :sort, :direction].each do |k|
67
+ params[k] = options[k] unless options[k].nil?
68
+ end
69
+
70
+ json_response = @accounts_interface.list(params)
71
+ accounts = json_response['accounts']
72
+ if options[:json]
73
+ print JSON.pretty_generate(json_response)
74
+ print "\n"
75
+ else
76
+ print "\n" ,cyan, bold, "Morpheus Accounts\n","==================", reset, "\n\n"
77
+ if accounts.empty?
78
+ puts yellow,"No accounts found.",reset
79
+ else
80
+ print_accounts_table(accounts)
81
+ end
82
+ print reset,"\n\n"
83
+ end
84
+ rescue RestClient::Exception => e
85
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
86
+ exit 1
87
+ end
88
+ end
89
+
90
+ def details(args)
91
+ usage = "Usage: morpheus accounts details [name] [options]"
92
+ if args.count < 1
93
+ puts "\n#{usage}\n\n"
94
+ exit 1
95
+ end
96
+ name = args[0]
97
+ options = {}
98
+ params = {}
99
+ optparse = OptionParser.new do|opts|
100
+ opts.banner = usage
101
+
102
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
103
+ end
104
+ optparse.parse(args)
105
+ connect(options)
106
+ begin
107
+
108
+ # todo: accounts_response = @accounts_interface.list({name: name})
109
+ # there may be response data outside of account that needs to be displayed
110
+
111
+ account = nil
112
+ if name.to_s =~ /\Aid:/
113
+ id = name.sub('id:', '')
114
+ account = find_account_by_id(id)
115
+ else
116
+ account = find_account_by_name(name)
117
+ end
118
+ exit 1 if account.nil?
119
+
120
+ if options[:json]
121
+ print JSON.pretty_generate(account)
122
+ print "\n"
123
+ else
124
+ print "\n" ,cyan, bold, "Account Details\n","==================", reset, "\n\n"
125
+ print cyan
126
+ puts "ID: #{account['id']}"
127
+ puts "Name: #{account['name']}"
128
+ puts "Description: #{account['description']}"
129
+ puts "Currency: #{account['currency']}"
130
+ # puts "# Users: #{account['usersCount']}"
131
+ # puts "# Instances: #{account['instancesCount']}"
132
+ puts "Date Created: #{format_local_dt(account['dateCreated'])}"
133
+ puts "Last Updated: #{format_local_dt(account['lastUpdated'])}"
134
+ status_state = nil
135
+ if account['active']
136
+ status_state = "#{green}ACTIVE#{cyan}"
137
+ else
138
+ status_state = "#{red}INACTIVE#{cyan}"
139
+ end
140
+ puts "Status: #{status_state}"
141
+ print "\n" ,cyan, bold, "Account Instance Limits\n","==================", reset, "\n\n"
142
+ print cyan
143
+ puts "Max Storage (bytes): #{account['instanceLimits'] ? account['instanceLimits']['maxStorage'] : 0}"
144
+ puts "Max Memory (bytes): #{account['instanceLimits'] ? account['instanceLimits']['maxMemory'] : 0}"
145
+ puts "CPU Count: #{account['instanceLimits'] ? account['instanceLimits']['maxCpu'] : 0}"
146
+ print cyan
147
+ print reset,"\n\n"
148
+ end
149
+ rescue RestClient::Exception => e
150
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
151
+ exit 1
152
+ end
153
+ end
154
+
155
+ def add(args)
156
+ usage = "Usage: morpheus accounts add [options]"
157
+ # if args.count > 0
158
+ # puts "\nUsage: morpheus accounts add [options]\n\n"
159
+ # exit 1
160
+ # end
161
+ options = {}
162
+ optparse = OptionParser.new do|opts|
163
+ opts.banner = usage
164
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
165
+ end
166
+ optparse.parse(args)
167
+
168
+ connect(options)
169
+
170
+ begin
171
+
172
+ params = Morpheus::Cli::OptionTypes.prompt(add_account_option_types, options[:options], @api_client, options[:params]) # options[:params] is mysterious
173
+
174
+ #puts "parsed params is : #{params.inspect}"
175
+ account_keys = ['name', 'description', 'currency']
176
+ account_payload = params.select {|k,v| account_keys.include?(k) }
177
+ account_payload['currency'] = account_payload['currency'].to_s.empty? ? "USD" : account_payload['currency'].upcase
178
+ account_payload['instanceLimits'] = {}
179
+ account_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
180
+ account_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
181
+ account_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
182
+ if params['role'].to_s != ''
183
+ role = find_role_by_name(nil, params['role'])
184
+ exit 1 if role.nil?
185
+ account_payload['role'] = {id: role['id']}
186
+ end
187
+ request_payload = {account: account_payload}
188
+ response = @accounts_interface.create(request_payload)
189
+
190
+ print_green_success "Account #{account_payload['name']} added"
191
+
192
+ details([account_payload["name"]])
193
+
194
+ rescue RestClient::Exception => e
195
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
196
+ exit 1
197
+ end
198
+ end
199
+
200
+ def update(args)
201
+ usage = "Usage: morpheus accounts update [name] [options]"
202
+ if args.count < 1
203
+ puts "\n#{usage}\n\n"
204
+ exit 1
205
+ end
206
+ name = args[0].strip
207
+ options = {}
208
+ optparse = OptionParser.new do|opts|
209
+ opts.banner = usage
210
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
211
+ end
212
+ optparse.parse(args)
213
+
214
+ connect(options)
215
+
216
+ begin
217
+
218
+ account = nil
219
+ if name.to_s =~ /\Aid:/
220
+ id = name.sub('id:', '')
221
+ account = find_account_by_id(id)
222
+ else
223
+ find_account_by_name(name)
224
+ end
225
+ exit 1 if account.nil?
226
+
227
+ #params = Morpheus::Cli::OptionTypes.prompt(update_account_option_types, options[:options], @api_client, options[:params]) # options[:params] is mysterious
228
+ params = options[:options] || {}
229
+
230
+ if params.empty?
231
+ puts "\n#{usage}\n\n"
232
+ option_lines = update_account_option_types.collect {|it| "\t-O #{it['fieldName']}=\"value\"" }.join("\n")
233
+ puts "\nAvailable Options:\n#{option_lines}\n\n"
234
+ exit 1
235
+ end
236
+
237
+ #puts "parsed params is : #{params.inspect}"
238
+ account_keys = ['name', 'description', 'currency']
239
+ account_payload = params.select {|k,v| account_keys.include?(k) }
240
+ account_payload['currency'] = account_payload['currency'].upcase unless account_payload['currency'].to_s.empty?
241
+ account_payload['instanceLimits'] = {}
242
+ account_payload['instanceLimits']['maxStorage'] = params['instanceLimits.maxStorage'].to_i if params['instanceLimits.maxStorage'].to_s.strip != ''
243
+ account_payload['instanceLimits']['maxMemory'] = params['instanceLimits.maxMemory'].to_i if params['instanceLimits.maxMemory'].to_s.strip != ''
244
+ account_payload['instanceLimits']['maxCpu'] = params['instanceLimits.maxCpu'].to_i if params['instanceLimits.maxCpu'].to_s.strip != ''
245
+ if params['role'].to_s != ''
246
+ role = find_role_by_name(nil, params['role'])
247
+ exit 1 if role.nil?
248
+ account_payload['role'] = {id: role['id']}
249
+ end
250
+ request_payload = {account: account_payload}
251
+ response = @accounts_interface.update(account['id'], request_payload)
252
+ print "\n", cyan, "Account #{account_payload['name'] || account['name']} updated", reset, "\n\n"
253
+ rescue RestClient::Exception => e
254
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
255
+ exit 1
256
+ end
257
+ end
258
+
259
+ def remove(args)
260
+ usage = "Usage: morpheus accounts remove [name]"
261
+ if args.count < 1
262
+ puts "\n#{usage}\n\n"
263
+ exit 1
264
+ end
265
+ name = args[0]
266
+ options = {}
267
+ optparse = OptionParser.new do|opts|
268
+ opts.banner = usage
269
+ Morpheus::Cli::CliCommand.genericOptions(opts,options)
270
+ end
271
+ optparse.parse(args)
272
+ connect(options)
273
+ begin
274
+ # allow finding by ID since name is not unique!
275
+ account = ((name.to_s =~ /\A\d{1,}\Z/) ? find_account_by_id(name) : find_account_by_name(name) )
276
+ exit 1 if account.nil?
277
+ exit unless Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the account #{account['name']}?")
278
+ @accounts_interface.destroy(account['id'])
279
+ # list([])
280
+ print "\n", cyan, "Account #{account['name']} removed", reset, "\n\n"
281
+ rescue RestClient::Exception => e
282
+ ::Morpheus::Cli::ErrorHandler.new.print_rest_exception(e)
283
+ exit 1
284
+ end
285
+ end
286
+
287
+ private
288
+
289
+
290
+ def add_account_option_types
291
+ [
292
+ {'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
293
+ {'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'displayOrder' => 2},
294
+ {'fieldName' => 'role', 'fieldLabel' => 'Base Role', 'type' => 'text', 'displayOrder' => 3},
295
+ {'fieldName' => 'currency', 'fieldLabel' => 'Currency', 'type' => 'text', 'displayOrder' => 4},
296
+ {'fieldName' => 'instanceLimits.maxStorage', 'fieldLabel' => 'Max Storage (bytes)', 'type' => 'text', 'displayOrder' => 5},
297
+ {'fieldName' => 'instanceLimits.maxMemory', 'fieldLabel' => 'Max Memory (bytes)', 'type' => 'text', 'displayOrder' => 6},
298
+ {'fieldName' => 'instanceLimits.maxCpu', 'fieldLabel' => 'CPU Count', 'type' => 'text', 'displayOrder' => 7},
299
+ ]
300
+ end
301
+
302
+ def update_account_option_types
303
+ add_account_option_types
304
+ end
305
+
306
+ end