kontena-cli 0.14.0 → 0.14.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 13295c1c17a8bc5e8a328ba103a1ce03d22f083e
4
- data.tar.gz: d1c228f5eb5decefb19bf73892858161f69da2ad
3
+ metadata.gz: 271ff6357fc144663ce26127000670ee955591f9
4
+ data.tar.gz: 3c649adbd8e51c377d91f2ccff9e1cddaf83d198
5
5
  SHA512:
6
- metadata.gz: cac1ed8d7f6c2f44621b7d3ccef67555b732a20e89e8213d9651f66c7b3b0f894826d7f25d176185600045c85b0b543cc23e4f10e0bd481c7b5dc626f7914b79
7
- data.tar.gz: 770733acf831c0f155289952ec31a03cfbcbc1b3acb45ed7cce7d4bceee8e51c89c0ab68ba9451a90e174016725278ae72918db48aad11a26beb1cc9899c0cb5
6
+ metadata.gz: a324873b2090e75da968425299e6d15581d5d0632be85e53f1664501b212c8c0aca79f11a7f42c0e1a10cb90f4cf2c325452d0a32047f849d9d87ef0ed50b867
7
+ data.tar.gz: 3b60be978cfbb2a686f02e9e1353a62627ea11fd4bc71854018b65d1d542da2ac0a303197b10b0712dfc05531564f041899ea657d96976f213125e3d3b44f41b
data/VERSION CHANGED
@@ -1 +1 @@
1
- 0.14.0
1
+ 0.14.1
@@ -12,12 +12,11 @@ module Kontena::Cli::Apps
12
12
  option ['--no-cache'], :flag, 'Do not use cache when building the image', default: false
13
13
  parameter "[SERVICE] ...", "Services to build"
14
14
 
15
- attr_reader :services, :service_prefix
15
+ attr_reader :services
16
16
 
17
17
  def execute
18
18
  require_config_file(filename)
19
- @service_prefix = project_name || current_dir
20
- @services = load_services(filename, service_list, service_prefix)
19
+ @services = services_from_yaml(filename, service_list, service_prefix)
21
20
  process_docker_images(services, true, no_cache?)
22
21
  end
23
22
  end
@@ -3,8 +3,7 @@ require 'pp'
3
3
 
4
4
  module Kontena::Cli::Apps
5
5
  class ConfigCommand < Clamp::Command
6
- include Kontena::Cli::Common
7
- include Kontena::Cli::GridOptions
6
+ include Kontena::Cli::Common
8
7
  include Common
9
8
 
10
9
  option ['-f', '--file'], 'FILE', 'Specify an alternate Kontena compose file', attribute_name: :filename, default: 'kontena.yml'
@@ -12,11 +11,8 @@ module Kontena::Cli::Apps
12
11
 
13
12
  parameter "[SERVICE] ...", "Services to view"
14
13
 
15
- attr_reader :service_prefix
16
-
17
14
  def execute
18
15
  require_config_file(filename)
19
- @service_prefix = project_name || current_dir
20
16
  services = services_from_yaml(filename, service_list, service_prefix)
21
17
  services.each do |name, config|
22
18
  config['cmd'] = config['cmd'].join(" ") if config['cmd']
@@ -19,6 +19,9 @@ module Kontena::Cli::Master::Aws
19
19
  option "--mongodb-uri", "URI", "External MongoDB uri (optional)"
20
20
  option "--version", "VERSION", "Define installed Kontena version", default: 'latest'
21
21
  option "--auth-provider-url", "AUTH_PROVIDER_URL", "Define authentication provider url (optional)"
22
+ option "--associate-public-ip-address", :flag, "Whether to associated public IP in case the VPC defaults to not doing it", default: false, attribute_name: :associate_public_ip
23
+ option "--security-groups", "SECURITY GROUPS", "Comma separated list of security groups (names) where the new instance will be attached (default: create 'kontena_master' group if not already existing)"
24
+
22
25
 
23
26
  def execute
24
27
  require 'kontena/machine/aws'
@@ -36,7 +39,9 @@ module Kontena::Cli::Master::Aws
36
39
  auth_server: auth_provider_url,
