xapixctl 1.1.2 → 1.2.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.github/workflows/cd.yaml +19 -0
- data/.ruby-version +1 -1
- data/Gemfile.lock +53 -36
- data/lib/xapixctl.rb +0 -3
- data/lib/xapixctl/base_cli.rb +45 -12
- data/lib/xapixctl/cli.rb +40 -62
- data/lib/xapixctl/phoenix_client.rb +36 -259
- data/lib/xapixctl/phoenix_client/connection.rb +50 -0
- data/lib/xapixctl/phoenix_client/organization_connection.rb +61 -0
- data/lib/xapixctl/phoenix_client/project_connection.rb +164 -0
- data/lib/xapixctl/phoenix_client/result_handler.rb +35 -0
- data/lib/xapixctl/preview_cli.rb +6 -18
- data/lib/xapixctl/sync_cli.rb +97 -0
- data/lib/xapixctl/version.rb +1 -1
- data/xapixctl.gemspec +10 -3
- metadata +58 -10
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c745d574b6c72e52ff4a74989ac0b4663c6707e9dbd3c14e69facac3e135a978
|
4
|
+
data.tar.gz: 042e00431dc81a64d68d3a3b61af8b54b4319133144a4ba3916d26ad6a32a423
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 34c8479e26148a0e158f20e9202340dc65dd84a85d624498f9e0b07994b1964257f5ab3d1b8db5fbc7304d4800ccb1672570f1beaffd857f7443c654d986cb63
|
7
|
+
data.tar.gz: 7071a6a8a53d41b41eec96af9ba05c58446c56ceb3be73148b619e3c33ac44d6da75b45b4192e0f5d1a4d547903ec98fbd2f87431ab5082cb659e456e827d39b
|
@@ -0,0 +1,19 @@
|
|
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: Install dependencies
|
17
|
+
run: bundle install
|
18
|
+
- name: Run tests
|
19
|
+
run: bundle exec rspec
|
data/.ruby-version
CHANGED
@@ -1 +1 @@
|
|
1
|
-
2.6.
|
1
|
+
2.6.3
|
data/Gemfile.lock
CHANGED
@@ -1,40 +1,45 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
xapixctl (1.
|
4
|
+
xapixctl (1.2.0)
|
5
5
|
activesupport (>= 5.2.3, < 6.0.0)
|
6
6
|
rest-client (>= 2.1.0, < 3.0.0)
|
7
|
-
thor (>= 1.0.0, < 1.
|
7
|
+
thor (>= 1.0.0, < 1.2.0)
|
8
8
|
|
9
9
|
GEM
|
10
10
|
remote: https://rubygems.org/
|
11
11
|
specs:
|
12
|
-
activesupport (5.2.4.
|
12
|
+
activesupport (5.2.4.5)
|
13
13
|
concurrent-ruby (~> 1.0, >= 1.0.2)
|
14
14
|
i18n (>= 0.7, < 2)
|
15
15
|
minitest (~> 5.1)
|
16
16
|
tzinfo (~> 1.1)
|
17
|
-
|
18
|
-
|
17
|
+
addressable (2.7.0)
|
18
|
+
public_suffix (>= 2.0.2, < 5.0)
|
19
|
+
ast (2.4.2)
|
20
|
+
concurrent-ruby (1.1.8)
|
21
|
+
crack (0.4.4)
|
19
22
|
diff-lcs (1.4.4)
|
20
23
|
domain_name (0.5.20190701)
|
21
24
|
unf (>= 0.0.5, < 1.0.0)
|
25
|
+
hashdiff (1.0.1)
|
22
26
|
http-accept (1.7.0)
|
23
27
|
http-cookie (1.0.3)
|
24
28
|
domain_name (~> 0.5)
|
25
|
-
i18n (1.8.
|
29
|
+
i18n (1.8.9)
|
26
30
|
concurrent-ruby (~> 1.0)
|
27
31
|
mime-types (3.3.1)
|
28
32
|
mime-types-data (~> 3.2015)
|
29
|
-
mime-types-data (3.
|
30
|
-
minitest (5.14.
|
33
|
+
mime-types-data (3.2021.0225)
|
34
|
+
minitest (5.14.4)
|
31
35
|
netrc (0.11.0)
|
32
|
-
parallel (1.
|
33
|
-
parser (
|
36
|
+
parallel (1.20.1)
|
37
|
+
parser (3.0.0.0)
|
34
38
|
ast (~> 2.4.1)
|
39
|
+
public_suffix (4.0.6)
|
35
40
|
rainbow (3.0.0)
|
36
|
-
rake (13.0.
|
37
|
-
regexp_parser (1.
|
41
|
+
rake (13.0.3)
|
42
|
+
regexp_parser (2.1.1)
|
38
43
|
relaxed-rubocop (2.5)
|
39
44
|
rest-client (2.1.0)
|
40
45
|
http-accept (>= 1.7.0, < 2.0)
|
@@ -42,50 +47,62 @@ GEM
|
|
42
47
|
mime-types (>= 1.16, < 4.0)
|
43
48
|
netrc (~> 0.8)
|
44
49
|
rexml (3.2.4)
|
45
|
-
rspec (3.
|
46
|
-
rspec-core (~> 3.
|
47
|
-
rspec-expectations (~> 3.
|
48
|
-
rspec-mocks (~> 3.
|
49
|
-
rspec-core (3.
|
50
|
-
rspec-support (~> 3.
|
51
|
-
rspec-expectations (3.
|
50
|
+
rspec (3.10.0)
|
51
|
+
rspec-core (~> 3.10.0)
|
52
|
+
rspec-expectations (~> 3.10.0)
|
53
|
+
rspec-mocks (~> 3.10.0)
|
54
|
+
rspec-core (3.10.1)
|
55
|
+
rspec-support (~> 3.10.0)
|
56
|
+
rspec-expectations (3.10.1)
|
52
57
|
diff-lcs (>= 1.2.0, < 2.0)
|
53
|
-
rspec-support (~> 3.
|
54
|
-
rspec-mocks (3.
|
58
|
+
rspec-support (~> 3.10.0)
|
59
|
+
rspec-mocks (3.10.2)
|
55
60
|
diff-lcs (>= 1.2.0, < 2.0)
|
56
|
-
rspec-support (~> 3.
|
57
|
-
rspec-support (3.
|
58
|
-
rubocop (
|
61
|
+
rspec-support (~> 3.10.0)
|
62
|
+
rspec-support (3.10.2)
|
63
|
+
rubocop (1.11.0)
|
59
64
|
parallel (~> 1.10)
|
60
|
-
parser (>=
|
65
|
+
parser (>= 3.0.0.0)
|
61
66
|
rainbow (>= 2.2.2, < 4.0)
|
62
|
-
regexp_parser (>= 1.
|
67
|
+
regexp_parser (>= 1.8, < 3.0)
|
63
68
|
rexml
|
64
|
-
rubocop-ast (>=
|
69
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
65
70
|
ruby-progressbar (~> 1.7)
|
66
|
-
unicode-display_width (>= 1.4.0, <
|
67
|
-
rubocop-ast (
|
71
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
72
|
+
rubocop-ast (1.4.1)
|
68
73
|
parser (>= 2.7.1.5)
|
69
|
-
|
70
|
-
|
74
|
+
rubocop-rake (0.5.1)
|
75
|
+
rubocop
|
76
|
+
rubocop-rspec (2.2.0)
|
77
|
+
rubocop (~> 1.0)
|
78
|
+
rubocop-ast (>= 1.1.0)
|
79
|
+
ruby-progressbar (1.11.0)
|
80
|
+
thor (1.1.0)
|
71
81
|
thread_safe (0.3.6)
|
72
|
-
tzinfo (1.2.
|
82
|
+
tzinfo (1.2.9)
|
73
83
|
thread_safe (~> 0.1)
|
74
84
|
unf (0.1.4)
|
75
85
|
unf_ext
|
76
86
|
unf_ext (0.0.7.7)
|
77
|
-
unicode-display_width (
|
87
|
+
unicode-display_width (2.0.0)
|
88
|
+
webmock (3.11.0)
|
89
|
+
addressable (>= 2.3.6)
|
90
|
+
crack (>= 0.3.2)
|
91
|
+
hashdiff (>= 0.4.0, < 2.0.0)
|
78
92
|
|
79
93
|
PLATFORMS
|
80
94
|
ruby
|
81
95
|
|
82
96
|
DEPENDENCIES
|
83
|
-
bundler (~> 1.
|
97
|
+
bundler (~> 2.1.4)
|
84
98
|
rake (~> 13.0)
|
85
99
|
relaxed-rubocop (~> 2.5)
|
86
100
|
rspec (~> 3.0)
|
87
|
-
rubocop (~>
|
101
|
+
rubocop (~> 1.11)
|
102
|
+
rubocop-rake
|
103
|
+
rubocop-rspec
|
104
|
+
webmock
|
88
105
|
xapixctl!
|
89
106
|
|
90
107
|
BUNDLED WITH
|
91
|
-
1.
|
108
|
+
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
|
|
data/lib/xapixctl/base_cli.rb
CHANGED
@@ -1,20 +1,23 @@
|
|
1
1
|
# frozen_string_literal: true
|
2
2
|
|
3
3
|
require 'thor'
|
4
|
+
require 'pathname'
|
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 :
|
10
|
+
class_option :org, aliases: "-o", desc: "Organization; Fallback: environment variable XAPIX_ORG"
|
11
|
+
class_option :project, aliases: "-p", desc: "Project, can be ORG/PROJECT; Fallback: environment variable XAPIX_PROJECT"
|
12
|
+
class_option :debug
|
10
13
|
class_option :xapix_url, desc: "Fallback: environment variable XAPIX_URL. URL to Xapix. Default: https://cloud.xapix.io/"
|
11
14
|
class_option :xapix_token, desc: "Fallback: environment variable XAPIX_TOKEN. Your access token."
|
12
15
|
|
13
16
|
private
|
14
17
|
|
15
|
-
def
|
18
|
+
def exit_with_api_error(err, result)
|
16
19
|
details = result['errors'].map { |k| k['detail'] }.unshift('').join("\n ") rescue err.to_s
|
17
|
-
warn "
|
20
|
+
warn "API error: #{details}"
|
18
21
|
exit 1
|
19
22
|
end
|
20
23
|
|
@@ -29,8 +32,8 @@ module Xapixctl
|
|
29
32
|
end
|
30
33
|
|
31
34
|
DOCUMENT_STRUCTURE = %w[version kind metadata definition].freeze
|
32
|
-
def resources_from_file(filename)
|
33
|
-
load_files(filename) do |yaml_string|
|
35
|
+
def resources_from_file(filename, ignore_missing: false)
|
36
|
+
load_files(filename, ignore_missing) do |yaml_string|
|
34
37
|
yaml_string.split(/^---\s*\n/).map { |yml| Psych.safe_load(yml) }.compact.each do |doc|
|
35
38
|
unless (DOCUMENT_STRUCTURE - doc.keys.map(&:to_s)).empty?
|
36
39
|
warn "does not look like a correct resource definition:"
|
@@ -42,24 +45,54 @@ module Xapixctl
|
|
42
45
|
end
|
43
46
|
end
|
44
47
|
|
45
|
-
def load_files(filename)
|
48
|
+
def load_files(filename, ignore_missing)
|
46
49
|
if filename == '-'
|
47
50
|
yield $stdin.read
|
48
51
|
else
|
49
|
-
pn = Pathname.new(filename)
|
52
|
+
pn = filename.is_a?(Pathname) ? filename : Pathname.new(filename)
|
50
53
|
if pn.directory?
|
51
54
|
pn.glob(["**/*.yaml", "**/*.yml"]).sort.each { |dpn| yield dpn.read }
|
52
|
-
|
55
|
+
elsif pn.exist?
|
53
56
|
yield pn.read
|
57
|
+
elsif !ignore_missing
|
58
|
+
warn "file not found: #{filename}"
|
59
|
+
exit 1
|
54
60
|
end
|
55
61
|
end
|
56
62
|
end
|
57
63
|
|
58
64
|
def connection
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
65
|
+
@connection ||= begin
|
66
|
+
url = options[:xapix_url] || ENV['XAPIX_URL'] || 'https://cloud.xapix.io/'
|
67
|
+
token = options[:xapix_token] || ENV['XAPIX_TOKEN']
|
68
|
+
raise Thor::RequiredArgumentMissingError, "No XAPIX_TOKEN given. Either use --xapix_token [TOKEN] or set environment variable XAPIX_TOKEN (recommended)" if !token
|
69
|
+
PhoenixClient.connection(
|
70
|
+
url, token,
|
71
|
+
default_error_handler: ->(err, result) { exit_with_api_error(err, result) },
|
72
|
+
logging: options[:debug] ? 'stdout' : nil
|
73
|
+
)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
def org_or_prj_connection
|
78
|
+
options[:project] ? prj_connection : org_connection
|
79
|
+
end
|
80
|
+
|
81
|
+
def org_connection
|
82
|
+
org = options[:org] || ENV['XAPIX_ORG']
|
83
|
+
raise Thor::RequiredArgumentMissingError, "No organization given. Either use --org [ORG] or set environment variable XAPIX_ORG" if !org
|
84
|
+
@org_connection ||= connection.organization(org)
|
85
|
+
end
|
86
|
+
|
87
|
+
def prj_connection
|
88
|
+
project = options[:project] || ENV['XAPIX_PROJECT']
|
89
|
+
org = options[:org] || ENV['XAPIX_ORG']
|
90
|
+
raise Thor::RequiredArgumentMissingError, "No project given. Either use --project [ORG/PROJECT] or set environment variable XAPIX_PROJECT" if !project
|
91
|
+
if project.include?('/')
|
92
|
+
org, project = project.split('/', 2)
|
93
|
+
end
|
94
|
+
raise Thor::RequiredArgumentMissingError, "No organization given. Either use --org [ORG] or set environment variable XAPIX_ORG" if !org
|
95
|
+
@prj_connection ||= connection.project(org: org, project: project)
|
63
96
|
end
|
64
97
|
end
|
65
98
|
end
|
data/lib/xapixctl/cli.rb
CHANGED
@@ -2,24 +2,26 @@
|
|
2
2
|
|
3
3
|
require 'xapixctl/base_cli'
|
4
4
|
require 'xapixctl/preview_cli'
|
5
|
+
require 'xapixctl/sync_cli'
|
5
6
|
|
6
7
|
module Xapixctl
|
7
8
|
class Cli < BaseCli
|
8
9
|
desc "preview SUBCOMMAND ...ARGS", "Request preview for resources"
|
9
10
|
subcommand "preview", Preview
|
10
11
|
|
11
|
-
|
12
|
-
|
12
|
+
desc "sync SUBCOMMAND ...ARGS", "Sync resources"
|
13
|
+
subcommand "sync", Sync
|
14
|
+
|
13
15
|
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
14
16
|
desc "get TYPE [ID]", "retrieve either all resources of given TYPE or just the resource of given TYPE and ID"
|
15
17
|
long_desc <<-LONGDESC
|
16
18
|
`xapixctl get TYPE` will retrieve the list of all resources of given type.
|
17
19
|
|
18
20
|
If requested on an organization (i.e. no project given), the following types are available:
|
19
|
-
\
|
21
|
+
\x5Project
|
20
22
|
|
21
23
|
If requested on an a project (i.e. organization and project are given), the following types are available:
|
22
|
-
\x5
|
24
|
+
\x5#{PhoenixClient::SUPPORTED_RESOURCE_TYPES.sort.join(', ')}
|
23
25
|
|
24
26
|
Use the format to switch between the different output formats.
|
25
27
|
|
@@ -27,24 +29,17 @@ module Xapixctl
|
|
27
29
|
\x5> $ xapixctl get -o xapix Project
|
28
30
|
\x5> $ xapixctl get -o xapix Project some-project
|
29
31
|
\x5> $ xapixctl get -o xapix -p some-project DataSource
|
30
|
-
\x5> $ xapixctl get -
|
32
|
+
\x5> $ xapixctl get -p xapix/some-project DataSource
|
33
|
+
\x5> $ xapixctl get -p xapix/some-project DataSource get-a-list
|
31
34
|
LONGDESC
|
32
35
|
def get(resource_type, resource_id = nil)
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
36
|
+
conn = org_or_prj_connection
|
37
|
+
resource_ids = resource_id ? [resource_id] : conn.resource_ids(resource_type)
|
38
|
+
resource_ids.each do |res_id|
|
39
|
+
puts conn.resource(resource_type, res_id, format: options[:format].to_sym)
|
43
40
|
end
|
44
41
|
end
|
45
42
|
|
46
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
47
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
48
43
|
option :format, aliases: "-f", default: 'text', enum: ['text', 'yaml', 'json'], desc: "Output format"
|
49
44
|
desc "export", "retrieves all resources within a project"
|
50
45
|
long_desc <<-LONGDESC
|
@@ -54,19 +49,15 @@ module Xapixctl
|
|
54
49
|
|
55
50
|
Examples:
|
56
51
|
\x5> $ xapixctl export -o xapix -p some-project
|
57
|
-
\x5> $ xapixctl export -
|
52
|
+
\x5> $ xapixctl export -p xapix/some-project
|
53
|
+
\x5> $ xapixctl export -p xapix/some-project -f yaml > some_project.yaml
|
58
54
|
LONGDESC
|
59
55
|
def export
|
60
|
-
|
61
|
-
|
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) }
|
56
|
+
get('Project', prj_connection.project)
|
57
|
+
prj_connection.resource_types_for_export.each { |type| get(type) }
|
65
58
|
end
|
66
59
|
|
67
|
-
option :
|
68
|
-
option :project, aliases: "-p", desc: "Project"
|
69
|
-
option :file, aliases: "-f", required: true
|
60
|
+
option :file, aliases: "-f", required: true, desc: 'file or directory from which to load resource descriptions'
|
70
61
|
desc "apply", "Create or update a resource from a file"
|
71
62
|
long_desc <<-LONGDESC
|
72
63
|
`xapixctl apply -f FILE` will apply the given resource description.
|
@@ -82,7 +73,8 @@ module Xapixctl
|
|
82
73
|
Examples:
|
83
74
|
\x5> $ xapixctl apply -o xapix -f get_a_list.yaml
|
84
75
|
\x5> $ xapixctl apply -o xapix -p some-project -f get_a_list.yaml
|
85
|
-
\x5> $ xapixctl apply -
|
76
|
+
\x5> $ xapixctl apply -p xapix/some-project -f get_a_list.yaml
|
77
|
+
\x5> $ xapixctl apply -p xapix/some-project -f ./
|
86
78
|
|
87
79
|
To copy over all data sources from one project to another:
|
88
80
|
\x5> $ xapixctl get -o xapix-old -p some-project DataSource -f yaml | xapixctl apply -o xapix-new -f -
|
@@ -90,16 +82,11 @@ module Xapixctl
|
|
90
82
|
def apply
|
91
83
|
resources_from_file(options[:file]) do |desc|
|
92
84
|
puts "applying #{desc['kind']} #{desc.dig('metadata', 'id')}"
|
93
|
-
|
94
|
-
res.on_success { puts 'OK' }
|
95
|
-
res.on_error { |err, result| warn_api_error("could not apply changes", err, result); break }
|
96
|
-
end
|
85
|
+
org_or_prj_connection.apply(desc)
|
97
86
|
end
|
98
87
|
end
|
99
88
|
|
100
|
-
option :
|
101
|
-
option :project, aliases: "-p", desc: "Project"
|
102
|
-
option :file, aliases: "-f"
|
89
|
+
option :file, aliases: "-f", desc: 'file or directory from which to load resource descriptions'
|
103
90
|
desc "delete [TYPE ID] [-f FILE]", "delete the resources in the file"
|
104
91
|
long_desc <<-LONGDESC
|
105
92
|
`xapixctl delete -f FILE` will delete all the resources listed in the file.
|
@@ -110,22 +97,20 @@ module Xapixctl
|
|
110
97
|
You can also read from stdin by using '-'.
|
111
98
|
|
112
99
|
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
100
|
\x5> $ xapixctl delete -o xapix Project some-project
|
101
|
+
\x5> $ xapixctl delete -p xapix -p some-project DataSource get-a-list
|
102
|
+
\x5> $ xapixctl delete -p xapix/some-project DataSource get-a-list
|
103
|
+
\x5> $ xapixctl delete -p xapix/some-project -f get_a_list.yaml
|
104
|
+
\x5> $ xapixctl delete -p xapix/some-project -f ./
|
117
105
|
LONGDESC
|
118
106
|
def delete(resource_type = nil, resource_id = nil)
|
119
107
|
if resource_type && resource_id
|
120
|
-
|
121
|
-
|
122
|
-
res.on_error { |err, result| warn_api_error("could not delete", err, result) }
|
123
|
-
end
|
108
|
+
org_or_prj_connection.delete(resource_type, resource_id)
|
109
|
+
puts "DELETED #{resource_type} #{resource_id}"
|
124
110
|
elsif options[:file]
|
125
111
|
resources_from_file(options[:file]) do |desc|
|
126
112
|
res_type = desc['kind']
|
127
113
|
res_id = desc.dig('metadata', 'id')
|
128
|
-
puts "deleting #{res_type} #{res_id}"
|
129
114
|
delete(res_type, res_id)
|
130
115
|
end
|
131
116
|
else
|
@@ -133,24 +118,21 @@ module Xapixctl
|
|
133
118
|
end
|
134
119
|
end
|
135
120
|
|
136
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
137
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
138
121
|
desc "publish", "Publishes the current version of the given project"
|
139
122
|
long_desc <<-LONGDESC
|
140
123
|
`xapixctl publish` will publish the given project.
|
141
124
|
|
142
125
|
Examples:
|
143
126
|
\x5> $ xapixctl publish -o xapix -p some-project
|
127
|
+
\x5> $ xapixctl publish -p xapix/some-project
|
144
128
|
LONGDESC
|
145
129
|
def publish
|
146
|
-
|
130
|
+
prj_connection.publish do |res|
|
147
131
|
res.on_success { |result| show_deployment_status(result) }
|
148
|
-
res.on_error { |err, result| show_deployment_status(result);
|
132
|
+
res.on_error { |err, result| show_deployment_status(result); exit_with_api_error(err, result) }
|
149
133
|
end
|
150
134
|
end
|
151
135
|
|
152
|
-
option :org, aliases: "-o", desc: "Organization", required: true
|
153
|
-
option :project, aliases: "-p", desc: "Project", required: true
|
154
136
|
desc "logs CORRELATION_ID", "Retrieves the execution logs for the given correlation ID"
|
155
137
|
long_desc <<-LONGDESC
|
156
138
|
`xapixctl logs CORRELATION_ID` will retrieve execution logs for the given correlation ID.
|
@@ -159,27 +141,23 @@ module Xapixctl
|
|
159
141
|
|
160
142
|
Examples:
|
161
143
|
\x5> $ xapixctl logs be9c8608-e291-460d-bc20-5a394c4079d4 -o xapix -p some-project
|
144
|
+
\x5> $ xapixctl logs be9c8608-e291-460d-bc20-5a394c4079d4 -p xapix/some-project
|
162
145
|
LONGDESC
|
163
146
|
def logs(correlation_id)
|
164
|
-
|
165
|
-
|
166
|
-
res.on_error { |err, result| warn_api_error('could not get logs', err, result) }
|
167
|
-
end
|
147
|
+
result = prj_connection.logs(correlation_id)
|
148
|
+
puts result['logs'].to_yaml
|
168
149
|
end
|
169
150
|
|
170
151
|
SUPPORTED_CONTEXTS = ['Project', 'Organization'].freeze
|
152
|
+
|
171
153
|
desc "api-resources", "retrieves a list of all available resource types"
|
172
154
|
def api_resources
|
173
|
-
connection.available_resource_types
|
174
|
-
|
175
|
-
|
176
|
-
|
177
|
-
|
178
|
-
|
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) }
|
155
|
+
available_types = connection.available_resource_types
|
156
|
+
format_str = "%20.20s %20.20s %26.26s"
|
157
|
+
puts format_str % ['Type', 'Required Context', '']
|
158
|
+
available_types.sort_by { |desc| desc['type'] }.each do |desc|
|
159
|
+
next unless SUPPORTED_CONTEXTS.include?(desc['context'])
|
160
|
+
puts format_str % [desc['type'], desc['context'], PhoenixClient.supported_type?(desc['type']) ? '' : '(unsupported, update CLI)']
|
183
161
|
end
|
184
162
|
end
|
185
163
|
end
|