morpheus-cli 2.10.0 → 2.10.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/bin/morpheus +27 -32
- data/lib/morpheus/api/accounts_interface.rb +36 -47
- data/lib/morpheus/api/api_client.rb +141 -110
- data/lib/morpheus/api/app_templates_interface.rb +56 -72
- data/lib/morpheus/api/apps_interface.rb +111 -132
- data/lib/morpheus/api/auth_interface.rb +30 -0
- data/lib/morpheus/api/clouds_interface.rb +71 -76
- data/lib/morpheus/api/custom_instance_types_interface.rb +21 -46
- data/lib/morpheus/api/dashboard_interface.rb +10 -17
- data/lib/morpheus/api/deploy_interface.rb +60 -72
- data/lib/morpheus/api/deployments_interface.rb +53 -71
- data/lib/morpheus/api/groups_interface.rb +55 -45
- data/lib/morpheus/api/instance_types_interface.rb +19 -23
- data/lib/morpheus/api/instances_interface.rb +179 -177
- data/lib/morpheus/api/key_pairs_interface.rb +11 -17
- data/lib/morpheus/api/license_interface.rb +18 -23
- data/lib/morpheus/api/load_balancers_interface.rb +54 -69
- data/lib/morpheus/api/logs_interface.rb +25 -29
- data/lib/morpheus/api/options_interface.rb +13 -17
- data/lib/morpheus/api/provision_types_interface.rb +19 -22
- data/lib/morpheus/api/roles_interface.rb +75 -94
- data/lib/morpheus/api/security_group_rules_interface.rb +28 -37
- data/lib/morpheus/api/security_groups_interface.rb +39 -51
- data/lib/morpheus/api/servers_interface.rb +113 -115
- data/lib/morpheus/api/setup_interface.rb +31 -0
- data/lib/morpheus/api/task_sets_interface.rb +36 -38
- data/lib/morpheus/api/tasks_interface.rb +56 -69
- data/lib/morpheus/api/users_interface.rb +67 -76
- data/lib/morpheus/api/virtual_images_interface.rb +61 -61
- data/lib/morpheus/api/whoami_interface.rb +12 -15
- data/lib/morpheus/cli.rb +71 -60
- data/lib/morpheus/cli/accounts.rb +254 -315
- data/lib/morpheus/cli/alias_command.rb +219 -0
- data/lib/morpheus/cli/app_templates.rb +264 -272
- data/lib/morpheus/cli/apps.rb +608 -671
- data/lib/morpheus/cli/cli_command.rb +259 -21
- data/lib/morpheus/cli/cli_registry.rb +99 -14
- data/lib/morpheus/cli/clouds.rb +599 -372
- data/lib/morpheus/cli/config_file.rb +126 -0
- data/lib/morpheus/cli/credentials.rb +141 -117
- data/lib/morpheus/cli/dashboard_command.rb +48 -56
- data/lib/morpheus/cli/deployments.rb +254 -268
- data/lib/morpheus/cli/deploys.rb +150 -142
- data/lib/morpheus/cli/error_handler.rb +38 -0
- data/lib/morpheus/cli/groups.rb +551 -179
- data/lib/morpheus/cli/hosts.rb +862 -617
- data/lib/morpheus/cli/instance_types.rb +103 -95
- data/lib/morpheus/cli/instances.rb +1335 -1009
- data/lib/morpheus/cli/key_pairs.rb +82 -90
- data/lib/morpheus/cli/library.rb +498 -499
- data/lib/morpheus/cli/license.rb +83 -101
- data/lib/morpheus/cli/load_balancers.rb +314 -300
- data/lib/morpheus/cli/login.rb +66 -44
- data/lib/morpheus/cli/logout.rb +47 -46
- data/lib/morpheus/cli/mixins/accounts_helper.rb +69 -31
- data/lib/morpheus/cli/mixins/infrastructure_helper.rb +106 -0
- data/lib/morpheus/cli/mixins/print_helper.rb +181 -17
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +535 -458
- data/lib/morpheus/cli/mixins/whoami_helper.rb +2 -2
- data/lib/morpheus/cli/option_parser.rb +35 -0
- data/lib/morpheus/cli/option_types.rb +232 -192
- data/lib/morpheus/cli/recent_activity_command.rb +61 -65
- data/lib/morpheus/cli/remote.rb +446 -199
- data/lib/morpheus/cli/roles.rb +884 -906
- data/lib/morpheus/cli/security_group_rules.rb +213 -203
- data/lib/morpheus/cli/security_groups.rb +237 -192
- data/lib/morpheus/cli/shell.rb +338 -231
- data/lib/morpheus/cli/tasks.rb +326 -308
- data/lib/morpheus/cli/users.rb +457 -462
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/cli/version_command.rb +16 -18
- data/lib/morpheus/cli/virtual_images.rb +526 -345
- data/lib/morpheus/cli/whoami.rb +125 -111
- data/lib/morpheus/cli/workflows.rb +338 -185
- data/lib/morpheus/formatters.rb +8 -1
- data/lib/morpheus/logging.rb +1 -1
- data/lib/morpheus/rest_client.rb +17 -8
- metadata +9 -3
- data/lib/morpheus/api/custom_instance_types.rb +0 -55
@@ -0,0 +1,219 @@
|
|
1
|
+
require 'optparse'
|
2
|
+
require 'morpheus/cli/cli_command'
|
3
|
+
require 'morpheus/cli/shell'
|
4
|
+
require 'json'
|
5
|
+
|
6
|
+
# This command allows the creation of an alias
|
7
|
+
# these aliases are stored in the $MORPHEUS_CLI_HOME/.morpheusrc
|
8
|
+
# See Morpheus::Cli::ConfigFile
|
9
|
+
#
|
10
|
+
class Morpheus::Cli::AliasCommand
|
11
|
+
include Morpheus::Cli::CliCommand
|
12
|
+
set_command_name :alias
|
13
|
+
register_subcommands :add, :remove, :list
|
14
|
+
#set_default_subcommand :add
|
15
|
+
|
16
|
+
def initialize()
|
17
|
+
end
|
18
|
+
|
19
|
+
def usage
|
20
|
+
out = "Usage: morpheus #{command_name} [name]='[command]'"
|
21
|
+
out
|
22
|
+
end
|
23
|
+
|
24
|
+
def handle(args)
|
25
|
+
if args.empty?
|
26
|
+
puts usage
|
27
|
+
exit 127
|
28
|
+
elsif self.class.has_subcommand?(args[0])
|
29
|
+
handle_subcommand(args)
|
30
|
+
elsif args.count == 1
|
31
|
+
add(args)
|
32
|
+
else
|
33
|
+
handle_subcommand(args)
|
34
|
+
#list([])
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
def add(args)
|
39
|
+
options = {}
|
40
|
+
do_remove = false
|
41
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
42
|
+
opts.banner = usage
|
43
|
+
#build_common_options(opts, options, [])
|
44
|
+
opts.on('-h', '--help', "Prints this help" ) do
|
45
|
+
puts opts.banner
|
46
|
+
puts "Commands:"
|
47
|
+
subcommands.sort.each {|cmd, method|
|
48
|
+
puts "\t#{cmd.to_s}"
|
49
|
+
}
|
50
|
+
puts "" +
|
51
|
+
"This defines an alias of a command.\n" +
|
52
|
+
"The [name] should be a one word .\n" +
|
53
|
+
"The [command] must be quoted if it is more than one word.\n" +
|
54
|
+
"The [command] may include multiple commands, semicolon delimited.\n" +
|
55
|
+
#"Example: alias cloud='clouds' .\n" +
|
56
|
+
"Aliases are preserved for future use in your config.\n" +
|
57
|
+
"You can use just `alias` instead of `alias add`.\n" +
|
58
|
+
"For more information, see https://github.com/gomorpheus/morpheus-cli/wiki/Alias"
|
59
|
+
exit
|
60
|
+
end
|
61
|
+
end
|
62
|
+
optparse.parse!(args)
|
63
|
+
if args.count != 1
|
64
|
+
puts optparse
|
65
|
+
exit 1
|
66
|
+
end
|
67
|
+
alias_definition = args[0]
|
68
|
+
alias_name, command_string = Morpheus::Cli::CliRegistry.parse_alias_definition(alias_definition)
|
69
|
+
|
70
|
+
if alias_name.empty? || command_string.empty?
|
71
|
+
print_red_alert "invalid alias syntax: #{alias_definition}"
|
72
|
+
return false
|
73
|
+
else
|
74
|
+
# config[:aliases] ||= []
|
75
|
+
# config[:aliases] << {name: alias_name, command: command_string}
|
76
|
+
begin
|
77
|
+
Morpheus::Cli::CliRegistry.instance.add_alias(alias_name, command_string)
|
78
|
+
#print "registered alias #{alias_name}", "\n"
|
79
|
+
rescue => err
|
80
|
+
print_red_alert "#{err.message}"
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
Morpheus::Cli::ConfigFile.instance.save_file()
|
84
|
+
end
|
85
|
+
|
86
|
+
Morpheus::Cli::Shell.instance.recalculate_auto_complete_commands()
|
87
|
+
|
88
|
+
end
|
89
|
+
|
90
|
+
def remove(args)
|
91
|
+
options = {}
|
92
|
+
do_remove = false
|
93
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
94
|
+
opts.banner = subcommand_usage("[alias1] [alias2]")
|
95
|
+
build_common_options(opts, options, [])
|
96
|
+
opts.footer = "This is how you remove alias definitions from your config."
|
97
|
+
end
|
98
|
+
optparse.parse!(args)
|
99
|
+
if args.count < 1
|
100
|
+
puts optparse
|
101
|
+
exit 1
|
102
|
+
end
|
103
|
+
alias_names = args
|
104
|
+
alias_names.each do |arg|
|
105
|
+
if !Morpheus::Cli::CliRegistry.has_alias?(arg)
|
106
|
+
print_red_alert "alias not found by name '#{arg}'"
|
107
|
+
exit 1
|
108
|
+
end
|
109
|
+
end
|
110
|
+
|
111
|
+
alias_names.each do |arg|
|
112
|
+
Morpheus::Cli::CliRegistry.instance.remove_alias(arg)
|
113
|
+
end
|
114
|
+
|
115
|
+
Morpheus::Cli::ConfigFile.instance.save_file()
|
116
|
+
if args.count == 1
|
117
|
+
puts "removed alias '#{alias_names[0]}'"
|
118
|
+
else
|
119
|
+
puts "removed aliases '#{alias_names.join(', ')}'"
|
120
|
+
end
|
121
|
+
end
|
122
|
+
|
123
|
+
def list(args)
|
124
|
+
options = {format:'friendly', sort:'name'}
|
125
|
+
do_remove = false
|
126
|
+
optparse = Morpheus::Cli::OptionParser.new do|opts|
|
127
|
+
opts.banner = subcommand_usage()
|
128
|
+
opts.on( '-E', '--export', "Generate output that can be used verbatim in a .morpheusrc config file." ) do
|
129
|
+
options[:format] = 'export'
|
130
|
+
end
|
131
|
+
build_common_options(opts, options, [:list, :json])
|
132
|
+
opts.footer = "This outputs a list of your defined aliases."
|
133
|
+
end
|
134
|
+
optparse.parse!(args)
|
135
|
+
|
136
|
+
#my_aliases = Morpheus::Cli::CliRegistry.all_aliases
|
137
|
+
my_aliases = Morpheus::Cli::CliRegistry.all_aliases.collect {|k,v|
|
138
|
+
{name: k, command_string: v}
|
139
|
+
}
|
140
|
+
|
141
|
+
# todo: generic support :list options on a local Array
|
142
|
+
if options[:phrase]
|
143
|
+
# my_aliases = my_aliases.grep(/^#{Regexp.escape(options[:phrase])}/)
|
144
|
+
match_regex = /#{Regexp.escape(options[:phrase])}/
|
145
|
+
my_aliases = my_aliases.select {|it|
|
146
|
+
it[:name].to_s =~ match_regex || it[:command_string].to_s =~ match_regex
|
147
|
+
}
|
148
|
+
end
|
149
|
+
|
150
|
+
options[:sort] ||= 'name'
|
151
|
+
options[:direction] ||= 'asc'
|
152
|
+
|
153
|
+
if options[:sort]
|
154
|
+
if options[:sort].to_s == 'name'
|
155
|
+
my_aliases = my_aliases.sort {|x,y| x[:name].to_s.downcase <=> y[:name].to_s.downcase }
|
156
|
+
elsif options[:sort].to_s == 'ts'
|
157
|
+
# just relies on the order they were registered in, heh...
|
158
|
+
my_aliases = my_aliases.sort {|x,y| x[:command_string].to_s.downcase <=> y[:command_string].to_s.downcase }
|
159
|
+
else
|
160
|
+
# a-z is the default, and the best
|
161
|
+
end
|
162
|
+
end
|
163
|
+
|
164
|
+
if options[:direction] == 'desc'
|
165
|
+
my_aliases = my_aliases.reverse
|
166
|
+
end
|
167
|
+
if options[:offset]
|
168
|
+
my_aliases = my_aliases.slice(options[:offset].to_i, my_aliases.size)
|
169
|
+
end
|
170
|
+
if options[:max]
|
171
|
+
my_aliases = my_aliases.first(options[:max].to_i)
|
172
|
+
end
|
173
|
+
num_aliases = my_aliases.size
|
174
|
+
out = ""
|
175
|
+
if options[:json]
|
176
|
+
options[:format] = 'json'
|
177
|
+
end
|
178
|
+
if options[:format] == 'json' || options[:json]
|
179
|
+
alias_json = {}
|
180
|
+
my_aliases.each do |it|
|
181
|
+
alias_json[it[:name]] = it[:command_string]
|
182
|
+
end
|
183
|
+
out << JSON.pretty_generate({aliases: alias_json})
|
184
|
+
out << "\n"
|
185
|
+
elsif options[:format] == 'export' || options[:format] == 'config'
|
186
|
+
# out << "# morpheus aliases for #{`whoami`}\n" # windows!
|
187
|
+
out << "# morpheus aliases\n"
|
188
|
+
my_aliases.each do |it|
|
189
|
+
out << "#{it[:name]}='#{it[:command_string]}'"
|
190
|
+
out << "\n"
|
191
|
+
end
|
192
|
+
else
|
193
|
+
# friendly
|
194
|
+
#out << cyan
|
195
|
+
if num_aliases == 0
|
196
|
+
#print "You have #{num_aliases} aliases defined."
|
197
|
+
out << "Found #{num_aliases} aliases"
|
198
|
+
elsif num_aliases == 1
|
199
|
+
#print "You have just one alias defined."
|
200
|
+
out << "Found #{num_aliases} alias"
|
201
|
+
else
|
202
|
+
#print "You have #{num_aliases} aliases defined."
|
203
|
+
out << "Found #{num_aliases} aliases"
|
204
|
+
end
|
205
|
+
if options[:phrase]
|
206
|
+
out << " matching '#{options[:phrase]}'"
|
207
|
+
end
|
208
|
+
out << "\n"
|
209
|
+
out << reset
|
210
|
+
my_aliases.each do |it|
|
211
|
+
out << "\t#{cyan}#{it[:name]}#{reset}='#{it[:command_string]}'"
|
212
|
+
out << "\n"
|
213
|
+
end
|
214
|
+
out << reset
|
215
|
+
end
|
216
|
+
print out
|
217
|
+
end
|
218
|
+
|
219
|
+
end
|
@@ -7,128 +7,108 @@ require 'json'
|
|
7
7
|
|
8
8
|
class Morpheus::Cli::AppTemplates
|
9
9
|
include Morpheus::Cli::CliCommand
|
10
|
+
include Morpheus::Cli::ProvisioningHelper
|
11
|
+
|
12
|
+
register_subcommands :list, :get, :add, :update, :remove, :'add-instance', :'remove-instance', :'connect-tiers', :'available-tiers', :'available-types'
|
13
|
+
alias_subcommand :details, :get
|
14
|
+
set_default_subcommand :list
|
10
15
|
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
print_red_alert "Invalid Credentials. Unable to acquire access token. Please verify your credentials and try again."
|
19
|
-
exit 1
|
20
|
-
end
|
21
|
-
@active_groups = ::Morpheus::Cli::Groups.load_group_file
|
22
|
-
@api_client = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url)
|
23
|
-
@app_templates_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).app_templates
|
16
|
+
def initialize()
|
17
|
+
# @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
|
18
|
+
end
|
19
|
+
|
20
|
+
def connect(opts)
|
21
|
+
@api_client = establish_remote_appliance_connection(opts)
|
22
|
+
@app_templates_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).app_templates
|
24
23
|
@groups_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).groups
|
25
24
|
@instances_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).instances
|
26
25
|
@instance_types_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).instance_types
|
27
26
|
@options_interface = Morpheus::APIClient.new(@access_token,nil,nil, @appliance_url).options
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
when 'update'
|
45
|
-
update(args[1..-1])
|
46
|
-
when 'add-instance'
|
47
|
-
add_instance(args[1..-1])
|
48
|
-
when 'remove-instance'
|
49
|
-
remove_instance(args[1..-1])
|
50
|
-
when 'connect-tiers'
|
51
|
-
connect_tiers(args[1..-1])
|
52
|
-
when 'remove'
|
53
|
-
remove(args[1..-1])
|
54
|
-
when 'available-tiers'
|
55
|
-
available_tiers(args[1..-1])
|
56
|
-
when 'available-types'
|
57
|
-
available_types(args[1..-1])
|
58
|
-
else
|
59
|
-
puts "\n#{usage}\n\n"
|
60
|
-
exit 127
|
61
|
-
end
|
62
|
-
end
|
63
|
-
|
64
|
-
def list(args)
|
65
|
-
options = {}
|
66
|
-
optparse = OptionParser.new do|opts|
|
67
|
-
build_common_options(opts, options, [:list, :json])
|
68
|
-
end
|
69
|
-
optparse.parse(args)
|
70
|
-
connect(options)
|
71
|
-
begin
|
27
|
+
@active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
|
28
|
+
end
|
29
|
+
|
30
|
+
def handle(args)
|
31
|
+
handle_subcommand(args)
|
32
|
+
end
|
33
|
+
|
34
|
+
def list(args)
|
35
|
+
options = {}
|
36
|
+
optparse = OptionParser.new do|opts|
|
37
|
+
opts.banner = subcommand_usage()
|
38
|
+
build_common_options(opts, options, [:list, :json, :dry_run])
|
39
|
+
end
|
40
|
+
optparse.parse!(args)
|
41
|
+
connect(options)
|
42
|
+
begin
|
72
43
|
params = {}
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
44
|
+
[:phrase, :offset, :max, :sort, :direction].each do |k|
|
45
|
+
params[k] = options[k] unless options[k].nil?
|
46
|
+
end
|
47
|
+
if options[:dry_run]
|
48
|
+
print_dry_run @app_templates_interface.dry.list(params)
|
49
|
+
return
|
50
|
+
end
|
51
|
+
json_response = @app_templates_interface.list(params)
|
52
|
+
app_templates = json_response['appTemplates']
|
53
|
+
if options[:json]
|
54
|
+
print JSON.pretty_generate(json_response)
|
55
|
+
print "\n"
|
56
|
+
else
|
57
|
+
print "\n" ,cyan, bold, "Morpheus App Templates\n","==================", reset, "\n\n"
|
58
|
+
if app_templates.empty?
|
59
|
+
puts yellow,"No app templates found.",reset
|
60
|
+
else
|
61
|
+
print_app_templates_table(app_templates)
|
62
|
+
print_results_pagination(json_response)
|
63
|
+
end
|
64
|
+
print reset,"\n"
|
65
|
+
end
|
66
|
+
rescue RestClient::Exception => e
|
67
|
+
print_rest_exception(e, options)
|
68
|
+
exit 1
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
def get(args)
|
73
|
+
options = {}
|
74
|
+
optparse = OptionParser.new do|opts|
|
75
|
+
opts.banner = subcommand_usage("[name]")
|
102
76
|
opts.on( '-c', '--config', "Display Config Data" ) do |val|
|
103
77
|
options[:config] = true
|
104
78
|
end
|
105
|
-
build_common_options(opts, options, [:json])
|
106
|
-
|
107
|
-
|
79
|
+
build_common_options(opts, options, [:json, :dry_run])
|
80
|
+
end
|
81
|
+
optparse.parse!(args)
|
108
82
|
if args.count < 1
|
109
|
-
puts
|
83
|
+
puts optparse
|
110
84
|
exit 1
|
111
85
|
end
|
112
|
-
|
113
|
-
|
114
|
-
|
115
|
-
|
116
|
-
|
117
|
-
|
118
|
-
|
119
|
-
|
120
|
-
|
121
|
-
|
122
|
-
|
123
|
-
|
124
|
-
|
125
|
-
|
126
|
-
|
127
|
-
|
128
|
-
|
129
|
-
|
130
|
-
|
131
|
-
|
86
|
+
connect(options)
|
87
|
+
begin
|
88
|
+
if options[:dry_run]
|
89
|
+
if args[0].to_s =~ /\A\d{1,}\Z/
|
90
|
+
print_dry_run @instances_interface.dry.get(args[0].to_i)
|
91
|
+
else
|
92
|
+
print_dry_run @instances_interface.dry.list({name:args[0]})
|
93
|
+
end
|
94
|
+
return
|
95
|
+
end
|
96
|
+
app_template = find_app_template_by_name_or_id(args[0])
|
97
|
+
exit 1 if app_template.nil?
|
98
|
+
|
99
|
+
json_response = @app_templates_interface.get(app_template['id'])
|
100
|
+
app_template = json_response['appTemplate']
|
101
|
+
|
102
|
+
if options[:json]
|
103
|
+
print JSON.pretty_generate(json_response)
|
104
|
+
print "\n"
|
105
|
+
else
|
106
|
+
print "\n" ,cyan, bold, "App Template Details\n","==================", reset, "\n\n"
|
107
|
+
print cyan
|
108
|
+
puts "ID: #{app_template['id']}"
|
109
|
+
puts "Name: #{app_template['name']}"
|
110
|
+
#puts "Category: #{app_template['category']}"
|
111
|
+
puts "Account: #{app_template['account'] ? app_template['account']['name'] : ''}"
|
132
112
|
instance_type_names = (app_template['instanceTypes'] || []).collect {|it| it['name'] }
|
133
113
|
#puts "Instance Types: #{instance_type_names.join(', ')}"
|
134
114
|
config = app_template['config']['tierView']
|
@@ -141,8 +121,9 @@ class Morpheus::Cli::AppTemplates
|
|
141
121
|
print "\n"
|
142
122
|
print cyan, "= #{tier['data']['name']}\n"
|
143
123
|
instances.each do |instance|
|
144
|
-
instance_id = instance['data']['id'].sub('newinstance-', '')
|
145
|
-
|
124
|
+
instance_id = instance['data']['id'].to_s.sub('newinstance-', '')
|
125
|
+
instance_name = instance['data']['instance.name'] || ''
|
126
|
+
print green, " #{instance_name} - #{instance['data']['typeName']} (#{instance_id})\n",reset
|
146
127
|
end
|
147
128
|
|
148
129
|
end
|
@@ -154,35 +135,34 @@ class Morpheus::Cli::AppTemplates
|
|
154
135
|
puts JSON.pretty_generate(config)
|
155
136
|
end
|
156
137
|
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
138
|
+
print reset,"\n"
|
139
|
+
end
|
140
|
+
rescue RestClient::Exception => e
|
141
|
+
print_rest_exception(e, options)
|
142
|
+
exit 1
|
143
|
+
end
|
144
|
+
end
|
164
145
|
|
165
|
-
|
166
|
-
usage = "Usage: morpheus app-templates add"
|
146
|
+
def add(args)
|
167
147
|
options = {}
|
168
148
|
optparse = OptionParser.new do|opts|
|
169
|
-
opts.banner =
|
149
|
+
opts.banner = subcommand_usage()
|
170
150
|
# opts.on( '-g', '--group GROUP', "Group Name" ) do |group|
|
171
151
|
# options[:options] ||= {}
|
172
152
|
# options[:options]['group'] = group
|
173
153
|
# end
|
174
|
-
build_common_options(opts, options, [:options, :json])
|
154
|
+
build_common_options(opts, options, [:options, :json, :dry_run])
|
175
155
|
end
|
176
|
-
optparse.parse(args)
|
156
|
+
optparse.parse!(args)
|
177
157
|
connect(options)
|
178
158
|
begin
|
179
|
-
|
159
|
+
|
180
160
|
params = Morpheus::Cli::OptionTypes.prompt(add_app_template_option_types, options[:options], @api_client, options[:params])
|
181
161
|
|
182
162
|
#puts "parsed params is : #{params.inspect}"
|
183
163
|
app_template_keys = ['name']
|
184
164
|
app_template_payload = params.select {|k,v| app_template_keys.include?(k) }
|
185
|
-
|
165
|
+
|
186
166
|
group = nil
|
187
167
|
if params['group'].to_s != ''
|
188
168
|
group = find_group_by_name(params['group'])
|
@@ -195,6 +175,12 @@ class Morpheus::Cli::AppTemplates
|
|
195
175
|
request_payload = {appTemplate: app_template_payload}
|
196
176
|
request_payload['siteId'] = group['id'] if group
|
197
177
|
request_payload['config'] = config
|
178
|
+
|
179
|
+
if options[:dry_run]
|
180
|
+
print_dry_run @app_templates_interface.dry.create(request_payload)
|
181
|
+
return
|
182
|
+
end
|
183
|
+
|
198
184
|
json_response = @app_templates_interface.create(request_payload)
|
199
185
|
|
200
186
|
if options[:json]
|
@@ -203,42 +189,40 @@ class Morpheus::Cli::AppTemplates
|
|
203
189
|
else
|
204
190
|
print_green_success "Added app template #{app_template_payload['name']}"
|
205
191
|
details_options = [app_template_payload["name"]]
|
206
|
-
|
192
|
+
get(details_options)
|
207
193
|
end
|
208
194
|
|
209
195
|
rescue RestClient::Exception => e
|
210
196
|
print_rest_exception(e, options)
|
211
197
|
exit 1
|
212
198
|
end
|
213
|
-
|
199
|
+
end
|
214
200
|
|
215
|
-
|
216
|
-
usage = "Usage: morpheus app-templates update [name] [options]"
|
201
|
+
def update(args)
|
217
202
|
options = {}
|
218
203
|
optparse = OptionParser.new do|opts|
|
219
|
-
opts.banner =
|
220
|
-
build_common_options(opts, options, [:options, :json])
|
204
|
+
opts.banner = subcommand_usage("[name] [options]")
|
205
|
+
build_common_options(opts, options, [:options, :json, :dry_run])
|
221
206
|
end
|
222
|
-
optparse.parse(args)
|
207
|
+
optparse.parse!(args)
|
223
208
|
|
224
209
|
if args.count < 1
|
225
|
-
puts
|
210
|
+
puts optparse
|
226
211
|
exit 1
|
227
212
|
end
|
228
|
-
name = args[0]
|
229
213
|
|
230
214
|
connect(options)
|
231
|
-
|
215
|
+
|
232
216
|
begin
|
233
217
|
|
234
|
-
app_template =
|
218
|
+
app_template = find_app_template_by_name_or_id(args[0])
|
235
219
|
exit 1 if app_template.nil?
|
236
220
|
|
237
221
|
#params = Morpheus::Cli::OptionTypes.prompt(update_app_template_option_types, options[:options], @api_client, options[:params])
|
238
222
|
params = options[:options] || {}
|
239
223
|
|
240
224
|
if params.empty?
|
241
|
-
puts
|
225
|
+
puts optparse
|
242
226
|
option_lines = update_app_template_option_types.collect {|it| "\t-O #{it['fieldName']}=\"value\"" }.join("\n")
|
243
227
|
puts "\nAvailable Options:\n#{option_lines}\n\n"
|
244
228
|
exit 1
|
@@ -247,7 +231,7 @@ class Morpheus::Cli::AppTemplates
|
|
247
231
|
#puts "parsed params is : #{params.inspect}"
|
248
232
|
app_template_keys = ['name']
|
249
233
|
app_template_payload = params.select {|k,v| app_template_keys.include?(k) }
|
250
|
-
|
234
|
+
|
251
235
|
group = nil
|
252
236
|
if params['group'].to_s != ''
|
253
237
|
group = find_group_by_name(params['group'])
|
@@ -263,49 +247,56 @@ class Morpheus::Cli::AppTemplates
|
|
263
247
|
end
|
264
248
|
# request_payload['config'] = config['tierView']
|
265
249
|
request_payload['config'] = config
|
250
|
+
|
251
|
+
if options[:dry_run]
|
252
|
+
print_dry_run @app_templates_interface.dry.update(app_template['id'], request_payload)
|
253
|
+
return
|
254
|
+
end
|
255
|
+
|
266
256
|
json_response = @app_templates_interface.update(app_template['id'], request_payload)
|
267
257
|
|
268
|
-
|
258
|
+
|
269
259
|
if options[:json]
|
270
260
|
print JSON.pretty_generate(json_response)
|
271
261
|
print "\n"
|
272
262
|
else
|
273
263
|
print_green_success "Updated app template #{app_template_payload['name']}"
|
274
264
|
details_options = [app_template_payload["name"] || app_template['name']]
|
275
|
-
|
265
|
+
get(details_options)
|
276
266
|
end
|
277
267
|
|
278
268
|
rescue RestClient::Exception => e
|
279
269
|
print_rest_exception(e, options)
|
280
270
|
exit 1
|
281
271
|
end
|
282
|
-
|
272
|
+
end
|
283
273
|
|
284
274
|
def remove(args)
|
285
|
-
usage = "Usage: morpheus app-templates remove [name]"
|
286
275
|
options = {}
|
287
276
|
optparse = OptionParser.new do|opts|
|
288
|
-
opts.banner =
|
289
|
-
build_common_options(opts, options, [:auto_confirm, :json])
|
277
|
+
opts.banner = subcommand_usage("[name]")
|
278
|
+
build_common_options(opts, options, [:auto_confirm, :json, :dry_run])
|
290
279
|
end
|
291
|
-
optparse.parse(args)
|
280
|
+
optparse.parse!(args)
|
292
281
|
|
293
282
|
if args.count < 1
|
294
|
-
puts
|
283
|
+
puts optparse
|
295
284
|
exit 1
|
296
285
|
end
|
297
|
-
name = args[0]
|
298
286
|
|
299
287
|
connect(options)
|
300
288
|
begin
|
301
|
-
|
302
|
-
app_template = ((name.to_s =~ /\A\d{1,}\Z/) ? find_app_template_by_id(name) : find_app_template_by_name(name) )
|
289
|
+
app_template = find_app_template_by_name_or_id(args[0])
|
303
290
|
exit 1 if app_template.nil?
|
304
291
|
unless options[:yes] || Morpheus::Cli::OptionTypes.confirm("Are you sure you want to delete the app template #{app_template['name']}?")
|
305
292
|
exit
|
306
293
|
end
|
294
|
+
if options[:dry_run]
|
295
|
+
print_dry_run @app_templates_interface.dry.destroy(app_template['id'])
|
296
|
+
return
|
297
|
+
end
|
307
298
|
json_response = @app_templates_interface.destroy(app_template['id'])
|
308
|
-
|
299
|
+
|
309
300
|
if options[:json]
|
310
301
|
print JSON.pretty_generate(json_response)
|
311
302
|
print "\n"
|
@@ -320,10 +311,9 @@ class Morpheus::Cli::AppTemplates
|
|
320
311
|
end
|
321
312
|
|
322
313
|
def add_instance(args)
|
323
|
-
usage = "Usage: morpheus app-templates add-instance [name] [tier] [instance-type]"
|
324
314
|
options = {}
|
325
315
|
optparse = OptionParser.new do|opts|
|
326
|
-
opts.banner =
|
316
|
+
opts.banner = subcommand_usage("[name] [tier] [instance-type]")
|
327
317
|
# opts.on( '-g', '--group GROUP', "Group" ) do |val|
|
328
318
|
# options[:group] = val
|
329
319
|
# end
|
@@ -332,7 +322,7 @@ class Morpheus::Cli::AppTemplates
|
|
332
322
|
# end
|
333
323
|
build_common_options(opts, options, [:json])
|
334
324
|
end
|
335
|
-
optparse.parse(args)
|
325
|
+
optparse.parse!(args)
|
336
326
|
|
337
327
|
if args.count < 3
|
338
328
|
puts "\n#{optparse}\n\n"
|
@@ -341,11 +331,11 @@ class Morpheus::Cli::AppTemplates
|
|
341
331
|
|
342
332
|
connect(options)
|
343
333
|
|
344
|
-
|
334
|
+
app_template_name = args[0]
|
345
335
|
tier_name = args[1]
|
346
336
|
instance_type_code = args[2]
|
347
337
|
|
348
|
-
app_template =
|
338
|
+
app_template = find_app_template_by_name_or_id(app_template_name)
|
349
339
|
exit 1 if app_template.nil?
|
350
340
|
|
351
341
|
instance_type = find_instance_type_by_code(instance_type_code)
|
@@ -398,7 +388,7 @@ class Morpheus::Cli::AppTemplates
|
|
398
388
|
plan_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'servicePlan', 'type' => 'select', 'fieldLabel' => 'Plan', 'selectOptions' => service_plans_dropdown, 'required' => true, 'description' => 'Choose the appropriately sized plan for this instance'}],options[:options])
|
399
389
|
service_plan = service_plans.find {|sp| sp["id"] == plan_prompt['servicePlan'].to_i }
|
400
390
|
payload[:servicePlan] = service_plan["id"]
|
401
|
-
|
391
|
+
|
402
392
|
|
403
393
|
type_payload = {}
|
404
394
|
if !layout['optionTypes'].nil? && !layout['optionTypes'].empty?
|
@@ -428,43 +418,43 @@ class Morpheus::Cli::AppTemplates
|
|
428
418
|
|
429
419
|
config['nodes'] ||= []
|
430
420
|
|
431
|
-
tier = config['nodes'].find {|node|
|
421
|
+
tier = config['nodes'].find {|node|
|
432
422
|
node["data"] && node["data"]["type"] == "tier" && node["data"]["id"] == "newtier-#{tier_name}"
|
433
423
|
}
|
434
424
|
if !tier
|
435
425
|
tier = {
|
436
|
-
"classes"=>"tier newtier-#{tier_name}",
|
437
|
-
"data"=>{"id"=>"newtier-#{tier_name}", "name"=> tier_name, "type"=>"tier"},
|
438
|
-
"grabbable"=>true, "group"=>"nodes","locked"=>false,
|
439
|
-
#"position"=>{"x"=>-2.5, "y"=>-45},
|
426
|
+
"classes"=>"tier newtier-#{tier_name}",
|
427
|
+
"data"=>{"id"=>"newtier-#{tier_name}", "name"=> tier_name, "type"=>"tier"},
|
428
|
+
"grabbable"=>true, "group"=>"nodes","locked"=>false,
|
429
|
+
#"position"=>{"x"=>-2.5, "y"=>-45},
|
440
430
|
"removed"=>false, "selectable"=>true, "selected"=>false
|
441
431
|
}
|
442
432
|
config['nodes'] << tier
|
443
433
|
end
|
444
|
-
|
434
|
+
|
445
435
|
instance_id = generate_id()
|
446
436
|
|
447
437
|
instance_type_node = {
|
448
|
-
"classes"=>"instance newinstance-#{instance_id} #{instance_type['code']}",
|
438
|
+
"classes"=>"instance newinstance-#{instance_id} #{instance_type['code']}",
|
449
439
|
"data"=>{
|
450
440
|
"controlName" => "instance.layout.id",
|
451
|
-
"id"=>"newinstance-#{instance_id}",
|
441
|
+
"id"=>"newinstance-#{instance_id}",
|
452
442
|
"nodeId"=>["newinstance-#{instance_id}"], # not sure what this is for..
|
453
|
-
"index"=>nil,
|
443
|
+
"index"=>nil,
|
454
444
|
"instance.layout.id"=>layout_id.to_s,
|
455
|
-
"instance.name"=>instance_name,
|
456
|
-
"instanceType"=>instance_type['code'],
|
457
|
-
"isPlaced"=>true,
|
458
|
-
"name"=> instance_name,
|
459
|
-
"parent"=>tier['data']['id'],
|
460
|
-
"type"=>"instance",
|
445
|
+
"instance.name"=>instance_name,
|
446
|
+
"instanceType"=>instance_type['code'],
|
447
|
+
"isPlaced"=>true,
|
448
|
+
"name"=> instance_name,
|
449
|
+
"parent"=>tier['data']['id'],
|
450
|
+
"type"=>"instance",
|
461
451
|
"typeName"=>instance_type['name'],
|
462
452
|
"servicePlan"=>plan_prompt['servicePlan'].to_s,
|
463
453
|
# "servicePlanOptions.maxCpu": "",
|
464
454
|
# "servicePlanOptions.maxCpuId": nil,
|
465
455
|
# "servicePlanOptions.maxMemory": "",
|
466
456
|
# "servicePlanOptions.maxMemoryId": nil,
|
467
|
-
|
457
|
+
|
468
458
|
# "volumes.datastoreId": nil,
|
469
459
|
# "volumes.name": "root",
|
470
460
|
# "volumes.rootVolume": "true",
|
@@ -475,9 +465,9 @@ class Morpheus::Cli::AppTemplates
|
|
475
465
|
"version"=>version_prompt['version'],
|
476
466
|
"siteId"=>group_id.to_s,
|
477
467
|
"zoneId"=>cloud_id.to_s
|
478
|
-
},
|
479
|
-
"grabbable"=>true, "group"=>"nodes", "locked"=>false,
|
480
|
-
#"position"=>{"x"=>-79.83254449505226, "y"=>458.33806818181824},
|
468
|
+
},
|
469
|
+
"grabbable"=>true, "group"=>"nodes", "locked"=>false,
|
470
|
+
#"position"=>{"x"=>-79.83254449505226, "y"=>458.33806818181824},
|
481
471
|
"removed"=>false, "selectable"=>true, "selected"=>false
|
482
472
|
}
|
483
473
|
|
@@ -493,7 +483,7 @@ class Morpheus::Cli::AppTemplates
|
|
493
483
|
|
494
484
|
# re-index nodes for this tier
|
495
485
|
tier_instances = config['nodes'].select {|node| node['data']['parent'] == tier['data']['id'] }
|
496
|
-
tier_instances.each_with_index do |node, idx|
|
486
|
+
tier_instances.each_with_index do |node, idx|
|
497
487
|
node['data']['index'] = idx
|
498
488
|
end
|
499
489
|
|
@@ -503,6 +493,10 @@ class Morpheus::Cli::AppTemplates
|
|
503
493
|
request_payload['config'] = config
|
504
494
|
|
505
495
|
begin
|
496
|
+
if options[:dry_run]
|
497
|
+
print_dry_run @app_templates_interface.dry.update(app_template['id'], request_payload)
|
498
|
+
return
|
499
|
+
end
|
506
500
|
json_response = @app_templates_interface.update(app_template['id'], request_payload)
|
507
501
|
|
508
502
|
if options[:json]
|
@@ -510,48 +504,46 @@ class Morpheus::Cli::AppTemplates
|
|
510
504
|
print "\n"
|
511
505
|
else
|
512
506
|
print_green_success "Added instance type to app template #{app_template['name']}"
|
513
|
-
|
514
|
-
details(details_options)
|
507
|
+
get([app_template['name']])
|
515
508
|
end
|
516
509
|
|
517
510
|
rescue RestClient::Exception => e
|
518
511
|
print_rest_exception(e, options)
|
519
512
|
exit 1
|
520
513
|
end
|
521
|
-
|
514
|
+
|
522
515
|
end
|
523
516
|
|
524
517
|
def remove_instance(args)
|
525
|
-
usage = "Usage: morpheus app-templates remove-instance [name] [instance-id]"
|
526
518
|
options = {}
|
527
519
|
optparse = OptionParser.new do|opts|
|
528
|
-
opts.banner =
|
520
|
+
opts.banner = subcommand_usage("[name] [instance-id]")
|
529
521
|
build_common_options(opts, options, [:auto_confirm, :json])
|
530
522
|
end
|
531
|
-
optparse.parse(args)
|
523
|
+
optparse.parse!(args)
|
532
524
|
|
533
525
|
if args.count < 2
|
534
|
-
puts
|
526
|
+
puts optparse
|
535
527
|
exit 1
|
536
528
|
end
|
537
|
-
|
529
|
+
app_template_name = args[0]
|
538
530
|
instance_id = args[1]
|
539
531
|
|
540
532
|
connect(options)
|
541
|
-
|
533
|
+
|
542
534
|
begin
|
543
535
|
|
544
|
-
app_template =
|
536
|
+
app_template = find_app_template_by_name_or_id(app_template_name)
|
545
537
|
exit 1 if app_template.nil?
|
546
538
|
|
547
|
-
config = app_template['config']['tierView']
|
539
|
+
config = app_template['config']['tierView']
|
548
540
|
|
549
541
|
config['nodes'] ||= []
|
550
542
|
|
551
|
-
instance_node = config['nodes'].find { |node|
|
543
|
+
instance_node = config['nodes'].find { |node|
|
552
544
|
node["data"] && node["data"]["type"] == "instance" && node["data"]["id"] == "newinstance-#{instance_id}"
|
553
545
|
}
|
554
|
-
|
546
|
+
|
555
547
|
if instance_node.nil?
|
556
548
|
print_red_alert "Instance not found by id #{instance_id}"
|
557
549
|
exit 1
|
@@ -561,7 +553,7 @@ class Morpheus::Cli::AppTemplates
|
|
561
553
|
exit
|
562
554
|
end
|
563
555
|
|
564
|
-
tier = config['nodes'].find {|node|
|
556
|
+
tier = config['nodes'].find {|node|
|
565
557
|
node["data"] && node["data"]["type"] == "tier" && node["data"]["id"] == instance_node['data']['parent']
|
566
558
|
}
|
567
559
|
|
@@ -574,11 +566,11 @@ class Morpheus::Cli::AppTemplates
|
|
574
566
|
config['nodes'] = config['nodes'].reject {|node|
|
575
567
|
node["data"] && node["data"]["type"] == "instance" && node["data"]["id"] == "newinstance-#{instance_id}"
|
576
568
|
}
|
577
|
-
|
569
|
+
|
578
570
|
|
579
571
|
# re-index nodes for this tier
|
580
572
|
tier_instances = config['nodes'].select {|node| node['data']['parent'] == tier['data']['id'] }
|
581
|
-
tier_instances.each_with_index do |node, idx|
|
573
|
+
tier_instances.each_with_index do |node, idx|
|
582
574
|
node['data']['index'] = idx
|
583
575
|
end
|
584
576
|
|
@@ -588,14 +580,13 @@ class Morpheus::Cli::AppTemplates
|
|
588
580
|
request_payload['config'] = config
|
589
581
|
json_response = @app_templates_interface.update(app_template['id'], request_payload)
|
590
582
|
|
591
|
-
|
583
|
+
|
592
584
|
if options[:json]
|
593
585
|
print JSON.pretty_generate(json_response)
|
594
586
|
print "\n"
|
595
587
|
else
|
596
588
|
print_green_success "Added instance type to app template #{app_template['name']}"
|
597
|
-
|
598
|
-
details(details_options)
|
589
|
+
get([app_template['name']])
|
599
590
|
end
|
600
591
|
|
601
592
|
rescue RestClient::Exception => e
|
@@ -605,34 +596,33 @@ class Morpheus::Cli::AppTemplates
|
|
605
596
|
end
|
606
597
|
|
607
598
|
def connect_tiers(args)
|
608
|
-
usage = "Usage: morpheus app-templates connect-tiers [name] [tier1] [tier2]"
|
609
599
|
options = {}
|
610
600
|
optparse = OptionParser.new do|opts|
|
611
|
-
opts.banner =
|
612
|
-
build_common_options(opts, options, [:json])
|
601
|
+
opts.banner = subcommand_usage("[name] [tier1] [tier2]")
|
602
|
+
build_common_options(opts, options, [:json, :dry_run])
|
613
603
|
end
|
614
|
-
optparse.parse(args)
|
604
|
+
optparse.parse!(args)
|
615
605
|
|
616
606
|
if args.count < 3
|
617
|
-
puts
|
607
|
+
puts optparse
|
618
608
|
exit 1
|
619
609
|
end
|
620
|
-
|
610
|
+
app_template_name = args[0]
|
621
611
|
tier1_name = args[1]
|
622
612
|
tier2_name = args[2]
|
623
613
|
|
624
614
|
connect(options)
|
625
|
-
|
615
|
+
|
626
616
|
begin
|
627
617
|
|
628
|
-
app_template =
|
618
|
+
app_template = find_app_template_by_name_or_id(app_template_name)
|
629
619
|
exit 1 if app_template.nil?
|
630
620
|
|
631
|
-
config = app_template['config']['tierView']
|
621
|
+
config = app_template['config']['tierView']
|
632
622
|
|
633
623
|
config['nodes'] ||= []
|
634
624
|
|
635
|
-
tier1 = config['nodes'].find {|node|
|
625
|
+
tier1 = config['nodes'].find {|node|
|
636
626
|
node["data"] && node["data"]["type"] == "tier" && node["data"]["id"] == "newtier-#{tier1_name}"
|
637
627
|
}
|
638
628
|
if tier1.nil?
|
@@ -640,14 +630,14 @@ class Morpheus::Cli::AppTemplates
|
|
640
630
|
exit 1
|
641
631
|
end
|
642
632
|
|
643
|
-
tier2 = config['nodes'].find {|node|
|
633
|
+
tier2 = config['nodes'].find {|node|
|
644
634
|
node["data"] && node["data"]["type"] == "tier" && node["data"]["id"] == "newtier-#{tier2_name}"
|
645
635
|
}
|
646
636
|
if tier2.nil?
|
647
637
|
print_red_alert "Tier not found by name #{tier2_name}!"
|
648
638
|
exit 1
|
649
639
|
end
|
650
|
-
|
640
|
+
|
651
641
|
config['edges'] ||= []
|
652
642
|
|
653
643
|
found_edge = config['edges'].find {|edge|
|
@@ -663,12 +653,12 @@ class Morpheus::Cli::AppTemplates
|
|
663
653
|
# not sure how this id is being generated in the ui exactly
|
664
654
|
new_edge_index = (1..999).find {|i|
|
665
655
|
!config['edges'].find {|edge| edge['data']['id'] == "ele#{i}" }
|
666
|
-
}
|
656
|
+
}
|
667
657
|
new_edge = {
|
668
|
-
"classes"=>"",
|
669
|
-
"data"=>{"id"=>"ele#{new_edge_index}", "source"=>tier1['data']['id'], "target"=>tier2['data']['id']},
|
670
|
-
"grabbable"=>true, "group"=>"edges", "locked"=>false,
|
671
|
-
#"position"=>{},
|
658
|
+
"classes"=>"",
|
659
|
+
"data"=>{"id"=>"ele#{new_edge_index}", "source"=>tier1['data']['id'], "target"=>tier2['data']['id']},
|
660
|
+
"grabbable"=>true, "group"=>"edges", "locked"=>false,
|
661
|
+
#"position"=>{},
|
672
662
|
"removed"=>false, "selectable"=>true, "selected"=>false
|
673
663
|
}
|
674
664
|
|
@@ -679,16 +669,20 @@ class Morpheus::Cli::AppTemplates
|
|
679
669
|
request_payload['siteId'] = app_template['config']['siteId']
|
680
670
|
# request_payload['config'] = config['tierView']
|
681
671
|
request_payload['config'] = config
|
672
|
+
|
673
|
+
if options[:dry_run]
|
674
|
+
print_dry_run @app_templates_interface.dry.update(app_template['id'], request_payload)
|
675
|
+
return
|
676
|
+
end
|
682
677
|
json_response = @app_templates_interface.update(app_template['id'], request_payload)
|
683
678
|
|
684
|
-
|
679
|
+
|
685
680
|
if options[:json]
|
686
681
|
print JSON.pretty_generate(json_response)
|
687
682
|
print "\n"
|
688
683
|
else
|
689
684
|
print_green_success "Connected tiers for app template #{app_template['name']}"
|
690
|
-
|
691
|
-
details(details_options)
|
685
|
+
get([app_template['name']])
|
692
686
|
end
|
693
687
|
|
694
688
|
rescue RestClient::Exception => e
|
@@ -700,13 +694,17 @@ class Morpheus::Cli::AppTemplates
|
|
700
694
|
def available_tiers(args)
|
701
695
|
options = {}
|
702
696
|
optparse = OptionParser.new do|opts|
|
703
|
-
build_common_options(opts, options, [:json])
|
697
|
+
build_common_options(opts, options, [:json, :dry_run])
|
704
698
|
end
|
705
|
-
optparse.parse(args)
|
699
|
+
optparse.parse!(args)
|
706
700
|
connect(options)
|
707
701
|
params = {}
|
708
|
-
|
702
|
+
|
709
703
|
begin
|
704
|
+
if options[:dry_run]
|
705
|
+
print_dry_run @app_templates_interface.dry.list_tiers(params)
|
706
|
+
return
|
707
|
+
end
|
710
708
|
json_response = @app_templates_interface.list_tiers(params)
|
711
709
|
tiers = json_response['tiers']
|
712
710
|
if options[:json]
|
@@ -719,21 +717,21 @@ class Morpheus::Cli::AppTemplates
|
|
719
717
|
else
|
720
718
|
rows = tiers.collect do |tier|
|
721
719
|
{
|
722
|
-
id: tier['id'],
|
723
|
-
name: tier['name'],
|
720
|
+
id: tier['id'],
|
721
|
+
name: tier['name'],
|
724
722
|
}
|
725
723
|
end
|
726
724
|
print cyan
|
727
725
|
tp rows, [:name]
|
728
726
|
print reset
|
729
727
|
end
|
730
|
-
print reset,"\n
|
728
|
+
print reset,"\n"
|
731
729
|
end
|
732
730
|
rescue RestClient::Exception => e
|
733
731
|
print_rest_exception(e, options)
|
734
732
|
exit 1
|
735
733
|
end
|
736
|
-
|
734
|
+
|
737
735
|
end
|
738
736
|
|
739
737
|
def available_types(args)
|
@@ -741,11 +739,15 @@ class Morpheus::Cli::AppTemplates
|
|
741
739
|
optparse = OptionParser.new do|opts|
|
742
740
|
build_common_options(opts, options, [:json])
|
743
741
|
end
|
744
|
-
optparse.parse(args)
|
742
|
+
optparse.parse!(args)
|
745
743
|
connect(options)
|
746
744
|
params = {}
|
747
|
-
|
745
|
+
|
748
746
|
begin
|
747
|
+
if options[:dry_run]
|
748
|
+
print_dry_run @app_templates_interface.dry.list_types(params)
|
749
|
+
return
|
750
|
+
end
|
749
751
|
json_response = @app_templates_interface.list_types(params)
|
750
752
|
instance_types = json_response['types']
|
751
753
|
if options[:json]
|
@@ -758,39 +760,47 @@ class Morpheus::Cli::AppTemplates
|
|
758
760
|
else
|
759
761
|
rows = instance_types.collect do |instance_type|
|
760
762
|
{
|
761
|
-
id: instance_type['id'],
|
762
|
-
code: instance_type['code'],
|
763
|
-
name: instance_type['name'],
|
763
|
+
id: instance_type['id'],
|
764
|
+
code: instance_type['code'],
|
765
|
+
name: instance_type['name'],
|
764
766
|
}
|
765
767
|
end
|
766
768
|
print cyan
|
767
769
|
tp rows, [:code, :name]
|
768
770
|
print reset
|
769
771
|
end
|
770
|
-
print reset,"\n
|
772
|
+
print reset,"\n"
|
771
773
|
end
|
772
774
|
rescue RestClient::Exception => e
|
773
775
|
print_rest_exception(e, options)
|
774
776
|
exit 1
|
775
777
|
end
|
776
|
-
|
778
|
+
|
777
779
|
end
|
778
780
|
|
779
|
-
private
|
780
|
-
|
781
|
+
private
|
782
|
+
|
781
783
|
|
782
|
-
|
783
|
-
|
784
|
-
|
784
|
+
def add_app_template_option_types
|
785
|
+
[
|
786
|
+
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'displayOrder' => 1},
|
785
787
|
{'fieldName' => 'group', 'fieldLabel' => 'Group', 'type' => 'text', 'required' => true, 'displayOrder' => 2},
|
786
|
-
|
787
|
-
|
788
|
+
]
|
789
|
+
end
|
788
790
|
|
789
|
-
|
790
|
-
|
791
|
-
|
791
|
+
def update_app_template_option_types
|
792
|
+
add_app_template_option_types
|
793
|
+
end
|
792
794
|
|
793
|
-
|
795
|
+
def find_app_template_by_name_or_id(val)
|
796
|
+
if val.to_s =~ /\A\d{1,}\Z/
|
797
|
+
return find_app_template_by_id(val)
|
798
|
+
else
|
799
|
+
return find_app_template_by_name(val)
|
800
|
+
end
|
801
|
+
end
|
802
|
+
|
803
|
+
def find_app_template_by_id(id)
|
794
804
|
begin
|
795
805
|
json_response = @app_templates_interface.get(id.to_i)
|
796
806
|
return json_response['appTemplate']
|
@@ -803,7 +813,7 @@ private
|
|
803
813
|
end
|
804
814
|
end
|
805
815
|
|
806
|
-
|
816
|
+
def find_app_template_by_name(name)
|
807
817
|
app_templates = @app_templates_interface.list({name: name.to_s})['appTemplates']
|
808
818
|
if app_templates.empty?
|
809
819
|
print_red_alert "App Template not found by name #{name}"
|
@@ -811,7 +821,7 @@ private
|
|
811
821
|
elsif app_templates.size > 1
|
812
822
|
print_red_alert "#{app_templates.size} app templates by name #{name}"
|
813
823
|
print_app_templates_table(app_templates, {color: red})
|
814
|
-
print reset,"\n
|
824
|
+
print reset,"\n"
|
815
825
|
return nil
|
816
826
|
else
|
817
827
|
return app_templates[0]
|
@@ -838,44 +848,26 @@ private
|
|
838
848
|
end
|
839
849
|
end
|
840
850
|
|
841
|
-
def
|
842
|
-
results = @instance_types_interface.get({code: code})
|
843
|
-
if results['instanceTypes'].empty?
|
844
|
-
print_red_alert "Instance Type not found by code #{code}"
|
845
|
-
return nil
|
846
|
-
end
|
847
|
-
return results['instanceTypes'][0]
|
848
|
-
end
|
849
|
-
|
850
|
-
def find_instance_type_by_name(name)
|
851
|
-
results = @instance_types_interface.get({name: name})
|
852
|
-
if results['instanceTypes'].empty?
|
853
|
-
print_red_alert "Instance Type not found by name #{name}"
|
854
|
-
return nil
|
855
|
-
end
|
856
|
-
return results['instanceTypes'][0]
|
857
|
-
end
|
858
|
-
|
859
|
-
def print_app_templates_table(app_templates, opts={})
|
851
|
+
def print_app_templates_table(app_templates, opts={})
|
860
852
|
table_color = opts[:color] || cyan
|
861
853
|
rows = app_templates.collect do |app_template|
|
862
|
-
|
854
|
+
instance_type_names = (app_template['instanceTypes'] || []).collect {|it| it['name'] }.join(', ')
|
863
855
|
{
|
864
|
-
id: app_template['id'],
|
865
|
-
name: app_template['name'],
|
866
|
-
#code: app_template['code'],
|
856
|
+
id: app_template['id'],
|
857
|
+
name: app_template['name'],
|
858
|
+
#code: app_template['code'],
|
867
859
|
instance_types: instance_type_names,
|
868
|
-
account: app_template['account'] ? app_template['account']['name'] : nil,
|
869
|
-
#dateCreated: format_local_dt(app_template['dateCreated'])
|
860
|
+
account: app_template['account'] ? app_template['account']['name'] : nil,
|
861
|
+
#dateCreated: format_local_dt(app_template['dateCreated'])
|
870
862
|
}
|
871
863
|
end
|
872
|
-
|
864
|
+
|
873
865
|
print table_color
|
874
866
|
tp rows, [
|
875
|
-
:id,
|
876
|
-
:name,
|
867
|
+
:id,
|
868
|
+
:name,
|
877
869
|
{:instance_types => {:display_name => "Instance Types"} },
|
878
|
-
:account,
|
870
|
+
:account,
|
879
871
|
#{:dateCreated => {:display_name => "Date Created"} }
|
880
872
|
]
|
881
873
|
print reset
|