xapixctl 1.1.2 → 1.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 3735380aedfe9b2b343be8035f2d988225e1ab686c8b861343a7872b74856b86
4
- data.tar.gz: 134e2c3c03e630fddda6dfdc266b51716c6e239989d24a8af4d0e495f8b80ba0
3
+ metadata.gz: 0650e8d61c4e4d43e38d195c74ad139484db57c0bd761af93ff2ea2a7a083217
4
+ data.tar.gz: 4878b54c4c48002b4e8d5131c62178a26ea2e4c0c12cb4b4e697ef3c43c25565
5
5
  SHA512:
6
- metadata.gz: 5ad8cc281b69dd9a42b9f4b335b36bcde452888cd75896a4841af22957ce6631adccca781192919e16996a4c550def367de43b9b05d70c9fcddf303a436c29ce
7
- data.tar.gz: 4730232765f508b57a332486a29abb543af26f0592471f1304d4e34a05491497d95ba04d737708cdf10085281293a5dda5a0edaf256fa4fa5d6f0f73052cadd3
6
+ metadata.gz: 780557e28161b7a8c8fb1fe49f209ad86000d046cc244b654009c49f3c85628607d00a18a2d8879e60e9d0f883ac4333533dfc46b06f37e52d545fa6dd5c935b
7
+ data.tar.gz: 72c2a0ec1a8f4bd517d97a186b63de572b03063601d4d6290ef198724a2b254c2c35e1ec97fc56e7fd0c853500c5ac286b8289c25e47d8483415345854833946
@@ -0,0 +1,17 @@
1
+ name: CD
2
+ on: push
3
+ jobs:
4
+ test:
5
+ runs-on: ubuntu-latest
6
+ strategy:
7
+ matrix:
8
+ ruby-version: [2.7, 2.6]
9
+ steps:
10
+ - uses: actions/checkout@v2
11
+ - name: Set up Ruby ${{ matrix.ruby-version }}
12
+ uses: ruby/setup-ruby@v1
13
+ with:
14
+ ruby-version: ${{ matrix.ruby-version }}
15
+ bundler-cache: true
16
+ - name: Run tests
17
+ run: bundle exec rspec
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.6.6
1
+ 2.6.3
data/Gemfile.lock CHANGED
@@ -1,40 +1,46 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- xapixctl (1.1.2)
4
+ xapixctl (1.2.4)
5
5
  activesupport (>= 5.2.3, < 6.0.0)
6
+ hashdiff (>= 1.0.1, < 1.2.0)
6
7
  rest-client (>= 2.1.0, < 3.0.0)
7
- thor (>= 1.0.0, < 1.1.0)
8
+ thor (>= 1.0.0, < 1.2.0)
8
9
 
9
10
  GEM
10
11
  remote: https://rubygems.org/
11
12
  specs:
12
- activesupport (5.2.4.4)
13
+ activesupport (5.2.4.5)
13
14
  concurrent-ruby (~> 1.0, >= 1.0.2)
14
15
  i18n (>= 0.7, < 2)
15
16
  minitest (~> 5.1)
16
17
  tzinfo (~> 1.1)
17
- ast (2.4.1)
18
- concurrent-ruby (1.1.7)
18
+ addressable (2.7.0)
19
+ public_suffix (>= 2.0.2, < 5.0)
20
+ ast (2.4.2)
21
+ concurrent-ruby (1.1.8)
22
+ crack (0.4.4)
19
23
  diff-lcs (1.4.4)
20
24
  domain_name (0.5.20190701)
21
25
  unf (>= 0.0.5, < 1.0.0)
26
+ hashdiff (1.0.1)
22
27
  http-accept (1.7.0)
23
28
  http-cookie (1.0.3)
24
29
  domain_name (~> 0.5)
25
- i18n (1.8.5)
30
+ i18n (1.8.9)
26
31
  concurrent-ruby (~> 1.0)
27
32
  mime-types (3.3.1)
