morpheus-cli 6.1.1 → 6.1.2

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3cf8719e8fbab69a6e0de10b9d2920b0394bb55d4928ba4266b82c9430f53658
4
- data.tar.gz: a518e58f7b2adc050e786ca6f29e0f7832787e5c294c495d5599960f7232aacc
3
+ metadata.gz: 683efa948a958a0fb4a6def11cb94ae525bdde8cbde0ba1d1aa313adeef3387d
4
+ data.tar.gz: c19c0522892a7f96a8398811b89ea4324815f4494011bf6696be1fb362787304
5
5
  SHA512:
6
- metadata.gz: 30263a5621c68dc42d8bb1093c67c21a27eab9c440bd12848a345ddee7200d45d8744531418dd9b936529405623a7c464d44b957503903ac0fc1e2bb462b431a
7
- data.tar.gz: 2bc5e8dc185195a1dc470394d487b1c970c1c8626701803636441ae84a6f138352dcafd07481d39a151c24911a05526dfa8748882ee7b1b48f57c02bba584e54
6
+ metadata.gz: a1b269a981ec0fcbeecbad62a91ba90f6e7429c26593579185a0a513d0ab5ea5e2394ab11d7bf138570314a418059b6a072e47fb04b0393010dc0f66a463db54
7
+ data.tar.gz: 3c211238b4a2dae07c4da54659be1c43e9f0cf7aaf25f7bbfcf53f0c6a0482b43b87b44db541287dfd7201228902902e80c0a1b4a5b538207f3303174940cff9
data/Dockerfile CHANGED
@@ -1,5 +1,5 @@
1
1
  FROM ruby:2.7.5
2
2
 
3
- RUN gem install morpheus-cli -v 6.1.1
3
+ RUN gem install morpheus-cli -v 6.1.2
4
4
 
5
5
  ENTRYPOINT ["morpheus"]
@@ -336,10 +336,6 @@ class Morpheus::APIClient
336
336
  }
337
337
  end
338
338
 
339
- def doc
340
- Morpheus::DocInterface.new(common_interface_options).setopts(@options)
341
- end
342
-
343
339
  def ping
344
340
  Morpheus::PingInterface.new(common_interface_options).setopts(@options)
345
341
  end
@@ -599,6 +599,9 @@ class Morpheus::Cli::Instances
599
599
  optparse = Morpheus::Cli::OptionParser.new do |opts|
600
600
  opts.banner = subcommand_usage("[instance]")
601
601
  opts.on('--name VALUE', String, "Name") do |val|
602
+ params['name'] = val
603
+ end
604
+ opts.on('--displayName VALUE', String, "Name") do |val|
602
605
  params['displayName'] = val
603
606
  end
604
607
  opts.on('--description VALUE', String, "Description") do |val|
