morpheus-cli 5.4.3.1 → 5.4.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/Dockerfile +1 -1
- data/lib/morpheus/api/api_client.rb +8 -0
- data/lib/morpheus/api/catalog_item_types_interface.rb +9 -12
- data/lib/morpheus/api/clusters_interface.rb +12 -0
- data/lib/morpheus/api/credential_types_interface.rb +9 -0
- data/lib/morpheus/api/credentials_interface.rb +9 -0
- data/lib/morpheus/api/monitoring_apps_interface.rb +12 -4
- data/lib/morpheus/api/monitoring_checks_interface.rb +12 -4
- data/lib/morpheus/api/monitoring_groups_interface.rb +13 -5
- data/lib/morpheus/api/monitoring_incidents_interface.rb +12 -4
- data/lib/morpheus/api/options_interface.rb +8 -1
- data/lib/morpheus/api/power_schedules_interface.rb +2 -2
- data/lib/morpheus/api/service_plans_interface.rb +6 -0
- data/lib/morpheus/cli/cli_command.rb +10 -17
- data/lib/morpheus/cli/commands/catalog_item_types_command.rb +75 -8
- data/lib/morpheus/cli/commands/clusters.rb +119 -5
- data/lib/morpheus/cli/commands/credential_types_command.rb +36 -0
- data/lib/morpheus/cli/commands/credentials_command.rb +124 -0
- data/lib/morpheus/cli/commands/hosts.rb +20 -2
- data/lib/morpheus/cli/commands/instances.rb +5 -1
- data/lib/morpheus/cli/commands/monitoring_apps_command.rb +8 -8
- data/lib/morpheus/cli/commands/monitoring_checks_command.rb +8 -8
- data/lib/morpheus/cli/commands/monitoring_groups_command.rb +8 -8
- data/lib/morpheus/cli/commands/monitoring_incidents_command.rb +8 -8
- data/lib/morpheus/cli/commands/power_schedules_command.rb +189 -258
- data/lib/morpheus/cli/commands/service_plans_command.rb +51 -4
- data/lib/morpheus/cli/commands/storage_server_types.rb +0 -5
- data/lib/morpheus/cli/commands/storage_servers.rb +0 -6
- data/lib/morpheus/cli/commands/storage_volume_types.rb +0 -5
- data/lib/morpheus/cli/commands/storage_volumes.rb +0 -6
- data/lib/morpheus/cli/mixins/provisioning_helper.rb +37 -27
- data/lib/morpheus/cli/mixins/rest_command.rb +20 -4
- data/lib/morpheus/cli/mixins/storage_servers_helper.rb +0 -63
- data/lib/morpheus/cli/mixins/storage_volumes_helper.rb +0 -43
- data/lib/morpheus/cli/option_types.rb +1 -0
- data/lib/morpheus/cli/version.rb +1 -1
- data/lib/morpheus/routes.rb +13 -3
- metadata +11 -7
@@ -26,124 +26,84 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
26
26
|
options = {}
|
27
27
|
params = {}
|
28
28
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
29
|
-
opts.banner = subcommand_usage()
|
30
|
-
|
29
|
+
opts.banner = subcommand_usage("[search]")
|
30
|
+
build_standard_list_options(opts, options)
|
31
|
+
opts.footer = "List power schedules."
|
31
32
|
end
|
32
33
|
optparse.parse!(args)
|
33
34
|
connect(options)
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
elsif options[:yaml]
|
49
|
-
puts as_yaml(json_response, options, "schedules")
|
50
|
-
return 0
|
51
|
-
end
|
52
|
-
schedules = json_response['schedules']
|
53
|
-
title = "Morpheus Power Schedules"
|
54
|
-
subtitles = []
|
55
|
-
subtitles += parse_list_subtitles(options)
|
56
|
-
print_h1 title, subtitles
|
57
|
-
if schedules.empty?
|
35
|
+
if args.count > 0
|
36
|
+
options[:phrase] = args.join(" ")
|
37
|
+
end
|
38
|
+
params.merge!(parse_list_options(options))
|
39
|
+
@power_schedules_interface.setopts(options)
|
40
|
+
if options[:dry_run]
|
41
|
+
print_dry_run @power_schedules_interface.dry.list(params)
|
42
|
+
return
|
43
|
+
end
|
44
|
+
json_response = @power_schedules_interface.list(params)
|
45
|
+
render_response(json_response, options, power_schedule_list_key) do
|
46
|
+
power_schedules = json_response[power_schedule_list_key]
|
47
|
+
print_h1 "Morpheus Power Schedules", parse_list_subtitles(options), options
|
48
|
+
if power_schedules.empty?
|
58
49
|
print cyan,"No power schedules found.",reset,"\n"
|
59
50
|
else
|
60
|
-
|
61
|
-
print_results_pagination(json_response
|
62
|
-
# print_results_pagination(json_response)
|
51
|
+
print as_pretty_table(power_schedules, power_schedule_list_column_definitions(options).upcase_keys!, options)
|
52
|
+
print_results_pagination(json_response)
|
63
53
|
end
|
64
54
|
print reset,"\n"
|
65
|
-
rescue RestClient::Exception => e
|
66
|
-
print_rest_exception(e, options)
|
67
|
-
return 1
|
68
55
|
end
|
56
|
+
return 0, nil
|
69
57
|
end
|
70
58
|
|
71
59
|
def get(args)
|
60
|
+
params = {}
|
72
61
|
options = {}
|
73
62
|
options[:max_instances] = 10
|
74
63
|
options[:max_servers] = 10
|
75
64
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
76
|
-
opts.banner = subcommand_usage("[
|
77
|
-
opts.on('--max-instances VALUE', String, "Display a limited number of instances in schedule. Default is
|
65
|
+
opts.banner = subcommand_usage("[schedule]")
|
66
|
+
opts.on('--max-instances VALUE', String, "Display a limited number of instances in schedule. Default is 10") do |val|
|
78
67
|
options[:max_instances] = val.to_i
|
79
68
|
end
|
80
|
-
opts.on('--max-hosts VALUE', String, "Display a limited number of hosts in schedule. Default is
|
69
|
+
opts.on('--max-hosts VALUE', String, "Display a limited number of hosts in schedule. Default is 10") do |val|
|
81
70
|
options[:max_servers] = val.to_i
|
82
71
|
end
|
83
|
-
|
72
|
+
build_standard_get_options(opts, options)
|
84
73
|
end
|
85
74
|
optparse.parse!(args)
|
86
|
-
|
87
|
-
puts optparse
|
88
|
-
return 1
|
89
|
-
end
|
75
|
+
verify_args!(args:args, optparse:optparse, min:1)
|
90
76
|
connect(options)
|
77
|
+
params.merge!(parse_query_options(options))
|
91
78
|
id_list = parse_id_list(args)
|
92
79
|
return run_command_for_each_arg(id_list) do |arg|
|
93
|
-
_get(arg, options)
|
80
|
+
_get(arg, params, options)
|
94
81
|
end
|
95
82
|
end
|
96
83
|
|
97
|
-
def _get(id, options)
|
84
|
+
def _get(id, params, options)
|
98
85
|
options ||= {}
|
99
86
|
options[:max_servers] ||= 10
|
100
87
|
options[:max_instances] ||= 10
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
88
|
+
|
89
|
+
schedule = find_schedule_by_name_or_id(id)
|
90
|
+
if schedule.nil?
|
91
|
+
return 1
|
92
|
+
end
|
93
|
+
@power_schedules_interface.setopts(options)
|
94
|
+
if options[:dry_run]
|
95
|
+
print_dry_run @power_schedules_interface.dry.get(schedule['id'], params)
|
96
|
+
return
|
97
|
+
end
|
98
|
+
json_response = @power_schedules_interface.get(schedule['id'], params)
|
99
|
+
render_response(json_response, options, power_schedule_object_key) do
|
100
|
+
schedule = json_response[power_schedule_object_key]
|
113
101
|
instances = json_response['instances'] || []
|
114
102
|
servers = json_response['servers'] || []
|
115
|
-
|
116
|
-
puts as_json(json_response, options, "schedule")
|
117
|
-
return 0
|
118
|
-
elsif options[:yaml]
|
119
|
-
puts as_yaml(json_response, options, "schedule")
|
120
|
-
return 0
|
121
|
-
elsif options[:csv]
|
122
|
-
puts records_as_csv([json_response['schedule']], options)
|
123
|
-
return 0
|
124
|
-
end
|
125
|
-
|
103
|
+
|
126
104
|
print_h1 "Power Schedule Details"
|
127
105
|
print cyan
|
128
|
-
|
129
|
-
"ID" => lambda {|it| it['id'] },
|
130
|
-
#"Account" => lambda {|it| it['owner'] ? it['owner']['name'] : '' },
|
131
|
-
"Name" => lambda {|it| it['name'] },
|
132
|
-
"Description" => lambda {|it| it['description'] },
|
133
|
-
"Type" => lambda {|it| format_schedule_type(it['scheduleType']) },
|
134
|
-
"Enabled" => lambda {|it| format_boolean it['enabled'] },
|
135
|
-
"Time Zone" => lambda {|it| it['scheduleTimezone'] || 'UTC (default)' },
|
136
|
-
"Sunday" => lambda {|it| schedule_hour_to_time(it['sundayOn']) + ' - ' + schedule_hour_to_time(it['sundayOff']) },
|
137
|
-
"Monday" => lambda {|it| schedule_hour_to_time(it['mondayOn']) + ' - ' + schedule_hour_to_time(it['mondayOff']) },
|
138
|
-
"Tuesday" => lambda {|it| schedule_hour_to_time(it['tuesdayOn']) + ' - ' + schedule_hour_to_time(it['tuesdayOff']) },
|
139
|
-
"Wednesday" => lambda {|it| schedule_hour_to_time(it['wednesdayOn']) + ' - ' + schedule_hour_to_time(it['wednesdayOff']) },
|
140
|
-
"Thursday" => lambda {|it| schedule_hour_to_time(it['thursdayOn']) + ' - ' + schedule_hour_to_time(it['thursdayOff']) },
|
141
|
-
"Friday" => lambda {|it| schedule_hour_to_time(it['fridayOn']) + ' - ' + schedule_hour_to_time(it['fridayOff']) },
|
142
|
-
"Saturday" => lambda {|it| schedule_hour_to_time(it['saturdayOn']) + ' - ' + schedule_hour_to_time(it['saturdayOff']) },
|
143
|
-
"Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
144
|
-
"Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
|
145
|
-
}
|
146
|
-
print_description_list(description_cols, schedule)
|
106
|
+
print_description_list(power_schedule_column_definitions(options), schedule, options)
|
147
107
|
|
148
108
|
## Instances
|
149
109
|
if instances.size == 0
|
@@ -167,11 +127,8 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
167
127
|
end
|
168
128
|
|
169
129
|
print reset,"\n"
|
170
|
-
|
171
|
-
rescue RestClient::Exception => e
|
172
|
-
print_rest_exception(e, options)
|
173
|
-
return 1
|
174
130
|
end
|
131
|
+
return 0, nil
|
175
132
|
end
|
176
133
|
|
177
134
|
def add(args)
|
@@ -179,59 +136,31 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
179
136
|
params = {'scheduleType' => 'power'}
|
180
137
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
181
138
|
opts.banner = subcommand_usage("[name]")
|
182
|
-
opts
|
183
|
-
|
184
|
-
end
|
185
|
-
# opts.on('--code VALUE', String, "Code") do |val|
|
186
|
-
# params['code'] = val
|
187
|
-
# end
|
188
|
-
opts.on('--description VALUE', String, "Description") do |val|
|
189
|
-
params['description'] = val
|
190
|
-
end
|
191
|
-
opts.on('--type [power|power off]', String, "Type of Schedule. Default is 'power'") do |val|
|
192
|
-
params['scheduleType'] = val
|
193
|
-
end
|
194
|
-
opts.on('--timezone CODE', String, "The timezone. Default is UTC.") do |val|
|
195
|
-
params['scheduleTimezone'] = val
|
196
|
-
end
|
197
|
-
[
|
198
|
-
'sunday','monday','tuesday','wednesday','thursday','friday','saturday'
|
199
|
-
].each do |day|
|
200
|
-
opts.on("--#{day}On [0-24]", String, "#{day.capitalize} start hour. Default is 0.") do |val|
|
201
|
-
params["#{day}On"] = val.to_f
|
202
|
-
end
|
203
|
-
opts.on("--#{day}Off [0-24]", String, "#{day.capitalize} end hour. Default is 24.") do |val|
|
204
|
-
params["#{day}Off"] = val.to_f
|
205
|
-
end
|
206
|
-
end
|
207
|
-
opts.on('--enabled [on|off]', String, "Can be used to disable it") do |val|
|
208
|
-
params['enabled'] = !(val.to_s == 'off' || val.to_s == 'false')
|
209
|
-
end
|
210
|
-
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
139
|
+
build_option_type_options(opts, options, add_power_schedule_option_types)
|
140
|
+
build_standard_add_options(opts, options)
|
211
141
|
opts.footer = "Create a new power schedule." + "\n" +
|
212
142
|
"[name] is required and can be passed as --name instead."
|
213
143
|
end
|
214
144
|
optparse.parse!(args)
|
215
|
-
|
216
|
-
print_error Morpheus::Terminal.angry_prompt
|
217
|
-
puts_error "wrong number of arguments, expected 0-1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
218
|
-
return 1
|
219
|
-
end
|
145
|
+
verify_args!(args:args, optparse:optparse, min:0, max:1)
|
220
146
|
# support [name] as first argument
|
221
147
|
if args[0]
|
222
|
-
|
148
|
+
options[:options]['name'] = args[0]
|
223
149
|
end
|
224
150
|
connect(options)
|
225
151
|
begin
|
226
152
|
# construct payload
|
227
|
-
payload =
|
153
|
+
payload = {}
|
228
154
|
if options[:payload]
|
229
155
|
payload = options[:payload]
|
156
|
+
payload.deep_merge!({'schedule' => parse_passed_options(options)})
|
230
157
|
else
|
231
158
|
# merge -O options into normally parsed options
|
232
|
-
|
233
|
-
#
|
234
|
-
|
159
|
+
payload.deep_merge!({'schedule' => parse_passed_options(options)})
|
160
|
+
# prompt
|
161
|
+
schedule_payload = Morpheus::Cli::OptionTypes.prompt(add_power_schedule_option_types, options[:options], @api_client, options[:params])
|
162
|
+
payload.deep_merge!({'schedule' => schedule_payload})
|
163
|
+
payload.booleanize!
|
235
164
|
end
|
236
165
|
@power_schedules_interface.setopts(options)
|
237
166
|
if options[:dry_run]
|
@@ -244,7 +173,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
244
173
|
elsif !options[:quiet]
|
245
174
|
schedule = json_response['schedule']
|
246
175
|
print_green_success "Added power schedule #{schedule['name']}"
|
247
|
-
_get(schedule['id'], {})
|
176
|
+
_get(schedule['id'], {}, options)
|
248
177
|
end
|
249
178
|
return 0
|
250
179
|
rescue RestClient::Exception => e
|
@@ -258,45 +187,14 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
258
187
|
options = {}
|
259
188
|
params = {}
|
260
189
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
261
|
-
opts.banner = subcommand_usage("[
|
262
|
-
opts
|
263
|
-
|
264
|
-
end
|
265
|
-
# opts.on('--code VALUE', String, "Code") do |val|
|
266
|
-
# params['code'] = val
|
267
|
-
# end
|
268
|
-
opts.on('--description VALUE', String, "Description") do |val|
|
269
|
-
params['description'] = val
|
270
|
-
end
|
271
|
-
opts.on('--type [power|power off]', String, "Type of Schedule. Default is 'power'") do |val|
|
272
|
-
params['scheduleType'] = val
|
273
|
-
end
|
274
|
-
opts.on('--timezone CODE', String, "The timezone. Default is UTC.") do |val|
|
275
|
-
params['scheduleTimezone'] = val
|
276
|
-
end
|
277
|
-
[
|
278
|
-
'sunday','monday','tuesday','wednesday','thursday','friday','saturday'
|
279
|
-
].each do |day|
|
280
|
-
opts.on("--#{day}On [0-24]", String, "#{day.capitalize} on hour. Default is 0.") do |val|
|
281
|
-
params["#{day}On"] = val.to_f
|
282
|
-
end
|
283
|
-
opts.on("--#{day}Off [0-24]", String, "#{day.capitalize} off hour. Default is 24.") do |val|
|
284
|
-
params["#{day}Off"] = val.to_f
|
285
|
-
end
|
286
|
-
end
|
287
|
-
opts.on('--enabled [on|off]', String, "Can be used to disable it") do |val|
|
288
|
-
params['enabled'] = !(val.to_s == 'off' || val.to_s == 'false')
|
289
|
-
end
|
290
|
-
build_common_options(opts, options, [:options, :payload, :json, :dry_run, :remote, :quiet])
|
190
|
+
opts.banner = subcommand_usage("[schedule]")
|
191
|
+
build_option_type_options(opts, options, update_power_schedule_option_types)
|
192
|
+
build_standard_add_options(opts, options)
|
291
193
|
opts.footer = "Update a power schedule." + "\n" +
|
292
|
-
"[
|
194
|
+
"[schedule] is required. This is the name or id of a power schedule."
|
293
195
|
end
|
294
196
|
optparse.parse!(args)
|
295
|
-
|
296
|
-
print_error Morpheus::Terminal.angry_prompt
|
297
|
-
puts_error "wrong number of arguments, expected 1 and got (#{args.count}) #{args.inspect}\n#{optparse}"
|
298
|
-
return 1
|
299
|
-
end
|
197
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
300
198
|
connect(options)
|
301
199
|
begin
|
302
200
|
schedule = find_schedule_by_name_or_id(args[0])
|
@@ -304,13 +202,17 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
304
202
|
return 1
|
305
203
|
end
|
306
204
|
# construct payload
|
307
|
-
payload =
|
205
|
+
payload = {}
|
308
206
|
if options[:payload]
|
309
207
|
payload = options[:payload]
|
208
|
+
payload.deep_merge!({'schedule' => parse_passed_options(options)})
|
310
209
|
else
|
311
210
|
# merge -O options into normally parsed options
|
312
|
-
|
313
|
-
|
211
|
+
payload.deep_merge!({'schedule' => parse_passed_options(options)})
|
212
|
+
# prompt
|
213
|
+
schedule_payload = Morpheus::Cli::OptionTypes.no_prompt(update_power_schedule_option_types, options[:options], @api_client, options[:params])
|
214
|
+
payload.deep_merge!({'schedule' => schedule_payload})
|
215
|
+
payload.booleanize!
|
314
216
|
end
|
315
217
|
@power_schedules_interface.setopts(options)
|
316
218
|
if options[:dry_run]
|
@@ -322,7 +224,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
322
224
|
puts as_json(json_response, options)
|
323
225
|
elsif !options[:quiet]
|
324
226
|
print_green_success "Updated power schedule #{schedule['name']}"
|
325
|
-
_get(schedule['id'], {})
|
227
|
+
_get(schedule['id'], {}, options)
|
326
228
|
end
|
327
229
|
return 0
|
328
230
|
rescue RestClient::Exception => e
|
@@ -335,14 +237,11 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
335
237
|
options = {}
|
336
238
|
params = {}
|
337
239
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
338
|
-
opts.banner = subcommand_usage("[
|
339
|
-
|
240
|
+
opts.banner = subcommand_usage("[schedule]")
|
241
|
+
build_standard_remove_options(opts, options)
|
340
242
|
end
|
341
243
|
optparse.parse!(args)
|
342
|
-
|
343
|
-
puts optparse
|
344
|
-
return 127
|
345
|
-
end
|
244
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
346
245
|
connect(options)
|
347
246
|
|
348
247
|
begin
|
@@ -355,11 +254,6 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
355
254
|
return false
|
356
255
|
end
|
357
256
|
|
358
|
-
# payload = {
|
359
|
-
# 'schedule' => {id: schedule["id"]}
|
360
|
-
# }
|
361
|
-
# payload['schedule'].merge!(schedule)
|
362
|
-
payload = params
|
363
257
|
@power_schedules_interface.setopts(options)
|
364
258
|
if options[:dry_run]
|
365
259
|
print_dry_run @power_schedules_interface.dry.destroy(schedule["id"])
|
@@ -383,17 +277,14 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
383
277
|
options = {}
|
384
278
|
params = {}
|
385
279
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
386
|
-
opts.banner = subcommand_usage("[
|
387
|
-
|
280
|
+
opts.banner = subcommand_usage("[schedule] [instance]")
|
281
|
+
build_standard_update_options(opts, options)
|
388
282
|
opts.footer = "Assign instances to a power schedule.\n" +
|
389
|
-
"[
|
283
|
+
"[schedule] is required. This is the name or id of a power schedule.\n" +
|
390
284
|
"[instance] is required. This is the name or id of an instance. More than one can be passed."
|
391
285
|
end
|
392
286
|
optparse.parse!(args)
|
393
|
-
|
394
|
-
puts optparse
|
395
|
-
return 1
|
396
|
-
end
|
287
|
+
verify_args!(args:args, optparse:optparse, min:2)
|
397
288
|
connect(options)
|
398
289
|
begin
|
399
290
|
schedule = find_schedule_by_name_or_id(args[0])
|
@@ -402,10 +293,12 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
402
293
|
end
|
403
294
|
|
404
295
|
# construct payload
|
405
|
-
payload =
|
296
|
+
payload = {}
|
406
297
|
if options[:payload]
|
407
298
|
payload = options[:payload]
|
299
|
+
payload.deep_merge!(parse_passed_options(options))
|
408
300
|
else
|
301
|
+
payload.deep_merge!(parse_passed_options(options))
|
409
302
|
instance_ids = args[1..-1]
|
410
303
|
instances = []
|
411
304
|
instance_ids.each do |instance_id|
|
@@ -413,7 +306,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
413
306
|
return 1 if instance.nil?
|
414
307
|
instances << instance
|
415
308
|
end
|
416
|
-
payload
|
309
|
+
payload.deep_merge!({'instances' => instances.collect {|it| it['id'] } })
|
417
310
|
end
|
418
311
|
@power_schedules_interface.setopts(options)
|
419
312
|
if options[:dry_run]
|
@@ -429,7 +322,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
429
322
|
else
|
430
323
|
print_green_success "Added #{instances.size} instances to power schedule #{schedule['name']}"
|
431
324
|
end
|
432
|
-
_get(schedule['id'], {})
|
325
|
+
_get(schedule['id'], {}, options)
|
433
326
|
end
|
434
327
|
return 0
|
435
328
|
rescue RestClient::Exception => e
|
@@ -442,17 +335,14 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
442
335
|
options = {}
|
443
336
|
params = {}
|
444
337
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
445
|
-
opts.banner = subcommand_usage("[
|
446
|
-
|
338
|
+
opts.banner = subcommand_usage("[schedule] [instance]")
|
339
|
+
build_standard_update_options(opts, options)
|
447
340
|
opts.footer = "Remove instances from a power schedule.\n" +
|
448
|
-
"[
|
341
|
+
"[schedule] is required. This is the name or id of a power schedule.\n" +
|
449
342
|
"[instance] is required. This is the name or id of an instance. More than one can be passed."
|
450
343
|
end
|
451
344
|
optparse.parse!(args)
|
452
|
-
|
453
|
-
puts optparse
|
454
|
-
return 1
|
455
|
-
end
|
345
|
+
verify_args!(args:args, optparse:optparse, min:2)
|
456
346
|
connect(options)
|
457
347
|
begin
|
458
348
|
schedule = find_schedule_by_name_or_id(args[0])
|
@@ -461,10 +351,12 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
461
351
|
end
|
462
352
|
|
463
353
|
# construct payload
|
464
|
-
payload =
|
354
|
+
payload = {}
|
465
355
|
if options[:payload]
|
466
356
|
payload = options[:payload]
|
357
|
+
payload.deep_merge!(parse_passed_options(options))
|
467
358
|
else
|
359
|
+
payload.deep_merge!(parse_passed_options(options))
|
468
360
|
instance_ids = args[1..-1]
|
469
361
|
instances = []
|
470
362
|
instance_ids.each do |instance_id|
|
@@ -472,7 +364,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
472
364
|
return 1 if instance.nil?
|
473
365
|
instances << instance
|
474
366
|
end
|
475
|
-
payload
|
367
|
+
payload.deep_merge!({'instances' => instances.collect {|it| it['id'] } })
|
476
368
|
end
|
477
369
|
@power_schedules_interface.setopts(options)
|
478
370
|
if options[:dry_run]
|
@@ -488,7 +380,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
488
380
|
else
|
489
381
|
print_green_success "Removed #{instances.size} instances from power schedule #{schedule['name']}"
|
490
382
|
end
|
491
|
-
_get(schedule['id'], {})
|
383
|
+
_get(schedule['id'], {}, options)
|
492
384
|
end
|
493
385
|
return 0
|
494
386
|
rescue RestClient::Exception => e
|
@@ -501,17 +393,14 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
501
393
|
options = {}
|
502
394
|
params = {}
|
503
395
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
504
|
-
opts.banner = subcommand_usage("[
|
505
|
-
|
396
|
+
opts.banner = subcommand_usage("[schedule] [host]")
|
397
|
+
build_standard_update_options(opts, options)
|
506
398
|
opts.footer = "Assign hosts to a power schedule.\n" +
|
507
|
-
"[
|
399
|
+
"[schedule] is required. This is the name or id of a power schedule.\n" +
|
508
400
|
"[host] is required. This is the name or id of a host. More than one can be passed."
|
509
401
|
end
|
510
402
|
optparse.parse!(args)
|
511
|
-
|
512
|
-
puts optparse
|
513
|
-
return 1
|
514
|
-
end
|
403
|
+
verify_args!(args:args, optparse:optparse, min:2)
|
515
404
|
connect(options)
|
516
405
|
begin
|
517
406
|
schedule = find_schedule_by_name_or_id(args[0])
|
@@ -520,10 +409,12 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
520
409
|
end
|
521
410
|
|
522
411
|
# construct payload
|
523
|
-
payload =
|
412
|
+
payload = {}
|
524
413
|
if options[:payload]
|
525
414
|
payload = options[:payload]
|
415
|
+
payload.deep_merge!(parse_passed_options(options))
|
526
416
|
else
|
417
|
+
payload.deep_merge!(parse_passed_options(options))
|
527
418
|
server_ids = args[1..-1]
|
528
419
|
servers = []
|
529
420
|
server_ids.each do |server_id|
|
@@ -531,7 +422,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
531
422
|
return 1 if server.nil?
|
532
423
|
servers << server
|
533
424
|
end
|
534
|
-
payload
|
425
|
+
payload.deep_merge!({'servers' => servers.collect {|it| it['id'] } })
|
535
426
|
end
|
536
427
|
@power_schedules_interface.setopts(options)
|
537
428
|
if options[:dry_run]
|
@@ -547,7 +438,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
547
438
|
else
|
548
439
|
print_green_success "Added #{servers.size} hosts to power schedule #{schedule['name']}"
|
549
440
|
end
|
550
|
-
_get(schedule['id'], {})
|
441
|
+
_get(schedule['id'], {}, options)
|
551
442
|
end
|
552
443
|
return 0
|
553
444
|
rescue RestClient::Exception => e
|
@@ -560,17 +451,14 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
560
451
|
options = {}
|
561
452
|
params = {}
|
562
453
|
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
563
|
-
opts.banner = subcommand_usage("[
|
564
|
-
|
454
|
+
opts.banner = subcommand_usage("[schedule] [host]")
|
455
|
+
build_standard_update_options(opts, options)
|
565
456
|
opts.footer = "Remove hosts from a power schedule.\n" +
|
566
|
-
"[
|
457
|
+
"[schedule] is required. This is the name or id of a power schedule.\n" +
|
567
458
|
"[host] is required. This is the name or id of a host. More than one can be passed."
|
568
459
|
end
|
569
460
|
optparse.parse!(args)
|
570
|
-
|
571
|
-
puts optparse
|
572
|
-
return 1
|
573
|
-
end
|
461
|
+
verify_args!(args:args, optparse:optparse, min:2)
|
574
462
|
connect(options)
|
575
463
|
begin
|
576
464
|
schedule = find_schedule_by_name_or_id(args[0])
|
@@ -579,10 +467,12 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
579
467
|
end
|
580
468
|
|
581
469
|
# construct payload
|
582
|
-
payload =
|
470
|
+
payload = {}
|
583
471
|
if options[:payload]
|
584
472
|
payload = options[:payload]
|
473
|
+
payload.deep_merge!(parse_passed_options(options))
|
585
474
|
else
|
475
|
+
payload.deep_merge!(parse_passed_options(options))
|
586
476
|
server_ids = args[1..-1]
|
587
477
|
servers = []
|
588
478
|
server_ids.each do |server_id|
|
@@ -590,7 +480,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
590
480
|
return 1 if server.nil?
|
591
481
|
servers << server
|
592
482
|
end
|
593
|
-
payload
|
483
|
+
payload.deep_merge!({'servers' => servers.collect {|it| it['id'] } })
|
594
484
|
end
|
595
485
|
@power_schedules_interface.setopts(options)
|
596
486
|
if options[:dry_run]
|
@@ -606,7 +496,7 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
606
496
|
else
|
607
497
|
print_green_success "Removed #{servers.size} hosts from power schedule #{schedule['name']}"
|
608
498
|
end
|
609
|
-
_get(schedule['id'], {})
|
499
|
+
_get(schedule['id'], {}, options)
|
610
500
|
end
|
611
501
|
return 0
|
612
502
|
rescue RestClient::Exception => e
|
@@ -618,6 +508,71 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
618
508
|
|
619
509
|
private
|
620
510
|
|
511
|
+
def power_schedule_object_key
|
512
|
+
'schedule'
|
513
|
+
end
|
514
|
+
|
515
|
+
def power_schedule_list_key
|
516
|
+
'schedules'
|
517
|
+
end
|
518
|
+
|
519
|
+
def power_schedule_list_column_definitions(options)
|
520
|
+
{
|
521
|
+
"ID" => lambda {|it| it['id'] },
|
522
|
+
"Name" => lambda {|it| it['name'] },
|
523
|
+
"Description" => lambda {|it| it['description'] },
|
524
|
+
"Type" => lambda {|it| format_schedule_type(it['scheduleType']) }
|
525
|
+
}
|
526
|
+
end
|
527
|
+
|
528
|
+
def power_schedule_column_definitions(options)
|
529
|
+
{
|
530
|
+
"ID" => lambda {|it| it['id'] },
|
531
|
+
#"Account" => lambda {|it| it['owner'] ? it['owner']['name'] : '' },
|
532
|
+
"Name" => lambda {|it| it['name'] },
|
533
|
+
"Description" => lambda {|it| it['description'] },
|
534
|
+
"Type" => lambda {|it| format_schedule_type(it['scheduleType']) },
|
535
|
+
"Enabled" => lambda {|it| format_boolean it['enabled'] },
|
536
|
+
"Time Zone" => lambda {|it| it['scheduleTimezone'] || 'UTC (default)' },
|
537
|
+
"Monday" => lambda {|it| format_schedule_day(it, "monday")},
|
538
|
+
"Tuesday" => lambda {|it| format_schedule_day(it, "tuesday") },
|
539
|
+
"Wednesday" => lambda {|it| format_schedule_day(it, "wednesday") },
|
540
|
+
"Thursday" => lambda {|it| format_schedule_day(it, "thursday") },
|
541
|
+
"Friday" => lambda {|it| format_schedule_day(it, "friday") },
|
542
|
+
"Saturday" => lambda {|it| format_schedule_day(it, "saturday") },
|
543
|
+
"Sunday" => lambda {|it| format_schedule_day(it, "sunday") },
|
544
|
+
"Created" => lambda {|it| format_local_dt(it['dateCreated']) },
|
545
|
+
"Updated" => lambda {|it| format_local_dt(it['lastUpdated']) }
|
546
|
+
}
|
547
|
+
end
|
548
|
+
|
549
|
+
def add_power_schedule_option_types()
|
550
|
+
option_list = [
|
551
|
+
{'fieldName' => 'name', 'fieldLabel' => 'Name', 'type' => 'text', 'required' => true, 'description' => 'Choose a unique name for the power schedule', 'fieldGroup' => 'Options', 'displayOrder' => 1},
|
552
|
+
{'fieldName' => 'description', 'fieldLabel' => 'Description', 'type' => 'text', 'description' => 'Description', 'displayOrder' => 2},
|
553
|
+
{'fieldName' => 'visibility', 'fieldLabel' => 'Visibility', 'type' => 'select', 'selectOptions' => [{'name' => 'Private', 'value' => 'private'}, {'name' => 'Public', 'value' => 'public'}], 'defaultValue' => 'private', 'displayOrder' => 3},
|
554
|
+
{'fieldName' => 'scheduleTimezone', 'fieldLabel' => 'Time Zone', 'type' => 'select', 'optionSource' => 'timezones', 'description' => "Time Zone", 'displayOrder' => 4}, #, 'defaultValue' => Time.now.zone
|
555
|
+
{'fieldName' => 'scheduleType', 'fieldLabel' => 'Schedule Type', 'type' => 'select', 'selectOptions' => [{'name' => 'Power On', 'value' => 'power'}, {'name' => 'Power Off', 'value' => 'power off'}], 'defaultValue' => 'power', 'description' => "Type of Power Schedule 'power' or 'power off'", 'displayOrder' => 5},
|
556
|
+
{'fieldName' => 'enabled', 'fieldLabel' => 'Enabled', 'type' => 'checkbox', 'defaultValue' => true, 'description' => 'Enable the power schedule to make it available for use.', 'displayOrder' => 6},
|
557
|
+
]
|
558
|
+
[
|
559
|
+
'monday','tuesday','wednesday','thursday','friday','saturday','sunday'
|
560
|
+
].each_with_index do |day, i|
|
561
|
+
option_list << {'fieldName' => "#{day}OnTime", 'fieldLabel' => "#{day.capitalize} Start", 'type' => 'text', 'placeHolder' => 'HH:MM', 'description' => "#{day.capitalize} start time in HH:MM 24-hour format", 'defaultValue' => "00:00", 'displayOrder' => 7+((i*2))}
|
562
|
+
option_list << {'fieldName' => "#{day}OffTime", 'fieldLabel' => "#{day.capitalize} End", 'type' => 'text', 'placeHolder' => 'HH:MM', 'description' => "#{day.capitalize} end time in HH:MM 24-hour format", 'defaultValue' => "24:00", 'displayOrder' => 7+((i*2)+1)}
|
563
|
+
end
|
564
|
+
return option_list
|
565
|
+
end
|
566
|
+
|
567
|
+
def update_power_schedule_option_types()
|
568
|
+
option_list = add_power_schedule_option_types
|
569
|
+
option_list.each do |option_type|
|
570
|
+
option_type.delete('required')
|
571
|
+
option_type.delete('defaultValue')
|
572
|
+
end
|
573
|
+
return option_list
|
574
|
+
end
|
575
|
+
|
621
576
|
def find_schedule_by_name_or_id(val)
|
622
577
|
if val.to_s =~ /\A\d{1,}\Z/
|
623
578
|
return find_schedule_by_id(val)
|
@@ -678,51 +633,27 @@ class Morpheus::Cli::PowerSchedulesCommand
|
|
678
633
|
end
|
679
634
|
end
|
680
635
|
|
681
|
-
#
|
682
|
-
def
|
683
|
-
|
684
|
-
|
685
|
-
|
686
|
-
|
687
|
-
|
688
|
-
# elsif hour > 12
|
689
|
-
# "#{(hour-12).to_s.rjust(2,'0')}:#{minute.to_s.rjust(2,'0')} PM"
|
690
|
-
# else
|
691
|
-
# "#{hour.to_s.rjust(2,'0')}:#{minute.to_s.rjust(2,'0')} AM"
|
692
|
-
# end
|
693
|
-
if format == :short
|
694
|
-
if minute == 0
|
695
|
-
"#{hour}"
|
696
|
-
else
|
697
|
-
"#{hour}:#{minute.to_s.rjust(2,'0')}"
|
698
|
-
end
|
636
|
+
# format day on - off times in HH:MM - HH:MM
|
637
|
+
def format_schedule_day(schedule, day)
|
638
|
+
# API used to only return On/Off but now returns OnTime/OffTime
|
639
|
+
if schedule[day + 'OnTime']
|
640
|
+
schedule[day + 'OnTime'].to_s + ' - ' + schedule[day + 'OffTime'].to_s
|
641
|
+
elsif schedule[day + 'On']
|
642
|
+
schedule_hour_to_time(schedule[day + 'On']) + ' - ' + schedule_hour_to_time(schedule[day + 'Off'])
|
699
643
|
else
|
700
|
-
"#
|
644
|
+
"" #"bad day"
|
701
645
|
end
|
702
646
|
end
|
703
647
|
|
704
|
-
|
705
|
-
|
706
|
-
|
707
|
-
|
708
|
-
|
709
|
-
|
710
|
-
|
711
|
-
# "F: #{schedule_hour_to_time(schedule['fridayOn'])}-#{schedule_hour_to_time(schedule['fridayOff'])}",
|
712
|
-
# "S: #{schedule_hour_to_time(schedule['saturdayOn'])}-#{schedule_hour_to_time(schedule['saturdayOff'])}",
|
713
|
-
# ].join(", ")
|
714
|
-
[
|
715
|
-
"Sn: #{schedule_hour_to_time(schedule['sundayOn'],:short)}-#{schedule_hour_to_time(schedule['sundayOff'],:short)}",
|
716
|
-
"M: #{schedule_hour_to_time(schedule['mondayOn'],:short)}-#{schedule_hour_to_time(schedule['mondayOff'],:short)}",
|
717
|
-
"T: #{schedule_hour_to_time(schedule['tuesdayOn'],:short)}-#{schedule_hour_to_time(schedule['tuesdayOff'],:short)}",
|
718
|
-
"W: #{schedule_hour_to_time(schedule['wednesdayOn'],:short)}-#{schedule_hour_to_time(schedule['wednesdayOff'],:short)}",
|
719
|
-
"Th: #{schedule_hour_to_time(schedule['thursdayOn'],:short)}-#{schedule_hour_to_time(schedule['thursdayOff'],:short)}",
|
720
|
-
"F: #{schedule_hour_to_time(schedule['fridayOn'],:short)}-#{schedule_hour_to_time(schedule['fridayOff'],:short)}",
|
721
|
-
"S: #{schedule_hour_to_time(schedule['saturdayOn'],:short)}-#{schedule_hour_to_time(schedule['saturdayOff'],:short)}",
|
722
|
-
].join(", ")
|
648
|
+
# convert the schedule on/off minute values [0-1440] to a time
|
649
|
+
# older versions used hours 0-24 instead of minutes
|
650
|
+
def schedule_hour_to_time(val)
|
651
|
+
hour = val.to_f.floor
|
652
|
+
remainder = val.to_f % 1
|
653
|
+
minute = remainder == 0 ? 0 : (60 * remainder).floor
|
654
|
+
"#{hour.to_s.rjust(2,'0')}:#{minute.to_s.rjust(2,'0')}"
|
723
655
|
end
|
724
656
|
|
725
|
-
|
726
657
|
def find_instance_by_name_or_id(val)
|
727
658
|
if val.to_s =~ /\A\d{1,}\Z/
|
728
659
|
return find_instance_by_id(val)
|