kontena-cli 1.4.3 → 1.5.0.pre1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/Dockerfile +7 -3
  3. data/Gemfile +7 -3
  4. data/README.md +1 -1
  5. data/VERSION +1 -1
  6. data/bin/kontena +1 -0
  7. data/kontena-cli.gemspec +5 -6
  8. data/lib/kontena/cli/browser_launcher.rb +61 -0
  9. data/lib/kontena/cli/certificate/authorize_command.rb +40 -16
  10. data/lib/kontena/cli/certificate/get_command.rb +1 -1
  11. data/lib/kontena/cli/cloud/login_command.rb +3 -4
  12. data/lib/kontena/cli/cloud/master/add_command.rb +1 -1
  13. data/lib/kontena/cli/cloud/master/list_command.rb +1 -1
  14. data/lib/kontena/cli/cloud/master/remove_command.rb +1 -1
  15. data/lib/kontena/cli/cloud/master/update_command.rb +1 -1
  16. data/lib/kontena/cli/common.rb +2 -2
  17. data/lib/kontena/cli/etcd_command.rb +1 -1
  18. data/lib/kontena/cli/external_registries/add_command.rb +2 -2
  19. data/lib/kontena/cli/external_registries/remove_command.rb +1 -1
  20. data/lib/kontena/cli/grids/common.rb +14 -4
  21. data/lib/kontena/cli/grids/events_command.rb +2 -2
  22. data/lib/kontena/cli/grids/list_command.rb +1 -1
  23. data/lib/kontena/cli/grids/logs_command.rb +1 -1
  24. data/lib/kontena/cli/grids/remove_command.rb +12 -10
  25. data/lib/kontena/cli/grids/trusted_subnets/add_command.rb +1 -1
  26. data/lib/kontena/cli/grids/trusted_subnets/remove_command.rb +12 -10
  27. data/lib/kontena/cli/grids/use_command.rb +1 -1
  28. data/lib/kontena/cli/helpers/log_helper.rb +1 -1
  29. data/lib/kontena/cli/logout_command.rb +1 -1
  30. data/lib/kontena/cli/master/login_command.rb +2 -3
  31. data/lib/kontena/cli/master/logout_command.rb +2 -2
  32. data/lib/kontena/cli/master/token/common.rb +2 -1
  33. data/lib/kontena/cli/master/token/create_command.rb +5 -2
  34. data/lib/kontena/cli/master/token/current_command.rb +9 -4
  35. data/lib/kontena/cli/master/token/list_command.rb +1 -1
  36. data/lib/kontena/cli/master/token/show_command.rb +11 -1
  37. data/lib/kontena/cli/master/user/invite_command.rb +1 -1
  38. data/lib/kontena/cli/master_command.rb +0 -1
  39. data/lib/kontena/cli/nodes/create_command.rb +1 -1
  40. data/lib/kontena/cli/nodes/labels/remove_command.rb +17 -3
  41. data/lib/kontena/cli/nodes/remove_command.rb +12 -10
  42. data/lib/kontena/cli/nodes/reset_token_command.rb +1 -1
  43. data/lib/kontena/cli/nodes/update_command.rb +1 -1
  44. data/lib/kontena/cli/plugin_command.rb +2 -1
  45. data/lib/kontena/cli/plugins/install_command.rb +2 -2
  46. data/lib/kontena/cli/plugins/uninstall_command.rb +19 -10
  47. data/lib/kontena/cli/plugins/upgrade_command.rb +60 -0
  48. data/lib/kontena/cli/registry/create_command.rb +1 -1
  49. data/lib/kontena/cli/registry/remove_command.rb +2 -2
  50. data/lib/kontena/cli/services/containers_command.rb +1 -1
  51. data/lib/kontena/cli/services/create_command.rb +1 -1
  52. data/lib/kontena/cli/services/deploy_command.rb +1 -1
  53. data/lib/kontena/cli/services/envs/add_command.rb +1 -1
  54. data/lib/kontena/cli/services/envs/remove_command.rb +5 -3
  55. data/lib/kontena/cli/services/link_command.rb +1 -1
  56. data/lib/kontena/cli/services/logs_command.rb +1 -1
  57. data/lib/kontena/cli/services/monitor_command.rb +1 -1
  58. data/lib/kontena/cli/services/remove_command.rb +11 -9
  59. data/lib/kontena/cli/services/restart_command.rb +1 -1
  60. data/lib/kontena/cli/services/secrets/link_command.rb +1 -1
  61. data/lib/kontena/cli/services/services_helper.rb +6 -12
  62. data/lib/kontena/cli/services/start_command.rb +5 -3
  63. data/lib/kontena/cli/services/stop_command.rb +5 -3
  64. data/lib/kontena/cli/services/unlink_command.rb +1 -1
  65. data/lib/kontena/cli/services/update_command.rb +1 -1
  66. data/lib/kontena/cli/spinner.rb +10 -10
  67. data/lib/kontena/cli/stack_command.rb +1 -0
  68. data/lib/kontena/cli/stacks/build_command.rb +6 -6
  69. data/lib/kontena/cli/stacks/deploy_command.rb +12 -10
  70. data/lib/kontena/cli/stacks/inspect_command.rb +17 -0
  71. data/lib/kontena/cli/stacks/install_command.rb +15 -4
  72. data/lib/kontena/cli/stacks/list_command.rb +2 -3
  73. data/lib/kontena/cli/stacks/logs_command.rb +1 -1
  74. data/lib/kontena/cli/stacks/monitor_command.rb +2 -2
  75. data/lib/kontena/cli/stacks/remove_command.rb +28 -19
  76. data/lib/kontena/cli/stacks/restart_command.rb +5 -4
  77. data/lib/kontena/cli/stacks/stop_command.rb +6 -5
  78. data/lib/kontena/cli/stacks/upgrade_command.rb +84 -64
  79. data/lib/kontena/cli/stacks/yaml/reader.rb +9 -4
  80. data/lib/kontena/cli/vault/remove_command.rb +7 -5
  81. data/lib/kontena/cli/vault/update_command.rb +1 -1
  82. data/lib/kontena/cli/vault/write_command.rb +1 -1
  83. data/lib/kontena/cli/volumes/remove_command.rb +6 -4
  84. data/lib/kontena/cli/vpn/create_command.rb +1 -1
  85. data/lib/kontena/cli/vpn/remove_command.rb +1 -1
  86. data/lib/kontena/client.rb +23 -14
  87. data/lib/kontena/command.rb +2 -2
  88. data/lib/kontena/debug_instrumentor.rb +11 -2
  89. data/lib/kontena/plugin_manager/common.rb +5 -2
  90. data/lib/kontena/plugin_manager/installer.rb +34 -10
  91. data/lib/kontena/scripts/completer.rb +91 -43
  92. data/lib/kontena/{cli/stacks → stacks}/change_resolver.rb +38 -16
  93. data/lib/kontena/stacks/stack_data.rb +58 -0
  94. data/lib/kontena/stacks/stack_data_set.rb +51 -0
  95. data/lib/kontena_cli.rb +1 -0
  96. data/omnibus/Gemfile.lock +32 -22
  97. data/omnibus/config/projects/kontena.rb +2 -0
  98. data/omnibus/config/software/kontena-cli.rb +6 -4
  99. data/omnibus/package-scripts/kontena/postinstall +1 -1
  100. data/omnibus/wrappers/sh/kontena +1 -1
  101. data/spec/fixtures/kontena_v3_with_registry_extends.yml +20 -0
  102. data/spec/kontena/cli/certificates/authorize_command_spec.rb +81 -0
  103. data/spec/kontena/cli/cloud/login_command_spec.rb +4 -4
  104. data/spec/kontena/cli/common_spec.rb +8 -1
  105. data/spec/kontena/cli/grids/update_command_spec.rb +13 -0
  106. data/spec/kontena/cli/master/join_command_spec.rb +1 -4
  107. data/spec/kontena/cli/master/login_command_spec.rb +4 -4
  108. data/spec/kontena/cli/master/token/create_command_spec.rb +132 -0
  109. data/spec/kontena/cli/master/token/show_command_spec.rb +90 -0
  110. data/spec/kontena/cli/nodes/labels/remove_command_spec.rb +35 -5
  111. data/spec/kontena/cli/stacks/install_command_spec.rb +16 -6
  112. data/spec/kontena/cli/stacks/remove_command_spec.rb +23 -2
  113. data/spec/kontena/cli/stacks/validate_command_spec.rb +1 -1
  114. data/spec/kontena/cli/stacks/yaml/reader_spec.rb +33 -1
  115. data/spec/kontena/client_spec.rb +38 -1
  116. data/spec/kontena/stacks/change_resolver_spec.rb +44 -0
  117. data/spec/kontena/stacks/stack_data_set_spec.rb +59 -0
  118. metadata +36 -34
  119. data/lib/kontena/cli/master/users_command.rb +0 -13