28
33
  mime-types-data (~> 3.2015)
29
- mime-types-data (3.2020.0512)
30
- minitest (5.14.2)
34
+ mime-types-data (3.2021.0225)
35
+ minitest (5.14.4)
31
36
  netrc (0.11.0)
32
- parallel (1.19.2)
33
- parser (2.7.1.5)
37
+ parallel (1.20.1)
38
+ parser (3.0.0.0)
34
39
  ast (~> 2.4.1)
40
+ public_suffix (4.0.6)
35
41
  rainbow (3.0.0)
36
- rake (13.0.1)
37
- regexp_parser (1.8.0)
42
+ rake (13.0.3)
43
+ regexp_parser (2.1.1)
38
44
  relaxed-rubocop (2.5)
39
45
  rest-client (2.1.0)
40
46
  http-accept (>= 1.7.0, < 2.0)
@@ -42,50 +48,62 @@ GEM
42
48
  mime-types (>= 1.16, < 4.0)
43
49
  netrc (~> 0.8)
44
50
  rexml (3.2.4)
45
- rspec (3.9.0)
46
- rspec-core (~> 3.9.0)
47
- rspec-expectations (~> 3.9.0)
48
- rspec-mocks (~> 3.9.0)
49
- rspec-core (3.9.2)
50
- rspec-support (~> 3.9.3)
51
- rspec-expectations (3.9.2)
51
+ rspec (3.10.0)
52
+ rspec-core (~> 3.10.0)
53
+ rspec-expectations (~> 3.10.0)
54
+ rspec-mocks (~> 3.10.0)
55
+ rspec-core (3.10.1)
56
+ rspec-support (~> 3.10.0)
57
+ rspec-expectations (3.10.1)
52
58
  diff-lcs (>= 1.2.0, < 2.0)
53
- rspec-support (~> 3.9.0)
54
- rspec-mocks (3.9.1)
59
+ rspec-support (~> 3.10.0)
60
+ rspec-mocks (3.10.2)
55
61
  diff-lcs (>= 1.2.0, < 2.0)
56
- rspec-support (~> 3.9.0)
57
- rspec-support (3.9.3)
58
- rubocop (0.92.0)
62
+ rspec-support (~> 3.10.0)
63
+ rspec-support (3.10.2)
64
+ rubocop (1.11.0)
59
65
  parallel (~> 1.10)
60
- parser (>= 2.7.1.5)
66
+ parser (>= 3.0.0.0)
61
67
  rainbow (>= 2.2.2, < 4.0)
62
- regexp_parser (>= 1.7)
68
+ regexp_parser (>= 1.8, < 3.0)
63
69
  rexml
64
- rubocop-ast (>= 0.5.0)
70
+ rubocop-ast (>= 1.2.0, < 2.0)
65
71
  ruby-progressbar (~> 1.7)
66
- unicode-display_width (>= 1.4.0, < 2.0)
67
- rubocop-ast (0.5.0)
72
+ unicode-display_width (>= 1.4.0, < 3.0)
73
+ rubocop-ast (1.4.1)
68
74
  parser (>= 2.7.1.5)
69
- ruby-progressbar (1.10.1)
70
- thor (1.0.1)
75
+ rubocop-rake (0.5.1)
76
+ rubocop
77
+ rubocop-rspec (2.2.0)
78
+ rubocop (~> 1.0)
79
+ rubocop-ast (>= 1.1.0)
80
+ ruby-progressbar (1.11.0)
81
+ thor (1.1.0)
71
82
  thread_safe (0.3.6)
72
- tzinfo (1.2.7)
83
+ tzinfo (1.2.9)
73
84
  thread_safe (~> 0.1)
74
85
  unf (0.1.4)
75
86
  unf_ext
76
87
  unf_ext (0.0.7.7)
77
- unicode-display_width (1.7.0)
88
+ unicode-display_width (2.0.0)
89
+ webmock (3.11.0)
90
+ addressable (>= 2.3.6)
91
+ crack (>= 0.3.2)
92
+ hashdiff (>= 0.4.0, < 2.0.0)
78
93
 
