morpheus-cli 5.3.3 → 5.3.4

Sign up to get free protection for your applications and to get access to all the features.
Files changed (35) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +1 -1
  3. data/lib/morpheus/api/api_client.rb +12 -0
  4. data/lib/morpheus/api/clouds_interface.rb +4 -11
  5. data/lib/morpheus/api/load_balancer_pools_interface.rb +4 -4
  6. data/lib/morpheus/api/load_balancer_profiles_interface.rb +10 -0
  7. data/lib/morpheus/api/load_balancer_virtual_servers_interface.rb +4 -4
  8. data/lib/morpheus/api/network_routers_interface.rb +21 -0
  9. data/lib/morpheus/api/network_servers_interface.rb +42 -0
  10. data/lib/morpheus/api/rest_interface.rb +2 -1
  11. data/lib/morpheus/api/virtual_servers_interface.rb +9 -0
  12. data/lib/morpheus/cli/cli_command.rb +2 -1
  13. data/lib/morpheus/cli/cloud_resource_pools_command.rb +1 -1
  14. data/lib/morpheus/cli/clouds.rb +22 -40
  15. data/lib/morpheus/cli/hosts.rb +0 -1
  16. data/lib/morpheus/cli/instances.rb +111 -7
  17. data/lib/morpheus/cli/invoices_command.rb +42 -38
  18. data/lib/morpheus/cli/library_option_lists_command.rb +3 -3
  19. data/lib/morpheus/cli/load_balancer_pools.rb +111 -0
  20. data/lib/morpheus/cli/load_balancer_virtual_servers.rb +136 -0
  21. data/lib/morpheus/cli/load_balancers.rb +0 -155
  22. data/lib/morpheus/cli/mixins/load_balancers_helper.rb +2 -2
  23. data/lib/morpheus/cli/mixins/provisioning_helper.rb +32 -11
  24. data/lib/morpheus/cli/mixins/rest_command.rb +53 -37
  25. data/lib/morpheus/cli/mixins/secondary_rest_command.rb +488 -0
  26. data/lib/morpheus/cli/network_routers_command.rb +291 -7
  27. data/lib/morpheus/cli/network_scopes_command.rb +442 -0
  28. data/lib/morpheus/cli/networks_command.rb +2 -2
  29. data/lib/morpheus/cli/option_types.rb +20 -0
  30. data/lib/morpheus/cli/subnets_command.rb +7 -2
  31. data/lib/morpheus/cli/tasks.rb +25 -2
  32. data/lib/morpheus/cli/version.rb +1 -1
  33. data/lib/morpheus/cli/virtual_images.rb +2 -0
  34. data/lib/morpheus/cli.rb +9 -1
  35. metadata +9 -2
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: ca7c939828b8f72ee86c663a19d01743a56d5c6c209cecc5e17b44046caeb484
4
- data.tar.gz: e13fccbf1a45e8980e818e4cc1f0dba98d65e405c79f5d90e13c33341ad2e514
3
+ metadata.gz: 7e1172b58bb99b6348f15121c97f5c3d8db818c25fa977cd33835f7a3645da44
4
+ data.tar.gz: bd216d539aadf61f968cee0dabb6d36361bd79dbdd4ac86527a80872f64620ec
5
5
  SHA512:
6
- metadata.gz: 5965b1af85499cadcae249f3109b6fd0ea4bee6af38192196fd6091bdcdb452f75c1f4025f372ec3d5f47ab1531e04acbf5fb2ed17848ba023087c309fdd06ee
7
- data.tar.gz: 56bc2124de4e6b28c0c4484b5fa40beef19287708edd98ee1fdddbe334bc7854b853153209d1531793502aa8034d1c8ccf9fca643ec13aebf3eb8353cdd1f72e
6
+ metadata.gz: 24e82961eae144b2b9a00f555313ae653b6c1f844a9be549553481c7e91789011858075acfc76efabfeb3a503f211f4ddc76c79a8a33cff1d4bf07a355179753
7
+ data.tar.gz: 0cf97e82534466142e81d7a20ff7672578de00179cfab36a1e94e6900a24193090e1dd1c91d6c6d409000ac92623ed06ae9e6f5f346937c2912b42b5fedac561
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  FROM ruby:2.5.1
2
2
 