@@ -1,6 +1,6 @@
1
- require_relative 'yaml/stack_file_loader'
1
+ require_relative 'stack_data_set'
2
2
 
3
- module Kontena::Cli::Stacks
3
+ module Kontena::Stacks
4
4
  class ChangeResolver
5
5
 
6
6
  attr_reader :old_data, :new_data
@@ -8,11 +8,11 @@ module Kontena::Cli::Stacks
8
8
  # Creates a change analysis from two sets of stack data.
9
9
  # The format is a flat hash of all related stacks.
10
10
  #
11
- # @param old_data [Hash]
12
- # @param new_data [Hash]
11
+ # @param old_data [DataSet,Hash]
12
+ # @param new_data [DataSet,Hash]
13
13
  def initialize(old_data, new_data)
14
- @old_data = old_data
15
- @new_data = new_data
14
+ @old_data = old_data.is_a?(StackDataSet) ? old_data : StackDataSet.new(old_data)
15
+ @new_data = new_data.is_a?(StackDataSet) ? new_data : StackDataSet.new(new_data)
16
16
  analyze
17
17
  end
18
18
 
@@ -56,41 +56,63 @@ module Kontena::Cli::Stacks
56
56
  @remaining_stacks ||= added_stacks + upgraded_stacks
57
57
  end