79
94
  PLATFORMS
80
95
  ruby
81
96
 
82
97
  DEPENDENCIES
83
- bundler (~> 1.17.3)
98
+ bundler (~> 2.1.4)
84
99
  rake (~> 13.0)
85
100
  relaxed-rubocop (~> 2.5)
86
- rspec (~> 3.0)
87
- rubocop (~> 0.89)
101
+ rspec (~> 3.10.0)
102
+ rubocop (~> 1.11.0)
103
+ rubocop-rake (~> 0.5.1)
104
+ rubocop-rspec (~> 2.2.0)
105
+ webmock (~> 3.11.0)
88
106
  xapixctl!
89
107
 
90
108
  BUNDLED WITH
91
- 1.17.3
109
+ 2.1.4
data/lib/xapixctl.rb CHANGED
@@ -4,9 +4,6 @@ require 'active_support'
4
4
  require 'active_support/core_ext/hash/keys'
5
5
  require 'active_support/core_ext/object/blank'
6
6
  require 'active_support/core_ext/string/inflections'
7
- require 'rest_client'
8
- require 'json'
9
- require 'psych'
10
7
  require 'xapixctl/version'
11
8
  require 'xapixctl/phoenix_client'
12
9
 
@@ -1,65 +1,77 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'thor'
4
+ require 'xapixctl/util'
4
5
 
5
6
  module Xapixctl
6
7
  class BaseCli < Thor
7
8
  def self.exit_on_failure?; true; end
8
9
 
9
- class_option :verbose, type: :boolean, aliases: "-v"
10
+ def self.start(given_args = ARGV, config = {})
11
+ super
12
+ rescue StandardError => err
13
+ config[:debug] || ENV["THOR_DEBUG"] == "1" ? (raise err) : config[:shell].error(err.message)
14
+ exit(false) if exit_on_failure?
15
+ end
16
+
17
+ class_option :org, aliases: "-o", desc: "Organization; Fallback: environment variable XAPIX_ORG"
18
+ class_option :project, aliases: "-p", desc: "Project, can be ORG/PROJECT; Fallback: environment variable XAPIX_PROJECT"
19
+ class_option :debug, type: :boolean, desc: "Print details for debugging"
10
20
  class_option :xapix_url, desc: "Fallback: environment variable XAPIX_URL. URL to Xapix. Default: https://cloud.xapix.io/"
11
21
  class_option :xapix_token, desc: "Fallback: environment variable XAPIX_TOKEN. Your access token."
12
22
 
13
23
  private
14
24
 
15
- def warn_api_error(text, err, result)
25
+ def exit_with_api_error(err, result)
16
26
  details = result['errors'].map { |k| k['detail'] }.unshift('').join("\n ") rescue err.to_s
17
- warn "#{text}: #{details}"
27
+ warn "API error: #{details}"
18
28
  exit 1
19
29
  end
20
30
 
21
31
  def show_deployment_status(result)
22
32
  return unless result && result['project_publication']
23
- puts "deployment: #{result.dig('project_publication', 'deployment')}"
24
- puts " data api: #{result.dig('project_publication', 'data_api')} (version: #{result.dig('project_publication', 'data_api_version').presence || 'n/a'})"
25
- puts " user management: #{result.dig('project_publication', 'user_management')}"
26
- if result.dig('project_publication', 'deployment') == 'success'
27
- puts " base URL: #{result.dig('project_publication', 'base_url')}"
33
+ say "deployment: #{result.dig('project_publication', 'deployment')}"
34
+ shell.indent do
35
+ say "data api: #{result.dig('project_publication', 'data_api')} (version: #{result.dig('project_publication', 'data_api_version').presence || 'n/a'})"
36
+ say "user management: #{result.dig('project_publication', 'user_management')}"
37
+ if result.dig('project_publication', 'deployment') == 'success'
38
+ say "base URL: #{result.dig('project_publication', 'base_url')}"
39
+ end
28
40
  end