3
- RUN gem install morpheus-cli -v 5.3.3
3
+ RUN gem install morpheus-cli -v 5.3.4
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
@@ -486,6 +486,10 @@ class Morpheus::APIClient
486
486
  Morpheus::LoadBalancerPoolsInterface.new(common_interface_options).setopts(@options)
487
487
  end
488
488
 
489
+ def virtual_servers
490
+ Morpheus::VirtualServersInterface.new(common_interface_options).setopts(@options)
491
+ end
492
+
489
493
  def tasks
490
494
  Morpheus::TasksInterface.new(common_interface_options).setopts(@options)
491
495
  end
@@ -836,6 +840,14 @@ class Morpheus::APIClient
836
840
  Morpheus::VdiGatewaysInterface.new(common_interface_options).setopts(@options)
837
841
  end
838
842
 
843
+ def network_servers
844
+ Morpheus::NetworkServersInterface.new(common_interface_options).setopts(@options)
845
+ end
846
+
847
+ def rest(endpoint)
848
+ Morpheus::RestInterface.new(common_interface_options).setopts(@options.merge({base_path: "#{@base_url}/api/#{endpoint}"}))
849
+ end
850
+
839
851
  # add new interfaces here
840
852
 
841
853
  protected
@@ -24,17 +24,10 @@ class Morpheus::CloudsInterface < Morpheus::APIClient
24
24
  execute(opts)
25
25
  end
26
26
 
27
- def get(params=nil)
28
- url = "#{@base_url}/api/zones"
29
- headers = { params: {}, authorization: "Bearer #{@access_token}" }
30
-
31
- if params.is_a?(Hash)
32
- headers[:params].merge!(params)
33
- elsif params.is_a?(Numeric)
34
- url = "#{@base_url}/api/zones/#{params}"
35
- elsif params.is_a?(String)
36
- headers[:params]['name'] = params
37
- end
27
+ def get(id, params={})
28
+ validate_id!(id)
29
+ url = "#{@base_url}/api/zones/#{id}"
30
+ headers = { params: params, authorization: "Bearer #{@access_token}" }
38
31
  opts = {method: :get, url: url, headers: headers}
39
32
  execute(opts)
40
33
  end
@@ -1,9 +1,9 @@
1
- require 'morpheus/api/secondary_rest_interface'
1
+ require 'morpheus/api/rest_interface'
2
2
 
3
- class Morpheus::LoadBalancerPoolsInterface < Morpheus::SecondaryRestInterface
3
+ class Morpheus::LoadBalancerPoolsInterface < Morpheus::RestInterface
4
4
 
5
- def base_path(load_balancer_id)
6
- "/api/load-balancers/#{load_balancer_id}/pools"
5
+ def base_path
6
+ "/api/load-balancer-pools"
7
7
  end
8
8
 
9
9
  end
@@ -0,0 +1,10 @@
1
+ require 'morpheus/api/rest_interface'
2
+
3
+ class Morpheus::LoadBalancerProfilesInterface < Morpheus::RestInterface
4
+
5
+ def base_path
6
+ "/api/load-balancer-profiles"
7
+ end
8
+
9
+ end
10
+
@@ -1,9 +1,9 @@
1
- require 'morpheus/api/secondary_rest_interface'
1
+ require 'morpheus/api/rest_interface'
2
2
 
3
- class Morpheus::LoadBalancerVirtualServersInterface < Morpheus::SecondaryRestInterface
3
+ class Morpheus::LoadBalancerVirtualServersInterface < Morpheus::RestInterface
4
4
 
5
- def base_path(load_balancer_id)
6
- "/api/load-balancers/#{load_balancer_id}/virtual-servers"
5
+ def base_path
6
+ "/api/load-balancer-virtual-servers"
7
7
  end
8
8
 
9
9
  end
@@ -143,6 +143,27 @@ class Morpheus::NetworkRoutersInterface < Morpheus::APIClient
143
143
  execute(opts)
144
144
  end
145
145
 