58
58
 
59
+ # @return [Boolean]
60
+ def safe?
61
+ removed_stacks.empty? && replaced_stacks.empty? && removed_services.empty?
62
+ end
63
+
59
64
  def analyze
60
- old_names = old_data.keys
61
- new_names = new_data.keys
65
+ old_names = old_data.stack_names
66
+ new_names = new_data.stack_names
62
67
 
63
68
  removed_stacks.concat(old_names - new_names)
64
69
  added_stacks.concat(new_names - old_names)
65
- upgraded_stacks.concat(new_names & old_names)
70
+ (new_names & old_names).each do |candidate|
71
+ upgraded_stacks << candidate if stack_upgraded?(candidate)
72
+ end
66
73
 
67
74
  removed_stacks.each do |removed_stack|
68
75
  removed_services.concat(
69
- old_data[removed_stack][:stack_data]['services'].map { |svc| "#{removed_stack}/#{svc['name']}"}
76
+ old_data.stack(removed_stack).service_names.map { |name| "#{removed_stack}/#{name}"}
70
77
  )
71
78
  end
72
79
 
73
80
  added_stacks.each do |added_stack|
74
81
  added_services.concat(
75
- new_data[added_stack][:stack_data]['services'].map { |svc| "#{added_stack}/#{svc['name']}"}
82
+ new_data.stack(added_stack).service_names.map { |name| "#{added_stack}/#{name}"}
76
83
  )
77
84
  end
78
85
 
79
86
  upgraded_stacks.each do |upgraded_stack|
80
- old_stack = old_data[upgraded_stack][:stack_data]['stack']
81
- new_stack = new_data[upgraded_stack][:stack_data]['stack']
87
+ old_stack = old_data.stack(upgraded_stack).stack_name
88
+ new_stack = new_data.stack(upgraded_stack).stack_name
82
89
 
83
90
  unless old_stack == new_stack
84
91
  replaced_stacks[upgraded_stack] = { from: old_stack, to: new_stack }
85
92
  end
86
93
 
87
- old_services = old_data[upgraded_stack][:stack_data]['services'].map { |svc| "#{upgraded_stack}/#{svc['name']}" }
88
- new_services = new_data[upgraded_stack][:stack_data]['services'].map { |svc| "#{upgraded_stack}/#{svc['name']}" }
94
+ old_services = old_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
95
+ new_services = new_data.stack(upgraded_stack).service_names.map { |name| "#{upgraded_stack}/#{name}" }
89
96
 