29
41
  end
30
42
 
31
- DOCUMENT_STRUCTURE = %w[version kind metadata definition].freeze
32
- def resources_from_file(filename)
33
- load_files(filename) do |yaml_string|
34
- yaml_string.split(/^---\s*\n/).map { |yml| Psych.safe_load(yml) }.compact.each do |doc|
35
- unless (DOCUMENT_STRUCTURE - doc.keys.map(&:to_s)).empty?
36
- warn "does not look like a correct resource definition:"
37
- warn doc.inspect
38
- exit 1
39
- end
40
- yield doc
41
- end
43
+ def connection
44
+ @connection ||= begin
45
+ url = options[:xapix_url] || ENV['XAPIX_URL'] || 'https://cloud.xapix.io/'
46
+ token = options[:xapix_token] || ENV['XAPIX_TOKEN']
47
+ raise Thor::RequiredArgumentMissingError, "No XAPIX_TOKEN given. Either use --xapix_token [TOKEN] or set environment variable XAPIX_TOKEN (recommended)" if !token
48
+ PhoenixClient.connection(
49
+ url, token,
50
+ default_error_handler: ->(err, result) { exit_with_api_error(err, result) },
51
+ logging: options[:debug] ? 'stdout' : nil
52
+ )
42
53
  end
43
54
  end
44
55
 
45
- def load_files(filename)
46
- if filename == '-'
47
- yield $stdin.read
48
- else
49
- pn = Pathname.new(filename)
50
- if pn.directory?
51
- pn.glob(["**/*.yaml", "**/*.yml"]).sort.each { |dpn| yield dpn.read }
52
- else
53
- yield pn.read
54
- end
55
- end
56
+ def org_or_prj_connection
57
+ options[:project] ? prj_connection : org_connection
56
58
  end
57
59
 
58
- def connection
59
- url = options[:xapix_url] || ENV['XAPIX_URL'] || 'https://cloud.xapix.io/'
60
- token = options[:xapix_token] || ENV['XAPIX_TOKEN']
61
- raise Thor::RequiredArgumentMissingError, "no XAPIX_TOKEN given. Either use --xapix_token [TOKEN] or set environment variable XAPIX_TOKEN (recommended)" if !token
62
- PhoenixClient::Connection.new(url, token)
60
+ def org_connection
61
+ org = options[:org] || ENV['XAPIX_ORG']
62
+ raise Thor::RequiredArgumentMissingError, "No organization given. Either use --org [ORG] or set environment variable XAPIX_ORG" if !org
63
+ @org_connection ||= connection.organization(org)
64
+ end
65
+
66
+ def prj_connection
67
+ project = options[:project] || ENV['XAPIX_PROJECT']
68
+ org = options[:org] || ENV['XAPIX_ORG']
69
+ raise Thor::RequiredArgumentMissingError, "No project given. Either use --project [ORG/PROJECT] or set environment variable XAPIX_PROJECT" if !project
70
+ if project.include?('/')
71
+ org, project = project.split('/', 2)
72
+ end
73
+ raise Thor::RequiredArgumentMissingError, "No organization given. Either use --org [ORG] or set environment variable XAPIX_ORG" if !org
74
+ @prj_connection ||= connection.project(org: org, project: project)
63
75
  end
64
76
  end
65
77
  end
data/lib/xapixctl/cli.rb CHANGED
@@ -1,25 +1,35 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'xapixctl/base_cli'
4
+ require 'xapixctl/connector_cli'
4
5
  require 'xapixctl/preview_cli'
6
+ require 'xapixctl/sync_cli'
7
+ require 'xapixctl/titan_cli'
5
8
 
6
9
  module Xapixctl
7
10
  class Cli < BaseCli
11
+ desc "connectors SUBCOMMAND ...ARGS", "Commands for Connector resources"
12
+ subcommand "connectors", ConnectorCli
13
+
8
14
  desc "preview SUBCOMMAND ...ARGS", "Request preview for resources"