146
+ def create_bgp_neighbor(router_id, payload={})
147
+ url = "#{@base_url}/api/networks/routers/#{router_id}/bgp-neighbors"
148
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
149
+ opts = {method: :post, url: url, headers: headers, payload: payload.to_json}
150
+ execute(opts)
151
+ end
152
+
153
+ def update_bgp_neighbor(router_id, nat_id, payload={})
154
+ url = "#{@base_url}/api/networks/routers/#{router_id}/bgp-neighbors/#{nat_id}"
155
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
156
+ opts = {method: :put, url: url, headers: headers, payload: payload.to_json}
157
+ execute(opts)
158
+ end
159
+
160
+ def destroy_bgp_neighbor(router_id, nat_id, payload={})
161
+ url = "#{@base_url}/api/networks/routers/#{router_id}/bgp-neighbors/#{nat_id}"
162
+ headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
163
+ opts = {method: :delete, url: url, headers: headers, payload: payload.to_json}
164
+ execute(opts)
165
+ end
166
+
146
167
  def update_permissions(router_id, payload)
147
168
  url = "#{@base_url}/api/networks/routers/#{router_id}/permissions"
148
169
  headers = { :authorization => "Bearer #{@access_token}", 'Content-Type' => 'application/json' }
@@ -0,0 +1,42 @@
1
+ require 'morpheus/api/api_client'
2
+
3
+ class Morpheus::NetworkServersInterface < Morpheus::RestInterface
4
+
5
+ def base_path
6
+ "/api/networks/servers"
7
+ end
8
+
9
+ def list_scopes(server_id, params={}, headers={})
10
+ validate_id!(server_id)
11
+ execute(method: :get, url: "#{base_path}/#{server_id}/scopes", params: params, headers: headers)
12
+ end
13
+
14
+ def get_scope(server_id, scope_id, params={}, headers={})
15
+ validate_id!(server_id)
16
+ validate_id!(scope_id)
17
+ execute(method: :get, url: "#{base_path}/#{server_id}/scopes/#{scope_id}", params: params, headers: headers)
18
+ end
19
+
20
+ def create_scope(server_id, payload, params={}, headers={})
21
+ validate_id!(server_id)
22
+ execute(method: :post, url: "#{base_path}/#{server_id}/scopes", params: params, payload: payload, headers: headers)
23
+ end
24
+
25
+ def update_scope(server_id, scope_id, payload, params={}, headers={})
26
+ validate_id!(server_id)
27
+ validate_id!(scope_id)
28
+ execute(method: :put, url: "#{base_path}/#{server_id}/scopes/#{scope_id}", params: params, payload: payload, headers: headers)
29
+ end
30
+
31
+ def destroy_scope(server_id, scope_id, params={}, headers={})
32
+ validate_id!(server_id)
33
+ validate_id!(scope_id)
34
+ execute(method: :delete, url: "#{base_path}/#{server_id}/scopes/#{scope_id}", params: params, headers: headers)
35
+ end
36
+
37
+ def update_scope_permissions(server_id, scope_id, payload, params={}, headers={})
38
+ validate_id!(server_id)
39
+ validate_id!(scope_id)
40
+ execute(method: :put, url: "#{base_path}/#{server_id}/scopes/#{scope_id}", payload: payload.to_json, params: params, headers: headers)
41
+ end
42
+ end
@@ -7,7 +7,8 @@ class Morpheus::RestInterface < Morpheus::APIClient
7
7
  # subclasses should override in your interface
8
8
  # Example: "/api/things"
9
9
  def base_path
10
- raise "#{self.class} has not defined base_path!"
10
+ raise "#{self.class} has not defined base_path!" if @options[:base_path].nil?
11
+ @options[:base_path]
11
12
  end
12
13
 
13
14
  def list(params={}, headers={})
@@ -0,0 +1,9 @@
1
+ require 'morpheus/api/rest_interface'
2
+
3
+ class Morpheus::VirtualServersInterface < Morpheus::RestInterface
4
+
5
+ def base_path
6
+ "/api/load-balancer-virtual-servers"
7
+ end
8
+
9
+ end
@@ -215,7 +215,8 @@ module Morpheus
215
215
  opts.on(arg1, arg2, description) do |val|
216
216
  if option_type['type'] == 'checkbox'
217
217
  val = (val.to_s != 'false' && val.to_s != 'off')