90
97
  removed_services.concat(old_services - new_services)
91
98
  added_services.concat(new_services - old_services)
92
99
  upgraded_services.concat(new_services & old_services)
93
100
  end
94
101
  end
102
+
103
+ # Stack is upgraded if version, stack name, variables change or stack is root
104
+ #
105
+ # @param name [String]
106
+ # @return [Boolean]
107
+ def stack_upgraded?(name)
108
+ old_stack = old_data.stack(name)
109
+ new_stack = new_data.stack(name)
110
+ return true if new_stack.root?
111
+ return true if old_stack.version != new_stack.version
112
+ return true if old_stack.stack_name != new_stack.stack_name
113
+ return true if old_stack.variables != new_stack.variables
114
+
115
+ false
116
+ end
95
117
  end
96
- end
118
+ end
@@ -0,0 +1,58 @@
1
+ module Kontena::Stacks
2
+ class StackData
3
+
4
+ attr_reader :loader
5
+
6
+ # @param data [Hash]
7
+ # @param loader [StackFileLoader,NilClass]
8
+ def initialize(data, loader = nil)
9
+ @data = data
10
+ @loader = loader
11
+ end
12
+
13
+ # @return [String]
14
+ def name
15
+ @data['name']
16
+ end
17
+
18
+ # @return [String]
19
+ def stack_name
20
+ @data['stack']
21
+ end
22
+
23
+ # @return [String]
24
+ def version
25
+ @data['version']
26
+ end
27
+
28
+ # @return [Boolean]
29
+ def root?
30
+ parent.nil?
31
+ end
32
+
33
+ # @return [String]
34
+ def parent
35
+ @data.dig('parent', 'name')
36
+ end
37
+
38
+ # @return [Hash]
39
+ def variables
40
+ @data['variables']
41
+ end
42
+
43
+ # @return [Array<Hash>]
44
+ def services
45
+ @data['services']
46
+ end
47
+
48
+ # @return [Array<String>]
49
+ def service_names
50
+ @data['services'].map { |s| s['name']}
51
+ end
52
+
53
+ # @return [Hash]
54
+ def data
55
+ @data.dup
56
+ end
57
+ end
58
+ end
@@ -0,0 +1,51 @@
1
+ require_relative 'stack_data'
2
+
3
+ module Kontena::Stacks
4
+ class StackDataSet
5
+
6
+ # @param data [Hash]
7
+ def initialize(data)
8
+ @data = data
9
+ end
10
+
11
+ # @param name [String]
12
+ # @return [StackData,NilClass]
13
+ def stack(name)
14
+ data = @data[name]
15
+ StackData.new(data[:stack_data], data[:loader]) if data
16
+ end
17
+
18
+ alias_method :[], :stack
19
+
20
+ # @return [Array<StackData>]
21
+ def stacks
22
+ stack_names.map do |name|
23
+ stack(name)
24
+ end.compact
25
+ end
26
+
27
+ # @return [Array<String>]
28
+ def stack_names
29
+ @data.keys
30
+ end
31
+
32
+ # @return [Integer]
33
+ def size
34
+ @data.size
35
+ end
36
+
37
+ # @param name [String]
38
+ # @return [StackData,NilClass]
39
+ def delete(name)
40
+ data = @data.delete(name)
41
+ StackData.new(data[:stack_data], data[:loader]) if data
42
+ end
43
+
44
+ # @return [Array<StackData>]
45
+ def remove_dependencies
46
+ stacks.map do |stack|
47
+ delete(stack.name) unless stack.root?
48
+ end.compact
49
+ end
50
+ end
51
+ end
data/lib/kontena_cli.rb CHANGED
@@ -176,6 +176,7 @@ class String
176
176
  end
177
177
  end
178
178
 
179
+
179
180
  require 'retriable'
180
181
  Retriable.configure do |c|
181
182
  c.on_retry = Proc.new do |exception, try, elapsed_time, next_interval|