@@ -1400,6 +1403,7 @@ class Morpheus::Cli::Instances
1400
1403
  description_cols = {
1401
1404
  "ID" => 'id',
1402
1405
  "Name" => 'name',
1406
+ "Display Name" => 'displayName',
1403
1407
  "Description" => 'description',
1404
1408
  "Group" => lambda {|it| it['group'] ? it['group']['name'] : '' },
1405
1409
  "Cloud" => lambda {|it| it['cloud'] ? it['cloud']['name'] : '' },
@@ -5423,6 +5427,7 @@ private
5423
5427
  def add_instance_schedule_option_types()
5424
5428
  [
5425
5429
  {'code' => 'scheduleType', 'fieldName' => 'scheduleType', 'fieldLabel' => 'Schedule Type', 'type' => 'select', 'selectOptions' => [{'name'=>'Day Of Week', 'value'=>'dayOfWeek'},{'name'=>'Exact', 'value'=>'exact'}], 'description' => "Schedule type can be recurring day of the week str or exact start and end timestamp", 'required' => true, 'defaultValue' => 'dayOfWeek'},
5430
+ {'dependsOnCode' => 'scheduleType:dayOfWeek', 'fieldName' => 'scheduleTimezone', 'fieldLabel' => 'Timezone', 'type' => 'select', 'optionSource' => 'timezones' , 'description' => "The timezone", 'defaultValue' => "UTC", 'required' => false},
5426
5431
  {'dependsOnCode' => 'scheduleType:dayOfWeek', 'fieldName' => 'startDayOfWeek', 'fieldLabel' => 'Start Day Of Week', 'type' => 'select', 'selectOptions' => day_of_week_dropdown, 'description' => "Start day of the week Sunday-Saturday (1-7)", 'defaultValue' => "Sunday", 'required' => true},
5427
5432
  {'dependsOnCode' => 'scheduleType:dayOfWeek', 'fieldName' => 'startTime', 'fieldLabel' => 'Start Time (HH:MM)', 'type' => 'text', 'description' => "Start time in HH:MM 24-hour format", 'placeHolder' => 'HH:MM', 'defaultValue' => "01:00", 'required' => true},
5428
5433
  {'dependsOnCode' => 'scheduleType:dayOfWeek', 'fieldName' => 'endDayOfWeek', 'fieldLabel' => 'End Day Of Week', 'type' => 'select', 'selectOptions' => day_of_week_dropdown, 'description' => "End day of the week Sunday-Saturday (1-7)", 'defaultValue' => "Sunday", 'required' => true},
@@ -13,7 +13,7 @@ class Morpheus::Cli::LoadBalancerPools
13
13
  set_rest_parent_name :load_balancers
14
14
 
15
15
  register_subcommands :list, :get, :add, :update, :remove
16
- register_interfaces :load_balancers, :load_balancer_types
16
+ register_interfaces :load_balancer_pools_secondary, :load_balancers, :load_balancer_types
17
17
 
18
18
 
19
19
  # set_rest_interface_name :load_balancer_pools
@@ -90,4 +90,40 @@ class Morpheus::Cli::LoadBalancerPools
90
90
 
91
91
  ## using CliCommand's generic find_by methods
92
92
 
93
+ def find_load_balancer_pool_by_name_or_id(load_balancer_pool_id, val)
94
+ if val.to_s =~ /\A\d{1,}\Z/
95
+ return find_load_balancer_pool_by_id(load_balancer_pool_id, val)
96
+ else
97
+ return find_load_balancer_pool_by_name(load_balancer_pool_id, val)
98
+ end
99
+ end
100
+
101
+ def find_load_balancer_pool_by_id(load_balancer_pool_id, id)
102
+ begin
103
+ json_response = @load_balancer_pools_secondary_interface.get(load_balancer_pool_id, id.to_i)
104
+ return json_response[load_balancer_pool_object_key]
105
+ rescue RestClient::Exception => e
106
+ if e.response && e.response.code == 404
107
+ print_red_alert "Load Balancer Pool not found by id #{id}"
108
+ else
109
+ raise e
110
+ end
111
+ end
112
+ end
113
+
114
+ def find_load_balancer_pool_by_name(load_balancer_pool_id, name)
115
+ lbs = @load_balancer_pools_secondary_interface.list(load_balancer_pool_id, {name: name.to_s})[load_balancer_pool_list_key]
116
+ if lbs.empty?
117
+ print_red_alert "Load Balancer Pool not found by name #{name}"
118
+ return nil
119
+ elsif lbs.size > 1
120
+ print_red_alert "#{lbs.size} load balancer pools found by name #{name}"
121
+ #print_lbs_table(lbs, {color: red})
122
+ print reset,"\n\n"
123
+ return nil
124
+ else
125
+ return lbs[0]
126
+ end
127
+ end
128
+
93
129
  end
@@ -210,6 +210,7 @@ class Morpheus::Cli::SecurityGroups
210
210
  params = {}
211
211
  options = {:options => {}}
212
212
  cloud_id = nil
213
+ resource_pool_id = nil
213
214
  tenants = nil
214
215
  group_access_all = nil
215
216
  group_access_list = nil
@@ -225,6 +226,9 @@ class Morpheus::Cli::SecurityGroups
225
226
  opts.on( '-c', '--cloud CLOUD', "Scoped Cloud Name or ID" ) do |val|
226
227
  cloud_id = val
227
228
  end
229
+ opts.on( '--resource-pool ID', String, "ID of the Resource Pool for Amazon VPC and Azure Resource Group" ) do |val|
230
+ resource_pool_id = val
231
+ end
228
232
  opts.on('--group-access-all [on|off]', String, "Toggle Access for all groups.") do |val|
229
233
  group_access_all = val.to_s == 'on' || val.to_s == 'true' || val.to_s == ''
230
234
  end
@@ -321,17 +325,20 @@ class Morpheus::Cli::SecurityGroups
321
325
  if !v_prompt['zoneId'].to_s.empty? && v_prompt['zoneId'].to_s != 'all' && v_prompt['zoneId'].to_s != '-1'
322
326
  payload['securityGroup']['zoneId'] = v_prompt['zoneId']
323
327
 
324
- zone = find_cloud_by_id(payload['securityGroup']['zoneId'])
325
- # networkServer needed here too? err
326
- if zone['securityServer']
327
- sec_server = @network_security_servers.get(zone['securityServer']['id'])['networkSecurityServer']
328
-
329
- if sec_server['type']
330
- payload['securityGroup'].deep_merge!(Morpheus::Cli::OptionTypes.prompt(sec_server['type']['optionTypes'], options[:options], @api_client, {zoneId: zone['id']}))
331
- end
332
- end
328
+ cloud = find_cloud_by_id(payload['securityGroup']['zoneId'])
329
+
330
+ # parse --resource-pool
331
+ # if resource_pool_id
332
+ # resource_pool = find_resource_pool_by_name_or_id(cloud['id'], resource_pool_id)
333
+ # return 1 if resource_pool.nil?
334
+ # end
335
+
336
+ # prompt for zone specific settings that go under "securityGroup.customOptions" for some reason
337
+ custom_options_values = prompt_security_group_custom_options(options, cloud, resource_pool_id)
338
+ payload['securityGroup'].deep_merge!(custom_options_values)
333
339
  end
334
340
  rescue => ex
341
+ # raise ex
335
342
  print yellow,"Failed to determine the available scoped clouds.",reset,"\n"
336
343
  end
337
344
 
@@ -626,34 +633,8 @@ class Morpheus::Cli::SecurityGroups
626
633
  # return 1 if resource_pool.nil?
627
634
  # end
628
635
 
629
- # Custom Options prompt
630
- # securityServer is no longer used, it has been replaced by networkServer,
631
- # default to the cloud type code, since it's the same...
632
- # no optionTypes returned here, so hard coded by type
633
- network_server_type = cloud['networkServer'] ? cloud['networkServer']['type'] : (cloud['securityServer'] ? cloud['securityServer']['type'] : cloud["zoneType"]["code"])
634
- custom_options_values = {}
635
- if network_server_type == 'amazon'
636
- if cloud['config'] && !cloud['config']['vpc'].to_s.empty?
637
- custom_options_values.deep_merge!({'customOptions' => {'vpc' => cloud['config']['vpc']} })
638
- else
639
- options[:options].deep_merge!({'customOptions' => {'vpc' => resource_pool_id} }) if resource_pool_id
640
- custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'vpc', 'fieldLabel' => 'VPC', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true, 'config' => {'valueField' => 'externalId'}}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
641
- end
642
- elsif network_server_type == 'azure' || network_server_type == 'azurestack'
643
- if cloud['config'] && !cloud['config']['resourceGroup'].to_s.empty?
644
- custom_options_values.deep_merge!({'customOptions' => {'resourceGroup' => cloud['config']['resourceGroup']} })
645
- else
646
- options[:options].deep_merge!({'customOptions' => {'resourceGroup' => resource_pool_id} }) if resource_pool_id
647
- custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'resourceGroup', 'fieldLabel' => 'Resource Group', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true, 'config' => {'valueField' => 'externalId'}}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
648
- end
649
- elsif network_server_type == 'openstack' || network_server_type == 'opentelekom' || network_server_type == 'huawei'
650
- if cloud['config'] && !cloud['config']['resourcePoolId'].to_s.empty?
651
- custom_options_values.deep_merge!({'customOptions' => {'resourcePoolId' => cloud['config']['resourcePoolId']} })
652
- else
653
- options[:options].deep_merge!({'customOptions' => {'resourcePoolId' => resource_pool_id} }) if resource_pool_id
654
- custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'resourcePoolId', 'fieldLabel' => 'Resource Pool', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
655
- end
656
- end
636
+ # prompt for zone specific settings that go under "securityGroup.customOptions" for some reason
637
+ custom_options_values = prompt_security_group_custom_options(options, cloud, resource_pool_id)
657
638
  payload['securityGroupLocation'].deep_merge!(custom_options_values)