218
- else
218
+ elsif option_type['dataType'] != 'string'
219
+ # 'dataType': 'string' added to cli to avoid auto conversion to JSON
219
220
  # attempt to parse JSON, this allows blank arrays for multiSelect like --tenants []
220
221
  if (val.to_s[0] == '{' && val.to_s[-1] == '}') || (val.to_s[0] == '[' && val.to_s[-1] == ']')
221
222
  begin
@@ -819,7 +819,7 @@ class Morpheus::Cli::CloudResourcePoolsCommand
819
819
  print_red_alert "Resource Pool not found by name #{name}"
820
820
  return nil
821
821
  elsif resource_pools.size > 1
822
- matching_resource_pools = folders.select { |it| name && (it['name'] == name || it['externalId'] == name) }
822
+ matching_resource_pools = resource_pools.select { |it| name && (it['name'] == name || it['externalId'] == name) }
823
823
  if matching_resource_pools.size == 1
824
824
  return matching_resource_pools[0]
825
825
  end
@@ -27,8 +27,6 @@ class Morpheus::Cli::Clouds
27
27
  @clouds_interface = @api_client.clouds
28
28
  @groups_interface = @api_client.groups
29
29
  @active_group_id = Morpheus::Cli::Groups.active_groups[@appliance_name]
30
- # preload stuff
31
- get_available_cloud_types()
32
30
  end
33
31
 
34
32
  def handle(args)
@@ -134,38 +132,36 @@ class Morpheus::Cli::Clouds
134
132
 
135
133
  def get(args)
136
134
  options = {}
135
+ params = {}
137
136
  optparse = Morpheus::Cli::OptionParser.new do |opts|
138
137
  opts.banner = subcommand_usage("[name]")
139
- build_common_options(opts, options, [:json, :yaml, :csv, :fields, :dry_run, :remote])
138
+ build_standard_list_options(opts, options)
140
139
  opts.footer = "Get details about a cloud.\n" +
141
140
  "[name] is required. This is the name or id of a cloud."
142
141
  end
143
142
  optparse.parse!(args)
144
- if args.count < 1
145
- puts optparse
146
- exit 1
147
- end
143
+ verify_args!(args:args, optparse:optparse, min:1)
148
144
  connect(options)
145
+ params.merge!(parse_query_options(options))
149
146
  id_list = parse_id_list(args)
150
147
  return run_command_for_each_arg(id_list) do |arg|
151
- _get(arg, options)
148
+ _get(arg, params, options)
152
149
  end
153
150
  end
154
151
 
155
- def _get(arg, options={})
156
- begin
157
- if options[:dry_run]
158
- @clouds_interface.setopts(options)
159
- if arg.to_s =~ /\A\d{1,}\Z/
160
- print_dry_run @clouds_interface.dry.get(arg.to_i)
161
- else
162
- print_dry_run @clouds_interface.dry.list({name:arg})
163
- end
164
- return
165
- end
166
- cloud = find_cloud_by_name_or_id(arg)
167
- @clouds_interface.setopts(options)
168
- json_response = @clouds_interface.get(cloud['id'])
152
+ def _get(id, params, options={})
153
+ cloud = nil
154
+ if id.to_s !~ /\A\d{1,}\Z/
155
+ cloud = find_cloud_by_name_or_id(id)
156
+ id = cloud['id']
157
+ end
158
+ @clouds_interface.setopts(options)
159
+ if options[:dry_run]
160
+ print_dry_run @clouds_interface.dry.get(id.to_i, params)
161
+ return
162
+ end
163
+ json_response = @clouds_interface.get(id, params)
164
+ render_response(json_response, options, 'zone') do
169
165
  cloud = json_response['zone']
170
166
  cloud_stats = cloud['stats']
171
167
  # serverCounts moved to zone.stats.serverCounts
@@ -175,17 +171,6 @@ class Morpheus::Cli::Clouds
175
171
  else
176
172
  server_counts = json_response['serverCounts'] # legacy
177
173
  end