data/omnibus/Gemfile.lock CHANGED
@@ -1,6 +1,6 @@
1
1
  GIT
2
2
  remote: git://github.com/opscode/omnibus-software.git
3
- revision: f315da39ad2ead2541fdaf21af1a555870109e7a
3
+ revision: 4ef2d1a5b9162f4f5f52617d2a0122796b4f3c43
4
4
  specs:
5
5
  omnibus-software (4.0.0)
6
6
  chef-sugar (>= 3.4.0)
@@ -9,22 +9,27 @@ GIT
9
9
  GEM
10
10
  remote: https://rubygems.org/
11
11
  specs:
12
+ addressable (2.5.2)
13
+ public_suffix (>= 2.0.2, < 4.0)
12
14
  awesome_print (1.8.0)
13
- aws-sdk (2.10.17)
14
- aws-sdk-resources (= 2.10.17)
15
- aws-sdk-core (2.10.17)
15
+ aws-sdk (2.10.130)
16
+ aws-sdk-resources (= 2.10.130)
17
+ aws-sdk-core (2.10.130)
16
18
  aws-sigv4 (~> 1.0)
17
19
  jmespath (~> 1.0)
18
- aws-sdk-resources (2.10.17)
19
- aws-sdk-core (= 2.10.17)
20
- aws-sigv4 (1.0.1)
21
- chef-config (12.13.37)
20
+ aws-sdk-resources (2.10.130)
21
+ aws-sdk-core (= 2.10.130)
22
+ aws-sigv4 (1.0.2)
23
+ chef-config (13.7.16)
24
+ addressable
22
25
  fuzzyurl
23
26
  mixlib-config (~> 2.0)
24
27
  mixlib-shellout (~> 2.0)
25
- chef-sugar (3.5.0)
28
+ tomlrb (~> 1.2)
29
+ chef-sugar (3.6.0)
30
+ citrus (3.0.2)
26
31
  cleanroom (1.0.0)
27
- ffi (1.9.14)
32
+ ffi (1.9.21)
28
33
  ffi-yajl (2.3.1)
29
34
  libyajl2 (~> 1.2)
30
35
  fuzzyurl (0.9.0)
@@ -32,16 +37,17 @@ GEM
32
37
  ipaddress (0.8.3)
33
38
  jmespath (1.3.1)
34
39
  libyajl2 (1.2.0)
35
- license_scout (0.1.3)
40
+ license_scout (1.0.0)
36
41
  ffi-yajl (~> 2.2)
37
42
  mixlib-shellout (~> 2.2)
43
+ toml-rb (~> 1.0)
38
44
  mixlib-cli (1.7.0)
39
- mixlib-config (2.2.4)
45
+ mixlib-config (2.2.5)
40
46
  mixlib-log (1.7.1)
41
- mixlib-shellout (2.2.7)
42
- mixlib-versioning (1.1.0)
47
+ mixlib-shellout (2.3.2)
48
+ mixlib-versioning (1.2.2)
43
49
  multipart-post (2.0.0)
44
- ohai (8.24.1)
50
+ ohai (8.26.1)
45
51
  chef-config (>= 12.5.0.alpha.1, < 14)
46
52
  ffi (~> 1.9)
47
53
  ffi-yajl (~> 2.2)
@@ -53,12 +59,12 @@ GEM
53
59
  plist (~> 3.1)
54
60
  systemu (~> 2.6.4)
55
61
  wmi-lite (~> 1.0)
56
- omnibus (5.6.1)
62
+ omnibus (5.6.8)
57
63
  aws-sdk (~> 2)
58
64
  chef-sugar (~> 3.3)
59
65
  cleanroom (~> 1.0)
60
66
  ffi-yajl (~> 2.2)
61
- license_scout
67
+ license_scout (~> 1.0)
62
68
  mixlib-shellout (~> 2.0)
63
69
  mixlib-versioning
64
70
  ohai (~> 8.0)
@@ -71,11 +77,15 @@ GEM
71
77
  multipart-post (~> 2.0.0)
72
78
  progressbar
73
79
  zhexdump (>= 0.0.2)