658
639
  end
659
640
  @security_groups_interface.setopts(options)
@@ -1270,4 +1251,44 @@ class Morpheus::Cli::SecurityGroups
1270
1251
  end
1271
1252
  end
1272
1253
 
1254
+ def prompt_security_group_custom_options(options, cloud, resource_pool_id=nil)
1255
+ custom_options_values = {}
1256
+ # Custom Options prompt
1257
+ # securityServer is no longer used, it has been replaced by networkServer,
1258
+ # default to the cloud type code, since it's the same...
1259
+ # no optionTypes returned here, so hard coded by type
1260
+ # The API used to return securityServer which could be fetched to get its optionTypes
1261
+ if cloud['securityServer']
1262
+ sec_server = @network_security_servers.get(cloud['securityServer']['id'])['networkSecurityServer']
1263
+ if sec_server['type']
1264
+ v_prompt = Morpheus::Cli::OptionTypes.prompt(sec_server['type']['optionTypes'], options[:options], @api_client, {zoneId: cloud['id']})
1265
+ custom_options_values.deep_merge!(v_prompt)
1266
+ end
1267
+ else
1268
+ network_server_type = cloud['networkServer'] ? cloud['networkServer']['type'] : (cloud['securityServer'] ? cloud['securityServer']['type'] : cloud["zoneType"]["code"])
1269
+ if network_server_type == 'amazon'
1270
+ if cloud['config'] && !cloud['config']['vpc'].to_s.empty?
1271
+ custom_options_values.deep_merge!({'customOptions' => {'vpc' => cloud['config']['vpc']} })
1272
+ else
1273
+ options[:options].deep_merge!({'customOptions' => {'vpc' => resource_pool_id} }) if resource_pool_id
1274
+ custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'vpc', 'fieldLabel' => 'VPC', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true, 'config' => {'valueField' => 'externalId'}}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
1275
+ end
1276
+ elsif network_server_type == 'azure' || network_server_type == 'azurestack'
1277
+ if cloud['config'] && !cloud['config']['resourceGroup'].to_s.empty?
1278
+ custom_options_values.deep_merge!({'customOptions' => {'resourceGroup' => cloud['config']['resourceGroup']} })
1279
+ else
1280
+ options[:options].deep_merge!({'customOptions' => {'resourceGroup' => resource_pool_id} }) if resource_pool_id
1281
+ custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'resourceGroup', 'fieldLabel' => 'Resource Group', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true, 'config' => {'valueField' => 'externalId'}}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
1282
+ end
1283
+ elsif network_server_type == 'openstack' || network_server_type == 'opentelekom' || network_server_type == 'huawei'
1284
+ if cloud['config'] && !cloud['config']['resourcePoolId'].to_s.empty?
1285
+ custom_options_values.deep_merge!({'customOptions' => {'resourcePoolId' => cloud['config']['resourcePoolId']} })
1286
+ else
1287
+ options[:options].deep_merge!({'customOptions' => {'resourcePoolId' => resource_pool_id} }) if resource_pool_id
1288
+ custom_options_values = Morpheus::Cli::OptionTypes.prompt([{'fieldContext' => 'customOptions', 'fieldName' => 'resourcePoolId', 'fieldLabel' => 'Resource Pool', 'type' => 'select', 'optionSource' => 'zonePools', 'required' => true}], options[:options], @api_client, {zoneId: cloud['id'], ignoreDefaultPool: true})
1289
+ end
1290
+ end
1291
+ end
1292
+ return custom_options_values
1293
+ end
1273
1294
  end