178
- if options[:json]
179
- puts as_json(json_response, options, 'zone')
180
- return 0
181
- elsif options[:yaml]
182
- puts as_yaml(json_response, options, 'zone')
183
- return 0
184
- end
185
- if options[:csv]
186
- puts records_as_csv([json_response['zone']], options)
187
- return 0
188
- end
189
174
  cloud_type = cloud_type_for_id(cloud['zoneTypeId'])
190
175
  print_h1 "Cloud Details"
191
176
  print cyan
@@ -195,6 +180,7 @@ class Morpheus::Cli::Clouds
195
180
  "Type" => lambda {|it| cloud_type ? cloud_type['name'] : '' },
196
181
  "Code" => 'code',
197
182
  "Location" => 'location',
183
+ "Region Code" => 'regionCode',
198
184
  "Visibility" => lambda {|it| it['visibility'].to_s.capitalize },
199
185
  "Groups" => lambda {|it| it['groups'].collect {|g| g.instance_of?(Hash) ? g['name'] : g.to_s }.join(', ') },
200
186
  #"Owner" => lambda {|it| it['owner'].instance_of?(Hash) ? it['owner']['name'] : it['ownerId'] },
@@ -214,14 +200,9 @@ class Morpheus::Cli::Clouds
214
200
  print "Unmanaged: #{server_counts['unmanaged']}".center(20)
215
201
  print "\n"
216
202
  end
217
-
218
203
  print reset,"\n"
219
-
220
- #puts instance
221
- rescue RestClient::Exception => e
222
- print_rest_exception(e, options)
223
- exit 1
224
204
  end
205
+ return 0, nil
225
206
  end
226
207
 
227
208
  def add(args)
@@ -954,13 +935,14 @@ class Morpheus::Cli::Clouds
954
935
  name: cloud['name'],
955
936
  type: cloud_type ? cloud_type['name'] : '',
956
937
  location: cloud['location'],
938
+ "REGION CODE": cloud['regionCode'],
957
939
  groups: (cloud['groups'] || []).collect {|it| it.instance_of?(Hash) ? it['name'] : it.to_s }.join(', '),
958
940
  servers: cloud['serverCount'],
959
941
  status: format_cloud_status(cloud)
960
942
  }
961
943
  end
962
944
  columns = [
963
- :id, :name, :type, :location, :groups, :servers, :status
945
+ :id, :name, :type, :location, "REGION CODE", :groups, :servers, :status
964
946
  ]
965
947
  print as_pretty_table(rows, columns, opts)
966
948
  end
@@ -553,7 +553,6 @@ class Morpheus::Cli::Hosts
553
553
  server_columns.delete("Cost") if server['hourlyCost'].to_f == 0
554
554
  server_columns.delete("Price") if server['hourlyPrice'].to_f == 0 || server['hourlyPrice'] == server['hourlyCost']
555
555
  server_columns.delete("Labels") if server['labels'].nil? || server['labels'].empty?
556
- server_columns.delete("Tags") if tags.nil? || tags.empty?
557
556
 
558
557
  print_description_list(server_columns, server)
559
558
 
@@ -1365,7 +1365,6 @@ class Morpheus::Cli::Instances
1365
1365
  "Status" => lambda {|it| format_instance_status(it) }
1366
1366
  }
1367
1367
  description_cols.delete("Labels") if labels.nil? || labels.empty?
1368
- description_cols.delete("Tags") if tags.nil? || tags.empty?
1369
1368
  description_cols.delete("Apps") if instance['apps'].nil? || instance['apps'].empty?
1370
1369
  description_cols.delete("Power Schedule") if instance['powerSchedule'].nil?
1371
1370
  description_cols.delete("Expire Date") if instance['expireDate'].nil?
@@ -1694,19 +1693,77 @@ class Morpheus::Cli::Instances
1694
1693
  options = {:options => {}}
1695
1694
  optparse = Morpheus::Cli::OptionParser.new do |opts|
1696
1695
  opts.banner = subcommand_usage("[instance] -g GROUP")
1697
- opts.on('--name VALUE', String, "Name") do |val|
1698
- options[:options]['name'] = val
1699
- end
1700
1696
  opts.on( '-g', '--group GROUP', "Group Name or ID for the new instance" ) do |val|
1701
1697
  options[:group] = val
1702
1698
  end
1703
1699
  opts.on( '-c', '--cloud CLOUD', "Cloud Name or ID for the new instance" ) do |val|
