morpheus-cli 5.4.3.1 → 5.4.4
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.
- 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)
|