concourse.rb 0.1.0.pre.9 → 0.5.0.pre.1
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 +4 -4
- data/Gemfile +2 -0
- data/Gemfile.lock +30 -2
- data/README.md +29 -9
- data/Rakefile +67 -45
- data/bin/console +1 -0
- data/concourse.rb.gemspec +24 -10
- data/lib/concourse.rb +5 -0
- data/lib/concourse/client.rb +10 -4
- data/lib/concourse/errors.rb +16 -0
- data/lib/concourse/headers.rb +9 -7
- data/lib/concourse/http.rb +43 -0
- data/lib/concourse/models.rb +8 -0
- data/lib/concourse/models/token.rb +34 -0
- data/lib/concourse/sub_clients.rb +3 -1
- data/lib/concourse/sub_clients/skymarshal_client.rb +71 -37
- data/lib/concourse/urls.rb +2 -2
- data/lib/concourse/version.rb +3 -1
- metadata +81 -35
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ca2610029d784fee0b28516c246eb64b9f49f939d24e1854dfcca52af05a5c74
|
4
|
+
data.tar.gz: cc90d5d0f12729d4170c5df3b7a0037d3faf0e376aa92754085b1729fbe76ef6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a49670a70d1841e4fef6fe713192e005edc80e069d0d0abafb983b56c19ab3c7d0ed740b074844aa7e2e8c70c6bd21d8432e2b8125cf15692f78c0b1a296799f
|
7
|
+
data.tar.gz: e686d1181b9252e0f50d244fb1a40ada9aa3a4e8b29cdb22838b69d1e16c4491ce8a5ca358603817940498daf28f60e3a61fa0e9c4ddfde7e7e3973d28dc94a4
|
data/Gemfile
CHANGED
data/Gemfile.lock
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
PATH
|
2
2
|
remote: .
|
3
3
|
specs:
|
4
|
-
concourse.rb (0.
|
4
|
+
concourse.rb (0.5.0.pre.1)
|
5
5
|
dry-schema (~> 0.5)
|
6
6
|
excon (~> 0.72)
|
7
7
|
semantic (~> 1.5)
|
@@ -17,6 +17,7 @@ GEM
|
|
17
17
|
zeitwerk (~> 2.3)
|
18
18
|
addressable (2.7.0)
|
19
19
|
public_suffix (>= 2.0.2, < 5.0)
|
20
|
+
ast (2.4.2)
|
20
21
|
colored2 (3.1.2)
|
21
22
|
concurrent-ruby (1.1.7)
|
22
23
|
diff-lcs (1.4.4)
|
@@ -73,7 +74,11 @@ GEM
|
|
73
74
|
sawyer (~> 0.8.0, >= 0.5.3)
|
74
75
|
open4 (1.3.4)
|
75
76
|
openssl (2.2.0)
|
77
|
+
parallel (1.20.1)
|
78
|
+
parser (3.0.0.0)
|
79
|
+
ast (~> 2.4.1)
|
76
80
|
public_suffix (4.0.6)
|
81
|
+
rainbow (3.0.0)
|
77
82
|
rake (13.0.3)
|
78
83
|
rake_circle_ci (0.9.0)
|
79
84
|
colored2 (~> 3.1)
|
@@ -95,6 +100,8 @@ GEM
|
|
95
100
|
colored2 (~> 3.1)
|
96
101
|
rake_factory (~> 0.23)
|
97
102
|
sshkey (~> 2.0)
|
103
|
+
regexp_parser (2.1.1)
|
104
|
+
rexml (3.2.4)
|
98
105
|
rspec (3.10.0)
|
99
106
|
rspec-core (~> 3.10.0)
|
100
107
|
rspec-expectations (~> 3.10.0)
|
@@ -108,6 +115,23 @@ GEM
|
|
108
115
|
diff-lcs (>= 1.2.0, < 2.0)
|
109
116
|
rspec-support (~> 3.10.0)
|
110
117
|
rspec-support (3.10.1)
|
118
|
+
rubocop (1.12.0)
|
119
|
+
parallel (~> 1.10)
|
120
|
+
parser (>= 3.0.0.0)
|
121
|
+
rainbow (>= 2.2.2, < 4.0)
|
122
|
+
regexp_parser (>= 1.8, < 3.0)
|
123
|
+
rexml
|
124
|
+
rubocop-ast (>= 1.2.0, < 2.0)
|
125
|
+
ruby-progressbar (~> 1.7)
|
126
|
+
unicode-display_width (>= 1.4.0, < 3.0)
|
127
|
+
rubocop-ast (1.4.1)
|
128
|
+
parser (>= 2.7.1.5)
|
129
|
+
rubocop-rake (0.5.1)
|
130
|
+
rubocop
|
131
|
+
rubocop-rspec (2.2.0)
|
132
|
+
rubocop (~> 1.0)
|
133
|
+
rubocop-ast (>= 1.1.0)
|
134
|
+
ruby-progressbar (1.11.0)
|
111
135
|
ruby2_keywords (0.0.2)
|
112
136
|
ruby_gpg2 (0.8.0)
|
113
137
|
lino (>= 1.5)
|
@@ -118,6 +142,7 @@ GEM
|
|
118
142
|
sshkey (2.0.0)
|
119
143
|
tzinfo (2.0.4)
|
120
144
|
concurrent-ruby (~> 1.0)
|
145
|
+
unicode-display_width (2.0.0)
|
121
146
|
zeitwerk (2.4.2)
|
122
147
|
|
123
148
|
PLATFORMS
|
@@ -138,6 +163,9 @@ DEPENDENCIES
|
|
138
163
|
rake_gpg (~> 0.12)
|
139
164
|
rake_ssh (~> 0.4)
|
140
165
|
rspec (~> 3.9)
|
166
|
+
rubocop (~> 1.12)
|
167
|
+
rubocop-rake (~> 0.5)
|
168
|
+
rubocop-rspec (~> 2.2)
|
141
169
|
|
142
170
|
BUNDLED WITH
|
143
|
-
2.2.
|
171
|
+
2.2.15
|
data/README.md
CHANGED
@@ -24,15 +24,35 @@ Add usage here.
|
|
24
24
|
|
25
25
|
## Development
|
26
26
|
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
27
|
+
To install dependencies and run the build, run the pre-commit build:
|
28
|
+
|
29
|
+
```shell script
|
30
|
+
./go
|
31
|
+
```
|
32
|
+
|
33
|
+
This runs all unit tests and other checks including coverage and code linting /
|
34
|
+
formatting.
|
35
|
+
|
36
|
+
To run only the unit tests, including coverage:
|
37
|
+
|
38
|
+
```shell script
|
39
|
+
./go test:unit
|
40
|
+
```
|
41
|
+
|
42
|
+
To attempt to fix any code linting / formatting issues:
|
43
|
+
|
44
|
+
```shell script
|
45
|
+
./go library:fix
|
46
|
+
```
|
47
|
+
|
48
|
+
To check for code linting / formatting issues without fixing:
|
49
|
+
|
50
|
+
```shell script
|
51
|
+
./go library:check
|
52
|
+
```
|
53
|
+
|
54
|
+
You can also run `bin/console` for an interactive prompt that will allow you to
|
55
|
+
experiment.
|
36
56
|
|
37
57
|
### Common Tasks
|
38
58
|
|
data/Rakefile
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'yaml'
|
2
4
|
require 'rake_circle_ci'
|
3
5
|
require 'rake_github'
|
@@ -5,13 +7,16 @@ require 'rake_ssh'
|
|
5
7
|
require 'rake_gpg'
|
6
8
|
require 'securerandom'
|
7
9
|
require 'rspec/core/rake_task'
|
10
|
+
require 'rubocop/rake_task'
|
8
11
|
|
9
|
-
task :
|
10
|
-
|
11
|
-
|
12
|
+
task default: %i[
|
13
|
+
library:fix
|
14
|
+
test:unit
|
15
|
+
]
|
12
16
|
|
13
17
|
namespace :encryption do
|
14
18
|
namespace :passphrase do
|
19
|
+
desc 'Generate encryption passphrase for CI GPG key'
|
15
20
|
task :generate do
|
16
21
|
File.open('config/secrets/ci/encryption.passphrase', 'w') do |f|
|
17
22
|
f.write(SecureRandom.base64(36))
|
@@ -23,86 +28,103 @@ end
|
|
23
28
|
namespace :keys do
|
24
29
|
namespace :deploy do
|
25
30
|
RakeSSH.define_key_tasks(
|
26
|
-
|
27
|
-
|
31
|
+
path: 'config/secrets/ci/',
|
32
|
+
comment: 'maintainers@infrablocks.io'
|
33
|
+
)
|
28
34
|
end
|
29
35
|
|
30
36
|
namespace :gpg do
|
31
37
|
RakeGPG.define_generate_key_task(
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
38
|
+
output_directory: 'config/secrets/ci',
|
39
|
+
name_prefix: 'gpg',
|
40
|
+
owner_name: 'InfraBlocks Maintainers',
|
41
|
+
owner_email: 'maintainers@infrablocks.io',
|
42
|
+
owner_comment: 'concourse.rb CI Key'
|
43
|
+
)
|
37
44
|
end
|
38
45
|
end
|
39
46
|
|
47
|
+
RuboCop::RakeTask.new
|
48
|
+
|
49
|
+
namespace :library do
|
50
|
+
desc 'Run all checks of the library'
|
51
|
+
task check: [:rubocop]
|
52
|
+
|
53
|
+
desc 'Attempt to automatically fix issues with the library'
|
54
|
+
task fix: [:'rubocop:auto_correct']
|
55
|
+
end
|
56
|
+
|
57
|
+
namespace :test do
|
58
|
+
RSpec::Core::RakeTask.new(:unit)
|
59
|
+
end
|
60
|
+
|
40
61
|
RakeCircleCI.define_project_tasks(
|
41
|
-
|
42
|
-
|
62
|
+
namespace: :circle_ci,
|
63
|
+
project_slug: 'github/infrablocks/concourse.rb'
|
43
64
|
) do |t|
|
44
65
|
circle_ci_config =
|
45
|
-
|
66
|
+
YAML.load_file('config/secrets/circle_ci/config.yaml')
|
46
67
|
|
47
|
-
t.api_token = circle_ci_config[
|
68
|
+
t.api_token = circle_ci_config['circle_ci_api_token']
|
48
69
|
t.environment_variables = {
|
49
|
-
|
50
|
-
|
51
|
-
|
70
|
+
ENCRYPTION_PASSPHRASE:
|
71
|
+
File.read('config/secrets/ci/encryption.passphrase')
|
72
|
+
.chomp
|
52
73
|
}
|
53
74
|
t.checkout_keys = []
|
54
75
|
t.ssh_keys = [
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
76
|
+
{
|
77
|
+
hostname: 'github.com',
|
78
|
+
private_key: File.read('config/secrets/ci/ssh.private')
|
79
|
+
}
|
59
80
|
]
|
60
81
|
end
|
61
82
|
|
62
83
|
RakeGithub.define_repository_tasks(
|
63
|
-
|
64
|
-
|
84
|
+
namespace: :github,
|
85
|
+
repository: 'infrablocks/concourse.rb'
|
65
86
|
) do |t|
|
66
87
|
github_config =
|
67
|
-
|
88
|
+
YAML.load_file('config/secrets/github/config.yaml')
|
68
89
|
|
69
|
-
t.access_token = github_config[
|
90
|
+
t.access_token = github_config['github_personal_access_token']
|
70
91
|
t.deploy_keys = [
|
71
|
-
|
72
|
-
|
73
|
-
|
74
|
-
|
92
|
+
{
|
93
|
+
title: 'CircleCI',
|
94
|
+
public_key: File.read('config/secrets/ci/ssh.public')
|
95
|
+
}
|
75
96
|
]
|
76
97
|
end
|
77
98
|
|
78
99
|
namespace :pipeline do
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
100
|
+
desc 'Prepare CircleCI Pipeline'
|
101
|
+
task prepare: %i[
|
102
|
+
circle_ci:project:follow
|
103
|
+
circle_ci:env_vars:ensure
|
104
|
+
circle_ci:checkout_keys:ensure
|
105
|
+
circle_ci:ssh_keys:ensure
|
106
|
+
github:deploy_keys:ensure
|
85
107
|
]
|
86
108
|
end
|
87
109
|
|
88
110
|
namespace :version do
|
89
|
-
desc
|
111
|
+
desc 'Bump version for specified type (pre, major, minor, patch)'
|
90
112
|
task :bump, [:type] do |_, args|
|
91
113
|
bump_version_for(args.type)
|
92
114
|
end
|
93
115
|
end
|
94
116
|
|
95
|
-
desc
|
117
|
+
desc 'Release gem'
|
96
118
|
task :release do
|
97
|
-
sh
|
119
|
+
sh 'gem release --tag --push'
|
98
120
|
end
|
99
121
|
|
100
122
|
def bump_version_for(version_type)
|
101
|
-
sh
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
123
|
+
sh 'gem bump ' \
|
124
|
+
'--skip-ci ' \
|
125
|
+
"--version #{version_type} " \
|
126
|
+
'--file lib/concourse/version.rb ' \
|
127
|
+
'&& bundle install ' \
|
128
|
+
'&& export LAST_MESSAGE="$(git log -1 --pretty=%B)" ' \
|
129
|
+
'&& git commit -a --amend -m "${LAST_MESSAGE}"'
|
108
130
|
end
|
data/bin/console
CHANGED
data/concourse.rb.gemspec
CHANGED
@@ -1,23 +1,34 @@
|
|
1
|
-
#
|
2
|
-
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
lib = File.expand_path('lib', __dir__)
|
3
4
|
$LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
|
4
5
|
require 'concourse/version'
|
5
6
|
require 'date'
|
6
7
|
|
8
|
+
files = %w[
|
9
|
+
bin
|
10
|
+
lib
|
11
|
+
CODE_OF_CONDUCT.md
|
12
|
+
concourse.rb.gemspec
|
13
|
+
Gemfile
|
14
|
+
LICENSE.txt
|
15
|
+
Rakefile
|
16
|
+
README.md
|
17
|
+
]
|
18
|
+
|
7
19
|
Gem::Specification.new do |spec|
|
8
20
|
spec.name = 'concourse.rb'
|
9
21
|
spec.version = Concourse::VERSION
|
10
22
|
spec.authors = ['Toby Clemson']
|
11
23
|
spec.email = ['tobyclemson@gmail.com']
|
12
24
|
|
13
|
-
spec.date = Date.today.to_s
|
14
25
|
spec.summary = 'A Ruby SDK for the Concourse CI API.'
|
15
26
|
spec.description = 'A Ruby SDK for the Concourse CI API.'
|
16
27
|
spec.homepage = 'https://github.com/infrablocks/concourse.rb'
|
17
28
|
spec.license = 'MIT'
|
18
29
|
|
19
30
|
spec.files = `git ls-files -z`.split("\x0").select do |f|
|
20
|
-
f.match(
|
31
|
+
f.match(/^(#{files.map { |g| Regexp.escape(g) }.join('|')})/)
|
21
32
|
end
|
22
33
|
spec.bindir = 'exe'
|
23
34
|
spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
|
@@ -25,19 +36,22 @@ Gem::Specification.new do |spec|
|
|
25
36
|
|
26
37
|
spec.required_ruby_version = '>= 2.6.0'
|
27
38
|
|
28
|
-
spec.add_dependency 'excon', '~> 0.72'
|
29
39
|
spec.add_dependency 'dry-schema', '~> 0.5'
|
40
|
+
spec.add_dependency 'excon', '~> 0.72'
|
30
41
|
spec.add_dependency 'semantic', '~> 1.5'
|
31
42
|
|
32
43
|
spec.add_development_dependency 'bundler', '~> 2.0'
|
44
|
+
spec.add_development_dependency 'faker', '~> 2.15'
|
45
|
+
spec.add_development_dependency 'gem-release', '~> 2.0'
|
46
|
+
spec.add_development_dependency 'jwt', '~> 2.2'
|
47
|
+
spec.add_development_dependency 'openssl', '~> 2.2'
|
33
48
|
spec.add_development_dependency 'rake', '~> 13.0'
|
34
49
|
spec.add_development_dependency 'rake_circle_ci', '~> 0.9'
|
35
50
|
spec.add_development_dependency 'rake_github', '~> 0.5'
|
36
|
-
spec.add_development_dependency 'rake_ssh', '~> 0.4'
|
37
51
|
spec.add_development_dependency 'rake_gpg', '~> 0.12'
|
52
|
+
spec.add_development_dependency 'rake_ssh', '~> 0.4'
|
38
53
|
spec.add_development_dependency 'rspec', '~> 3.9'
|
39
|
-
spec.add_development_dependency '
|
40
|
-
spec.add_development_dependency '
|
41
|
-
spec.add_development_dependency '
|
42
|
-
spec.add_development_dependency 'gem-release', '~> 2.0'
|
54
|
+
spec.add_development_dependency 'rubocop', '~> 1.12'
|
55
|
+
spec.add_development_dependency 'rubocop-rake', '~> 0.5'
|
56
|
+
spec.add_development_dependency 'rubocop-rspec', '~> 2.2'
|
43
57
|
end
|
data/lib/concourse.rb
CHANGED
@@ -1,4 +1,9 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require_relative 'concourse/version'
|
4
|
+
require_relative 'concourse/models'
|
5
|
+
require_relative 'concourse/errors'
|
6
|
+
require_relative 'concourse/http'
|
2
7
|
require_relative 'concourse/client'
|
3
8
|
require_relative 'concourse/urls'
|
4
9
|
require_relative 'concourse/headers'
|
data/lib/concourse/client.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'excon'
|
2
4
|
require 'json'
|
3
5
|
|
@@ -11,15 +13,19 @@ module Concourse
|
|
11
13
|
|
12
14
|
def for_skymarshal
|
13
15
|
Concourse::SubClients::SkymarshalClient.new(
|
14
|
-
|
16
|
+
@options.merge(version: get_info[:version])
|
17
|
+
)
|
15
18
|
end
|
16
19
|
|
20
|
+
# rubocop:disable Naming/AccessorMethodName
|
17
21
|
def get_info
|
18
22
|
JSON.parse(
|
19
|
-
|
20
|
-
|
21
|
-
|
23
|
+
Excon.get(Concourse::Urls.info_url(@options[:url]))
|
24
|
+
.body,
|
25
|
+
symbolize_names: true
|
26
|
+
)
|
22
27
|
end
|
28
|
+
# rubocop:enable Naming/AccessorMethodName
|
23
29
|
|
24
30
|
def ==(other)
|
25
31
|
other.class == self.class && other.state == state
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Concourse
|
4
|
+
module Errors
|
5
|
+
class ApiError < StandardError
|
6
|
+
def initialize(parameters)
|
7
|
+
@request = parameters[:request]
|
8
|
+
@response = parameters[:response]
|
9
|
+
|
10
|
+
super("Request to #{@request.url} failed " \
|
11
|
+
"with status #{@response.status} " \
|
12
|
+
"and body #{@response.body}")
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/concourse/headers.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'base64'
|
2
4
|
|
3
5
|
module Concourse
|
@@ -17,25 +19,25 @@ module Concourse
|
|
17
19
|
|
18
20
|
module HeaderNames
|
19
21
|
def self.content_type
|
20
|
-
|
22
|
+
'Content-Type'
|
21
23
|
end
|
22
|
-
|
24
|
+
|
23
25
|
def self.authorization
|
24
|
-
|
26
|
+
'Authorization'
|
25
27
|
end
|
26
28
|
|
27
29
|
def self.date
|
28
|
-
|
30
|
+
'Date'
|
29
31
|
end
|
30
32
|
end
|
31
33
|
|
32
34
|
module Headers
|
33
35
|
def self.content_type(content_type)
|
34
|
-
{Concourse::HeaderNames.content_type => content_type}
|
36
|
+
{ Concourse::HeaderNames.content_type => content_type }
|
35
37
|
end
|
36
38
|
|
37
39
|
def self.authorization(authorization)
|
38
|
-
{Concourse::HeaderNames.authorization => authorization}
|
40
|
+
{ Concourse::HeaderNames.authorization => authorization }
|
39
41
|
end
|
40
42
|
end
|
41
|
-
end
|
43
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Concourse
|
4
|
+
module Http
|
5
|
+
class Request
|
6
|
+
attr_reader :url, :headers, :body
|
7
|
+
|
8
|
+
def initialize(url, headers = {}, body = nil)
|
9
|
+
@url = url
|
10
|
+
@headers = headers
|
11
|
+
@body = body
|
12
|
+
end
|
13
|
+
|
14
|
+
def ==(other)
|
15
|
+
other.class == self.class && other.state == state
|
16
|
+
end
|
17
|
+
|
18
|
+
def eql?(other)
|
19
|
+
self == other
|
20
|
+
end
|
21
|
+
|
22
|
+
def hash
|
23
|
+
state.hash
|
24
|
+
end
|
25
|
+
|
26
|
+
protected
|
27
|
+
|
28
|
+
def state
|
29
|
+
[@url, @headers, @body]
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def assert_successful(request, response)
|
34
|
+
raise api_error(request, response) unless response.status < 400
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def api_error(request, response)
|
40
|
+
Errors::ApiError.new(request: request, response: response)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module Concourse
|
4
|
+
module Models
|
5
|
+
class Token
|
6
|
+
attr_reader :access_token, :token_type, :expires_at, :id_token
|
7
|
+
|
8
|
+
def initialize(parameters)
|
9
|
+
@access_token = parameters[:access_token]
|
10
|
+
@token_type = parameters[:token_type]
|
11
|
+
@expires_at = parameters[:expires_at]
|
12
|
+
@id_token = parameters[:id_token]
|
13
|
+
end
|
14
|
+
|
15
|
+
def ==(other)
|
16
|
+
other.class == self.class && other.state == state
|
17
|
+
end
|
18
|
+
|
19
|
+
def eql?(other)
|
20
|
+
self == other
|
21
|
+
end
|
22
|
+
|
23
|
+
def hash
|
24
|
+
state.hash
|
25
|
+
end
|
26
|
+
|
27
|
+
protected
|
28
|
+
|
29
|
+
def state
|
30
|
+
[@access_token, @token_type, @expires_at, @id_token]
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -1,15 +1,20 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
require 'semantic'
|
2
4
|
require 'time'
|
3
5
|
require 'json'
|
4
6
|
|
5
7
|
require 'concourse/urls'
|
6
8
|
require 'concourse/headers'
|
9
|
+
require 'concourse/http'
|
7
10
|
|
8
11
|
module Concourse
|
9
12
|
module SubClients
|
10
13
|
class SkymarshalClient
|
11
14
|
VERSION_6_1 = Semantic::Version.new('6.1.0')
|
12
15
|
|
16
|
+
include Concourse::Http
|
17
|
+
|
13
18
|
def initialize(options)
|
14
19
|
@url = options[:url]
|
15
20
|
@version = Semantic::Version.new(options[:version])
|
@@ -20,8 +25,10 @@ module Concourse
|
|
20
25
|
headers = create_token_headers
|
21
26
|
body = create_token_body(parameters)
|
22
27
|
|
28
|
+
token_request = Http::Request.new(url, headers, body)
|
23
29
|
token_response = Excon.post(url, headers: headers, body: body)
|
24
30
|
|
31
|
+
assert_successful(token_request, token_response)
|
25
32
|
token(token_response)
|
26
33
|
end
|
27
34
|
|
@@ -38,60 +45,87 @@ module Concourse
|
|
38
45
|
private
|
39
46
|
|
40
47
|
def create_token_url
|
41
|
-
@version >= VERSION_6_1
|
42
|
-
|
43
|
-
|
48
|
+
if @version >= VERSION_6_1
|
49
|
+
Concourse::Urls.sky_issuer_token_url(@url)
|
50
|
+
else
|
51
|
+
Concourse::Urls.sky_token_url(@url)
|
52
|
+
end
|
44
53
|
end
|
45
54
|
|
46
55
|
def create_token_headers
|
47
56
|
{}
|
48
|
-
|
49
|
-
|
50
|
-
|
51
|
-
|
52
|
-
|
57
|
+
.merge(Concourse::Headers.content_type(
|
58
|
+
Concourse::ContentTypes::APPLICATION_WWW_FORM_URLENCODED
|
59
|
+
))
|
60
|
+
.merge(Concourse::Headers.authorization(
|
61
|
+
Concourse::Authorization.basic(
|
62
|
+
'fly', 'Zmx5'
|
63
|
+
)
|
64
|
+
))
|
53
65
|
end
|
54
66
|
|
55
67
|
def create_token_body(parameters)
|
56
68
|
username = parameters[:username]
|
57
69
|
password = parameters[:password]
|
58
70
|
|
59
|
-
|
60
|
-
|
61
|
-
'openid+profile+email+federated:id+groups'
|
62
|
-
|
63
|
-
URI.encode_www_form({
|
71
|
+
URI.encode_www_form(
|
72
|
+
{
|
64
73
|
grant_type: 'password',
|
65
74
|
username: username,
|
66
75
|
password: password,
|
67
76
|
scope: scope
|
68
|
-
|
77
|
+
}
|
78
|
+
)
|
69
79
|
end
|
70
80
|
|
71
81
|
def token(token_response)
|
72
|
-
|
73
|
-
|
74
|
-
|
75
|
-
|
76
|
-
|
77
|
-
|
78
|
-
|
79
|
-
|
80
|
-
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
|
90
|
-
|
91
|
-
|
92
|
-
|
93
|
-
|
82
|
+
if @version >= VERSION_6_1
|
83
|
+
post_version_6_1_token(token_response)
|
84
|
+
else
|
85
|
+
pre_version_6_1_token(token_response)
|
86
|
+
end
|
87
|
+
end
|
88
|
+
|
89
|
+
def scope
|
90
|
+
if @version >= VERSION_6_1
|
91
|
+
'openid profile email federated:id groups'
|
92
|
+
else
|
93
|
+
'openid+profile+email+federated:id+groups'
|
94
|
+
end
|
95
|
+
end
|
96
|
+
|
97
|
+
def token_response_date(token_response)
|
98
|
+
Time.parse(token_response.headers[Concourse::HeaderNames.date])
|
99
|
+
end
|
100
|
+
|
101
|
+
def token_response_body(token_response)
|
102
|
+
JSON.parse(token_response.body, symbolize_names: true)
|
103
|
+
end
|
104
|
+
|
105
|
+
def pre_version_6_1_token(token_response)
|
106
|
+
token_response_body = token_response_body(token_response)
|
107
|
+
|
108
|
+
Models::Token.new(
|
109
|
+
access_token: token_response_body[:access_token],
|
110
|
+
token_type: token_response_body[:token_type].downcase,
|
111
|
+
expires_at: token_response_body[:expiry],
|
112
|
+
id_token: token_response_body[:access_token]
|
113
|
+
)
|
114
|
+
end
|
115
|
+
|
116
|
+
def post_version_6_1_token(token_response)
|
117
|
+
token_response_body = token_response_body(token_response)
|
118
|
+
token_response_date = token_response_date(token_response)
|
119
|
+
|
120
|
+
Models::Token.new(
|
121
|
+
access_token: token_response_body[:access_token],
|
122
|
+
token_type: token_response_body[:token_type].downcase,
|
123
|
+
expires_at:
|
124
|
+
(token_response_date + token_response_body[:expires_in])
|
125
|
+
.iso8601,
|
126
|
+
id_token: token_response_body[:id_token]
|
127
|
+
)
|
94
128
|
end
|
95
129
|
end
|
96
130
|
end
|
97
|
-
end
|
131
|
+
end
|
data/lib/concourse/urls.rb
CHANGED
@@ -1,3 +1,5 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
1
3
|
module Concourse
|
2
4
|
module Urls
|
3
5
|
def self.api_url(concourse_url)
|
@@ -16,8 +18,6 @@ module Concourse
|
|
16
18
|
"#{api_url(concourse_url)}/info"
|
17
19
|
end
|
18
20
|
|
19
|
-
private
|
20
|
-
|
21
21
|
def self.base_url(concourse_url)
|
22
22
|
concourse_url.chomp('/')
|
23
23
|
end
|
data/lib/concourse/version.rb
CHANGED
metadata
CHANGED
@@ -1,43 +1,43 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: concourse.rb
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.5.0.pre.1
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Toby Clemson
|
8
8
|
autorequire:
|
9
9
|
bindir: exe
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-04-02 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
|
-
name:
|
14
|
+
name: dry-schema
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
17
|
- - "~>"
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version: '0.
|
19
|
+
version: '0.5'
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version: '0.
|
26
|
+
version: '0.5'
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
|
-
name:
|
28
|
+
name: excon
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '0.
|
33
|
+
version: '0.72'
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
38
|
- - "~>"
|
39
39
|
- !ruby/object:Gem::Version
|
40
|
-
version: '0.
|
40
|
+
version: '0.72'
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: semantic
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -67,61 +67,103 @@ dependencies:
|
|
67
67
|
- !ruby/object:Gem::Version
|
68
68
|
version: '2.0'
|
69
69
|
- !ruby/object:Gem::Dependency
|
70
|
-
name:
|
70
|
+
name: faker
|
71
71
|
requirement: !ruby/object:Gem::Requirement
|
72
72
|
requirements:
|
73
73
|
- - "~>"
|
74
74
|
- !ruby/object:Gem::Version
|
75
|
-
version: '
|
75
|
+
version: '2.15'
|
76
76
|
type: :development
|
77
77
|
prerelease: false
|
78
78
|
version_requirements: !ruby/object:Gem::Requirement
|
79
79
|
requirements:
|
80
80
|
- - "~>"
|
81
81
|
- !ruby/object:Gem::Version
|
82
|
-
version: '
|
82
|
+
version: '2.15'
|
83
83
|
- !ruby/object:Gem::Dependency
|
84
|
-
name:
|
84
|
+
name: gem-release
|
85
85
|
requirement: !ruby/object:Gem::Requirement
|
86
86
|
requirements:
|
87
87
|
- - "~>"
|
88
88
|
- !ruby/object:Gem::Version
|
89
|
-
version: '0
|
89
|
+
version: '2.0'
|
90
90
|
type: :development
|
91
91
|
prerelease: false
|
92
92
|
version_requirements: !ruby/object:Gem::Requirement
|
93
93
|
requirements:
|
94
94
|
- - "~>"
|
95
95
|
- !ruby/object:Gem::Version
|
96
|
-
version: '0
|
96
|
+
version: '2.0'
|
97
97
|
- !ruby/object:Gem::Dependency
|
98
|
-
name:
|
98
|
+
name: jwt
|
99
99
|
requirement: !ruby/object:Gem::Requirement
|
100
100
|
requirements:
|
101
101
|
- - "~>"
|
102
102
|
- !ruby/object:Gem::Version
|
103
|
-
version: '
|
103
|
+
version: '2.2'
|
104
104
|
type: :development
|
105
105
|
prerelease: false
|
106
106
|
version_requirements: !ruby/object:Gem::Requirement
|
107
107
|
requirements:
|
108
108
|
- - "~>"
|
109
109
|
- !ruby/object:Gem::Version
|
110
|
-
version: '
|
110
|
+
version: '2.2'
|
111
111
|
- !ruby/object:Gem::Dependency
|
112
|
-
name:
|
112
|
+
name: openssl
|
113
113
|
requirement: !ruby/object:Gem::Requirement
|
114
114
|
requirements:
|
115
115
|
- - "~>"
|
116
116
|
- !ruby/object:Gem::Version
|
117
|
-
version: '
|
117
|
+
version: '2.2'
|
118
118
|
type: :development
|
119
119
|
prerelease: false
|
120
120
|
version_requirements: !ruby/object:Gem::Requirement
|
121
121
|
requirements:
|
122
122
|
- - "~>"
|
123
123
|
- !ruby/object:Gem::Version
|
124
|
-
version: '
|
124
|
+
version: '2.2'
|
125
|
+
- !ruby/object:Gem::Dependency
|
126
|
+
name: rake
|
127
|
+
requirement: !ruby/object:Gem::Requirement
|
128
|
+
requirements:
|
129
|
+
- - "~>"
|
130
|
+
- !ruby/object:Gem::Version
|
131
|
+
version: '13.0'
|
132
|
+
type: :development
|
133
|
+
prerelease: false
|
134
|
+
version_requirements: !ruby/object:Gem::Requirement
|
135
|
+
requirements:
|
136
|
+
- - "~>"
|
137
|
+
- !ruby/object:Gem::Version
|
138
|
+
version: '13.0'
|
139
|
+
- !ruby/object:Gem::Dependency
|
140
|
+
name: rake_circle_ci
|
141
|
+
requirement: !ruby/object:Gem::Requirement
|
142
|
+
requirements:
|
143
|
+
- - "~>"
|
144
|
+
- !ruby/object:Gem::Version
|
145
|
+
version: '0.9'
|
146
|
+
type: :development
|
147
|
+
prerelease: false
|
148
|
+
version_requirements: !ruby/object:Gem::Requirement
|
149
|
+
requirements:
|
150
|
+
- - "~>"
|
151
|
+
- !ruby/object:Gem::Version
|
152
|
+
version: '0.9'
|
153
|
+
- !ruby/object:Gem::Dependency
|
154
|
+
name: rake_github
|
155
|
+
requirement: !ruby/object:Gem::Requirement
|
156
|
+
requirements:
|
157
|
+
- - "~>"
|
158
|
+
- !ruby/object:Gem::Version
|
159
|
+
version: '0.5'
|
160
|
+
type: :development
|
161
|
+
prerelease: false
|
162
|
+
version_requirements: !ruby/object:Gem::Requirement
|
163
|
+
requirements:
|
164
|
+
- - "~>"
|
165
|
+
- !ruby/object:Gem::Version
|
166
|
+
version: '0.5'
|
125
167
|
- !ruby/object:Gem::Dependency
|
126
168
|
name: rake_gpg
|
127
169
|
requirement: !ruby/object:Gem::Requirement
|
@@ -137,75 +179,75 @@ dependencies:
|
|
137
179
|
- !ruby/object:Gem::Version
|
138
180
|
version: '0.12'
|
139
181
|
- !ruby/object:Gem::Dependency
|
140
|
-
name:
|
182
|
+
name: rake_ssh
|
141
183
|
requirement: !ruby/object:Gem::Requirement
|
142
184
|
requirements:
|
143
185
|
- - "~>"
|
144
186
|
- !ruby/object:Gem::Version
|
145
|
-
version: '
|
187
|
+
version: '0.4'
|
146
188
|
type: :development
|
147
189
|
prerelease: false
|
148
190
|
version_requirements: !ruby/object:Gem::Requirement
|
149
191
|
requirements:
|
150
192
|
- - "~>"
|
151
193
|
- !ruby/object:Gem::Version
|
152
|
-
version: '
|
194
|
+
version: '0.4'
|
153
195
|
- !ruby/object:Gem::Dependency
|
154
|
-
name:
|
196
|
+
name: rspec
|
155
197
|
requirement: !ruby/object:Gem::Requirement
|
156
198
|
requirements:
|
157
199
|
- - "~>"
|
158
200
|
- !ruby/object:Gem::Version
|
159
|
-
version: '
|
201
|
+
version: '3.9'
|
160
202
|
type: :development
|
161
203
|
prerelease: false
|
162
204
|
version_requirements: !ruby/object:Gem::Requirement
|
163
205
|
requirements:
|
164
206
|
- - "~>"
|
165
207
|
- !ruby/object:Gem::Version
|
166
|
-
version: '
|
208
|
+
version: '3.9'
|
167
209
|
- !ruby/object:Gem::Dependency
|
168
|
-
name:
|
210
|
+
name: rubocop
|
169
211
|
requirement: !ruby/object:Gem::Requirement
|
170
212
|
requirements:
|
171
213
|
- - "~>"
|
172
214
|
- !ruby/object:Gem::Version
|
173
|
-
version: '
|
215
|
+
version: '1.12'
|
174
216
|
type: :development
|
175
217
|
prerelease: false
|
176
218
|
version_requirements: !ruby/object:Gem::Requirement
|
177
219
|
requirements:
|
178
220
|
- - "~>"
|
179
221
|
- !ruby/object:Gem::Version
|
180
|
-
version: '
|
222
|
+
version: '1.12'
|
181
223
|
- !ruby/object:Gem::Dependency
|
182
|
-
name:
|
224
|
+
name: rubocop-rake
|
183
225
|
requirement: !ruby/object:Gem::Requirement
|
184
226
|
requirements:
|
185
227
|
- - "~>"
|
186
228
|
- !ruby/object:Gem::Version
|
187
|
-
version: '
|
229
|
+
version: '0.5'
|
188
230
|
type: :development
|
189
231
|
prerelease: false
|
190
232
|
version_requirements: !ruby/object:Gem::Requirement
|
191
233
|
requirements:
|
192
234
|
- - "~>"
|
193
235
|
- !ruby/object:Gem::Version
|
194
|
-
version: '
|
236
|
+
version: '0.5'
|
195
237
|
- !ruby/object:Gem::Dependency
|
196
|
-
name:
|
238
|
+
name: rubocop-rspec
|
197
239
|
requirement: !ruby/object:Gem::Requirement
|
198
240
|
requirements:
|
199
241
|
- - "~>"
|
200
242
|
- !ruby/object:Gem::Version
|
201
|
-
version: '2.
|
243
|
+
version: '2.2'
|
202
244
|
type: :development
|
203
245
|
prerelease: false
|
204
246
|
version_requirements: !ruby/object:Gem::Requirement
|
205
247
|
requirements:
|
206
248
|
- - "~>"
|
207
249
|
- !ruby/object:Gem::Version
|
208
|
-
version: '2.
|
250
|
+
version: '2.2'
|
209
251
|
description: A Ruby SDK for the Concourse CI API.
|
210
252
|
email:
|
211
253
|
- tobyclemson@gmail.com
|
@@ -224,7 +266,11 @@ files:
|
|
224
266
|
- concourse.rb.gemspec
|
225
267
|
- lib/concourse.rb
|
226
268
|
- lib/concourse/client.rb
|
269
|
+
- lib/concourse/errors.rb
|
227
270
|
- lib/concourse/headers.rb
|
271
|
+
- lib/concourse/http.rb
|
272
|
+
- lib/concourse/models.rb
|
273
|
+
- lib/concourse/models/token.rb
|
228
274
|
- lib/concourse/sub_clients.rb
|
229
275
|
- lib/concourse/sub_clients/skymarshal_client.rb
|
230
276
|
- lib/concourse/urls.rb
|