37
40
  vault_secret: vault_secret || SecureRandom.hex(24),
38
41
  vault_iv: vault_iv || SecureRandom.hex(24),
39
- mongodb_uri: mongodb_uri
42
+ mongodb_uri: mongodb_uri,
43
+ associate_public_ip: associate_public_ip?,
44
+ security_groups: security_groups
40
45
  )
41
46
  end
42
47
  end
@@ -14,6 +14,8 @@ module Kontena::Cli::Nodes::Aws
14
14
  option "--type", "SIZE", "Instance type", default: 't2.small'
15
15
  option "--storage", "STORAGE", "Storage size (GiB)", default: '30'
16
16
  option "--version", "VERSION", "Define installed Kontena version", default: 'latest'
17
+ option "--associate-public-ip-address", :flag, "Whether to associated public IP in case the VPC defaults to not doing it", default: false, attribute_name: :associate_public_ip
18
+ option "--security-groups", "SECURITY GROUPS", "Comma separated list of security groups (names) where the new instance will be attached (default: create grid specific group if not already existing)"
17
19
 
18
20
  def execute
19
21
  require_api_url
@@ -33,7 +35,9 @@ module Kontena::Cli::Nodes::Aws
33
35
  subnet: subnet_id,
34
36
  storage: storage,
35
37
  version: version,
36
- key_pair: key_pair
38
+ key_pair: key_pair,
39
+ associate_public_ip: associate_public_ip?,
40
+ security_groups: security_groups
37
41
  )
38
42
  end
39
43
  end
@@ -20,11 +20,11 @@ module Kontena::Cli::Services
20
20
  option "--instances", "INSTANCES", "How many instances should be deployed"
21
21
  option ["-u", "--user"], "USER", "Username who executes first process inside container"
22
22
  option "--privileged", :flag, "Give extended privileges to this service", default: false
23
- option "--cap-add", "CAP_ADD", "Add capabitilies", multivalued: true
24
- option "--cap-drop", "CAP_DROP", "Drop capabitilies", multivalued: true
23
+ option "--cap-add", "CAP_ADD", "Add capabitilies", multivalued: true, default: nil
24
+ option "--cap-drop", "CAP_DROP", "Drop capabitilies", multivalued: true, default: nil
25
25
  option "--net", "NET", "Network mode"
26
26
  option "--log-driver", "LOG_DRIVER", "Set logging driver"
27
- option "--log-opt", "LOG_OPT", "Add logging options", multivalued: true
27
+ option "--log-opt", "LOG_OPT", "Add logging options", multivalued: true, default: nil
28
28
  option "--deploy-strategy", "STRATEGY", "Deploy strategy to use (ha, daemon, random)"
29
29
  option "--deploy-wait-for-port", "PORT", "Wait for port to respond when deploying"
30
30
  option "--deploy-min-health", "FLOAT", "The minimum percentage (0.0 - 1.0) of healthy instances that do not sacrifice overall service availability while deploying"
@@ -59,11 +59,11 @@ module Kontena::Cli::Services
59
59
  data[:user] = user if user
60
60
  data[:image] = parse_image(image) if image
61
61
  data[:privileged] = privileged?
62
- data[:cap_add] = cap_add_list unless cap_add_list.empty?
63
- data[:cap_drop] = cap_drop_list unless cap_drop_list.empty?
62
+ data[:cap_add] = cap_add_list if cap_add_list
63
+ data[:cap_drop] = cap_drop_list if cap_drop_list
64
64
  data[:net] = net if net
65
65
  data[:log_driver] = log_driver if log_driver
66
- data[:log_opts] = parse_log_opts(log_opt_list)
66
+ data[:log_opts] = parse_log_opts(log_opt_list) if log_opt_list
67
67
  data[:deploy_opts] = {}
68
68
  data[:deploy_opts][:min_health] = deploy_min_health.to_f if deploy_min_health
69
69
  data[:deploy_opts][:wait_for_port] = deploy_wait_for_port.to_i if deploy_wait_for_port
@@ -32,6 +32,26 @@ module Kontena
32
32
  def default_vpc
33
33
  ec2.vpcs({filters: [{name: "is-default", values: ["true"]}]}).first
34
34
  end