9
- subcommand "preview", Preview
15
+ subcommand "preview", PreviewCli
16
+
17
+ desc "sync SUBCOMMAND ...ARGS", "Sync resources"
18
+ subcommand "sync", SyncCli
19
+
20
+ desc "titan SUBCOMMAND ...ARGS", "Tools for ML model deployments and service generation", hide: true
21
+ subcommand "titan", TitanCli
10
22
 
11
- option :org, aliases: "-o", desc: "Organization", required: true
12
- option :project, aliases: "-p", desc: "Project"
13
23
  option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
14
24
  desc "get TYPE [ID]", "retrieve either all resources of given TYPE or just the resource of given TYPE and ID"
15
25
  long_desc <<-LONGDESC
16
26
  `xapixctl get TYPE` will retrieve the list of all resources of given type.
17
27
 
18
28
  If requested on an organization (i.e. no project given), the following types are available:
19
- \x5 Project
29
+ \x5Project
20
30
 
21
31
  If requested on an a project (i.e. organization and project are given), the following types are available:
22
- \x5 Ambassador, AuthScheme, CacheConnection, Credential, DataSource, Endpoint, EndpointGroup, Proxy, Schema, Stream, StreamGroup
32
+ \x5#{PhoenixClient::SUPPORTED_RESOURCE_TYPES.sort.join(', ')}
23
33
 
24
34
  Use the format to switch between the different output formats.
25
35
 
@@ -27,24 +37,17 @@ module Xapixctl
27
37
  \x5> $ xapixctl get -o xapix Project
28
38
  \x5> $ xapixctl get -o xapix Project some-project
29
39
  \x5> $ xapixctl get -o xapix -p some-project DataSource
30
- \x5> $ xapixctl get -o xapix -p some-project DataSource get-a-list
40
+ \x5> $ xapixctl get -p xapix/some-project DataSource
41
+ \x5> $ xapixctl get -p xapix/some-project DataSource get-a-list
31
42
  LONGDESC
32
43
  def get(resource_type, resource_id = nil)
33
- if resource_id
34
- connection.resource(resource_type, resource_id, org: options[:org], project: options[:project], format: options[:format].to_sym) do |res|
35
- res.on_success { |resource| puts resource }
36
- res.on_error { |err, result| warn_api_error("could not get", err, result) }
37
- end
38
- else
39
- connection.resource_ids(resource_type, org: options[:org], project: options[:project]) do |res|
40
- res.on_success { |resource_ids| resource_ids.each { |res_id| get(resource_type, res_id) } }
41
- res.on_error { |err, result| warn_api_error("could not get", err, result) }
42
- end
44
+ conn = org_or_prj_connection
45
+ resource_ids = resource_id ? [resource_id] : conn.resource_ids(resource_type)
46
+ resource_ids.each do |res_id|
47
+ say conn.resource(resource_type, res_id, format: options[:format].to_sym)
43
48
  end
44
49
  end
45
50
 
46
- option :org, aliases: "-o", desc: "Organization", required: true
47
- option :project, aliases: "-p", desc: "Project", required: true
48
51
  option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
49
52
  desc "export", "retrieves all resources within a project"
50
53
  long_desc <<-LONGDESC
@@ -54,19 +57,15 @@ module Xapixctl
54
57
 
55
58
  Examples:
56
59
  \x5> $ xapixctl export -o xapix -p some-project
57
- \x5> $ xapixctl export -o xapix -p some-project -f yaml > some_project.yaml
60
+ \x5> $ xapixctl export -p xapix/some-project
61
+ \x5> $ xapixctl export -p xapix/some-project -f yaml > some_project.yaml
58
62
  LONGDESC
59
63
  def export