@@ -1,6 +1,6 @@
1
1
 
2
2
  module Morpheus
3
3
  module Cli
4
- VERSION = "6.1.1"
4
+ VERSION = "6.1.2"
5
5
  end
6
6
  end
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: 6.1.1
4
+ version: 6.1.2
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: 2023-05-17 00:00:00.000000000 Z
14
+ date: 2023-06-21 00:00:00.000000000 Z
15
15
  dependencies:
16
16
  - !ruby/object:Gem::Dependency
17
17
  name: bundler
@@ -226,7 +226,6 @@ files:
226
226
  - lib/morpheus/api/datastores_interface.rb
227
227
  - lib/morpheus/api/deploy_interface.rb
228
228
  - lib/morpheus/api/deployments_interface.rb
229
- - lib/morpheus/api/doc_interface.rb
230
229
  - lib/morpheus/api/environments_interface.rb
231
230
  - lib/morpheus/api/execute_schedules_interface.rb
232
231
  - lib/morpheus/api/execution_request_interface.rb
@@ -400,7 +399,6 @@ files:
400
399
  - lib/morpheus/cli/commands/deploy.rb
401
400
  - lib/morpheus/cli/commands/deployments.rb
402
401
  - lib/morpheus/cli/commands/deploys.rb
403
- - lib/morpheus/cli/commands/doc.rb
404
402
  - lib/morpheus/cli/commands/echo_command.rb