35
+
36
+
37
+
38
+ ##
39
+ # Resolves givne list of group names into group ids
40
+ # @param [String] comma separated list of group names
41
+ # @return [Array]
42
+ def resolve_security_groups_to_ids(group_list, vpc_id)
43
+ ids = group_list.split(',').map { |group|
44
+ sg = ec2.security_groups({
45
+ filters: [
46
+ {name: 'group-name', values: [group]},
47
+ {name: 'vpc-id', values: [vpc_id]}
48
+ ]
49
+ }).first
50
+
51
+ sg ? sg.group_id : nil
52
+ }
53
+ ids.compact
54
+ end
35
55
  end
36
56
  end
37
57
  end
@@ -42,6 +42,7 @@ module Kontena
42
42
  else
43
43
  subnet = ec2.subnet(opts[:subnet])
44
44
  end
45
+ abort('Failed to find subnet!') unless subnet
45
46
  userdata_vars = {
46
47
  ssl_cert: ssl_cert,
47
48
  auth_server: opts[:auth_server],
@@ -51,16 +52,17 @@ module Kontena
51
52
  mongodb_uri: opts[:mongodb_uri]
52
53
  }
53
54
 
54
- security_group = ensure_security_group(opts[:vpc])
55
+ security_groups = opts[:security_groups] ?
56
+ resolve_security_groups_to_ids(opts[:security_groups], opts[:vpc]) :
57
+ ensure_security_group(opts[:vpc])
58
+
55
59
  name = generate_name
56
60
  ec2_instance = ec2.create_instances({
57
61
  image_id: ami,
58
62
  min_count: 1,
59
63
  max_count: 1,
60
64
  instance_type: opts[:type],
61
- security_group_ids: [security_group.group_id],
62
65
  key_name: opts[:key_pair],
63
- subnet_id: subnet.subnet_id,
64
66
  user_data: Base64.encode64(user_data(userdata_vars)),
65
67
  block_device_mappings: [
66
68
  {
@@ -71,6 +73,15 @@ module Kontena
71
73
  volume_type: 'gp2'
72
74
  }
73
75
  }
76
+ ],
77
+ network_interfaces: [
78
+ {
79
+ device_index: 0,
80
+ subnet_id: subnet.subnet_id,
81
+ groups: security_groups,
82
+ associate_public_ip_address: opts[:associate_public_ip],
83
+ delete_on_termination: true
84
+ }
74
85
  ]
75
86
  }).first
76
87
  ec2_instance.create_tags({
@@ -78,37 +89,41 @@ module Kontena
78
89
  {key: 'Name', value: name}
79
90
  ]
80
91
  })
92
+
81
93
  ShellSpinner "Creating AWS instance #{name.colorize(:cyan)} " do
82
94
  sleep 5 until ec2_instance.reload.state.name == 'running'
83
95
  end
84
- master_url = "https://#{ec2_instance.public_ip_address}"
85
- Excon.defaults[:ssl_verify_peer] = false
86
- http_client = Excon.new(master_url, :connect_timeout => 10)
87
- ShellSpinner "Waiting for #{name.colorize(:cyan)} to start " do
88
- sleep 5 until master_running?(http_client)
96
+ public_ip = ec2_instance.reload.public_ip_address
97
+ if public_ip.nil?
98
+ master_url = "https://#{ec2_instance.private_ip_address}"
99
+ puts "Could not get public IP for the created master, private connect url is: #{master_url}"
100
+ else
101
+ master_url = "https://#{ec2_instance.public_ip_address}"
102
+ Excon.defaults[:ssl_verify_peer] = false
103
+ http_client = Excon.new(master_url, :connect_timeout => 10)
104
+ ShellSpinner "Waiting for #{name.colorize(:cyan)} to start " do
105
+ sleep 5 until master_running?(http_client)
106
+ end
89
107
  end
90
-
108
+
91
109
  puts "Kontena Master is now running at #{master_url}"
92
110
  puts "Use #{"kontena login --name=#{name.sub('kontena-master-', '')} #{master_url}".colorize(:light_black)} to complete Kontena Master setup"
93
111
  end
94
112
 
95
113
  ##
96
114
  # @param [String] vpc_id
