kontena-cli 0.16.3 → 0.17.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (99) hide show
  1. checksums.yaml +4 -4
  2. data/.dockerignore +1 -0
  3. data/.gitignore +3 -1
  4. data/VERSION +1 -1
  5. data/lib/kontena/callbacks/master/deploy/40_install_ssl_certificate_after_deploy.rb +32 -0
  6. data/lib/kontena/cli/apps/deploy_command.rb +2 -2
  7. data/lib/kontena/cli/apps/scale_command.rb +2 -2
  8. data/lib/kontena/cli/apps/show_command.rb +3 -2
  9. data/lib/kontena/cli/apps/yaml/validations.rb +10 -6
  10. data/lib/kontena/cli/apps/yaml/validator.rb +1 -0
  11. data/lib/kontena/cli/apps/yaml/validator_v2.rb +1 -0
  12. data/lib/kontena/cli/cloud/login_command.rb +66 -64
  13. data/lib/kontena/cli/common.rb +0 -10
  14. data/lib/kontena/cli/grids/logs_command.rb +0 -1
  15. data/lib/kontena/cli/localhost_web_server.rb +11 -3
  16. data/lib/kontena/cli/master/login_command.rb +213 -163
  17. data/lib/kontena/cli/nodes/label_command.rb +2 -0
  18. data/lib/kontena/cli/nodes/labels/add_command.rb +7 -8
  19. data/lib/kontena/cli/nodes/labels/list_command.rb +17 -0
  20. data/lib/kontena/cli/nodes/labels/remove_command.rb +7 -12
  21. data/lib/kontena/cli/nodes/show_command.rb +1 -0
  22. data/lib/kontena/cli/plugins/common.rb +8 -0
  23. data/lib/kontena/cli/plugins/install_command.rb +21 -2
  24. data/lib/kontena/cli/plugins/list_command.rb +4 -2
  25. data/lib/kontena/cli/plugins/search_command.rb +4 -2
  26. data/lib/kontena/cli/registry/create_command.rb +19 -12
  27. data/lib/kontena/cli/registry/remove_command.rb +4 -4
  28. data/lib/kontena/cli/registry_command.rb +0 -1
  29. data/lib/kontena/cli/services/create_command.rb +6 -6
  30. data/lib/kontena/cli/services/deploy_command.rb +8 -4
  31. data/lib/kontena/cli/services/list_command.rb +34 -21
  32. data/lib/kontena/cli/services/logs_command.rb +1 -1
  33. data/lib/kontena/cli/services/scale_command.rb +3 -3
  34. data/lib/kontena/cli/services/services_helper.rb +18 -14
  35. data/lib/kontena/cli/services/show_command.rb +1 -0
  36. data/lib/kontena/cli/services/update_command.rb +6 -6
  37. data/lib/kontena/cli/stack_command.rb +12 -6
  38. data/lib/kontena/cli/stacks/build_command.rb +110 -0
  39. data/lib/kontena/cli/stacks/common.rb +85 -20
  40. data/lib/kontena/cli/stacks/deploy_command.rb +30 -7
  41. data/lib/kontena/cli/stacks/install_command.rb +30 -0
  42. data/lib/kontena/cli/stacks/list_command.rb +74 -14
  43. data/lib/kontena/cli/stacks/logs_command.rb +31 -0
  44. data/lib/kontena/cli/stacks/monitor_command.rb +91 -0
  45. data/lib/kontena/cli/stacks/remove_command.rb +24 -7
  46. data/lib/kontena/cli/stacks/service_generator.rb +115 -0
  47. data/lib/kontena/cli/stacks/service_generator_v2.rb +27 -0
  48. data/lib/kontena/cli/stacks/show_command.rb +65 -13
  49. data/lib/kontena/cli/stacks/upgrade_command.rb +28 -0
  50. data/lib/kontena/cli/stacks/yaml/custom_validators/affinities_validator.rb +19 -0
  51. data/lib/kontena/cli/stacks/yaml/custom_validators/build_validator.rb +22 -0
  52. data/lib/kontena/cli/stacks/yaml/custom_validators/extends_validator.rb +21 -0
  53. data/lib/kontena/cli/stacks/yaml/custom_validators/hooks_validator.rb +54 -0
  54. data/lib/kontena/cli/stacks/yaml/custom_validators/secrets_validator.rb +22 -0
  55. data/lib/kontena/cli/stacks/yaml/reader.rb +219 -0
  56. data/lib/kontena/cli/stacks/yaml/service_extender.rb +78 -0
  57. data/lib/kontena/cli/stacks/yaml/validations.rb +71 -0
  58. data/lib/kontena/cli/stacks/yaml/validator_v3.rb +52 -0
  59. data/lib/kontena/cli/version_command.rb +5 -1
  60. data/lib/kontena/cli/vpn/create_command.rb +20 -17
  61. data/lib/kontena/cli/vpn/remove_command.rb +4 -3
  62. data/lib/kontena/client.rb +21 -20
  63. data/lib/kontena/machine/cert_helper.rb +4 -0
  64. data/lib/kontena/machine/cloud_config/cloudinit.yml +1 -1
  65. data/lib/kontena/main_command.rb +1 -1
  66. data/spec/fixtures/kontena-build.yml +2 -2
  67. data/spec/fixtures/kontena-invalid.yml +1 -1
  68. data/spec/fixtures/kontena-not-hash-service-config.yml +1 -1
  69. data/spec/fixtures/kontena-with-env-file.yml +2 -2
  70. data/spec/fixtures/kontena_build_v3.yml +23 -0
  71. data/spec/fixtures/kontena_v3.yml +20 -0
  72. data/spec/fixtures/stack-internal-extend.yml +11 -0
  73. data/spec/fixtures/stack-with-env-file.yml +21 -0
  74. data/spec/fixtures/stack-with-variables.yml +22 -0
  75. data/spec/kontena/cli/app/scale_spec.rb +3 -1
  76. data/spec/kontena/cli/cloud/login_command_spec.rb +283 -0
  77. data/spec/kontena/cli/master/login_command_spec.rb +324 -145
  78. data/spec/kontena/cli/services/link_command_spec.rb +1 -1
  79. data/spec/kontena/cli/services/secrets/link_command_spec.rb +4 -4
  80. data/spec/kontena/cli/services/secrets/unlink_command_spec.rb +2 -2
  81. data/spec/kontena/cli/services/services_helper_spec.rb +15 -11
  82. data/spec/kontena/cli/services/unlink_command_spec.rb +1 -1
  83. data/spec/kontena/cli/stacks/deploy_command_spec.rb +26 -0
  84. data/spec/kontena/cli/stacks/install_command_spec.rb +54 -0
  85. data/spec/kontena/cli/stacks/list_command_spec.rb +27 -0
  86. data/spec/kontena/cli/stacks/remove_command_spec.rb +45 -0
  87. data/spec/kontena/cli/stacks/service_generator_spec.rb +385 -0
  88. data/spec/kontena/cli/stacks/service_generator_v2_spec.rb +74 -0
  89. data/spec/kontena/cli/stacks/show_command_spec.rb +26 -0
  90. data/spec/kontena/cli/stacks/upgrade_command_spec.rb +50 -0
  91. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +370 -0
  92. data/spec/kontena/cli/stacks/yaml/service_extender_spec.rb +128 -0
  93. data/spec/kontena/cli/stacks/yaml/validator_v3_spec.rb +302 -0
  94. data/spec/spec_helper.rb +6 -4
  95. data/spec/support/client_helpers.rb +1 -0
  96. metadata +57 -7
  97. data/lib/kontena/cli/registry/delete_command.rb +0 -18
  98. data/lib/kontena/cli/stacks/create_command.rb +0 -27
  99. data/lib/kontena/cli/stacks/update_command.rb +0 -27