60
- connection.resource('Project', options[:project], org: options[:org], format: options[:format].to_sym) do |res|
61
- res.on_success { |resource| puts resource }
62
- res.on_error { |err, result| warn_api_error("could not get", err, result) }
63
- end
64
- (connection.resource_types_for_export - ['Project']).each { |type| get(type) }
64
+ get('Project', prj_connection.project)
65
+ prj_connection.resource_types_for_export.each { |type| get(type) }
65
66
  end
66
67
 
67
- option :org, aliases: "-o", desc: "Organization", required: true
68
- option :project, aliases: "-p", desc: "Project"
69
- option :file, aliases: "-f", required: true
68
+ option :file, aliases: "-f", required: true, desc: 'file or directory from which to load resource descriptions'
70
69
  desc "apply", "Create or update a resource from a file"
71
70
  long_desc <<-LONGDESC
72
71
  `xapixctl apply -f FILE` will apply the given resource description.
@@ -82,24 +81,20 @@ module Xapixctl
82
81
  Examples:
83
82
  \x5> $ xapixctl apply -o xapix -f get_a_list.yaml
84
83
  \x5> $ xapixctl apply -o xapix -p some-project -f get_a_list.yaml
85
- \x5> $ xapixctl apply -o xapix -p some-project -f ./
84
+ \x5> $ xapixctl apply -p xapix/some-project -f get_a_list.yaml
85
+ \x5> $ xapixctl apply -p xapix/some-project -f ./
86
86
 
87
87
  To copy over all data sources from one project to another:
88
88
  \x5> $ xapixctl get -o xapix-old -p some-project DataSource -f yaml | xapixctl apply -o xapix-new -f -
89
89
  LONGDESC
90
90
  def apply
91
- resources_from_file(options[:file]) do |desc|
92
- puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')}"
93
- connection.apply(desc, org: options[:org], project: options[:project]) do |res|
94
- res.on_success { puts 'OK' }
95
- res.on_error { |err, result| warn_api_error("could not apply changes", err, result); break }
96
- end
91
+ Util.resources_from_file(options[:file]) do |desc|
92
+ say "applying #{desc['kind']} #{desc.dig('metadata', 'id')}"
93
+ org_or_prj_connection.apply(desc)
97
94
  end
98
95
  end
99
96
 
100
- option :org, aliases: "-o", desc: "Organization", required: true
101
- option :project, aliases: "-p", desc: "Project"
102
- option :file, aliases: "-f"
97
+ option :file, aliases: "-f", desc: 'file or directory from which to load resource descriptions'
103
98
  desc "delete [TYPE ID] [-f FILE]", "delete the resources in the file"
104
99
  long_desc <<-LONGDESC
105
100
  `xapixctl delete -f FILE` will delete all the resources listed in the file.
@@ -110,22 +105,20 @@ module Xapixctl
110
105
  You can also read from stdin by using '-'.
111
106
 
112
107
  Examples:
113
- \x5> $ xapixctl delete -o xapix -p some-project -f get_a_list.yaml
114
- \x5> $ xapixctl delete -o xapix -p some-project -f ./
115
- \x5> $ xapixctl delete -o xapix -p some-project DataSource get-a-list
116
108
  \x5> $ xapixctl delete -o xapix Project some-project
109
+ \x5> $ xapixctl delete -p xapix -p some-project DataSource get-a-list
110
+ \x5> $ xapixctl delete -p xapix/some-project DataSource get-a-list
111
+ \x5> $ xapixctl delete -p xapix/some-project -f get_a_list.yaml
112
+ \x5> $ xapixctl delete -p xapix/some-project -f ./
117
113
  LONGDESC
118
114
  def delete(resource_type = nil, resource_id = nil)
119
115
  if resource_type && resource_id
120
- connection.delete(resource_type, resource_id, org: options[:org], project: options[:project]) do |res|
121
- res.on_success { puts "DELETED #{resource_type} #{resource_id}" }
122
- res.on_error { |err, result| warn_api_error("could not delete", err, result) }
123
- end
116
+ org_or_prj_connection.delete(resource_type, resource_id)
117
+ say "DELETED #{resource_type} #{resource_id}"
124
118
  elsif options[:file]
