kontena-cli 0.8.4 → 0.9.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/bin/kontena +4 -0
- data/lib/kontena/cli/app_command.rb +2 -0
- data/lib/kontena/cli/apps/build_command.rb +26 -0
- data/lib/kontena/cli/apps/common.rb +41 -12
- data/lib/kontena/cli/apps/deploy_command.rb +31 -13
- data/lib/kontena/cli/apps/docker_helper.rb +34 -0
- data/lib/kontena/cli/apps/init_command.rb +130 -10
- data/lib/kontena/cli/apps/list_command.rb +4 -2
- data/lib/kontena/cli/apps/logs_command.rb +4 -2
- data/lib/kontena/cli/apps/remove_command.rb +4 -2
- data/lib/kontena/cli/apps/start_command.rb +4 -2
- data/lib/kontena/cli/apps/stop_command.rb +4 -2
- data/lib/kontena/cli/common.rb +3 -3
- data/lib/kontena/cli/container_command.rb +3 -0
- data/lib/kontena/cli/containers/inspect_command.rb +16 -0
- data/lib/kontena/cli/deploy_command.rb +3 -0
- data/lib/kontena/cli/etcd/get_command.rb +21 -0
- data/lib/kontena/cli/etcd/list_command.rb +26 -0
- data/lib/kontena/cli/etcd/mkdir_command.rb +17 -0
- data/lib/kontena/cli/etcd/remove_command.rb +21 -0
- data/lib/kontena/cli/etcd/set_command.rb +18 -0
- data/lib/kontena/cli/etcd_command.rb +17 -0
- data/lib/kontena/cli/grid_command.rb +2 -0
- data/lib/kontena/cli/grids/logs_command.rb +71 -0
- data/lib/kontena/cli/master/aws/create_command.rb +33 -0
- data/lib/kontena/cli/master/aws_command.rb +8 -0
- data/lib/kontena/cli/master/azure/create_command.rb +33 -0
- data/lib/kontena/cli/master/azure_command.rb +13 -0
- data/lib/kontena/cli/master/digital_ocean/create_command.rb +30 -0
- data/lib/kontena/cli/master/digital_ocean_command.rb +13 -0
- data/lib/kontena/cli/master/vagrant/create_command.rb +19 -0
- data/lib/kontena/cli/master/vagrant/restart_command.rb +20 -0
- data/lib/kontena/cli/master/vagrant/ssh_command.rb +15 -0
- data/lib/kontena/cli/master/vagrant/start_command.rb +20 -0
- data/lib/kontena/cli/master/vagrant/stop_command.rb +20 -0
- data/lib/kontena/cli/master/vagrant/terminate_command.rb +13 -0
- data/lib/kontena/cli/master/vagrant_command.rb +23 -0
- data/lib/kontena/cli/master_command.rb +15 -0
- data/lib/kontena/cli/node_command.rb +4 -0
- data/lib/kontena/cli/nodes/aws/create_command.rb +39 -0
- data/lib/kontena/cli/nodes/aws/restart_command.rb +28 -0
- data/lib/kontena/cli/nodes/aws/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/aws_command.rb +15 -0
- data/lib/kontena/cli/nodes/azure/create_command.rb +39 -0
- data/lib/kontena/cli/nodes/azure/restart_command.rb +31 -0
- data/lib/kontena/cli/nodes/azure/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/azure_command.rb +15 -0
- data/lib/kontena/cli/nodes/digital_ocean/create_command.rb +1 -1
- data/lib/kontena/cli/nodes/vagrant/create_command.rb +1 -1
- data/lib/kontena/cli/service_command.rb +4 -0
- data/lib/kontena/cli/services/add_env_command.rb +18 -0
- data/lib/kontena/cli/services/create_command.rb +8 -0
- data/lib/kontena/cli/services/remove_env_command.rb +17 -0
- data/lib/kontena/cli/services/services_helper.rb +20 -1
- data/lib/kontena/cli/services/update_command.rb +10 -0
- data/lib/kontena/client.rb +22 -1
- data/lib/kontena/machine/aws.rb +13 -0
- data/lib/kontena/machine/aws/cloudinit.yml +66 -0
- data/lib/kontena/machine/aws/cloudinit_master.yml +105 -0
- data/lib/kontena/machine/aws/master_provisioner.rb +161 -0
- data/lib/kontena/machine/aws/node_destroyer.rb +39 -0
- data/lib/kontena/machine/aws/node_provisioner.rb +168 -0
- data/lib/kontena/machine/azure.rb +13 -0
- data/lib/kontena/machine/azure/cloudinit.yml +59 -0
- data/lib/kontena/machine/azure/cloudinit_master.yml +105 -0
- data/lib/kontena/machine/azure/logger.rb +27 -0
- data/lib/kontena/machine/azure/master_provisioner.rb +126 -0
- data/lib/kontena/machine/azure/node_destroyer.rb +53 -0
- data/lib/kontena/machine/azure/node_provisioner.rb +128 -0
- data/lib/kontena/machine/digital_ocean.rb +1 -0
- data/lib/kontena/machine/digital_ocean/cloudinit.yml +1 -0
- data/lib/kontena/machine/digital_ocean/cloudinit_master.yml +105 -0
- data/lib/kontena/machine/digital_ocean/master_provisioner.rb +94 -0
- data/lib/kontena/machine/digital_ocean/node_provisioner.rb +8 -1
- data/lib/kontena/machine/vagrant.rb +2 -0
- data/lib/kontena/machine/vagrant/Vagrantfile.master.rb.erb +101 -0
- data/lib/kontena/machine/vagrant/{Vagrantfile.coreos.rb.erb → Vagrantfile.node.rb.erb} +0 -0
- data/lib/kontena/machine/vagrant/cloudinit.yml +2 -1
- data/lib/kontena/machine/vagrant/master_destroyer.rb +37 -0
- data/lib/kontena/machine/vagrant/master_provisioner.rb +75 -0
- data/lib/kontena/machine/vagrant/node_destroyer.rb +4 -0
- data/lib/kontena/machine/vagrant/node_provisioner.rb +1 -1
- data/lib/kontena/scripts/completer +29 -3
- data/spec/kontena/cli/app/common_spec.rb +61 -0
- data/spec/kontena/cli/app/deploy_command_spec.rb +25 -6
- data/spec/kontena/cli/app/docker_helper_spec.rb +32 -0
- data/spec/kontena/cli/common_spec.rb +53 -0
- metadata +61 -3
File without changes
|
@@ -8,7 +8,7 @@ write_files:
|
|
8
8
|
KONTENA_TOKEN="<%= grid_token %>"
|
9
9
|
KONTENA_PEER_INTERFACE=eth1
|
10
10
|
KONTENA_VERSION=<%= version %>
|
11
|
-
- path: /etc/systemd/system/docker.service.d/50-
|
11
|
+
- path: /etc/systemd/system/docker.service.d/50-kontena.conf
|
12
12
|
content: |
|
13
13
|
[Service]
|
14
14
|
Environment='DOCKER_OPTS=--insecure-registry="10.81.0.0/19" --bip="172.17.42.1/16"'
|
@@ -61,5 +61,6 @@ coreos:
|
|
61
61
|
-e KONTENA_TOKEN=${KONTENA_TOKEN} \
|
62
62
|
-e KONTENA_PEER_INTERFACE=${KONTENA_PEER_INTERFACE} \
|
63
63
|
-v=/var/run/docker.sock:/var/run/docker.sock \
|
64
|
+
-v=/etc/kontena-agent.env:/etc/kontena.env \
|
64
65
|
--net=host \
|
65
66
|
kontena/agent:${KONTENA_VERSION}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
|
3
|
+
module Kontena
|
4
|
+
module Machine
|
5
|
+
module Vagrant
|
6
|
+
class MasterDestroyer
|
7
|
+
|
8
|
+
attr_reader :client, :api_client
|
9
|
+
|
10
|
+
# @param [Kontena::Client] api_client Kontena api client
|
11
|
+
def initialize(api_client)
|
12
|
+
@api_client = api_client
|
13
|
+
end
|
14
|
+
|
15
|
+
def run!
|
16
|
+
if api_client.get("grids")['grids'].size > 0
|
17
|
+
abort("Cannot remove kontena-master because it has grids".colorize(:red))
|
18
|
+
end
|
19
|
+
|
20
|
+
vagrant_path = "#{Dir.home}/.kontena/vagrant_master"
|
21
|
+
Dir.chdir(vagrant_path) do
|
22
|
+
ShellSpinner "Terminating Vagrant kontena-master " do
|
23
|
+
Open3.popen2('vagrant destroy -f') do |stdin, output, wait|
|
24
|
+
while o = output.gets
|
25
|
+
puts o if ENV['DEBUG']
|
26
|
+
end
|
27
|
+
if wait.value == 0
|
28
|
+
FileUtils.remove_entry_secure(vagrant_path)
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,75 @@
|
|
1
|
+
require 'fileutils'
|
2
|
+
require 'erb'
|
3
|
+
require 'open3'
|
4
|
+
require 'shell-spinner'
|
5
|
+
|
6
|
+
module Kontena
|
7
|
+
module Machine
|
8
|
+
module Vagrant
|
9
|
+
class MasterProvisioner
|
10
|
+
include RandomName
|
11
|
+
|
12
|
+
API_URL = 'http://192.168.66.100:8080'
|
13
|
+
attr_reader :client
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@client = Excon.new(API_URL)
|
17
|
+
end
|
18
|
+
|
19
|
+
def run!(opts)
|
20
|
+
name = generate_name
|
21
|
+
version = opts[:version]
|
22
|
+
memory = opts[:memory] || 1024
|
23
|
+
auth_server = opts[:auth_server]
|
24
|
+
vagrant_path = "#{Dir.home}/.kontena/vagrant_master/"
|
25
|
+
if Dir.exist?(vagrant_path)
|
26
|
+
abort("Oops... cannot create Kontena Master! You can run only one Kontena Master with Vagrant".colorize(:red))
|
27
|
+
end
|
28
|
+
FileUtils.mkdir_p(vagrant_path)
|
29
|
+
|
30
|
+
template = File.join(__dir__ , '/Vagrantfile.master.rb.erb')
|
31
|
+
cloudinit_template = File.join(__dir__ , '/cloudinit.yml')
|
32
|
+
vars = {
|
33
|
+
name: name,
|
34
|
+
version: version,
|
35
|
+
memory: memory,
|
36
|
+
auth_server: auth_server,
|
37
|
+
cloudinit: "#{vagrant_path}/cloudinit.yml"
|
38
|
+
}
|
39
|
+
vagrant_data = erb(File.read(template), vars)
|
40
|
+
cloudinit = erb(File.read(cloudinit_template), vars)
|
41
|
+
File.write("#{vagrant_path}/Vagrantfile", vagrant_data)
|
42
|
+
File.write("#{vagrant_path}/cloudinit.yml", cloudinit)
|
43
|
+
Dir.chdir(vagrant_path) do
|
44
|
+
ShellSpinner "Creating Vagrant machine #{name.colorize(:cyan)} " do
|
45
|
+
Open3.popen2('vagrant box update && vagrant up') do |stdin, output, wait|
|
46
|
+
while o = output.gets
|
47
|
+
print o if ENV['DEBUG']
|
48
|
+
end
|
49
|
+
end
|
50
|
+
end
|
51
|
+
ShellSpinner "Waiting for #{name.colorize(:cyan)} to start " do
|
52
|
+
sleep 1 until master_running?
|
53
|
+
end
|
54
|
+
puts "Kontena Master is now running at #{API_URL}"
|
55
|
+
puts "Use #{"kontena login #{API_URL}".colorize(:light_black)} to complete Kontena Master setup"
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def erb(template, vars)
|
60
|
+
ERB.new(template).result(OpenStruct.new(vars).instance_eval { binding })
|
61
|
+
end
|
62
|
+
|
63
|
+
def master_running?
|
64
|
+
client.get(path: '/').status == 200
|
65
|
+
rescue
|
66
|
+
false
|
67
|
+
end
|
68
|
+
|
69
|
+
def generate_name
|
70
|
+
"kontena-master-#{super}-#{rand(1..99)}"
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
@@ -23,7 +23,7 @@ module Kontena
|
|
23
23
|
vagrant_path = "#{Dir.home}/.kontena/#{grid}/#{name}"
|
24
24
|
FileUtils.mkdir_p(vagrant_path)
|
25
25
|
|
26
|
-
template = File.join(__dir__ , '/Vagrantfile.
|
26
|
+
template = File.join(__dir__ , '/Vagrantfile.node.rb.erb')
|
27
27
|
cloudinit_template = File.join(__dir__ , '/cloudinit.yml')
|
28
28
|
vars = {
|
29
29
|
name: name,
|
@@ -3,6 +3,7 @@
|
|
3
3
|
|
4
4
|
# resolve bin path, ignoring symlinks
|
5
5
|
require 'pathname'
|
6
|
+
require 'yaml'
|
6
7
|
bin_file = Pathname.new(__FILE__).realpath
|
7
8
|
|
8
9
|
# add self to libpath
|
@@ -52,6 +53,16 @@ class Helper
|
|
52
53
|
rescue
|
53
54
|
[]
|
54
55
|
end
|
56
|
+
|
57
|
+
def yml_services
|
58
|
+
if File.exist?('kontena.yml')
|
59
|
+
services = YAML.load(File.read('kontena.yml'))
|
60
|
+
services.keys
|
61
|
+
end
|
62
|
+
rescue
|
63
|
+
[]
|
64
|
+
end
|
65
|
+
|
55
66
|
end
|
56
67
|
|
57
68
|
helper = Helper.new
|
@@ -60,7 +71,7 @@ words = ARGV
|
|
60
71
|
words.delete_at(0)
|
61
72
|
|
62
73
|
completion = []
|
63
|
-
completion.push %w(app deploy forgot-password node grid invite service container vpn external-registry registry login logout whoami) if words.size < 2
|
74
|
+
completion.push %w(app deploy forgot-password master node grid invite service container vpn external-registry registry login logout whoami) if words.size < 2
|
64
75
|
if words.size > 0
|
65
76
|
case words[0]
|
66
77
|
when 'grid'
|
@@ -74,13 +85,22 @@ if words.size > 0
|
|
74
85
|
end
|
75
86
|
when 'node'
|
76
87
|
completion.clear
|
77
|
-
sub_commands = %w(list show remove vagrant digitalocean)
|
88
|
+
sub_commands = %w(list show remove vagrant digitalocean azure aws)
|
78
89
|
if words[1]
|
79
90
|
completion.push(sub_commands) unless sub_commands.include?(words[1])
|
80
91
|
completion.push helper.nodes
|
81
92
|
else
|
82
93
|
completion.push sub_commands
|
83
94
|
end
|
95
|
+
when 'master'
|
96
|
+
completion.clear
|
97
|
+
sub_commands = %w(vagrant digitalocean azure aws)
|
98
|
+
if words[1]
|
99
|
+
completion.push(sub_commands) unless sub_commands.include?(words[1])
|
100
|
+
completion.push %w(create)
|
101
|
+
else
|
102
|
+
completion.push sub_commands
|
103
|
+
end
|
84
104
|
when 'service'
|
85
105
|
completion.clear
|
86
106
|
sub_commands = %w(containers create delete deploy list logs restart scale show start stats stop update)
|
@@ -107,7 +127,13 @@ if words.size > 0
|
|
107
127
|
completion.push %w(add list delete)
|
108
128
|
when 'app'
|
109
129
|
completion.clear
|
110
|
-
|
130
|
+
sub_commands = %w(init build deploy start stop remove rm ps list logs)
|
131
|
+
if words[1]
|
132
|
+
completion.push(sub_commands) unless sub_commands.include?(words[1])
|
133
|
+
completion.push helper.yml_services
|
134
|
+
else
|
135
|
+
completion.push sub_commands
|
136
|
+
end
|
111
137
|
end
|
112
138
|
end
|
113
139
|
|
@@ -0,0 +1,61 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require "kontena/cli/apps/common"
|
3
|
+
|
4
|
+
describe Kontena::Cli::Apps::Common do
|
5
|
+
|
6
|
+
let(:subject) do
|
7
|
+
Class.new { include Kontena::Cli::Apps::Common}.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#normalize_env_vars' do
|
11
|
+
it 'converts env hash to array' do
|
12
|
+
opts = {
|
13
|
+
'environment' => {
|
14
|
+
'FOO' => 'bar',
|
15
|
+
'BAR' => 'baz'
|
16
|
+
}
|
17
|
+
}
|
18
|
+
subject.normalize_env_vars(opts)
|
19
|
+
env = opts['environment']
|
20
|
+
expect(env).to include('FOO=bar')
|
21
|
+
expect(env).to include('BAR=baz')
|
22
|
+
end
|
23
|
+
|
24
|
+
it 'does nothing to env array' do
|
25
|
+
opts = {
|
26
|
+
'environment' => [
|
27
|
+
'FOO=bar', 'BAR=baz'
|
28
|
+
]
|
29
|
+
}
|
30
|
+
subject.normalize_env_vars(opts)
|
31
|
+
env = opts['environment']
|
32
|
+
expect(env).to include('FOO=bar')
|
33
|
+
expect(env).to include('BAR=baz')
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
37
|
+
describe '#extend_env_vars' do
|
38
|
+
it 'inherites env vars from upper level' do
|
39
|
+
from = {'environment' => ['FOO=bar']}
|
40
|
+
to = {}
|
41
|
+
env_vars = subject.extend_env_vars(from, to)
|
42
|
+
expect(env_vars).to eq(['FOO=bar'])
|
43
|
+
end
|
44
|
+
|
45
|
+
it 'overrides values' do
|
46
|
+
from = {'environment' => ['FOO=bar']}
|
47
|
+
to = {'environment' => ['FOO=baz']}
|
48
|
+
env_vars = subject.extend_env_vars(from, to)
|
49
|
+
expect(env_vars).to eq(['FOO=baz'])
|
50
|
+
end
|
51
|
+
|
52
|
+
it 'combines variables' do
|
53
|
+
from = {'environment' => ['FOO=bar']}
|
54
|
+
to = {'environment' => ['BAR=baz']}
|
55
|
+
env_vars = subject.extend_env_vars(from, to)
|
56
|
+
expect(env_vars).to eq(['BAR=baz', 'FOO=bar'])
|
57
|
+
end
|
58
|
+
|
59
|
+
|
60
|
+
end
|
61
|
+
end
|
@@ -37,7 +37,7 @@ wordpress:
|
|
37
37
|
service: wordpress
|
38
38
|
stateful: true
|
39
39
|
environment:
|
40
|
-
- WORDPRESS_DB_PASSWORD=%{
|
40
|
+
- WORDPRESS_DB_PASSWORD=%{project}_secret
|
41
41
|
instances: 2
|
42
42
|
deploy:
|
43
43
|
strategy: ha
|
@@ -47,7 +47,7 @@ mysql:
|
|
47
47
|
service: mysql
|
48
48
|
stateful: true
|
49
49
|
environment:
|
50
|
-
- MYSQL_ROOT_PASSWORD=%{
|
50
|
+
- MYSQL_ROOT_PASSWORD=%{project}_secret
|
51
51
|
yml
|
52
52
|
yml_content
|
53
53
|
end
|
@@ -105,8 +105,8 @@ yml
|
|
105
105
|
before(:each) do
|
106
106
|
allow(subject).to receive(:settings).and_return(settings)
|
107
107
|
allow(File).to receive(:exists?).and_return(true)
|
108
|
-
allow(File).to receive(:read).with(
|
109
|
-
allow(File).to receive(:read).with(
|
108
|
+
allow(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
|
109
|
+
allow(File).to receive(:read).with("#{Dir.getwd}/docker-compose.yml").and_return(docker_compose_yml)
|
110
110
|
allow(subject).to receive(:get_service).and_raise(Kontena::Errors::StandardError.new(404, 'Not Found'))
|
111
111
|
allow(subject).to receive(:create_service).and_return({'id' => 'cli/kontena-test-mysql', 'name' => 'kontena-test-mysql'},{'id' => 'cli/kontena-test-wordpress', 'name' => 'kontena-test-wordpress'})
|
112
112
|
allow(subject).to receive(:current_grid).and_return('1')
|
@@ -115,17 +115,18 @@ yml
|
|
115
115
|
|
116
116
|
it 'reads ./kontena.yml file by default' do
|
117
117
|
allow(subject).to receive(:settings).and_return(settings)
|
118
|
-
expect(File).to receive(:read).with(
|
118
|
+
expect(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
|
119
119
|
subject.run([])
|
120
120
|
end
|
121
121
|
|
122
122
|
it 'reads given yml file' do
|
123
|
-
expect(File).to receive(:read).with(
|
123
|
+
expect(File).to receive(:read).with("#{Dir.getwd}/custom.yml").and_return(kontena_yml)
|
124
124
|
subject.run(["--file", "custom.yml"])
|
125
125
|
end
|
126
126
|
|
127
127
|
it 'uses current directory as service name prefix by default' do
|
128
128
|
current_dir = '/kontena/tests/stacks'
|
129
|
+
allow(Dir).to receive(:chdir).and_return(true)
|
129
130
|
allow(Dir).to receive(:getwd).and_return(current_dir)
|
130
131
|
expect(File).to receive(:basename).with(current_dir).and_return('stacks')
|
131
132
|
subject.run([])
|
@@ -180,6 +181,24 @@ yml
|
|
180
181
|
end
|
181
182
|
end
|
182
183
|
|
184
|
+
it 'merges external links to links' do
|
185
|
+
allow(subject).to receive(:current_dir).and_return("kontena-test")
|
186
|
+
allow(YAML).to receive(:load).and_return(services)
|
187
|
+
services['wordpress']['external_links'] = ['loadbalancer:loadbalancer']
|
188
|
+
data = {
|
189
|
+
:name =>"kontena-test-wordpress",
|
190
|
+
:image=>"wordpress:latest",
|
191
|
+
:env=> nil,
|
192
|
+
:container_count=>2,
|
193
|
+
:stateful=>false,
|
194
|
+
:links=>[{:name => "kontena-test-mysql", :alias => "db"}, {:name => "loadbalancer", :alias => "loadbalancer"}],
|
195
|
+
:ports=>[{:container_port => "80", :node_port => "80", :protocol => "tcp"}]
|
196
|
+
}
|
197
|
+
|
198
|
+
expect(subject).to receive(:create_service).with('1234567', '1', data)
|
199
|
+
subject.run([])
|
200
|
+
end
|
201
|
+
|
183
202
|
it 'creates mysql service before wordpress' do
|
184
203
|
allow(subject).to receive(:current_dir).and_return("kontena-test")
|
185
204
|
data = {:name =>"kontena-test-mysql", :image=>'mysql:5.6', :env=>["MYSQL_ROOT_PASSWORD=kontena-test_secret"], :container_count=>nil, :stateful=>true}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
require_relative "../../../spec_helper"
|
2
|
+
require "kontena/cli/apps/docker_helper"
|
3
|
+
|
4
|
+
describe Kontena::Cli::Apps::DockerHelper do
|
5
|
+
|
6
|
+
let(:subject) do
|
7
|
+
Class.new { include Kontena::Cli::Apps::DockerHelper}.new
|
8
|
+
end
|
9
|
+
|
10
|
+
describe '#validate_image_name' do
|
11
|
+
context 'when image name is valid' do
|
12
|
+
it 'returns true' do
|
13
|
+
expect(subject.validate_image_name('registry.kontena.local/image-name:latest')).to be_truthy
|
14
|
+
expect(subject.validate_image_name('my-registry.com/organization/image_name:latest')).to be_truthy
|
15
|
+
expect(subject.validate_image_name('mysql:5.1')).to be_truthy
|
16
|
+
expect(subject.validate_image_name('wordpress')).to be_truthy
|
17
|
+
end
|
18
|
+
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
describe '#validate_image_name' do
|
23
|
+
context 'when image name is invalid' do
|
24
|
+
it 'returns false' do
|
25
|
+
expect(subject.validate_image_name('registry.kontena.local/image-name:')).to be_falsey
|
26
|
+
expect(subject.validate_image_name('mysql 5.1')).to be_falsey
|
27
|
+
expect(subject.validate_image_name('*.mydomain.com/mysql')).to be_falsey
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,53 @@
|
|
1
|
+
require_relative "../../spec_helper"
|
2
|
+
require "kontena/cli/common"
|
3
|
+
|
4
|
+
describe Kontena::Cli::Common do
|
5
|
+
|
6
|
+
let(:subject) do
|
7
|
+
Class.new do
|
8
|
+
include Kontena::Cli::Common
|
9
|
+
end.new
|
10
|
+
end
|
11
|
+
|
12
|
+
before(:each) do
|
13
|
+
allow(subject).to receive(:settings).and_return({'server' => {}})
|
14
|
+
allow(subject).to receive(:save_settings)
|
15
|
+
end
|
16
|
+
|
17
|
+
describe '#current_grid' do
|
18
|
+
it 'returns nil by default' do
|
19
|
+
expect(subject.current_grid).to eq(nil)
|
20
|
+
end
|
21
|
+
|
22
|
+
it 'returns grid from env' do
|
23
|
+
expect(ENV).to receive(:[]).with('KONTENA_GRID').and_return('foo')
|
24
|
+
expect(subject.current_grid).to eq('foo')
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
describe '#api_url' do
|
29
|
+
it 'raises error by default' do
|
30
|
+
expect {
|
31
|
+
subject.api_url
|
32
|
+
}.to raise_error(ArgumentError)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'return url from env' do
|
36
|
+
expect(ENV).to receive(:[]).with('KONTENA_URL').and_return('https://domain.com')
|
37
|
+
expect(subject.api_url).to eq('https://domain.com')
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
describe '#require_token' do
|
42
|
+
it 'raises error by default' do
|
43
|
+
expect {
|
44
|
+
subject.require_token
|
45
|
+
}.to raise_error(ArgumentError)
|
46
|
+
end
|
47
|
+
|
48
|
+
it 'return token from env' do
|
49
|
+
expect(ENV).to receive(:[]).with('KONTENA_TOKEN').and_return('secret_token')
|
50
|
+
expect(subject.require_token).to eq('secret_token')
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end
|