1704
1700
  options[:cloud] = val
1705
1701
  end
1702
+ opts.on('--name VALUE', String, "Name") do |val|
1703
+ options[:options]['name'] = val
1704
+ end
1705
+ opts.on("--description [TEXT]", String, "Description") do |val|
1706
+ options[:description] = val.to_s
1707
+ end
1708
+ opts.on("--environment ENV", String, "Environment code") do |val|
1709
+ options[:environment] = val.to_s
1710
+ end
1711
+ opts.on('--tags LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
1712
+ options[:metadata] = val
1713
+ end
1714
+ opts.on('--metadata LIST', String, "Metadata tags in the format 'ping=pong,flash=bang'") do |val|
1715
+ options[:metadata] = val
1716
+ end
1717
+ opts.add_hidden_option('--metadata')
1718
+ opts.on('--labels LIST', String, "Labels (keywords) in the format 'foo, bar'") do |val|
1719
+ options[:labels] = val.split(',').collect {|it| it.to_s.strip }.compact.uniq.join(',')
1720
+ end
1721
+ # opts.on("--copies NUMBER", Integer, "Number of copies to provision") do |val|
1722
+ # options[:copies] = val.to_i
1723
+ # end
1724
+ # opts.on("--layout-size NUMBER", Integer, "Apply a multiply factor of containers/vms within the instance") do |val|
1725
+ # options[:layout_size] = val.to_i
1726
+ # end
1727
+ # opts.on( '-l', '--layout LAYOUT', "Layout ID" ) do |val|
1728
+ # options[:layout] = val
1729
+ # end
1730
+ opts.on( '-p', '--plan PLAN', "Service plan ID") do |val|
1731
+ options[:service_plan] = val
1732
+ end
1733
+ opts.on( '--resource-pool ID', String, "Resource pool ID" ) do |val|
1734
+ options[:resource_pool] = val
1735
+ end
1736
+ opts.on("--workflow ID", String, "Automation: Workflow ID") do |val|
1737
+ options[:workflow_id] = val
1738
+ end
1739
+ opts.on("--ports ARRAY", String, "Exposed Ports, JSON formatted list of objects containing name and port") do |val|
1740
+ # expects format like --ports '[{"name":"web","port":8080}]'
1741
+ ports_array = JSON.parse(val)
1742
+ options[:ports] = ports_array
1743
+ options[:options]['ports'] = ports_array
1744
+ end
1745
+ # opts.on('-L', "--lb", "Enable Load Balancer") do
1746
+ # options[:enable_load_balancer] = true
1747
+ # end
1706
1748
  opts.on("--create-user on|off", String, "User Config: Create Your User. Default is on") do |val|
1707
1749
  options[:create_user] = !['false','off','0'].include?(val.to_s)
1708
1750
  end
1709
- build_common_options(opts, options, [:options, :payload, :auto_confirm, :json, :dry_run, :remote])
1751
+ opts.on("--user-group USERGROUP", String, "User Config: User Group") do |val|
1752
+ options[:user_group_id] = val
1753
+ end
1754
+ opts.on("--shutdown-days DAYS", Integer, "Automation: Shutdown Days") do |val|
1755
+ options[:shutdown_days] = val.to_i
1756
+ end
1757
+ opts.on("--expire-days DAYS", Integer, "Automation: Expiration Days") do |val|
1758
+ options[:expire_days] = val.to_i
1759
+ end
1760
+ opts.on("--create-backup [on|off]", String, "Automation: Create Backups.") do |val|
1761
+ options[:create_backup] = ['on','true','1',''].include?(val.to_s.downcase) ? 'on' : 'off'
1762
+ end
1763
+ opts.on("--security-groups LIST", String, "Security Groups, comma separated list of security group IDs") do |val|
1764
+ options[:security_groups] = val.split(",").collect {|s| s.strip }.select {|s| !s.to_s.empty? }
1765
+ end
1766
+ build_standard_post_options(opts, options, [:auto_confirm])
1710
1767
  end
1711
1768
  optparse.parse!(args)
1712
1769
  if args.count < 1 || args.count > 2
@@ -1724,12 +1781,20 @@ class Morpheus::Cli::Instances
1724
1781
 
1725
1782
  # defaults derived from clone
1726
1783
  options[:default_name] = instance['name'] + '-clone' if instance['name']
1784
+ options[:default_description] = instance['description'] if !instance['description'].to_s.empty?
1785
+ options[:default_environment] = instance['environment'] if instance['environment']
1727
1786
  options[:default_group] = instance['group']['id'] if instance['group']
1728
1787
  options[:default_cloud] = instance['cloud']['name'] if instance['cloud']
1729
1788
  options[:default_plan] = instance['plan']['name'] if instance['plan']
1730
1789
  options[:default_resource_pool] = instance['config']['resourcePoolId'] if instance['config']
1731
1790
  options[:default_config] = instance['config']
1732
1791
  options[:default_security_group] = instance['config']['securityGroups'][0]['id'] if instance['config'] && (instance['config']['securityGroups'] || []).count > 0
1792
+ if instance['labels'] && !instance['labels'].empty?
1793
+ options[:default_labels] = (instance['labels'] || []).join(',')
1794
+ end
1795
+ if instance['tags'] && !instance['tags'].empty?
1796
+ options[:current_tags] = instance['tags']
1797
+ end
1733
1798
 
1734
1799
  # immutable derived from clone
1735
1800
  options[:instance_type_code] = instance['instanceType']['code'] if instance['instanceType']
@@ -1767,13 +1832,52 @@ class Morpheus::Cli::Instances
1767
1832
  payload.deep_merge!(passed_options)
1768
1833
  end
1769
1834
 
1835
+ #payload['instance'] ||= {}
1836
+ # if options[:instance_name]
1837
+ # payload['instance']['name'] = options[:instance_name]
1838
+ # end
1839
+ # if options[:description] && !payload['instance']['description']
1840
+ # payload['instance']['description'] = options[:description]
1841
+ # end
1842
+ # if options[:environment] && !payload['instance']['instanceContext']
1843
+ # payload['instance']['instanceContext'] = options[:environment]
1844
+ # end
1845
+
1846
+ #payload[:copies] = options[:copies] if options[:copies] && options[:copies] > 0
1847
+ if options[:layout_size] && options[:layout_size] > 0 # aka Scale Factor
1848
+ payload[:layoutSize] = options[:layout_size]
1849
+ end
1850
+ if !options[:create_backup].nil?
1851
+ payload[:createBackup] = options[:create_backup]
1852
+ end
1853
+ if options[:expire_days]
1854
+ payload['instance'] ||= {}
1855
+ payload['instance']['expireDays'] = options[:expire_days]
1856
+ end
1857
+ if options[:shutdown_days]
1858
+ payload['instance'] ||= {}
1859
+ payload['shutdownDays'] = options[:shutdown_days]
1860
+ end
1770
1861
  # JD: this actually fixed a customer problem
1771
1862
  # It appears to be important to pass this... not sure if config.createUser is necessary...
1772
1863
  if options[:create_user].nil?
1773
1864
  options[:create_user] = true
1774
1865
  end
1775
- if options[:create_user] != nil
1776
- payload.deep_merge!({'createUser' => options[:create_user], 'config' =>{'createUser' => options[:create_user]}})
1866
+ if options.key?(:create_user)
1867
+ payload['config'] ||= {}
1868
+ payload['config']['createUser'] = options[:create_user]
1869
+ payload['createUser'] = options[:create_user]
1870
+ end
1871
+ if options[:user_group_id]
1872
+ payload['instance'] ||= {}
1873
+ payload['instance']['userGroup'] = {'id' => options[:user_group_id] }
1874
+ end
1875
+ if options[:workflow_id]
1876
+ if options[:workflow_id].to_s =~ /\A\d{1,}\Z/
1877
+ payload['taskSetId'] = options[:workflow_id].to_i
1878
+ else
1879
+ payload['taskSetName'] = options[:workflow_id]
1880
+ end
1777
1881
  end
1778
1882
  unless options[:yes] || ::Morpheus::Cli::OptionTypes::confirm("Are you sure you would like to clone the instance #{instance['name']} as '#{payload['name']}'?", options)
1779
1883
  return 9, "aborted command"