125
- resources_from_file(options[:file]) do |desc|
119
+ Util.resources_from_file(options[:file]) do |desc|
126
120
  res_type = desc['kind']
127
121
  res_id = desc.dig('metadata', 'id')
128
- puts "deleting #{res_type} #{res_id}"
129
122
  delete(res_type, res_id)
130
123
  end
131
124
  else
@@ -133,24 +126,21 @@ module Xapixctl
133
126
  end
134
127
  end
135
128
 
136
- option :org, aliases: "-o", desc: "Organization", required: true
137
- option :project, aliases: "-p", desc: "Project", required: true
138
129
  desc "publish", "Publishes the current version of the given project"
139
130
  long_desc <<-LONGDESC
140
131
  `xapixctl publish` will publish the given project.
141
132
 
142
133
  Examples:
143
134
  \x5> $ xapixctl publish -o xapix -p some-project
135
+ \x5> $ xapixctl publish -p xapix/some-project
144
136
  LONGDESC
145
137
  def publish
146
- connection.publish(org: options[:org], project: options[:project]) do |res|
138
+ prj_connection.publish do |res|
147
139
  res.on_success { |result| show_deployment_status(result) }
148
- res.on_error { |err, result| show_deployment_status(result); warn_api_error('errors', err, result) }
140
+ res.on_error { |err, result| show_deployment_status(result); exit_with_api_error(err, result) }
149
141
  end
150
142
  end
151
143
 
152
- option :org, aliases: "-o", desc: "Organization", required: true
153
- option :project, aliases: "-p", desc: "Project", required: true
154
144
  desc "logs CORRELATION_ID", "Retrieves the execution logs for the given correlation ID"
155
145
  long_desc <<-LONGDESC
156
146
  `xapixctl logs CORRELATION_ID` will retrieve execution logs for the given correlation ID.
@@ -159,28 +149,23 @@ module Xapixctl
159
149
 
160
150
  Examples:
161
151
  \x5> $ xapixctl logs be9c8608-e291-460d-bc20-5a394c4079d4 -o xapix -p some-project
152
+ \x5> $ xapixctl logs be9c8608-e291-460d-bc20-5a394c4079d4 -p xapix/some-project
162
153
  LONGDESC
163
154
  def logs(correlation_id)
164
- connection.logs(correlation_id, org: options[:org], project: options[:project]) do |res|
165
- res.on_success { |result| puts result['logs'].to_yaml }
166
- res.on_error { |err, result| warn_api_error('could not get logs', err, result) }
167
- end
155
+ result = prj_connection.logs(correlation_id)
156
+ say result['logs'].to_yaml
168
157
  end
169
158
 
170
159
  SUPPORTED_CONTEXTS = ['Project', 'Organization'].freeze
160
+
171
161
  desc "api-resources", "retrieves a list of all available resource types"
172
162
  def api_resources
173
- connection.available_resource_types do |res|
174
- res.on_success do |available_types|
175
- format_str = "%20.20s %20.20s"
176
- puts format_str % ['Type', 'Required Context']
177
- available_types.sort_by { |desc| desc['type'] }.each do |desc|
178
- next unless SUPPORTED_CONTEXTS.include?(desc['context'])
179
- puts format_str % [desc['type'], desc['context']]
180
- end
181
- end
182
- res.on_error { |err, result| warn_api_error("could not get", err, result) }
163
+ available_types = connection.available_resource_types.sort_by { |desc| desc['type'] }.filter { |desc| SUPPORTED_CONTEXTS.include?(desc['context']) }
164
+ table = [['Type', 'Required Context', '']]
165
+ table += available_types.map do |desc|
166
+ [desc['type'], desc['context'], PhoenixClient.supported_type?(desc['type']) ? '' : '(unsupported, update CLI)']
183
167
  end
168
+ print_table table, indent: 1
184
169
  end
185
170
  end
186
171
  end