@@ -35,7 +35,7 @@ describe Kontena::Cli::Services::LinkCommand do
35
35
 
36
36
  it 'sends link to master' do
37
37
  expect(client).to receive(:put).with(
38
- 'services/test-grid/service-a', {links: [{name: 'service-b', alias: 'service-b'}]}
38
+ 'services/test-grid/default/service-a', {links: [{name: 'service-b', alias: 'service-b'}]}
39
39
  )
40
40
  subject.run(['service-a', 'service-b'])
41
41
  end
@@ -35,10 +35,10 @@ describe Kontena::Cli::Services::Secrets::LinkCommand do
35
35
  {secret: 'MY_PASSWORD', name: 'PASSWORD', type: 'env'}
36
36
  ]
37
37
  }
38
- allow(client).to receive(:get).with("services/test-grid/foo").and_return({
38
+ allow(client).to receive(:get).with("services/test-grid/default/foo").and_return({
39
39
  'secrets' => []
40
40
  })
41
- expect(client).to receive(:put).with("services/test-grid/foo", data)
41
+ expect(client).to receive(:put).with("services/test-grid/default/foo", data)
42
42
  subject.run(['foo', 'MY_PASSWORD:PASSWORD:env'])
43
43
  end
44
44
 
@@ -54,8 +54,8 @@ describe Kontena::Cli::Services::Secrets::LinkCommand do
54
54
  {secret: 'MY_PASSWORD', name: 'PASSWORD', type: 'env'}
55
55
  ]
56
56
  }
