kontena-plugin-digitalocean 0.3.0 → 0.3.1.rc1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/.travis.yml +5 -4
- data/kontena-plugin-digitalocean.gemspec +1 -1
- data/lib/kontena/machine/digital_ocean/master_provisioner.rb +1 -10
- data/lib/kontena/machine/digital_ocean/node_provisioner.rb +1 -6
- data/lib/kontena/machine/digital_ocean/ssh_key_manager.rb +31 -0
- data/lib/kontena/machine/digital_ocean.rb +1 -0
- data/lib/kontena/plugin/digital_ocean/master/create_command.rb +6 -2
- data/lib/kontena/plugin/digital_ocean/master/terminate_command.rb +3 -0
- data/lib/kontena/plugin/digital_ocean/nodes/create_command.rb +7 -3
- data/lib/kontena/plugin/digital_ocean/nodes/restart_command.rb +3 -0
- data/lib/kontena/plugin/digital_ocean/nodes/terminate_command.rb +3 -0
- data/lib/kontena/plugin/digital_ocean/prompts.rb +56 -6
- data/lib/kontena/plugin/digital_ocean.rb +1 -1
- metadata +8 -13
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 159d041998037905df8bfaf653d921910f8ba2df
|
4
|
+
data.tar.gz: b49274c2e74cace9384aa6c25fde76e6c19edb41
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 88ebcc12587efa3c1edbd14f249dc6e5a4b6dbe051eb6f5e7d27a6ca2bbcf81f8941e6928cc148e4be37eeaa4e059451bf83a2cc812fbcb8439765e6feb3f097
|
7
|
+
data.tar.gz: 4608d8bc37fb630b12f91316a05a704106fa89717d106a64ae912438978cbf94dddb18777dc2476892270a4adc3ea2ed10a4c4ee67fb5b812015667deb0974e8
|
data/.travis.yml
CHANGED
@@ -1,9 +1,9 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
- 2.
|
4
|
-
- 2.
|
5
|
-
- 2.
|
6
|
-
- 2.
|
3
|
+
- 2.1.10
|
4
|
+
- 2.2.6
|
5
|
+
- 2.3.3
|
6
|
+
- 2.4.1
|
7
7
|
env:
|
8
8
|
- secure: "HAJRG+iaNDuyOMlbYSsXNjA2jwTMQonYJ3fHhm4zDPmIMupNnM+Krx650rVqlMP2KpNIYg4BEWCaDobTU9HoOy0AApmPGc8gGHMCP6v3cSnoGHxmiFy8yB7szgltcBz27PLeJN+exxRCjWPk677jW7JaooyYVSD64dEgVUrFju7olWUrvR0a0hAfBfawXU6kiGgdLnIEtc4AK+mokN9J6fR2PJthuDirZNgDPtVPuBJNFErI9Rh200stcZDOE3F1QE80HyAbrsyfvN/9cosSYDhJS9G+awAw6S+BqeBFZTQlDkWqJgdGsaacasxAmB5bgpkFY5tuv8DdqksK4nXlvsGVurQOYyufuc0y7HllPFVBPkzETCyWaafzek9acfTriLKJIJ26sFYQpuGQlgmAT/KyKYqqzX1ZAk/qe+haT5dt19bXzCHQHWapnWIll11AU0F67TiastmfyaBhnO8d983rwyxIww+8n3AfGPJXZ2eEjw2Rr17yqPYIVtkRoy7ctvCVJTeC6nDGhCqgU5lfl59656fzmJaBI9nWkadK0hQY8WB/5sLJ72pnRZDBbv3xIddS+JnDqxQWheMaJ7Oz5MkbHzdmRo3EhuHGPYpsdPQoeMudqGXX6OTxkQcRbKqJOHDE58rQzz7cZPvY2fwYOkhCspjLWcUAytbaMDkrEVs="
|
9
9
|
cache: bundler
|
@@ -14,3 +14,4 @@ deploy:
|
|
14
14
|
gem: kontena-plugin-digitalocean
|
15
15
|
on:
|
16
16
|
tags: true
|
17
|
+
rvm: 2.4.1
|
@@ -18,7 +18,7 @@ Gem::Specification.new do |spec|
|
|
18
18
|
spec.require_paths = ["lib"]
|
19
19
|
|
20
20
|
spec.add_runtime_dependency 'kontena-cli', '>= 1.0'
|
21
|
-
spec.add_runtime_dependency 'droplet_kit', '~> 2.
|
21
|
+
spec.add_runtime_dependency 'droplet_kit', '~> 2.2'
|
22
22
|
spec.add_runtime_dependency 'activesupport', '~> 4.0'
|
23
23
|
spec.add_development_dependency "bundler", "~> 1.11"
|
24
24
|
spec.add_development_dependency "rake", "~> 10.0"
|
@@ -18,11 +18,6 @@ module Kontena
|
|
18
18
|
end
|
19
19
|
|
20
20
|
def run!(opts)
|
21
|
-
abort('Invalid ssh key') unless File.exists?(File.expand_path(opts[:ssh_key]))
|
22
|
-
|
23
|
-
ssh_key = ssh_key(File.read(File.expand_path(opts[:ssh_key])).strip)
|
24
|
-
abort('Ssh key does not exist in Digital Ocean') unless ssh_key
|
25
|
-
|
26
21
|
if opts[:ssl_cert]
|
27
22
|
abort('Invalid ssl cert') unless File.exists?(File.expand_path(opts[:ssl_cert]))
|
28
23
|
ssl_cert = File.read(File.expand_path(opts[:ssl_cert]))
|
@@ -45,7 +40,7 @@ module Kontena
|
|
45
40
|
size: opts[:size],
|
46
41
|
private_networking: true,
|
47
42
|
user_data: user_data(userdata_vars),
|
48
|
-
ssh_keys: [
|
43
|
+
ssh_keys: [opts[:ssh_key_id]],
|
49
44
|
tags: ['master']
|
50
45
|
)
|
51
46
|
|
@@ -89,10 +84,6 @@ module Kontena
|
|
89
84
|
erb(File.read(cloudinit_template), vars)
|
90
85
|
end
|
91
86
|
|
92
|
-
def ssh_key(public_key)
|
93
|
-
client.ssh_keys.all.find{|key| key.public_key == public_key}
|
94
|
-
end
|
95
|
-
|
96
87
|
def master_running?
|
97
88
|
http_client.get(path: '/').status == 200
|
98
89
|
rescue
|
@@ -19,11 +19,6 @@ module Kontena
|
|
19
19
|
end
|
20
20
|
|
21
21
|
def run!(opts)
|
22
|
-
abort('Invalid ssh key') unless File.exists?(File.expand_path(opts[:ssh_key]))
|
23
|
-
|
24
|
-
ssh_key = ssh_key(File.read(File.expand_path(opts[:ssh_key])).strip)
|
25
|
-
abort('Ssh key does not exist in Digital Ocean') unless ssh_key
|
26
|
-
|
27
22
|
userdata_vars = {
|
28
23
|
version: opts[:version],
|
29
24
|
master_uri: opts[:master_uri],
|
@@ -39,7 +34,7 @@ module Kontena
|
|
39
34
|
size: opts[:size],
|
40
35
|
private_networking: true,
|
41
36
|
user_data: user_data(userdata_vars),
|
42
|
-
ssh_keys: [
|
37
|
+
ssh_keys: [opts[:ssh_key_id]],
|
43
38
|
tags: [opts[:grid]]
|
44
39
|
)
|
45
40
|
created = client.droplets.create(droplet)
|
@@ -0,0 +1,31 @@
|
|
1
|
+
module Kontena
|
2
|
+
module Machine
|
3
|
+
module DigitalOcean
|
4
|
+
class SshKeyManager
|
5
|
+
|
6
|
+
attr_reader :client
|
7
|
+
|
8
|
+
# @param [String] token Digital Ocean API token
|
9
|
+
def initialize(token)
|
10
|
+
@client = DropletKit::Client.new(access_token: token)
|
11
|
+
end
|
12
|
+
|
13
|
+
def find_by_public_key(public_key)
|
14
|
+
list.find { |key| key.public_key == public_key }
|
15
|
+
end
|
16
|
+
|
17
|
+
def list
|
18
|
+
client.ssh_keys.all.to_a
|
19
|
+
end
|
20
|
+
|
21
|
+
def create(public_key)
|
22
|
+
client.ssh_keys.create(DropletKit::SSHKey.new(public_key: public_key, name: public_key.split(/\s+/).last))
|
23
|
+
end
|
24
|
+
|
25
|
+
def find_or_create_by_public_key(public_key)
|
26
|
+
find_by_public_key(public_key) || create(public_key)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
@@ -10,7 +10,7 @@ module Kontena::Plugin::DigitalOcean::Master
|
|
10
10
|
option "--token", "TOKEN", "DigitalOcean API token", environment_variable: "DO_TOKEN"
|
11
11
|
option "--region", "REGION", "Region"
|
12
12
|
option "--size", "SIZE", "Droplet size"
|
13
|
-
option "--ssh-key", "SSH_KEY", "Path to ssh public key"
|
13
|
+
option "--ssh-key", "SSH_KEY", "Path to ssh public key"
|
14
14
|
option "--ssl-cert", "SSL CERT", "SSL certificate file"
|
15
15
|
option "--vault-secret", "VAULT_SECRET", "Secret key for Vault (optional)"
|
16
16
|
option "--vault-iv", "VAULT_IV", "Initialization vector for Vault (optional)"
|
@@ -19,17 +19,19 @@ module Kontena::Plugin::DigitalOcean::Master
|
|
19
19
|
|
20
20
|
|
21
21
|
def execute
|
22
|
+
suppress_warnings # until DO merges resource_kit pr #32
|
22
23
|
do_token = ask_do_token
|
23
24
|
|
24
25
|
require_relative '../../../machine/digital_ocean'
|
25
26
|
|
26
27
|
do_region = ask_droplet_region(do_token)
|
27
28
|
do_size = ask_droplet_size(do_token, do_region)
|
29
|
+
do_ssh_key_id = ask_ssh_key(do_token)
|
28
30
|
|
29
31
|
provisioner = provisioner(do_token)
|
30
32
|
provisioner.run!(
|
31
33
|
name: name,
|
32
|
-
|
34
|
+
ssh_key_id: do_ssh_key_id,
|
33
35
|
ssl_cert: ssl_cert,
|
34
36
|
size: do_size,
|
35
37
|
region: do_region,
|
@@ -39,6 +41,8 @@ module Kontena::Plugin::DigitalOcean::Master
|
|
39
41
|
initial_admin_code: SecureRandom.hex(16),
|
40
42
|
mongodb_uri: mongodb_uri
|
41
43
|
)
|
44
|
+
ensure
|
45
|
+
resume_warnings
|
42
46
|
end
|
43
47
|
|
44
48
|
# @param [String] token
|
@@ -9,12 +9,15 @@ module Kontena::Plugin::DigitalOcean::Master
|
|
9
9
|
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
10
10
|
|
11
11
|
def execute
|
12
|
+
suppress_warnings # until DO merges resource_kit pr #32
|
12
13
|
do_token = ask_do_token
|
13
14
|
confirm_command(name) unless forced?
|
14
15
|
|
15
16
|
require_relative '../../../machine/digital_ocean'
|
16
17
|
destroyer = destroyer(do_token)
|
17
18
|
destroyer.run!(name)
|
19
|
+
ensure
|
20
|
+
resume_warnings
|
18
21
|
end
|
19
22
|
|
20
23
|
# @param [String] token
|
@@ -9,13 +9,14 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
9
9
|
parameter "[NAME]", "Node name"
|
10
10
|
option "--token", "TOKEN", "DigitalOcean API token", environment_variable: 'DO_TOKEN'
|
11
11
|
option "--region", "REGION", "Region"
|
12
|
-
option "--ssh-key", "SSH_KEY", "Path to ssh public key"
|
12
|
+
option "--ssh-key", "SSH_KEY", "Path to ssh public key"
|
13
13
|
option "--size", "SIZE", "Droplet size"
|
14
14
|
option "--count", "COUNT", "How many droplets to create"
|
15
15
|
option "--version", "VERSION", "Define installed Kontena version", default: 'latest'
|
16
16
|
option "--channel", "CHANNEL", "Define CoreOS image channel"
|
17
17
|
|
18
18
|
def execute
|
19
|
+
suppress_warnings # until DO merges resource_kit pr #32
|
19
20
|
require_api_url
|
20
21
|
require_current_grid
|
21
22
|
|
@@ -27,6 +28,7 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
27
28
|
coreos_channel = self.channel || ask_channel
|
28
29
|
do_size = ask_droplet_size(do_token, do_region)
|
29
30
|
do_count = ask_droplet_count
|
31
|
+
do_ssh_key_id = ask_ssh_key(do_token)
|
30
32
|
|
31
33
|
grid = fetch_grid
|
32
34
|
provisioner = provisioner(client(require_token), do_token)
|
@@ -34,7 +36,7 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
34
36
|
master_uri: api_url,
|
35
37
|
grid_token: grid['token'],
|
36
38
|
grid: current_grid,
|
37
|
-
|
39
|
+
ssh_key_id: do_ssh_key_id,
|
38
40
|
name: name,
|
39
41
|
size: do_size,
|
40
42
|
count: do_count,
|
@@ -42,11 +44,13 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
42
44
|
version: version,
|
43
45
|
channel: coreos_channel
|
44
46
|
)
|
47
|
+
ensure
|
48
|
+
resume_warnings
|
45
49
|
end
|
46
50
|
|
47
51
|
def ask_droplet_count
|
48
52
|
if self.count.nil?
|
49
|
-
prompt.ask('How many droplets?:
|
53
|
+
prompt.ask('How many droplets?:', default: 1)
|
50
54
|
else
|
51
55
|
self.count
|
52
56
|
end
|
@@ -10,6 +10,7 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
10
10
|
option "--token", "TOKEN", "DigitalOcean API token", environment_variable: "DO_TOKEN"
|
11
11
|
|
12
12
|
def execute
|
13
|
+
suppress_warnings # until DO merges resource_kit pr #32
|
13
14
|
require_api_url
|
14
15
|
require_current_grid
|
15
16
|
do_token = ask_do_token
|
@@ -27,6 +28,8 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
27
28
|
else
|
28
29
|
exit_with_error "Cannot find droplet #{pastel.cyan(name)} in DigitalOcean"
|
29
30
|
end
|
31
|
+
ensure
|
32
|
+
resume_warnings
|
30
33
|
end
|
31
34
|
end
|
32
35
|
end
|
@@ -11,6 +11,7 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
11
11
|
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
12
12
|
|
13
13
|
def execute
|
14
|
+
suppress_warnings # until DO merges resource_kit pr #32
|
14
15
|
require_api_url
|
15
16
|
require_current_grid
|
16
17
|
token = require_token
|
@@ -22,6 +23,8 @@ module Kontena::Plugin::DigitalOcean::Nodes
|
|
22
23
|
grid = client(require_token).get("grids/#{current_grid}")
|
23
24
|
destroyer = destroyer(client(token), do_token)
|
24
25
|
destroyer.run!(grid, node_name)
|
26
|
+
ensure
|
27
|
+
resume_warnings
|
25
28
|
end
|
26
29
|
|
27
30
|
# @param [Kontena::Client] client
|
@@ -1,7 +1,56 @@
|
|
1
1
|
module Kontena::Plugin::DigitalOcean::Prompts
|
2
|
+
|
3
|
+
# Until DO merges https://github.com/digitalocean/resource_kit/pull/32
|
4
|
+
def suppress_warnings
|
5
|
+
@original_verbosity = $VERBOSE
|
6
|
+
$VERBOSE = nil
|
7
|
+
end
|
8
|
+
|
9
|
+
def resume_warnings
|
10
|
+
$VERBOSE = @original_verbosity
|
11
|
+
end
|
12
|
+
|
13
|
+
def ask_ssh_key(do_token)
|
14
|
+
manager = Kontena::Machine::DigitalOcean::SshKeyManager.new(do_token)
|
15
|
+
|
16
|
+
if self.ssh_key
|
17
|
+
puts self.ssh_key.inspect
|
18
|
+
public_key = File.read(self.ssh_key).strip
|
19
|
+
else
|
20
|
+
keys = manager.list
|
21
|
+
key_id = :new
|
22
|
+
|
23
|
+
default_path = File.join(Dir.home, '.ssh', 'id_rsa.pub')
|
24
|
+
default = File.exist?(default_path) ? File.read(default_path).strip : nil
|
25
|
+
|
26
|
+
unless keys.empty?
|
27
|
+
key = prompt.select("Choose SSH key:") do |menu|
|
28
|
+
i = 1
|
29
|
+
keys.each do |item|
|
30
|
+
menu.choice "#{item.name} (#{item.fingerprint})" , item
|
31
|
+
menu.default i if item.public_key == default
|
32
|
+
i += 1
|
33
|
+
end
|
34
|
+
menu.choice "Create new SSH key", :new
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
if key == :new
|
39
|
+
|
40
|
+
public_key = prompt.ask('SSH public key: (enter an ssh key in OpenSSH format "ssh-xxx xxxxx key_name")', default: default) do |q|
|
41
|
+
q.validate /^ssh-rsa \S+ \S+$/
|
42
|
+
end
|
43
|
+
else
|
44
|
+
public_key = key.public_key
|
45
|
+
end
|
46
|
+
|
47
|
+
manager.find_or_create_by_public_key(public_key).id
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
2
51
|
def ask_do_token
|
3
52
|
if self.token.nil?
|
4
|
-
prompt.ask('DigitalOcean API token:
|
53
|
+
prompt.ask('DigitalOcean API token:', echo: false)
|
5
54
|
else
|
6
55
|
self.token
|
7
56
|
end
|
@@ -9,7 +58,7 @@ module Kontena::Plugin::DigitalOcean::Prompts
|
|
9
58
|
|
10
59
|
def ask_droplet_region(do_token)
|
11
60
|
if self.region.nil?
|
12
|
-
prompt.select("Choose a datacenter region:
|
61
|
+
prompt.select("Choose a datacenter region:") do |menu|
|
13
62
|
do_client = DropletKit::Client.new(access_token: do_token)
|
14
63
|
do_client.regions.all.sort_by{|r| r.slug }.each{ |region|
|
15
64
|
menu.choice region.name, region.slug
|
@@ -22,12 +71,13 @@ module Kontena::Plugin::DigitalOcean::Prompts
|
|
22
71
|
|
23
72
|
def ask_droplet_size(do_token, do_region)
|
24
73
|
if self.size.nil?
|
25
|
-
prompt.select("Choose droplet size:
|
74
|
+
prompt.select("Choose droplet size:") do |menu|
|
26
75
|
do_client = DropletKit::Client.new(access_token: do_token)
|
27
76
|
do_client.sizes.all.to_a.select{ |s| s.memory > 1000 }.sort_by{|s| s.memory }.each{ |size|
|
77
|
+
#p size
|
28
78
|
if size.regions.include?(do_region)
|
29
79
|
memory = size.memory.to_i / 1024
|
30
|
-
menu.choice "#{memory}GB/#{size.vcpus}CPU/#{size.disk}GB ($#{size.price_monthly.to_i}/mo)", size.slug
|
80
|
+
menu.choice "#{size.slug}: #{memory}GB/#{size.vcpus}CPU/#{size.disk}GB ($#{size.price_monthly.to_i}/mo)", size.slug
|
31
81
|
end
|
32
82
|
}
|
33
83
|
end
|
@@ -43,7 +93,7 @@ module Kontena::Plugin::DigitalOcean::Prompts
|
|
43
93
|
n['labels'] && n['labels'].include?('provider=digitalocean'.freeze)
|
44
94
|
}
|
45
95
|
raise "Did not find any nodes with label provider=digitalocean" if nodes.size == 0
|
46
|
-
prompt.select("Select node:
|
96
|
+
prompt.select("Select node:") do |menu|
|
47
97
|
nodes.sort_by{|n| n['node_number'] }.reverse.each do |node|
|
48
98
|
initial = node['initial_member'] ? '(initial) ' : ''
|
49
99
|
menu.choice "#{node['name']} #{initial}", node['name']
|
@@ -55,7 +105,7 @@ module Kontena::Plugin::DigitalOcean::Prompts
|
|
55
105
|
end
|
56
106
|
|
57
107
|
def ask_channel
|
58
|
-
prompt.select('Select
|
108
|
+
prompt.select('Select Container Linux channel:') do |menu|
|
59
109
|
menu.choice 'Stable', 'stable'
|
60
110
|
menu.choice 'Beta', 'beta'
|
61
111
|
menu.choice 'Alpha', 'alpha'
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: kontena-plugin-digitalocean
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.3.
|
4
|
+
version: 0.3.1.rc1
|
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
|
+
date: 2017-08-03 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: kontena-cli
|
@@ -30,20 +30,14 @@ dependencies:
|
|
30
30
|
requirements:
|
31
31
|
- - "~>"
|
32
32
|
- !ruby/object:Gem::Version
|
33
|
-
version: '2.
|
34
|
-
- - ">="
|
35
|
-
- !ruby/object:Gem::Version
|
36
|
-
version: 2.0.1
|
33
|
+
version: '2.2'
|
37
34
|
type: :runtime
|
38
35
|
prerelease: false
|
39
36
|
version_requirements: !ruby/object:Gem::Requirement
|
40
37
|
requirements:
|
41
38
|
- - "~>"
|
42
39
|
- !ruby/object:Gem::Version
|
43
|
-
version: '2.
|
44
|
-
- - ">="
|
45
|
-
- !ruby/object:Gem::Version
|
46
|
-
version: 2.0.1
|
40
|
+
version: '2.2'
|
47
41
|
- !ruby/object:Gem::Dependency
|
48
42
|
name: activesupport
|
49
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -108,6 +102,7 @@ files:
|
|
108
102
|
- lib/kontena/machine/digital_ocean/master_provisioner.rb
|
109
103
|
- lib/kontena/machine/digital_ocean/node_destroyer.rb
|
110
104
|
- lib/kontena/machine/digital_ocean/node_provisioner.rb
|
105
|
+
- lib/kontena/machine/digital_ocean/ssh_key_manager.rb
|
111
106
|
- lib/kontena/plugin/digital_ocean.rb
|
112
107
|
- lib/kontena/plugin/digital_ocean/master/create_command.rb
|
113
108
|
- lib/kontena/plugin/digital_ocean/master/terminate_command.rb
|
@@ -134,12 +129,12 @@ required_ruby_version: !ruby/object:Gem::Requirement
|
|
134
129
|
version: '0'
|
135
130
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
136
131
|
requirements:
|
137
|
-
- - "
|
132
|
+
- - ">"
|
138
133
|
- !ruby/object:Gem::Version
|
139
|
-
version:
|
134
|
+
version: 1.3.1
|
140
135
|
requirements: []
|
141
136
|
rubyforge_project:
|
142
|
-
rubygems_version: 2.
|
137
|
+
rubygems_version: 2.6.11
|
143
138
|
signing_key:
|
144
139
|
specification_version: 4
|
145
140
|
summary: Kontena DigitalOcean plugin
|