97
- # @return [Aws::EC2::SecurityGroup]
115
+ # @return [Array] Security group id in array
98
116
  def ensure_security_group(vpc_id)
99
117
  group_name = "kontena_master"
100
- sg = ec2.security_groups({
101
- filters: [
102
- {name: 'group-name', values: [group_name]},
103
- {name: 'vpc-id', values: [vpc_id]}
104
- ]
105
- }).first
106
- unless sg
118
+ group_id = resolve_security_groups_to_ids(group_name, vpc_id)
119
+
120
+ if group_id.empty?
107
121
  ShellSpinner "Creating AWS security group" do
108
122
  sg = create_security_group(group_name, vpc_id)
123
+ group_id = [sg.group_id]
109
124
  end
110
125
  end
111
- sg
126
+ group_id
112
127
  end
113
128
 
114
129
  ##
@@ -31,10 +31,12 @@ module Kontena
31
31
 
32
32
  opts[:vpc] = default_vpc.vpc_id unless opts[:vpc]
33
33
 
34
- security_group = ensure_security_group(opts[:grid], opts[:vpc])
34
+ security_groups = opts[:security_groups] ?
35
+ resolve_security_groups_to_ids(opts[:security_groups], opts[:vpc]) :
36
+ ensure_security_group(opts[:grid], opts[:vpc])
37
+
35
38
  name = opts[:name ] || generate_name
36
39
 
37
-
38
40
  if opts[:subnet].nil?
39
41
  subnet = default_subnet(opts[:vpc], region+opts[:zone])
40
42
  else
@@ -54,9 +56,7 @@ module Kontena
54
56
  min_count: 1,
55
57
  max_count: 1,
56
58
  instance_type: opts[:type],
57
- security_group_ids: [security_group.group_id],
58
59
  key_name: opts[:key_pair],
59
- subnet_id: subnet.subnet_id,
60
60
  user_data: Base64.encode64(user_data(userdata_vars)),
61
61
  block_device_mappings: [
62
62
  {
@@ -67,6 +67,15 @@ module Kontena
67
67
  volume_type: 'gp2'
68
68
  }
69
69
  }
70
+ ],
71
+ network_interfaces: [
72
+ {
73
+ device_index: 0,
74
+ subnet_id: subnet.subnet_id,
75
+ groups: security_groups,
76
+ associate_public_ip_address: opts[:associate_public_ip],
77
+ delete_on_termination: true
78
+ }
70
79
  ]
71
80
  }).first