57
- allow(client).to receive(:get).with("services/test-grid/foo").and_return(original)
58
- expect(client).to receive(:put).with("services/test-grid/foo", data)
57
+ allow(client).to receive(:get).with("services/test-grid/default/foo").and_return(original)
58
+ expect(client).to receive(:put).with("services/test-grid/default/foo", data)
59
59
  subject.run(['foo', 'MY_PASSWORD:PASSWORD:env'])
60
60
  end
61
61
  end
@@ -41,8 +41,8 @@ describe Kontena::Cli::Services::Secrets::UnlinkCommand do
41
41
  {'secret' => 'BAR', 'name' => 'BAZ', 'type' => 'env'}
42
42
  ]
43
43
  }
44
- allow(client).to receive(:get).with("services/test-grid/mymy").and_return(original)
45
- expect(client).to receive(:put).with("services/test-grid/mymy", data)
44
+ allow(client).to receive(:get).with("services/test-grid/default/mymy").and_return(original)
45
+ expect(client).to receive(:put).with("services/test-grid/default/mymy", data)
46
46
  subject.run(['mymy', 'FOO:BAR:env'])
47
47
  end
48
48
  end
@@ -29,43 +29,43 @@ module Kontena::Cli::Services
29
29
 
30
30
  describe '#update_service' do
31
31
  it 'creates PUT services/:id request to Kontena Server' do
32
- expect(client).to receive(:put).with('services/test-grid/1', {'name' => 'test-service'})
32
+ expect(client).to receive(:put).with('services/test-grid/default/1', {'name' => 'test-service'})
33
33
  subject.update_service(token, '1', {'name' => 'test-service'})
34
34
  end
35
35
  end
36
36
 
37
37
  describe '#get_service' do
38
38
  it 'creates GET services/:id request to Kontena Server' do
39
- expect(client).to receive(:get).with('services/test-grid/test-service')
39
+ expect(client).to receive(:get).with('services/test-grid/default/test-service')
40
40
  subject.get_service(token, 'test-service')
41
41
  end
42
42
  end
43
43
 
44
44
  describe '#stop_service' do
45
45
  it 'creates POST services/:id/stop request to Kontena Server' do
46
- expect(client).to receive(:post).with('services/test-grid/test-service/stop', {})
46
+ expect(client).to receive(:post).with('services/test-grid/default/test-service/stop', {})
47
47
  subject.stop_service(token, 'test-service')
48
48
  end
49
49
  end
50
50
 
51
51
  describe '#start_service' do
52
52
  it 'creates POST services/:id/start request to Kontena Server' do
53
- expect(client).to receive(:post).with('services/test-grid/test-service/start', {})
53
+ expect(client).to receive(:post).with('services/test-grid/default/test-service/start', {})
54
54
  subject.start_service(token, 'test-service')
55
55
  end
56
56
  end
57
57
 
58
58
  describe '#restart_service' do
59
59
  it 'creates POST services/:id/restart request to Kontena Server' do