74
- plist (3.3.0)
75
- progressbar (1.8.2)
76
- ruby-progressbar (1.8.1)
80
+ plist (3.4.0)
81
+ progressbar (1.9.0)
82
+ public_suffix (3.0.2)
83
+ ruby-progressbar (1.9.0)
77
84
  systemu (2.6.5)
78
- thor (0.19.1)
85
+ thor (0.20.0)
86
+ toml-rb (1.1.1)
87
+ citrus (~> 3.0, > 3.0)
88
+ tomlrb (1.2.6)
79
89
  wmi-lite (1.0.0)
80
90
  zhexdump (0.0.2)
81
91
 
@@ -87,4 +97,4 @@ DEPENDENCIES
87
97
  omnibus-software!
88
98
 
89
99
  BUNDLED WITH
90
- 1.15.3
100
+ 1.16.0
@@ -11,6 +11,8 @@ description "Command-line tool for the Kontena Platform"
11
11
  maintainer "Kontena, Inc."
12
12
  homepage "https://kontena.io"
13
13
 
14
+ override :ruby, version: "2.5.0"
15
+
14
16
  # Defaults to C:/kontena on Windows
15
17
  # and /opt/kontena on all other platforms
16
18
  install_dir "#{default_root}/#{name}"
@@ -9,9 +9,11 @@ dependency "libxml2"
9
9
  dependency "libxslt"
10
10
  whitelist_file "./wrappers/sh/kontena"
11
11
  build do
12
- gem "install rb-readline -v 0.5.4 --no-ri --no-doc"
13
- gem "install nokogiri -v 1.6.8 --no-ri --no-doc"
14
- gem "install kontena-cli -v #{default_version} --no-ri --no-doc"
15
- gem "install kontena-plugin-cloud --no-ri --no-doc"
12
+ env = with_standard_compiler_flags(with_embedded_path)
13
+ gem "install rb-readline -v 0.5.4 -N", env: env
14
+ gem "install nokogiri -v 1.8.2 -N", env: env
15
+ gem "build kontena-cli.gemspec", env: env, cwd: File.expand_path('..', Omnibus::Config.project_root)
16
+ gem "install -N #{Dir[File.expand_path('../kontena-cli-%s.gem' % default_version, Omnibus::Config.project_root)].first}", env: env
17
+ gem "install kontena-plugin-cloud -N", env: env
16
18
  copy "sh/kontena", "#{install_dir}/bin/kontena"
17
19
  end
@@ -4,7 +4,7 @@
4
4
  # after package is installed.
5
5
  #
6
6
  chown $USER /opt/kontena/embedded/bin
7
- chown $USER -R /opt/kontena/embedded/lib/ruby/gems/2.1.0
7
+ chown $USER -R /opt/kontena/embedded/lib/ruby/gems/2.5.0
8
8
 
9
9
  mkdir -p /usr/local/bin
10
10
  ln -s /opt/kontena/bin/kontena /usr/local/bin/kontena
@@ -1,7 +1,7 @@
1
1
  #!/bin/sh
2
2
 
3
3
  export PATH=/opt/kontena/embedded/bin:$PATH
4
- export GEM_HOME=/opt/kontena/embedded/lib/ruby/gems/2.1.0
4
+ export GEM_HOME=/opt/kontena/embedded/lib/ruby/gems/2.5.0
5
5
  export GEM_PATH=$GEM_HOME
6
6
 
7
7
  exec /opt/kontena/embedded/bin/kontena "$@"