72
81
  ec2_instance.create_tags({
@@ -83,27 +92,28 @@ module Kontena
83
92
  ShellSpinner "Waiting for node #{name.colorize(:cyan)} join to grid #{opts[:grid].colorize(:cyan)} " do
84
93
  sleep 2 until node = instance_exists_in_grid?(opts[:grid], name)
85
94
  end
86
- labels = ["region=#{region}", "az=#{opts[:zone]}"]
95
+ labels = [
96
+ "region=#{region}",
97
+ "az=#{opts[:zone]}",
98
+ "provider=aws"
99
+ ]
87
100
  set_labels(node, labels)
88
101
  end
89
102
 
90
103
  ##
91
104
  # @param [String] grid
92
- # @return [Aws::EC2::SecurityGroup]
105
+ # @return [Array] Security group id in array
93
106
  def ensure_security_group(grid, vpc_id)
94
107
  group_name = "kontena_grid_#{grid}"
95
- sg = ec2.security_groups({
96
- filters: [
97
- {name: 'group-name', values: [group_name]},
98
- {name: 'vpc-id', values: [vpc_id]}
99
- ]
100
- }).first
101
- unless sg
108
+ group_id = resolve_security_groups_to_ids(group_name, vpc_id)
109
+
110
+ if group_id.empty?
102
111
  ShellSpinner "Creating AWS security group" do
103
112
  sg = create_security_group(group_name, vpc_id)
113
+ group_id = [sg.group_id]
104
114
  end
105
115
  end
106
- sg
116
+ group_id
107
117
  end
108
118
 
109
119
  ##
@@ -74,7 +74,8 @@ module Kontena
74
74
  if node
75
75
  labels = [
76
76
  "region=#{cloud_service(cloud_service_name).location}",
77
- "az=#{cloud_service(cloud_service_name).location}"
77
+ "az=#{cloud_service(cloud_service_name).location}",
78
+ "provider=azure"
78
79
  ]
79
80
  set_labels(node, labels)
80
81
  end
@@ -47,7 +47,14 @@ module Kontena
47
47
  ShellSpinner "Waiting for node #{droplet.name.colorize(:cyan)} join to grid #{opts[:grid].colorize(:cyan)} " do
48
48
  sleep 2 until node = droplet_exists_in_grid?(opts[:grid], droplet)
49
49
  end
50
- set_labels(node, ["region=#{opts[:region]}", "az=#{opts[:region]}"])
50
+ set_labels(
51
+ node,
52
+ [
53
+ "region=#{opts[:region]}",
54
+ "az=#{opts[:region]}",
55
+ "provider=digitalocean"
56
+ ]
57
+ )
51
58
  end
52
59
 
53
60
  def user_data(vars)
@@ -35,6 +35,8 @@ module Kontena
35
35
  end
36
36
  end
37
37
 
38
+ abort_unless_api_access
39
+
38
40
  abort('CoreOS template not found on Upcloud') unless coreos_template = find_template('CoreOS Stable')
39
41
  abort('Server plan not found on Upcloud') unless plan = find_plan(opts[:plan])
40
42
  abort('Zone not found on Upcloud') unless zone_exist?(opts[:zone])
@@ -18,6 +18,9 @@ module Kontena
18
18
  end
19
19
 
20
20
  def run!(grid, name)
21
+
22
+ abort_unless_api_access
23
+
21
24
  servers = get('server')
22
25
  unless servers && servers.has_key?(:servers)
23
26
  abort('Upcloud API error')
@@ -34,6 +34,8 @@ module Kontena
34
34
  grid_token: opts[:grid_token],
35
35
  }
36
36
 
37
+ abort_unless_api_access
38
+
37
39
  abort('CoreOS template not found on Upcloud') unless coreos_template = find_template('CoreOS Stable')
38
40
  abort('Server plan not found on Upcloud') unless plan = find_plan(opts[:plan])
39
41
  abort('Zone not found on Upcloud') unless zone_exist?(opts[:zone])
@@ -17,6 +17,8 @@ module Kontena
17
17
  end
18
18
 
19
19
  def run!(name)
20
+ abort_unless_api_access
21
+
20
22
  servers = get('server')
21
23
  unless servers && servers.has_key?(:servers)
22
24
  abort('Upcloud API error')
@@ -35,6 +35,19 @@ module Kontena
35
35
  get("server/#{id}").fetch(:server, nil)
36
36
  end
37
37
 
38
+ def api_access?
39
+ response = get('account')
40
+ response.kind_of?(Hash) && response.has_key?(:account)
41
+ rescue
42
+ false
43
+ end
44
+
45
+ def abort_unless_api_access
46
+ unless api_access?
47
+ abort('Upcloud API authentication failed. Check that API access is enabled for the user.')
48
+ end
49
+ end
50
+
38
51
  [:get, :post, :delete].each do |http_method|
39
52
  define_method http_method do |path, opts={}|
40
53
  response = client.send(
@@ -59,12 +72,3 @@ module Kontena
59
72
  end
60
73
  end
61
74
  end
62
-
63
- class Testing
64
- include Kontena::Machine::Upcloud::UpcloudCommon
65
- def initialize(user, pass)
66
- @username = user
67
- @password = pass
68
- end
69
- end
70
-
@@ -0,0 +1,56 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/apps/build_command"
3
+
4
+ describe Kontena::Cli::Apps::BuildCommand do
5
+ include FixturesHelpers
6
+
7
+ let(:subject) do
8
+ described_class.new(File.basename($0))
9
+ end
10
+
11
+ let(:kontena_yml) do
12
+ fixture('kontena.yml')
13
+ end
14
+
15
+ let(:docker_compose_yml) do
16
+ fixture('docker-compose.yml')
17
+ end
18
+
19
+ let(:settings) do
20
+ {'current_server' => 'alias',
21
+ 'servers' => [
22
+ {
23
+ 'name' => 'some_master',
24
+ 'url' => 'some_master'
25
+ }
26
+ ]
27
+ }
28
+ end
29
+
30
+ describe '#execute' do
31
+ before(:each) do
32
+ allow(subject).to receive(:settings).and_return(settings)
33
+ allow(subject).to receive(:current_dir).and_return("kontena-test")
34
+ allow(File).to receive(:exists?).and_return(true)
35
+ allow(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
36
+ allow(File).to receive(:read).with("#{Dir.getwd}/docker-compose.yml").and_return(docker_compose_yml)
37
+ end
38
+
39
+ it 'requests process_docker_images with services from yaml' do
40
+ expect(subject).to receive(:process_docker_images) do |services, force_build, no_cache|
41
+ expect(services.keys).to eq(['wordpress', 'mysql'])
42
+ end
43
+ subject.run([])
44
+ end
45
+
46
+ it 'requests process_docker_images with force_build' do
47
+ expect(subject).to receive(:process_docker_images).with(anything, true, anything)
48
+ subject.run([])
49
+ end
50
+
51
+ it 'requests process_docker_images with given no_cache option' do
52
+ expect(subject).to receive(:process_docker_images).with(anything, anything, true)
53
+ subject.run(['--no-cache', true])
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,78 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/apps/config_command"
3
+ require 'ruby_dig'
4
+
5
+ describe Kontena::Cli::Apps::ConfigCommand do
6
+ include FixturesHelpers
7
+
8
+ let(:subject) do
9
+ described_class.new(File.basename($0))
10
+ end
11
+
12
+ let(:kontena_yml) do
13
+ fixture('mysql.yml')
14
+ end
15
+
16
+ let(:yaml_with_app_name) do
17
+ {
18
+ 'version' => '2',
19
+ 'name' => 'myapp',
20
+ 'services' => {
21
+ 'mysql' => {
22
+ 'image' => '$project-mysql:5.6'
23
+ }
24
+ }
25
+ }
26
+ end
27
+
28
+ let(:settings) do
29
+ {'current_server' => 'alias',
30
+ 'servers' => [
31
+ {
32
+ 'name' => 'some_master',
33
+ 'url' => 'some_master'
34
+ }
35
+ ]
36
+ }
37
+ end
38
+
39
+ describe '#execute' do
40
+ before(:each) do
41
+ allow(subject).to receive(:settings).and_return(settings)
42
+ allow(subject).to receive(:current_dir).and_return("kontena-test")
43
+ allow(File).to receive(:exists?).and_return(true)
44
+ allow(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(kontena_yml)
45
+ end
46
+
47
+ it 'outputs service configs' do
48
+ valid_output = {
49
+ 'services' => {
50
+ 'mysql' => {
51
+ 'image' => 'mysql:5.6',
52
+ 'stateful' => false
53
+ }
54
+ }
55
+ }
56
+ expect {
57
+ subject.run([])
58
+ }.to output(valid_output.to_yaml).to_stdout
59
+ end
60
+
61
+ it 'uses app name from yaml as project variable' do
62
+
63
+ allow(File).to receive(:read).with("#{Dir.getwd}/kontena.yml").and_return(yaml_with_app_name.to_yaml)
64
+ valid_output = {
65
+ 'services' => {
66
+ 'mysql' => {
67
+ 'image' => 'myapp-mysql:5.6',
68
+ 'stateful' => false
69
+ }
70
+ }
71
+ }
72
+ expect {
73
+ subject.run([])
74
+ }.to output(valid_output.to_yaml).to_stdout
75
+ end
76
+
77
+ end
78
+ end
@@ -0,0 +1,56 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/grid_options"
3
+ require "kontena/cli/services/update_command"
4
+
5
+ describe Kontena::Cli::Services::UpdateCommand do
6
+
7
+ include ClientHelpers
8
+
9
+ describe '#execute' do
10
+
11
+ before(:each) do
12
+ allow(subject).to receive(:update_service).and_return({})
13
+ end
14
+
15
+ it 'requires api url' do
16
+ expect(subject).to receive(:require_api_url).once
17
+ subject.run(['service'])
18
+ end
19
+
20
+ it 'requires token' do
21
+ expect(subject).to receive(:require_token).once
22
+ subject.run(['service'])
23
+ end
24
+
25
+ it 'sends update command' do
26
+ expect(subject).to receive(:update_service).with(token, 'service', {privileged: false})
27
+ subject.run(['service'])
28
+ end
29
+
30
+ it 'sends --cap-add' do
31
+ expect(subject).to receive(:update_service).with(token, 'service', hash_including(cap_add: ['NET_ADMIN']))
32
+ subject.run(['--cap-add', 'NET_ADMIN', 'service'])
33
+ end
34
+
35
+ it 'sends --cap-drop' do
36
+ expect(subject).to receive(:update_service).with(token, 'service', hash_including(cap_drop: ['MKNOD']))
37
+ subject.run(['--cap-drop', 'MKNOD', 'service'])
38
+ end
39
+
40
+ it 'sends --log-driver' do
41
+ expect(subject).to receive(:update_service).with(token, 'service', hash_including(log_driver: 'syslog'))
42
+ subject.run(['--log-driver', 'syslog', 'service'])
43
+ end
44
+
45
+ it 'sends --log-opt' do
46
+ expect(subject).to receive(:update_service).with(
47
+ token, 'service', hash_including(log_opts: {
48
+ 'gelf-address' => 'udp://log_forwarder-logstash_internal:12201'
49
+ })
50
+ )
51
+ subject.run([
52
+ '--log-opt', 'gelf-address=udp://log_forwarder-logstash_internal:12201', 'service'
53
+ ])
54
+ end
55
+ end
56
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: kontena-cli
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.14.0
4
+ version: 0.14.1
5
5
  platform: ruby
6
6
  authors:
7
7
  - Kontena, Inc
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2016-05-31 00:00:00.000000000 Z
11
+ date: 2016-06-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -411,7 +411,9 @@ files:
411
411
  - spec/fixtures/mysql.yml
412
412
  - spec/fixtures/wordpress-scaled.yml
413
413
  - spec/fixtures/wordpress.yml
414
+ - spec/kontena/cli/app/build_command_spec.rb
414
415
  - spec/kontena/cli/app/common_spec.rb
416
+ - spec/kontena/cli/app/config_command_spec.rb
415
417
  - spec/kontena/cli/app/deploy_command_spec.rb
416
418
  - spec/kontena/cli/app/docker_helper_spec.rb
417
419
  - spec/kontena/cli/app/scale_spec.rb
@@ -440,6 +442,7 @@ files:
440
442
  - spec/kontena/cli/services/secrets/unlink_command_spec.rb
441
443
  - spec/kontena/cli/services/services_helper_spec.rb
442
444
  - spec/kontena/cli/services/unlink_command_spec.rb
445
+ - spec/kontena/cli/services/update_command_spec.rb
443
446
  - spec/kontena/cli/version_command_spec.rb
444
447
  - spec/spec_helper.rb
445
448
  - spec/support/client_helpers.rb
@@ -479,7 +482,9 @@ test_files:
479
482
  - spec/fixtures/mysql.yml
480
483
  - spec/fixtures/wordpress-scaled.yml
481
484
  - spec/fixtures/wordpress.yml
485
+ - spec/kontena/cli/app/build_command_spec.rb
482
486
  - spec/kontena/cli/app/common_spec.rb
487
+ - spec/kontena/cli/app/config_command_spec.rb
483
488
  - spec/kontena/cli/app/deploy_command_spec.rb
484
489
  - spec/kontena/cli/app/docker_helper_spec.rb
485
490
  - spec/kontena/cli/app/scale_spec.rb
@@ -508,6 +513,7 @@ test_files:
508
513
  - spec/kontena/cli/services/secrets/unlink_command_spec.rb
509
514
  - spec/kontena/cli/services/services_helper_spec.rb
510
515
  - spec/kontena/cli/services/unlink_command_spec.rb
516
+ - spec/kontena/cli/services/update_command_spec.rb
511
517
  - spec/kontena/cli/version_command_spec.rb
512
518
  - spec/spec_helper.rb
513
519
  - spec/support/client_helpers.rb