60
- expect(client).to receive(:post).with('services/test-grid/test-service/restart', {})
60
+ expect(client).to receive(:post).with('services/test-grid/default/test-service/restart', {})
61
61
  subject.restart_service(token, 'test-service')
62
62
  end
63
63
  end
64
64
 
65
65
  describe '#deploy_service' do
66
66
  it 'creates POST services/:id/deploy request to Kontena Server' do
67
- allow(client).to receive(:get).with('services/test-grid/1').and_return({'state' => 'running'})
68
- expect(client).to receive(:post).with('services/test-grid/1/deploy', {'strategy' => 'ha'})
67
+ allow(client).to receive(:get).with('services/test-grid/default/1').and_return({'state' => 'running'})
68
+ expect(client).to receive(:post).with('services/test-grid/default/1/deploy', {'strategy' => 'ha'})
69
69
  subject.deploy_service(token, '1', {'strategy' => 'ha'})
70
70
  end
71
71
  end
@@ -146,12 +146,16 @@ module Kontena::Cli::Services
146
146
  end
147
147
 
148
148
  describe '#parse_service_id' do
149
- it 'adds current_grid if service_id is missing prefix' do
150
- expect(subject.parse_service_id('mysql')).to eq('test-grid/mysql')
149
+ it 'adds current_grid & stack if service_id is missing prefix' do
150
+ expect(subject.parse_service_id('mysql')).to eq('test-grid/default/mysql')
151
151
  end
152
152
 
153
- it 'does not add current_grid if service id includes prefix' do
154
- expect(subject.parse_service_id('second-grid/mysql')).to eq('second-grid/mysql')
153
+ it 'adds current grid if service_id has stack & service' do
154
+ expect(subject.parse_service_id('second-grid/mysql')).to eq('test-grid/second-grid/mysql')
155
+ end
156
+
157
+ it 'does not add anything if id container grid, stack and service' do
158
+ expect(subject.parse_service_id('test-grid/second-grid/mysql')).to eq('test-grid/second-grid/mysql')
155
159
  end
156
160
  end
157
161
 
@@ -35,7 +35,7 @@ describe Kontena::Cli::Services::UnlinkCommand do
35
35
 
36
36
  it 'sends link to master' do
37
37
  expect(client).to receive(:put).with(
38
- 'services/test-grid/service-a', {links: []}
38
+ 'services/test-grid/default/service-a', {links: []}
39
39
  )
40
40
  subject.run(['service-a', 'service-b'])
41
41
  end