405
403
  - lib/morpheus/cli/commands/edit_profile_command.rb
406
404
  - lib/morpheus/cli/commands/edit_rc_command.rb
@@ -578,14 +576,12 @@ files:
578
576
  - lib/morpheus/util.rb
579
577
  - morpheus-cli.gemspec
580
578
  - test/api/containers_interface_test.rb
581
- - test/api/doc_interface_test.rb
582
579
  - test/api/instances_interface_test.rb
583
580
  - test/api/whoami_interface_test.rb
584
581
  - test/cli/access_token_test.rb
585
582
  - test/cli/auth_test.rb
586
583
  - test/cli/cli_test.rb
587
584
  - test/cli/containers_test.rb
588
- - test/cli/doc_test.rb
589
585
  - test/cli/help_test.rb
590
586
  - test/cli/instances_test.rb
591
587
  - test/cli/man_test.rb
@@ -624,14 +620,12 @@ specification_version: 4
624
620
  summary: Provides CLI Interface to the Morpheus Public/Private Cloud Appliance
625
621
  test_files:
626
622
  - test/api/containers_interface_test.rb
627
- - test/api/doc_interface_test.rb
628
623
  - test/api/instances_interface_test.rb
629
624
  - test/api/whoami_interface_test.rb
630
625
  - test/cli/access_token_test.rb
631
626
  - test/cli/auth_test.rb
632
627
  - test/cli/cli_test.rb
633
628
  - test/cli/containers_test.rb
634
- - test/cli/doc_test.rb
635
629
  - test/cli/help_test.rb
636
630
  - test/cli/instances_test.rb
637
631
  - test/cli/man_test.rb
