morpheus-cli 5.2.3 → 5.2.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/instances_interface.rb +21 -0
- data/lib/morpheus/cli/hosts.rb +12 -0
- data/lib/morpheus/cli/instances.rb +116 -2
- data/lib/morpheus/cli/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 3798eb711a94541135bbefd28bbf1b33db18460ab70d7caf4d6f1cde90dafed3
|
4
|
+
data.tar.gz: b24f15db530f004a00899a86d8c609ee5dc44e71ee7b69cc821e33f91070b4f1
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 165402498f461633ca18f4fd273e27cc5dcf7fddfd219722912563ea1c318a4412b9f6c6f5a014382e14bac1bfa060ffb4a794b72182739e57c1299ce685e7d2
|
7
|
+
data.tar.gz: 2305c2c67c28e206c9507abda3a95b2e62dadb0a6e73e44fd4b79a4feaa40f40fe713e47619f0383a30dfca22828ff439446063e5e7417746b658b08ced63804
|
data/Dockerfile
CHANGED
@@ -190,6 +190,27 @@ class Morpheus::InstancesInterface < Morpheus::APIClient
|
|
190
190
|
execute(opts)
|
191
191
|
end
|
192
192
|
|
193
|
+
def clone_image(id, payload)
|
194
|
+
url = "#{@base_url}/api/instances/#{id}/clone-image"
|
195
|
+
headers = {:authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
196
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
197
|
+
execute(opts)
|
198
|
+
end
|
199
|
+
|
200
|
+
def lock(id, payload)
|
201
|
+
url = "#{@base_url}/api/instances/#{id}/lock"
|
202
|
+
headers = {:authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
203
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
204
|
+
execute(opts)
|
205
|
+
end
|
206
|
+
|
207
|
+
def unlock(id, payload)
|
208
|
+
url = "#{@base_url}/api/instances/#{id}/unlock"
|
209
|
+
headers = {:authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
210
|
+
opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
|
211
|
+
execute(opts)
|
212
|
+
end
|
213
|
+
|
193
214
|
def firewall_disable(id)
|
194
215
|
url = "#{@base_url}/api/instances/#{id}/security-groups/disable"
|
195
216
|
headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
|
data/lib/morpheus/cli/hosts.rb
CHANGED
@@ -117,6 +117,12 @@ class Morpheus::Cli::Hosts
|
|
117
117
|
opts.on( '--tenant TENANT', "Tenant Name or ID" ) do |val|
|
118
118
|
options[:account] = val
|
119
119
|
end
|
120
|
+
opts.on('--labels label',String, "Filter by labels (keywords).") do |val|
|
121
|
+
val.split(",").each do |k|
|
122
|
+
options[:labels] ||= []
|
123
|
+
options[:labels] << k.strip
|
124
|
+
end
|
125
|
+
end
|
120
126
|
opts.on('--tags Name=Value',String, "Filter by tags.") do |val|
|
121
127
|
val.split(",").each do |value_pair|
|
122
128
|
k,v = value_pair.strip.split("=")
|
@@ -186,6 +192,7 @@ class Morpheus::Cli::Hosts
|
|
186
192
|
params['clusterId'] = cluster['id']
|
187
193
|
end
|
188
194
|
end
|
195
|
+
params['labels'] = options[:labels] if options[:labels]
|
189
196
|
if options[:tags] && !options[:tags].empty?
|
190
197
|
options[:tags].each do |k,v|
|
191
198
|
params['tags.' + k] = v
|
@@ -542,6 +549,7 @@ class Morpheus::Cli::Hosts
|
|
542
549
|
"Name" => 'name',
|
543
550
|
"Hostname" => 'hostname',
|
544
551
|
"Description" => 'description',
|
552
|
+
"Labels" => lambda {|it| it['labels'] ? it['labels'].join(',') : '' },
|
545
553
|
"Tags" => lambda {|it| tags ? format_metadata(tags) : '' },
|
546
554
|
"Owner" => lambda {|it| it['owner'] ? it['owner']['username'] : '' },
|
547
555
|
"Tenant" => lambda {|it| it['account'] ? it['account']['name'] : '' },
|
@@ -566,6 +574,7 @@ class Morpheus::Cli::Hosts
|
|
566
574
|
# server_columns.delete("Tenant") if multi_tenant != true
|
567
575
|
server_columns.delete("Cost") if server['hourlyCost'].to_f == 0
|
568
576
|
server_columns.delete("Price") if server['hourlyPrice'].to_f == 0 || server['hourlyPrice'] == server['hourlyCost']
|
577
|
+
server_columns.delete("Labels") if server['labels'].nil? || server['labels'].empty?
|
569
578
|
server_columns.delete("Tags") if tags.nil? || tags.empty?
|
570
579
|
|
571
580
|
print_description_list(server_columns, server)
|
@@ -993,6 +1002,9 @@ class Morpheus::Cli::Hosts
|
|
993
1002
|
opts.on('--power-schedule-type ID', String, "Power Schedule Type ID") do |val|
|
994
1003
|
params['powerScheduleType'] = val == "null" ? nil : val
|
995
1004
|
end
|
1005
|
+
opts.on('--labels [LIST]', String, "Labels (keywords) in the format 'foo, bar'") do |val|
|
1006
|
+
params['labels'] = val.to_s.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
|
1007
|
+
end
|
996
1008
|
opts.on('--tags LIST', String, "Tags in the format 'name:value, name:value'. This will add and remove tags.") do |val|
|
997
1009
|
options[:tags] = val
|
998
1010
|
end
|
@@ -19,6 +19,7 @@ class Morpheus::Cli::Instances
|
|
19
19
|
:history, {:'history-details' => :history_details}, {:'history-event' => :history_event_details},
|
20
20
|
:stats, :stop, :start, :restart, :actions, :action, :suspend, :eject, :stop_service, :start_service, :restart_service,
|
21
21
|
:backup, :backups, :resize, :clone, :envs, :setenv, :delenv,
|
22
|
+
:lock, :unlock, :clone_image,
|
22
23
|
:security_groups, :apply_security_groups, :run_workflow, :import_snapshot, :snapshot, :snapshots,
|
23
24
|
:console, :status_check, {:containers => :list_containers},
|
24
25
|
:scaling, {:'scaling-update' => :scaling_update},
|
@@ -603,8 +604,8 @@ class Morpheus::Cli::Instances
|
|
603
604
|
opts.on('--group GROUP', String, "Group Name or ID") do |val|
|
604
605
|
options[:group] = val
|
605
606
|
end
|
606
|
-
opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
|
607
|
-
params['labels'] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
|
607
|
+
opts.on('--labels [LIST]', String, "Labels (keywords) in the format 'foo, bar'") do |val|
|
608
|
+
params['labels'] = val.to_s.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
|
608
609
|
end
|
609
610
|
opts.on('--tags LIST', String, "Tags in the format 'name:value, name:value'. This will add and remove tags.") do |val|
|
610
611
|
options[:tags] = val
|
@@ -1350,6 +1351,7 @@ class Morpheus::Cli::Instances
|
|
1350
1351
|
"Shutdown Date" => lambda {|it| it['shutdownDate'] ? format_local_dt(it['shutdownDate']) : '' },
|
1351
1352
|
"Nodes" => lambda {|it| it['containers'] ? it['containers'].count : 0 },
|
1352
1353
|
"Connection" => lambda {|it| format_instance_connection_string(it) },
|
1354
|
+
"Locked" => lambda {|it| format_boolean(it['locked']) },
|
1353
1355
|
"Status" => lambda {|it| format_instance_status(it) }
|
1354
1356
|
}
|
1355
1357
|
description_cols.delete("Labels") if labels.nil? || labels.empty?
|
@@ -1359,6 +1361,7 @@ class Morpheus::Cli::Instances
|
|
1359
1361
|
description_cols.delete("Shutdown Date") if instance['shutdownDate'].nil?
|
1360
1362
|
description_cols["Removal Date"] = lambda {|it| format_local_dt(it['removalDate'])} if instance['status'] == 'pendingRemoval'
|
1361
1363
|
description_cols.delete("Last Deployment") if instance['lastDeploy'].nil?
|
1364
|
+
description_cols.delete("Locked") if instance['locked'] != true
|
1362
1365
|
#description_cols.delete("Environment") if instance['instanceContext'].nil?
|
1363
1366
|
print_description_list(description_cols, instance)
|
1364
1367
|
|
@@ -3888,6 +3891,117 @@ EOT
|
|
3888
3891
|
return 0
|
3889
3892
|
end
|
3890
3893
|
|
3894
|
+
def clone_image(args)
|
3895
|
+
options = {}
|
3896
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
3897
|
+
opts.banner = subcommand_usage("[instance]")
|
3898
|
+
opts.on( '--name VALUE', String, "Image Name (Template Name). Default is server name + timestamp" ) do |val|
|
3899
|
+
options[:options]['templateName'] = val
|
3900
|
+
end
|
3901
|
+
build_standard_update_options(opts, options)
|
3902
|
+
opts.footer = <<-EOT
|
3903
|
+
Clone to image (template) for an instance
|
3904
|
+
[instance] is required. This is the name or id of an instance
|
3905
|
+
EOT
|
3906
|
+
end
|
3907
|
+
optparse.parse!(args)
|
3908
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
3909
|
+
connect(options)
|
3910
|
+
instance = find_instance_by_name_or_id(args[0])
|
3911
|
+
return 1 if instance.nil?
|
3912
|
+
payload = {}
|
3913
|
+
if options[:payload]
|
3914
|
+
payload = options[:payload]
|
3915
|
+
payload.deep_merge!(parse_passed_options(options))
|
3916
|
+
else
|
3917
|
+
payload.deep_merge!(parse_passed_options(options))
|
3918
|
+
if payload['templateName'].nil?
|
3919
|
+
v_prompt = Morpheus::Cli::OptionTypes.prompt([{'fieldName' => 'templateName', 'type' => 'text', 'fieldLabel' => 'Image Name', 'description' => 'Choose a name for the new image template. Default is the server name + timestamp'}], options[:options])
|
3920
|
+
if v_prompt['templateName'].to_s != ''
|
3921
|
+
payload['templateName'] = v_prompt['templateName']
|
3922
|
+
end
|
3923
|
+
end
|
3924
|
+
end
|
3925
|
+
@instances_interface.setopts(options)
|
3926
|
+
if options[:dry_run]
|
3927
|
+
print_dry_run @instances_interface.dry.clone_image(instance['id'], payload)
|
3928
|
+
return
|
3929
|
+
end
|
3930
|
+
json_response = @instances_interface.clone_image(instance['id'], payload)
|
3931
|
+
render_response(json_response, options) do
|
3932
|
+
print_green_success "Clone Image initiated."
|
3933
|
+
end
|
3934
|
+
return 0, nil
|
3935
|
+
end
|
3936
|
+
|
3937
|
+
def lock(args)
|
3938
|
+
options = {}
|
3939
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
3940
|
+
opts.banner = subcommand_usage("[instance]")
|
3941
|
+
build_standard_update_options(opts, options)
|
3942
|
+
opts.footer = <<-EOT
|
3943
|
+
Lock an instance
|
3944
|
+
[instance] is required. This is the name or id of an instance
|
3945
|
+
EOT
|
3946
|
+
end
|
3947
|
+
optparse.parse!(args)
|
3948
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
3949
|
+
connect(options)
|
3950
|
+
instance = find_instance_by_name_or_id(args[0])
|
3951
|
+
return 1 if instance.nil?
|
3952
|
+
payload = {}
|
3953
|
+
if options[:payload]
|
3954
|
+
payload = options[:payload]
|
3955
|
+
payload.deep_merge!(parse_passed_options(options))
|
3956
|
+
else
|
3957
|
+
payload.deep_merge!(parse_passed_options(options))
|
3958
|
+
end
|
3959
|
+
@instances_interface.setopts(options)
|
3960
|
+
if options[:dry_run]
|
3961
|
+
print_dry_run @instances_interface.dry.lock(instance['id'], payload)
|
3962
|
+
return
|
3963
|
+
end
|
3964
|
+
json_response = @instances_interface.lock(instance['id'], payload)
|
3965
|
+
render_response(json_response, options) do
|
3966
|
+
print_green_success "Locked instance #{instance['name']}"
|
3967
|
+
end
|
3968
|
+
return 0, nil
|
3969
|
+
end
|
3970
|
+
|
3971
|
+
def unlock(args)
|
3972
|
+
options = {}
|
3973
|
+
optparse = Morpheus::Cli::OptionParser.new do |opts|
|
3974
|
+
opts.banner = subcommand_usage("[instance]")
|
3975
|
+
build_standard_update_options(opts, options)
|
3976
|
+
opts.footer = <<-EOT
|
3977
|
+
Unlock an instance
|
3978
|
+
[instance] is required. This is the name or id of an instance
|
3979
|
+
EOT
|
3980
|
+
end
|
3981
|
+
optparse.parse!(args)
|
3982
|
+
verify_args!(args:args, optparse:optparse, count:1)
|
3983
|
+
connect(options)
|
3984
|
+
instance = find_instance_by_name_or_id(args[0])
|
3985
|
+
return 1 if instance.nil?
|
3986
|
+
payload = {}
|
3987
|
+
if options[:payload]
|
3988
|
+
payload = options[:payload]
|
3989
|
+
payload.deep_merge!(parse_passed_options(options))
|
3990
|
+
else
|
3991
|
+
payload.deep_merge!(parse_passed_options(options))
|
3992
|
+
end
|
3993
|
+
@instances_interface.setopts(options)
|
3994
|
+
if options[:dry_run]
|
3995
|
+
print_dry_run @instances_interface.dry.unlock(instance['id'], payload)
|
3996
|
+
return
|
3997
|
+
end
|
3998
|
+
json_response = @instances_interface.unlock(instance['id'], payload)
|
3999
|
+
render_response(json_response, options) do
|
4000
|
+
print_green_success "Unlocked instance #{instance['name']}"
|
4001
|
+
end
|
4002
|
+
return 0, nil
|
4003
|
+
end
|
4004
|
+
|
3891
4005
|
private
|
3892
4006
|
|
3893
4007
|
def find_zone_by_name_or_id(group_id, val)
|
data/lib/morpheus/cli/version.rb
CHANGED
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: morpheus-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 5.2.
|
4
|
+
version: 5.2.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- David Estes
|
@@ -11,7 +11,7 @@ authors:
|
|
11
11
|
autorequire:
|
12
12
|
bindir: bin
|
13
13
|
cert_chain: []
|
14
|
-
date:
|
14
|
+
date: 2021-01-12 00:00:00.000000000 Z
|
15
15
|
dependencies:
|
16
16
|
- !ruby/object:Gem::Dependency
|
17
17
|
name: bundler
|