@@ -0,0 +1,26 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/stacks/deploy_command"
3
+
4
+ describe Kontena::Cli::Stacks::DeployCommand do
5
+
6
+ include ClientHelpers
7
+
8
+ describe '#execute' do
9
+ it 'requires api url' do
10
+ expect(subject).to receive(:require_api_url).once
11
+ subject.run(['test-stack'])
12
+ end
13
+
14
+ it 'requires token' do
15
+ expect(subject).to receive(:require_token).and_return(token)
16
+ subject.run(['test-stack'])
17
+ end
18
+
19
+ it 'sends deploy command to master' do
20
+ expect(client).to receive(:post).with(
21
+ 'stacks/test-grid/test-stack/deploy', {}
22
+ )
23
+ subject.run(['test-stack'])
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,54 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/stacks/install_command"
3
+
4
+ describe Kontena::Cli::Stacks::InstallCommand do
5
+
6
+ include ClientHelpers
7
+
8
+ describe '#execute' do
9
+ let(:stack) do
10
+ {
11
+ name: 'stack-a',
12
+ registry: 'file://kontena.yml',
13
+ source: "YAML content",
14
+ services: []
15
+ }
16
+ end
17
+
18
+ before(:each) do
19
+ allow(subject).to receive(:yaml_content).and_return("YAML content")
20
+ end
21
+
22
+ it 'requires api url' do
23
+ allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
24
+ expect(subject).to receive(:require_api_url).once
25
+ subject.run([])
26
+ end
27
+
28
+ it 'requires token' do
29
+ allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
30
+ expect(subject).to receive(:require_token).and_return(token)
31
+ subject.run([])
32
+ end
33
+
34
+ it 'sends stack to master' do
35
+ allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
36
+ allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
37
+ expect(client).to receive(:post).with(
38
+ 'grids/test-grid/stacks', stack
39
+ )
40
+ subject.run([])
41
+ end
42
+
43
+ it 'allows to override stack name' do
44
+ allow(subject).to receive(:require_config_file).with('kontena.yml').and_return(true)
45
+ allow(subject).to receive(:stack_from_yaml).with('kontena.yml').and_return(stack)
46
+ stack_b = stack
47
+ stack_b[:name] = 'stack-b'
48
+ expect(client).to receive(:post).with(
49
+ 'grids/test-grid/stacks', stack
50
+ )
51
+ subject.run(['--name', 'stack-b'])
52
+ end
53
+ end
54
+ end
@@ -0,0 +1,27 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/stacks/list_command"
3
+
4
+ describe Kontena::Cli::Stacks::ListCommand do
5
+
6
+ include ClientHelpers
7
+
8
+ describe '#execute' do
9
+ it 'requires api url' do
10
+ expect(subject).to receive(:require_api_url).once
11
+ subject.run([])
12
+ end
13
+
14
+ it 'requires token' do
15
+ expect(subject).to receive(:require_token).and_return(token)
16
+ subject.run([])
17
+ end
18
+
19
+ it 'fetches stacks from master' do
20
+ stacks = {
21
+ 'stacks' => []
22
+ }
23
+ expect(client).to receive(:get).with('grids/test-grid/stacks').and_return(stacks)
24
+ subject.run([])
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,45 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/stacks/remove_command"
3
+
4
+ describe Kontena::Cli::Stacks::RemoveCommand do
5
+
6
+ include ClientHelpers
7
+
8
+ describe '#execute' do
9
+ it 'requires api url' do
10
+ allow(subject).to receive(:forced?).and_return(true)
11
+ allow(subject).to receive(:wait_stack_removal)
12
+ expect(subject).to receive(:require_api_url).once
13
+ subject.run(['test-stack'])
14
+ end
15
+
16
+ it 'requires token' do
17
+ allow(subject).to receive(:forced?).and_return(true)
18
+ allow(subject).to receive(:wait_stack_removal)
19
+ expect(subject).to receive(:require_token).and_return(token)
20
+ subject.run(['test-stack'])
21
+ end
22
+
23
+ it 'sends remove command to master' do
24
+ allow(subject).to receive(:wait_stack_removal)
25
+ expect(client).to receive(:delete).with('stacks/test-grid/test-stack')
26
+ subject.run(['--force', 'test-stack'])
27
+ end
28
+
29
+ it 'waits until service is removed' do
30
+ allow(client).to receive(:delete).with('stacks/test-grid/test-stack')
31
+ expect(client).to receive(:get).with('stacks/test-grid/test-stack')
32
+ .and_raise(Kontena::Errors::StandardError.new(404, 'Not Found'))
33
+ subject.run(['--force', 'test-stack'])
34
+ end
35
+
36
+ it 'raises exception on server error' do
37
+ expect(client).to receive(:delete).with('stacks/test-grid/test-stack')
38
+ expect(client).to receive(:get).with('stacks/test-grid/test-stack')
39
+ .and_raise(Kontena::Errors::StandardError.new(500, 'internal error'))
40
+ expect{
41
+ subject.run(['--force', 'test-stack'])
42
+ }.to raise_error(Kontena::Errors::StandardError)
43
+ end
44
+ end
45
+ end
@@ -0,0 +1,385 @@
1
+ require_relative "../../../spec_helper"
2
+ require "kontena/cli/stacks/service_generator"
3
+
4
+ describe Kontena::Cli::Stacks::ServiceGenerator do
5
+ let(:subject) do
6
+ described_class.new({})
7
+ end
8
+
9
+ describe '#parse_data' do
10
+ context 'volumes' do
11
+ it 'returns volumes if set' do
12
+ data = {
13
+ 'image' => 'foo/bar:latest',
14
+ 'volumes' => [
15
+ 'mongodb-1'
16
+ ]
17
+ }
18
+ result = subject.send(:parse_data, data)
19
+ expect(result['volumes']).to eq(data['volumes'])
20
+ end
21
+
22
+ it 'returns empty volumes if not set' do
23
+ data = {
24
+ 'image' => 'foo/bar:latest'
25
+ }
26
+ result = subject.send(:parse_data, data)
27
+ expect(result['volumes']).to eq([])
28
+ end
29
+ end
30
+
31
+ context 'volumes_from' do
32
+ it 'returns volumes_from if set' do
33
+ data = {
34
+ 'image' => 'foo/bar:latest',
35
+ 'volumes_from' => [
36
+ 'mongodb-1'
37
+ ]
38
+ }
39
+ result = subject.send(:parse_data, data)
40
+ expect(result['volumes_from']).to eq(data['volumes_from'])
41
+ end
42
+
43
+ it 'returns empty volumes_from if not set' do
44
+ data = {
45
+ 'image' => 'foo/bar:latest'
46
+ }
47
+ result = subject.send(:parse_data, data)
48
+ expect(result['volumes_from']).to eq([])
49
+ end
50
+ end
51
+
52
+ context 'command' do
53
+ it 'returns cmd array if set' do
54
+ data = {
55
+ 'image' => 'foo/bar:latest',
56
+ 'command' => 'ls -la'
57
+ }
58
+ result = subject.send(:parse_data, data)
59
+ expect(result['cmd']).to eq(data['command'].split(' '))
60
+ end
61
+
62
+ it 'does not return cmd if not set' do
63
+ data = {
64
+ 'image' => 'foo/bar:latest'
65
+ }
66
+ result = subject.send(:parse_data, data)
67
+ expect(result.has_key?('cmd')).to be_falsey
68
+ end
69
+ end
70
+
71
+ context 'affinity' do
72
+ it 'returns affinity if set' do
73
+ data = {
74
+ 'image' => 'foo/bar:latest',
75
+ 'affinity' => [
76
+ 'label==az=b'
77
+ ]
78
+ }
79
+ result = subject.send(:parse_data, data)
80
+ expect(result['affinity']).to eq(data['affinity'])
81
+ end
82
+
83
+ it 'returns affinity as empty array if not set' do
84
+ data = {
85
+ 'image' => 'foo/bar:latest'
86
+ }
87
+ result = subject.send(:parse_data, data)
88
+ expect(result.has_key?('affinity')).to be_truthy
89
+ expect(result['affinity']).to eq([])
90
+ end
91
+ end
92
+
93
+ context 'user' do
94
+ it 'returns user if set' do
95
+ data = {
96
+ 'image' => 'foo/bar:latest',
97
+ 'user' => 'user'
98
+ }
99
+ result = subject.send(:parse_data, data)
100
+ expect(result['user']).to eq('user')
101
+ end
102
+
103
+ it 'does not return user if not set' do
104
+ data = {
105
+ 'image' => 'foo/bar:latest'
106
+ }
107
+ result = subject.send(:parse_data, data)
108
+ expect(result.has_key?('user')).to be_falsey
109
+ end
110
+ end
111
+
112
+ context 'stateful' do
113
+ it 'returns stateful if set' do
114
+ data = {
115
+ 'image' => 'foo/bar:latest',
116
+ 'stateful' => true
117
+ }
118
+ result = subject.send(:parse_data, data)
119
+ expect(result['stateful']).to eq(true)
120
+ end
121
+
122
+ it 'returns stateful as false if not set' do
123
+ data = {
124
+ 'image' => 'foo/bar:latest'
125
+ }
126
+ result = subject.send(:parse_data, data)
127
+ expect(result['stateful']).to eq(false)
128
+ end
129
+ end
130
+
131
+ context 'links' do
132
+ it 'returns empty array if links not set' do
133
+ data = {
134
+ 'image' => 'wordpress:latest'
135
+ }
136
+ result = subject.send(:parse_data, data)
137
+ expect(result['links']).to eq([])
138
+ end
139
+
140
+ it 'returns parsed links array' do
141
+ data = {
142
+ 'image' => 'wordpress:latest',
143
+ 'links' => ['mysql:db']
144
+ }
145
+ result = subject.send(:parse_data, data)
146
+ expect(result['links']).to eq([{
147
+ 'name' => 'mysql',
148
+ 'alias' => 'db'
149
+ }])
150
+ end
151
+ end
152
+ context 'privileged' do
153
+ it 'returns privileged if set' do
154
+ data = {
155
+ 'image' => 'foo/bar:latest',
156
+ 'privileged' => false
157
+ }
158
+ result = subject.send(:parse_data, data)
159
+ expect(result['privileged']).to eq(false)
160
+ end
161
+
162
+ it 'does not return privileged if not set' do
163
+ data = {
164
+ 'image' => 'foo/bar:latest'
165
+ }
166
+ result = subject.send(:parse_data, data)
167
+ expect(result['privileged']).to be_nil
168
+ end
169
+ end
170
+
171
+ context 'cap_add' do
172
+ it 'returns cap_drop if set' do
173
+ data = {
174
+ 'image' => 'foo/bar:latest',
175
+ 'cap_add' => [
176
+ 'NET_ADMIN'
177
+ ]
178
+ }
179
+ result = subject.send(:parse_data, data)
180
+ expect(result['cap_add']).to eq(data['cap_add'])
181
+ end
182
+
183
+ it 'does not return cap_add if not set' do
184
+ data = {
185
+ 'image' => 'foo/bar:latest'
186
+ }
187
+ result = subject.send(:parse_data, data)
188
+ expect(result['cap_add']).to be_nil
189
+ end
190
+ end
191
+
192
+ context 'cap_drop' do
193
+ it 'returns cap_drop if set' do
194
+ data = {
195
+ 'image' => 'foo/bar:latest',
196
+ 'cap_drop' => [
197
+ 'NET_ADMIN'
198
+ ]
199
+ }
200
+ result = subject.send(:parse_data, data)
201
+ expect(result['cap_drop']).to eq(data['cap_drop'])
202
+ end
203
+
204
+ it 'does not return cap_drop if not set' do
205
+ data = {
206
+ 'image' => 'foo/bar:latest'
207
+ }
208
+ result = subject.send(:parse_data, data)
209
+ expect(result['cap_drop']).to be_nil
210
+ end
211
+ end
212
+
213
+ context 'net' do
214
+ it 'returns net if set' do
215
+ data = {
216
+ 'image' => 'foo/bar:latest',
217
+ 'net' => 'host'
218
+ }
219
+ result = subject.send(:parse_data, data)
220
+ expect(result['net']).to eq('host')
221
+ end
222
+
223
+ it 'does not return pid if not set' do
224
+ data = {
225
+ 'image' => 'foo/bar:latest'
226
+ }
227
+ result = subject.send(:parse_data, data)
228
+ expect(result['net']).to be_nil
229
+ end
230
+ end
231
+
232
+ context 'pid' do
233
+ it 'returns pid if set' do
234
+ data = {
235
+ 'image' => 'foo/bar:latest',
236
+ 'pid' => 'host'
237
+ }
238
+ result = subject.send(:parse_data, data)
239
+ expect(result['pid']).to eq('host')
240
+ end
241
+
242
+ it 'does not return pid if not set' do
243
+ data = {
244
+ 'image' => 'foo/bar:latest'
245
+ }
246
+ result = subject.send(:parse_data, data)
247
+ expect(result['pid']).to be_nil
248
+ end
249
+ end
250
+
251
+ context 'log_driver' do
252
+ it 'returns log_driver if set' do
253
+ data = {
254
+ 'image' => 'foo/bar:latest',
255
+ 'log_driver' => 'syslog'
256
+ }
257
+ result = subject.send(:parse_data, data)
258
+ expect(result['log_driver']).to eq('syslog')
259
+ end
260
+
261
+ it 'does not return log_driver if not set' do
262
+ data = {
263
+ 'image' => 'foo/bar:latest'
264
+ }
265
+ result = subject.send(:parse_data, data)
266
+ expect(result['log_driver']).to be_nil
267
+ end
268
+ end
269
+
270
+ context 'log_opt' do
271
+ it 'returns log_opts hash if log_opt is set' do
272
+ data = {
273
+ 'image' => 'foo/bar:latest',
274
+ 'log_driver' => 'fluentd',
275
+ 'log_opt' => {
276
+ 'fluentd-address' => '192.168.99.1:24224',
277
+ 'fluentd-tag' => 'docker.{{.Name}}'
278
+ }
279
+ }
280
+ result = subject.send(:parse_data, data)
281
+ expect(result['log_opts']).to eq(data['log_opt'])
282
+ end
283
+
284
+ it 'does not return log_opts if log_opt is not set' do
285
+ data = {
286
+ 'image' => 'foo/bar:latest'
287
+ }
288
+ result = subject.send(:parse_data, data)
289
+ expect(result['log_opts']).to be_nil
290
+ end
291
+ end
292
+
293
+ context 'deploy_opts' do
294
+ it 'returns deploy_opts if deploy.wait_for_port is defined' do
295
+ data = {
296
+ 'image' => 'foo/bar:latest',
297
+ 'deploy' => {
298
+ 'wait_for_port' => '8080'
299
+ }
300
+ }
301
+ result = subject.send(:parse_data, data)
302
+ expect(result['deploy_opts']['wait_for_port']).to eq('8080')
303
+ end
304
+
305
+ it 'returns deploy_opts if deploy.min_health is defined' do
306
+ data = {
307
+ 'image' => 'foo/bar:latest',
308
+ 'deploy' => {
309
+ 'min_health' => '0.5'
310
+ }
311
+ }
312
+ result = subject.send(:parse_data, data)
313
+ expect(result['deploy_opts']['min_health']).to eq('0.5')
314
+ end
315
+
316
+ it 'sets strategy if deploy.strategy is defined' do
317
+ data = {
318
+ 'image' => 'foo/bar:latest',
319
+ 'deploy' => {
320
+ 'strategy' => 'daemon'
321
+ }
322
+ }
323
+ result = subject.send(:parse_data, data)
324
+ expect(result['strategy']).to eq('daemon')
325
+ end
326
+
327
+ it 'sets interval if deploy.interval is defined' do
328
+ data = {
329
+ 'image' => 'foo/bar:latest',
330
+ 'deploy' => {
331
+ 'interval' => '1min'
332
+ }
333
+ }
334
+ result = subject.send(:parse_data, data)
335
+ expect(result['deploy_opts']['interval']).to eq(60)
336
+ end
337
+
338
+ it 'does not return deploy_opts if no deploy options are defined' do
339
+ data = {
340
+ 'image' => 'foo/bar:latest'
341
+ }
342
+ result = subject.send(:parse_data, data)
343
+ expect(result['deploy_opts']).to be_nil
344
+ end
345
+ end
346
+
347
+ context 'hooks' do
348
+ it 'returns hooks hash if defined' do
349
+ data = {
350
+ 'image' => 'foo/bar:latest',
351
+ 'hooks' => {
352
+ 'post_start' => []
353
+ }
354
+ }
355
+ result = subject.send(:parse_data, data)
356
+ expect(result['hooks']).to eq(data['hooks'])
357
+ end
358
+
359
+ it 'does returns empty hook hash if not defined' do
360
+ data = {'image' => 'foo/bar:latest'}
361
+ result = subject.send(:parse_data, data)
362
+ expect(result['hooks']).to eq({})
363
+ end
364
+ end
365
+
366
+ context 'secrets' do
367
+ it 'returns secrets array if defined' do
368
+ data = {
369
+ 'image' => 'foo/bar:latest',
370
+ 'secrets' => [
371
+ {'secret' => 'MYSQL_ADMIN_PASSWORD', 'name' => 'WORDPRESS_DB_PASSWORD', 'type' => 'env'}
372
+ ]
373
+ }
374
+ result = subject.send(:parse_data, data)
375
+ expect(result['secrets']).to eq(data['secrets'])
376
+ end
377
+
378
+ it 'does not return secrets if not defined' do
379
+ data = {'image' => 'foo/bar:latest'}
380
+ result = subject.send(:parse_data, data)
381
+ expect(result['secrets']).to be_nil
382
+ end
383
+ end
384
+ end
385
+ end