kontena-plugin-cloud 1.2.0.pre4 → 1.2.0.pre5
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/kontena/cli/models/image_repo.rb +15 -0
- data/lib/kontena/cli/models/image_tag.rb +15 -0
- data/lib/kontena/plugin/cloud/image/common.rb +25 -0
- data/lib/kontena/plugin/cloud/image/create_command.rb +26 -0
- data/lib/kontena/plugin/cloud/image/list_command.rb +33 -0
- data/lib/kontena/plugin/cloud/image/login_command.rb +58 -0
- data/lib/kontena/plugin/cloud/image/remove_command.rb +20 -0
- data/lib/kontena/plugin/cloud/image/show_command.rb +20 -0
- data/lib/kontena/plugin/cloud/image/tag/list_command.rb +31 -0
- data/lib/kontena/plugin/cloud/image/tag_command.rb +7 -0
- data/lib/kontena/plugin/cloud/image_command.rb +12 -0
- data/lib/kontena/plugin/cloud.rb +5 -1
- data/lib/kontena/plugin/cloud_command.rb +1 -0
- metadata +14 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: d4bbe3fc569faeda478e442d9877cbb2e7c06079a60c05b835620dc866569efe
|
4
|
+
data.tar.gz: 3cceb0d2d46dcdbf2d63ccb9930d4933f216217273d5ce5a448d1201c41508ec
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 0f9956c8b4901fa789f1a8401a4fba86a6fc33d93ef95c3d510e16ca016ffd72d0243904ebdd7b98e6e8d36abc9a84c5997c6eeb0009e9e259383824e70fcdc9
|
7
|
+
data.tar.gz: 5ff697f3a1630c894ccd044ef4b3373017e839bcbaa49d1bf0bb95481189a8d9731718ddb55b6be543cf11403436059fb0f113f560a96e6d2ca29f1bc59d395e
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'cloud_api_model'
|
2
|
+
|
3
|
+
module Kontena::Cli::Models
|
4
|
+
class ImageRepo
|
5
|
+
include CloudApiModel
|
6
|
+
|
7
|
+
def created_at
|
8
|
+
Time.parse(@api_data.dig('attributes', 'created-at')).to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def updated_at
|
12
|
+
Time.parse(@api_data.dig('attributes', 'updated-at')).to_i
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,15 @@
|
|
1
|
+
require_relative 'cloud_api_model'
|
2
|
+
|
3
|
+
module Kontena::Cli::Models
|
4
|
+
class ImageTag
|
5
|
+
include CloudApiModel
|
6
|
+
|
7
|
+
def created_at
|
8
|
+
Time.parse(@api_data.dig('attributes', 'created-at')).to_i
|
9
|
+
end
|
10
|
+
|
11
|
+
def updated_at
|
12
|
+
Time.parse(@api_data.dig('attributes', 'updated-at')).to_i
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../../../cli/models/image_repo'
|
2
|
+
require_relative '../../../cli/models/image_tag'
|
3
|
+
|
4
|
+
module Kontena::Plugin::Cloud::Image::Common
|
5
|
+
def image_registry_client
|
6
|
+
@compute_client ||= Kontena::Client.new(image_registry_url, config.current_account.token, prefix: '/')
|
7
|
+
end
|
8
|
+
|
9
|
+
def image_registry_url
|
10
|
+
ENV['KONTENA_IMAGE_REGISTRY_URL'] || 'https://image-registry.kontena.io'
|
11
|
+
end
|
12
|
+
|
13
|
+
def image_distribution_url
|
14
|
+
ENV['KONTENA_IMAGES_URL'] || 'https://images.kontena.io'
|
15
|
+
end
|
16
|
+
|
17
|
+
def default_org
|
18
|
+
unless current_master
|
19
|
+
exit_with_error "Organization is required"
|
20
|
+
end
|
21
|
+
org, _ = current_master.name.split('/')
|
22
|
+
|
23
|
+
org
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
class Kontena::Plugin::Cloud::Image::CreateCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Util
|
6
|
+
include Kontena::Plugin::Cloud::Image::Common
|
7
|
+
include Kontena::Cli::TableGenerator::Helper
|
8
|
+
|
9
|
+
parameter "NAME", "Image repository name"
|
10
|
+
|
11
|
+
requires_current_account_token
|
12
|
+
|
13
|
+
def execute
|
14
|
+
|
15
|
+
body = {
|
16
|
+
data: {
|
17
|
+
type: 'repositories',
|
18
|
+
id: self.name
|
19
|
+
}
|
20
|
+
}
|
21
|
+
spinner "Creating image repository #{pastel.cyan(name)}" do
|
22
|
+
image_registry_client.post("/repositories", JSON.dump(body))
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
class Kontena::Plugin::Cloud::Image::ListCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Util
|
6
|
+
include Kontena::Plugin::Cloud::Image::Common
|
7
|
+
include Kontena::Cli::TableGenerator::Helper
|
8
|
+
|
9
|
+
option ["--organization", "--org"], "ORG", "Organization", environment_variable: "KONTENA_ORGANIZATION"
|
10
|
+
|
11
|
+
requires_current_account_token
|
12
|
+
|
13
|
+
def execute
|
14
|
+
|
15
|
+
org = self.organization || default_org
|
16
|
+
|
17
|
+
repos = image_registry_client.get("/organizations/#{org}/repositories")['data']
|
18
|
+
print_table(repos) do |r|
|
19
|
+
r['pulls'] = r.dig('attributes', 'pulls')
|
20
|
+
r['created_at'] = time_ago( Time.parse(r.dig('attributes', 'created-at')).to_i )
|
21
|
+
r['public'] = r.dig('attributes', 'public')
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def fields
|
26
|
+
{
|
27
|
+
'name': 'id',
|
28
|
+
'pulls': 'pulls',
|
29
|
+
'public': 'public',
|
30
|
+
'created': 'created_at'
|
31
|
+
}
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
require 'shellwords'
|
3
|
+
require 'open3'
|
4
|
+
|
5
|
+
class Kontena::Plugin::Cloud::Image::LoginCommand < Kontena::Command
|
6
|
+
include Kontena::Cli::Common
|
7
|
+
include Kontena::Plugin::Cloud::Image::Common
|
8
|
+
|
9
|
+
requires_current_account_token
|
10
|
+
|
11
|
+
def execute
|
12
|
+
token = nil
|
13
|
+
spinner "Creating a new Kontena Cloud token for Docker" do
|
14
|
+
data = { attributes: { name: 'docker' } }
|
15
|
+
token = cloud_client.post("/user/personal_access_tokens", { data: data })['data']
|
16
|
+
end
|
17
|
+
|
18
|
+
success = spinner "Logging in to the Kontena Cloud Image Registry" do |spin|
|
19
|
+
pass = token.dig('attributes', 'access-token')
|
20
|
+
|
21
|
+
if `docker login --help`['--password-stdin']
|
22
|
+
output, stderr, status = Open3.capture3("docker login -u %s --password-stdin %s" % [current_account.username, image_distribution_url].map(&:shellescape), :stdin_data => pass)
|
23
|
+
unless status.success?
|
24
|
+
exit_with_error stderr
|
25
|
+
end
|
26
|
+
else
|
27
|
+
output, stderr, status = Open3.capture3("docker login -u %s --password \"%s\" %s" % [current_account.username, pass, image_distribution_url])
|
28
|
+
unless status.success?
|
29
|
+
exit_with_error stderr
|
30
|
+
end
|
31
|
+
end
|
32
|
+
true
|
33
|
+
end
|
34
|
+
|
35
|
+
if success
|
36
|
+
puts
|
37
|
+
puts " Login succeeded. Now you should be able to push and pull images using docker"
|
38
|
+
puts " cli from #{pastel.cyan(image_distribution_url)}"
|
39
|
+
puts
|
40
|
+
puts " Example:"
|
41
|
+
puts
|
42
|
+
puts " #{pastel.green.on_black(' docker tag localimage images.kontena.io/organization/imagename ')}"
|
43
|
+
puts " #{pastel.green.on_black(' docker push images.kontena.io/organization/imagename ')}"
|
44
|
+
puts
|
45
|
+
puts " To configure grid nodes to pull from Kontena Cloud Image Registry you should:"
|
46
|
+
puts
|
47
|
+
puts " 1. Create a non-expiring token for authentication:"
|
48
|
+
puts
|
49
|
+
puts " #{pastel.green.on_black(' kontena cloud token create <name> ')}"
|
50
|
+
puts
|
51
|
+
puts " 2. Configure your platform to use Kontena Cloud Image Registry as an external"
|
52
|
+
puts " registry:"
|
53
|
+
puts
|
54
|
+
puts " #{pastel.green.on_black(' kontena external-registry add -u <username> -p <token> https://images.kontena.io ')}"
|
55
|
+
puts
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
class Kontena::Plugin::Cloud::Image::RemoveCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Util
|
6
|
+
include Kontena::Plugin::Cloud::Image::Common
|
7
|
+
|
8
|
+
requires_current_account_token
|
9
|
+
|
10
|
+
parameter "NAME", "Image repository name"
|
11
|
+
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
12
|
+
|
13
|
+
def execute
|
14
|
+
confirm_command(name) unless forced?
|
15
|
+
|
16
|
+
spinner "Removing image repository #{pastel.cyan(name)}" do
|
17
|
+
image_registry_client.delete("/repositories/#{name}")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative 'common'
|
2
|
+
|
3
|
+
class Kontena::Plugin::Cloud::Image::ShowCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Util
|
6
|
+
include Kontena::Plugin::Cloud::Image::Common
|
7
|
+
|
8
|
+
requires_current_account_token
|
9
|
+
|
10
|
+
parameter "NAME", "Image repository name"
|
11
|
+
|
12
|
+
def execute
|
13
|
+
repo = Kontena::Cli::Models::ImageRepo.new(image_registry_client.get("/repositories/#{name}")['data'])
|
14
|
+
puts "#{name}:"
|
15
|
+
puts " created: #{ time_ago(repo.created_at.to_i)}"
|
16
|
+
puts " updated: #{ time_ago(repo.updated_at.to_i)}"
|
17
|
+
puts " pulls: #{repo.pulls}"
|
18
|
+
puts " pushes: #{repo.pushs}"
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,31 @@
|
|
1
|
+
require_relative '../common'
|
2
|
+
|
3
|
+
class Kontena::Plugin::Cloud::Image::Tag::ListCommand < Kontena::Command
|
4
|
+
include Kontena::Cli::Common
|
5
|
+
include Kontena::Util
|
6
|
+
include Kontena::Plugin::Cloud::Image::Common
|
7
|
+
include Kontena::Cli::TableGenerator::Helper
|
8
|
+
|
9
|
+
requires_current_account_token
|
10
|
+
|
11
|
+
parameter "NAME", "Image repository name"
|
12
|
+
|
13
|
+
def execute
|
14
|
+
tags = image_registry_client.get("/repositories/#{name}/tags")['data']
|
15
|
+
print_table(tags) do |t|
|
16
|
+
t['id'] = "#{name}:#{t['id']}"
|
17
|
+
t['pulls'] = t.dig('attributes', 'pulls')
|
18
|
+
t['pushs'] = t.dig('attributes', 'pushs')
|
19
|
+
t['updated_at'] = time_ago( Time.parse(t.dig('attributes', 'updated-at')).to_i )
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def fields
|
24
|
+
{
|
25
|
+
'name': 'id',
|
26
|
+
'pulls': 'pulls',
|
27
|
+
'pushes': 'pushs',
|
28
|
+
'updated': 'updated_at'
|
29
|
+
}
|
30
|
+
end
|
31
|
+
end
|
@@ -0,0 +1,12 @@
|
|
1
|
+
class Kontena::Plugin::Cloud::ImageCommand < Kontena::Command
|
2
|
+
|
3
|
+
subcommand ['list', 'ls'], 'List image repositories', load_subcommand('kontena/plugin/cloud/image/list_command')
|
4
|
+
subcommand ['show'], 'Show image repository details', load_subcommand('kontena/plugin/cloud/image/show_command')
|
5
|
+
subcommand ['login-docker'], 'Login docker to image registry', load_subcommand('kontena/plugin/cloud/image/login_command')
|
6
|
+
subcommand ['tag'], 'Image repository tag specific commands', load_subcommand('kontena/plugin/cloud/image/tag_command')
|
7
|
+
subcommand ['create'], 'Create new image repository', load_subcommand('kontena/plugin/cloud/image/create_command')
|
8
|
+
subcommand ['remove', 'rm'], 'Remove image repository', load_subcommand('kontena/plugin/cloud/image/remove_command')
|
9
|
+
|
10
|
+
def execute
|
11
|
+
end
|
12
|
+
end
|
data/lib/kontena/plugin/cloud.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
module Kontena
|
2
2
|
module Plugin
|
3
3
|
module Cloud
|
4
|
-
VERSION = "1.2.0.
|
4
|
+
VERSION = "1.2.0.pre5"
|
5
5
|
|
6
6
|
module Organization
|
7
7
|
module User; end
|
@@ -15,6 +15,10 @@ module Kontena
|
|
15
15
|
module User; end
|
16
16
|
end
|
17
17
|
|
18
|
+
module Image
|
19
|
+
module Tag; end
|
20
|
+
end
|
21
|
+
|
18
22
|
module Token; end;
|
19
23
|
end
|
20
24
|
|
@@ -3,6 +3,7 @@ class Kontena::Cli::CloudCommand < Kontena::Command
|
|
3
3
|
subcommand 'platform', 'Kontena platform specific commands', load_subcommand('kontena/plugin/cloud/platform_command')
|
4
4
|
subcommand 'node', 'Kontena node specific commands', load_subcommand('kontena/plugin/cloud/node_command')
|
5
5
|
subcommand ['organization', 'org'], 'Organization specific commands', load_subcommand('kontena/plugin/cloud/organization_command')
|
6
|
+
subcommand ['image-repository', 'ir'], 'Image repository specific commands', load_subcommand('kontena/plugin/cloud/image_command')
|
6
7
|
subcommand 'region', 'Region specific commands', load_subcommand('kontena/plugin/cloud/region_command')
|
7
8
|
subcommand 'token', 'Personal access token specific commands', load_subcommand('kontena/plugin/cloud/token_command')
|
8
9
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-plugin-cloud
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.2.0.
|
4
|
+
version: 1.2.0.pre5
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Kontena, Inc.
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-11-
|
11
|
+
date: 2017-11-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kontena-cli
|
@@ -70,11 +70,22 @@ files:
|
|
70
70
|
- lib/kontena/cli/master_code_exchanger.rb
|
71
71
|
- lib/kontena/cli/models/cloud_api_model.rb
|
72
72
|
- lib/kontena/cli/models/grid.rb
|
73
|
+
- lib/kontena/cli/models/image_repo.rb
|
74
|
+
- lib/kontena/cli/models/image_tag.rb
|
73
75
|
- lib/kontena/cli/models/master_api_model.rb
|
74
76
|
- lib/kontena/cli/models/node.rb
|
75
77
|
- lib/kontena/cli/models/organization.rb
|
76
78
|
- lib/kontena/cli/models/platform.rb
|
77
79
|
- lib/kontena/plugin/cloud.rb
|
80
|
+
- lib/kontena/plugin/cloud/image/common.rb
|
81
|
+
- lib/kontena/plugin/cloud/image/create_command.rb
|
82
|
+
- lib/kontena/plugin/cloud/image/list_command.rb
|
83
|
+
- lib/kontena/plugin/cloud/image/login_command.rb
|
84
|
+
- lib/kontena/plugin/cloud/image/remove_command.rb
|
85
|
+
- lib/kontena/plugin/cloud/image/show_command.rb
|
86
|
+
- lib/kontena/plugin/cloud/image/tag/list_command.rb
|
87
|
+
- lib/kontena/plugin/cloud/image/tag_command.rb
|
88
|
+
- lib/kontena/plugin/cloud/image_command.rb
|
78
89
|
- lib/kontena/plugin/cloud/node/common.rb
|
79
90
|
- lib/kontena/plugin/cloud/node/create_command.rb
|
80
91
|
- lib/kontena/plugin/cloud/node/list_command.rb
|
@@ -135,7 +146,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
135
146
|
version: 1.3.1
|
136
147
|
requirements: []
|
137
148
|
rubyforge_project:
|
138
|
-
rubygems_version: 2.7.
|
149
|
+
rubygems_version: 2.7.2
|
139
150
|
signing_key:
|
140
151
|
specification_version: 4
|
141
152
|
summary: Kontena Cloud management for Kontena CLI
|