@@ -1,50 +0,0 @@
1
- require 'morpheus/api/api_client'
2
-
3
- class Morpheus::DocInterface < Morpheus::APIClient
4
-
5
- def list(params={})
6
- url = "/api/doc"
7
- headers = {params: params}
8
- execute(method: :get, url: url, headers: headers)
9
- end
10
-
11
- def openapi(params={})
12
- url = "/api/doc/openapi"
13
- fmt = params.delete('format')
14
- if fmt
15
- url = url + "." + fmt
16
- end
17
- is_yaml = fmt == "yml" || fmt == "yaml"
18
- headers = {params: params}
19
- execute(method: :get, url: url, headers: headers, timeout: 172800, parse_json: !is_yaml)
20
- end
21
-
22
- def download_openapi(outfile, params={})
23
- # note that RestClient.execute still requires the full path with base_url
24
- url = "#{@base_url}/api/doc/openapi"
25
- fmt = params.delete('format')
26
- if fmt
27
- url = url + "." + fmt
28
- end
29
- headers = {params: params, authorization: "Bearer #{@access_token}"}
30
- opts = {method: :get, url: url, headers: headers, timeout: 172800, parse_json: false}
31
-
32
- if @dry_run
33
- return opts
34
- end
35
-
36
- http_response = nil
37
- File.open(File.expand_path(outfile), 'w') {|f|
38
- block = proc { |response|
39
- response.read_body do |chunk|
40
- # writing to #{outfile} ..."
41
- f.write chunk
42
- end
43
- }
44
- opts[:block_response] = block
45
- http_response = Morpheus::RestClient.execute(opts)
46
- }
47
- http_response
48
- end
49
-
50
- end
@@ -1,182 +0,0 @@
1
- require 'morpheus/cli/cli_command'
2
-
3
- # This provides commands for authentication
4
- # This also includes credential management.
5
- class Morpheus::Cli::Doc
6
- include Morpheus::Cli::CliCommand
7
-
8
- set_command_name :'doc'
9
- register_subcommands :list
10
- register_subcommands :get => :openapi
11
- register_subcommands :download => :download_openapi
12
-
13
- # hidden until doc complete (or close to it)
14
- set_command_hidden
15
-
16
- def initialize()
17
- # @appliance_name, @appliance_url = Morpheus::Cli::Remote.active_appliance
18
- end
19
-
20
- def handle(args)
21
- handle_subcommand(args)
22
- end
23
-
24
- def connect(options)
25
- # @api_client = establish_remote_appliance_connection(options.merge({:no_prompt => true, :skip_verify_access_token => true, :skip_login => true}))
26
- @api_client = establish_remote_appliance_connection(options)
27
- @doc_interface = @api_client.doc
28
- end
29
-
30
- def list(args)
31
- exit_code, err = 0, nil
32
- params, options = {}, {}
33
- optparse = Morpheus::Cli::OptionParser.new do |opts|
34
- opts.banner = subcommand_usage()
35
- build_standard_get_options(opts, options)
36
- opts.footer = <<-EOT
37
- List documentation links.
38
- EOT
39
- end
40
- optparse.parse!(args)
41
- verify_args!(args:args, optparse:optparse, count:0)
42
- connect(options)
43
- # construct the api request
44
- params.merge!(parse_list_options(options))
45
- # execute the api request
46
- @doc_interface.setopts(options)
47
- if options[:dry_run]
48
- print_dry_run @doc_interface.dry.list(params)
49
- return 0, nil
50
- end
51
- json_response = @doc_interface.list(params)
52
- render_response(json_response, options, "links") do
53
- title = "Morpheus Documentation"
54
- print_h1 title, options
55
- if json_response['links'].empty?
56
- print yellow, "No help links found.",reset,"\n"
57
- else
58
- columns = {
59
- "Link Name" => 'name',
60
- "URL" => 'url',
61
- "Description" => {display_method:'description', max_width: (options[:wrap] ? nil : 50)},
62
- }
63
- print as_pretty_table(json_response['links'], columns.upcase_keys!, options)
64
- # print_results_pagination(json_response)
65
- end
66
- print reset,"\n"
67
- end
68
- return exit_code, err
69
- end
70
-
71
- def openapi(args)
72
- exit_code, err = 0, nil
73
- params, options = {}, {}
74
- optparse = Morpheus::Cli::OptionParser.new do |opts|
75
- opts.banner = subcommand_usage()
76
- # opts.on(nil, "--refresh", "Refresh the document. By default the openapi.yml and openapi.json are cached by the server.") do
77
- # params['refresh'] = true
78
- # end
79
- # opts.on('-g', '--generate', "Alias for --refresh") do
80
- # params['refresh'] = true
81
- # end
82
- build_standard_get_options(opts, options, [], [:csv])
83
- opts.footer = <<-EOT
84
- Print the Morpheus API OpenAPI Documentation (swagger).
85
- The default format is JSON. Supports json or yaml.
86
- EOT
87
- end
88
- optparse.parse!(args)
89
- verify_args!(args:args, optparse:optparse, count:0)
90
- connect(options)
91
- # construct the api request
92
- params.merge!(parse_list_options(options))
93
- # for now, always use .json, and just convert to yaml for display on cli side
94
- openapi_format = options[:yaml] ? "yaml" : "json"
95
- # params['format'] = openapi_format
96
- # execute the api request
97
- @doc_interface.setopts(options)
98
- if options[:dry_run]
99
- params['format'] = openapi_format
100
- print_dry_run @doc_interface.dry.openapi(params)
101
- return 0, nil
102
- end
103
- json_response = @doc_interface.openapi(params)
104
- # default format is to print header and json
105
- render_response(json_response, options) do
106
- title = "Morpheus API openapi.#{openapi_format}"
107
- print_h1 title, options
108
- print cyan
109
- print as_json(json_response, options)
110
- print reset,"\n"
111
- end
112
- return exit_code, err
113
- end
114
-
115
- def download_openapi(args)
116
- exit_code, err = 0, nil
117
- params, options = {}, {}
118
- optparse = Morpheus::Cli::OptionParser.new do |opts|
119
- opts.banner = subcommand_usage("[local-file]")
120
- # build_standard_get_options(opts, options, [], [:csv,:out])
121
- opts.on(nil, '--yaml', "YAML Output") do
122
- options[:yaml] = true
123
- options[:format] = :yaml
124
- end
125
- # opts.on(nil, "--refresh", "Refresh the document. By default the openapi.yml and openapi.json are cached by the server.") do
126
- # params['refresh'] = true
127
- # end
128
- # opts.on('-g', '--generate', "Alias for --refresh") do
129
- # params['refresh'] = true
130
- # end
131
- opts.on( '-f', '--force', "Overwrite existing [local-file] if it exists." ) do
132
- options[:overwrite] = true
133
- end
134
- opts.on( '-p', '--mkdir', "Create missing directories for [local-file] if they do not exist." ) do
135
- options[:mkdir] = true
136
- end
137
- build_common_options(opts, options, [:dry_run, :quiet, :remote])
138
- opts.footer = <<-EOT
139
- Download the Morpheus API OpenAPI Documentation (swagger).
140
- [local-file] is required. This is the full local filepath for the downloaded file.
141
- The default format is JSON. Supports json or yaml.
142
- EOT
143
- end
144
- optparse.parse!(args)
145
- verify_args!(args:args, optparse:optparse, count:1)
146
- connect(options)
147
- # parse args
148
- outfile = args[0]
149
- if !validate_outfile(outfile, options)
150
- return 1, "Failed to validate outfile"
151
- end
152
- # construct the api request
153
- params.merge!(parse_list_options(options))
154
- if outfile.include?(".yml") || outfile.include?(".yaml")
155
- options[:yaml] = true
156
- end
157
- openapi_format = options[:yaml] ? "yaml" : "json"
158
- params['format'] = openapi_format
159
- # execute the api request
160
- @doc_interface.setopts(options)
161
- if options[:dry_run]
162
- print_dry_run @doc_interface.dry.download_openapi(outfile, params)
163
- return 0, nil
164
- end
165
- print cyan + "Downloading openapi.#{openapi_format} to #{outfile} ... " if !options[:quiet]
166
- http_response = @doc_interface.download_openapi(outfile, params)
167
- if http_response.code.to_i == 200
168
- print green + "SUCCESS" + reset + "\n" if !options[:quiet]
169
- return 0, nil
170
- else
171
- print red + "ERROR" + reset + " HTTP #{http_response.code}" + "\n" if !options[:quiet]
172
- if File.exist?(outfile) && File.file?(outfile)
173
- Morpheus::Logging::DarkPrinter.puts "Deleting bad file download: #{outfile}" if Morpheus::Logging.debug?
174
- File.delete(outfile)
175
- end
176
- return 1, "HTTP #{http_response.code}"
177
- end
178
- end
179
-
180
- protected
181
-
182
- end
@@ -1,35 +0,0 @@
1
- require 'morpheus_test'
2
-
3
- # Tests for Morpheus::DocInterface
4
- class MorpheusTest::DocInterfaceTest < MorpheusTest::TestCase
5
-
6
- def test_doc_list
7
- @doc_interface = client.doc
8
- response = @doc_interface.list()
9
- assert_equal response['links'].class, Array
10
- end
11
-
12
- def test_doc_get
13
- @doc_interface = client.doc
14
- response = @doc_interface.openapi()
15
- assert_equal response['openapi'], '3.0.3'
16
- # todo: fix this, can be cached and fail
17
- #assert_equal response['version'], Morpheus::Cli::Remote.load_remote(@config.remote_name)[:build_version]
18
- end
19
-
20
- def test_doc_get_yaml
21
- @doc_interface = client.doc
22
- response = @doc_interface.openapi({'format' => "yaml"})
23
- assert response.body
24
- assert YAML.load(response.body)
25
- end
26
-
27
- # def test_doc_download
28
- # @doc_interface = client.doc
29
- # response = @doc_interface.download_openapi('/path/to/openapi.json')
30
- # yaml_content = response.body
31
- # yaml_data = YAML.load(yaml_content)
32
- # assert_not_nil yaml_data
33
- # end
34
-
35
- end
data/test/cli/doc_test.rb DELETED
@@ -1,35 +0,0 @@
1
- require 'morpheus_test'
2
-
3
- # Tests for Morpheus::Cli::Doc
4
- class MorpheusTest::DocTest < MorpheusTest::TestCase
5
-
6
- def test_doc_list
7
- assert_execute("doc list")
8
- end
9
-
10
- def test_doc_get
11
- # using --quiet because the output is massive
12
- assert_execute("doc get --quiet")
13
- end
14
-
15
- def test_doc_get_yaml
16
- # using --quiet because the output is massive
17
- assert_execute("doc get --yaml --quiet")
18
- end
19
-
20
- # def test_doc_download
21
- # assert_execute("doc download '/path/to/openapi.json')
22
- # end
23
-
24
- # def test_doc_download_yaml
25
- # assert_execute("doc download '/path/to/openapi.yaml' --yaml")
26
- # end
27
-
28
- def test_doc_get_unauthorized
29
- # authentication is NOT required for this api
30
- without_authentication do
31
- assert_error("doc get -q")
32
- end
33
- end
34
-
35
- end