@@ -0,0 +1,20 @@
1
+ stack: user/stackname
2
+ version: 0.1.1
3
+ services:
4
+ wordpress:
5
+ extends:
6
+ stack: registrystack/compose:1.0.0
7
+ service: wordpress
8
+ stateful: true
9
+ environment:
10
+ WORDPRESS_DB_PASSWORD: ${STACK}_secret
11
+ instances: 2
12
+ deploy:
13
+ strategy: ha
14
+ mysql:
15
+ extends:
16
+ stack: registrystack/compose:1.0.0
17
+ service: mysql
18
+ stateful: true
19
+ environment:
20
+ - MYSQL_ROOT_PASSWORD=${STACK}_secret
@@ -0,0 +1,81 @@
1
+ require 'kontena/cli/certificate/authorize_command'
2
+
3
+ describe Kontena::Cli::Certificate::AuthorizeCommand do
4
+ include ClientHelpers
5
+ include OutputHelpers
6
+
7
+ let(:subject) { described_class.new("kontena") }
8
+
9
+ let(:challenge_opts) { {} }
10
+ let(:linked_service) { {} }
11
+ let(:domain_authorization) {
12
+ {
13
+ 'id' => 'test/example.com',
14
+ 'domain' => 'example.com',
15
+ 'challenge_opts' => challenge_opts,
16
+ 'linked_service' => linked_service,
17
+ }
18
+ }
19
+
20
+ describe '--type=dns-01' do
21
+ let(:challenge_opts) {
22
+ {
23
+ 'record_name' => '_acme-challenge',
24
+ 'record_type' => 'TXT',
25
+ 'record_content' => 'qyANS...sqXm4',
26
+
27
+ }
28
+ }
29
+
30
+ it "requests domain authorization and shows the record contents" do
31
+ allow(client).to receive(:post).with('grids/test-grid/domain_authorizations', {domain: 'example.com', authorization_type: 'dns-01'}).and_return(domain_authorization)
32
+
33
+ expect{subject.run(['--type=dns-01', 'example.com'])}.to output(<<-EOM
34
+ Authorization successfully created. Use the following details to create necessary validations:
35
+ Record name: _acme-challenge.example.com
36
+ Record type: TXT
37
+ Record content: qyANS...sqXm4
38
+ EOM
39
+ ).to_stdout
40
+ end
41
+ end
42
+
43
+ describe '--type=http-01' do
44
+ let(:challenge_opts) {
45
+ {
46
+ 'token' => 'LoqXcYV8q5ONbJQxbmR7SCTNo3tiAXDfowyjxAjEuX0',
47
+ 'content' => 'LoqXcYV8q5ONbJQxbmR7SCTNo3tiAXDfowyjxAjEuX0.9jg46WB3rR_AHD-EBXdN7cBkH1WOu0tA3M9fm21mqTI',
48
+ }
49
+ }
50
+ let(:linked_service) { { 'id' => 'test-grid/test/lb' } }
51
+
52
+ it "fails without --linked-service" do
53
+ expect{subject.run(["--type=http-01", 'example.com'])}.to exit_with_error.and output(/--linked-service is required with --type=http-01/).to_stderr
54
+ end
55
+
56
+ it "requests domain authorization" do
57
+ allow(client).to receive(:post).with('grids/test-grid/domain_authorizations', {domain: 'example.com', authorization_type: 'http-01', linked_service: 'test/lb'}).and_return(domain_authorization)
58
+ allow(subject).to receive(:wait_for_domain_auth_deployed).with(domain_authorization).and_return(domain_authorization)
59
+
60
+ expect{subject.run(['--type=http-01', '--linked-service=test/lb', 'example.com'])}.to output(/Waiting for http-01 challenge to be deployed into .*\nHTTP challenge is deployed, you can now request the actual certificate/m).to_stdout
61
+ end
62
+ end
63
+
64
+ describe '--type=tls-sni-01' do
65
+ let(:challenge_opts) {
66
+ { }
67
+ }
68
+ let(:linked_service) { { 'id' => 'test-grid/test/lb' } }
69
+
70
+ it "fails without --linked-service" do
71
+ expect{subject.run(["--type=tls-sni-01", 'example.com'])}.to exit_with_error.and output(/--linked-service is required with --type=tls-sni-01/).to_stderr
72
+ end
73
+
74
+ it "requests domain authorization and waits for deploy" do
75
+ allow(client).to receive(:post).with('grids/test-grid/domain_authorizations', {domain: 'example.com', authorization_type: 'tls-sni-01', linked_service: 'test/lb'}).and_return(domain_authorization)
76
+ allow(subject).to receive(:wait_for_domain_auth_deployed).with(domain_authorization).and_return(domain_authorization)
77
+
78
+ expect{subject.run(['--type=tls-sni-01', '--linked-service=test/lb', 'example.com'])}.to output(/Waiting for tls-sni-01 challenge to be deployed into .*\nTLS-SNI challenge certificate is deployed, you can now request the actual certificate/m).to_stdout
79
+ end
80
+ end
81
+ end