kontena-cli 0.11.7 → 0.12.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (137) hide show
  1. checksums.yaml +4 -4
  2. data/VERSION +1 -1
  3. data/bin/kontena +2 -4
  4. data/kontena-cli.gemspec +1 -0
  5. data/lib/kontena/cli/app_command.rb +1 -1
  6. data/lib/kontena/cli/apps/common.rb +30 -3
  7. data/lib/kontena/cli/apps/deploy_command.rb +1 -0
  8. data/lib/kontena/cli/apps/list_command.rb +1 -0
  9. data/lib/kontena/cli/apps/logs_command.rb +9 -3
  10. data/lib/kontena/cli/apps/monitor_command.rb +1 -0
  11. data/lib/kontena/cli/apps/remove_command.rb +2 -0
  12. data/lib/kontena/cli/apps/scale_command.rb +2 -1
  13. data/lib/kontena/cli/apps/show_command.rb +1 -0
  14. data/lib/kontena/cli/apps/start_command.rb +1 -0
  15. data/lib/kontena/cli/apps/stop_command.rb +1 -0
  16. data/lib/kontena/cli/common.rb +5 -1
  17. data/lib/kontena/cli/containers/exec_command.rb +1 -0
  18. data/lib/kontena/cli/containers/inspect_command.rb +1 -0
  19. data/lib/kontena/cli/etcd/get_command.rb +2 -1
  20. data/lib/kontena/cli/etcd/list_command.rb +1 -0
  21. data/lib/kontena/cli/etcd/mkdir_command.rb +2 -1
  22. data/lib/kontena/cli/etcd/remove_command.rb +2 -1
  23. data/lib/kontena/cli/etcd/set_command.rb +2 -1
  24. data/lib/kontena/cli/etcd_command.rb +2 -2
  25. data/lib/kontena/cli/external_registries/add_command.rb +1 -0
  26. data/lib/kontena/cli/external_registries/delete_command.rb +2 -0
  27. data/lib/kontena/cli/external_registries/list_command.rb +1 -0
  28. data/lib/kontena/cli/external_registries/remove_command.rb +13 -0
  29. data/lib/kontena/cli/external_registry_command.rb +4 -3
  30. data/lib/kontena/cli/grid_command.rb +5 -1
  31. data/lib/kontena/cli/grid_options.rb +12 -0
  32. data/lib/kontena/cli/grids/add_user_command.rb +1 -0
  33. data/lib/kontena/cli/grids/cloud_config_command.rb +41 -0
  34. data/lib/kontena/cli/grids/common.rb +65 -4
  35. data/lib/kontena/cli/grids/logs_command.rb +9 -4
  36. data/lib/kontena/cli/grids/remove_user_command.rb +1 -0
  37. data/lib/kontena/cli/grids/update_command.rb +27 -0
  38. data/lib/kontena/cli/master/use_command.rb +12 -2
  39. data/lib/kontena/cli/master/users/add_role_command.rb +26 -0
  40. data/lib/kontena/cli/master/users/invite_command.rb +24 -0
  41. data/lib/kontena/cli/master/users/list_command.rb +18 -0
  42. data/lib/kontena/cli/master/users/remove_role_command.rb +26 -0
  43. data/lib/kontena/cli/master/users_command.rb +14 -0
  44. data/lib/kontena/cli/master_command.rb +2 -1
  45. data/lib/kontena/cli/node_command.rb +7 -1
  46. data/lib/kontena/cli/nodes/add_label_command.rb +19 -0
  47. data/lib/kontena/cli/nodes/aws/create_command.rb +2 -1
  48. data/lib/kontena/cli/nodes/aws/restart_command.rb +1 -0
  49. data/lib/kontena/cli/nodes/aws/terminate_command.rb +1 -0
  50. data/lib/kontena/cli/nodes/azure/create_command.rb +1 -0
  51. data/lib/kontena/cli/nodes/azure/restart_command.rb +1 -0
  52. data/lib/kontena/cli/nodes/azure/terminate_command.rb +1 -0
  53. data/lib/kontena/cli/nodes/digital_ocean/create_command.rb +1 -0
  54. data/lib/kontena/cli/nodes/digital_ocean/restart_command.rb +1 -0
  55. data/lib/kontena/cli/nodes/digital_ocean/terminate_command.rb +1 -0
  56. data/lib/kontena/cli/nodes/list_command.rb +10 -14
  57. data/lib/kontena/cli/nodes/remove_command.rb +1 -0
  58. data/lib/kontena/cli/nodes/remove_label_command.rb +23 -0
  59. data/lib/kontena/cli/nodes/show_command.rb +1 -0
  60. data/lib/kontena/cli/nodes/ssh_command.rb +1 -0
  61. data/lib/kontena/cli/nodes/update_command.rb +1 -0
  62. data/lib/kontena/cli/nodes/vagrant/create_command.rb +1 -0
  63. data/lib/kontena/cli/nodes/vagrant/restart_command.rb +1 -0
  64. data/lib/kontena/cli/nodes/vagrant/ssh_command.rb +1 -0
  65. data/lib/kontena/cli/nodes/vagrant/start_command.rb +1 -0
  66. data/lib/kontena/cli/nodes/vagrant/stop_command.rb +1 -0
  67. data/lib/kontena/cli/nodes/vagrant/terminate_command.rb +1 -0
  68. data/lib/kontena/cli/registry/create_command.rb +80 -30
  69. data/lib/kontena/cli/registry/delete_command.rb +3 -0
  70. data/lib/kontena/cli/registry/remove_command.rb +15 -0
  71. data/lib/kontena/cli/registry_command.rb +3 -1
  72. data/lib/kontena/cli/service_command.rb +20 -4
  73. data/lib/kontena/cli/services/add_env_command.rb +1 -0
  74. data/lib/kontena/cli/services/add_secret_command.rb +24 -0
  75. data/lib/kontena/cli/services/containers_command.rb +1 -0
  76. data/lib/kontena/cli/services/create_command.rb +3 -2
  77. data/lib/kontena/cli/services/delete_command.rb +2 -0
  78. data/lib/kontena/cli/services/deploy_command.rb +1 -0
  79. data/lib/kontena/cli/services/envs_command.rb +1 -0
  80. data/lib/kontena/cli/services/link_command.rb +26 -0
  81. data/lib/kontena/cli/services/list_command.rb +13 -10
  82. data/lib/kontena/cli/services/logs_command.rb +13 -5
  83. data/lib/kontena/cli/services/monitor_command.rb +1 -0
  84. data/lib/kontena/cli/services/remove_command.rb +17 -0
  85. data/lib/kontena/cli/services/remove_env_command.rb +1 -0
  86. data/lib/kontena/cli/services/remove_secret_command.rb +28 -0
  87. data/lib/kontena/cli/services/restart_command.rb +1 -0
  88. data/lib/kontena/cli/services/scale_command.rb +2 -1
  89. data/lib/kontena/cli/services/show_command.rb +1 -0
  90. data/lib/kontena/cli/services/start_command.rb +1 -0
  91. data/lib/kontena/cli/services/stats_command.rb +5 -4
  92. data/lib/kontena/cli/services/stop_command.rb +1 -0
  93. data/lib/kontena/cli/services/unlink_command.rb +25 -0
  94. data/lib/kontena/cli/services/update_command.rb +4 -3
  95. data/lib/kontena/cli/users_command.rb +15 -0
  96. data/lib/kontena/cli/vault/list_command.rb +1 -0
  97. data/lib/kontena/cli/vault/read_command.rb +1 -0
  98. data/lib/kontena/cli/vault/remove_command.rb +1 -0
  99. data/lib/kontena/cli/vault/write_command.rb +1 -0
  100. data/lib/kontena/cli/version_command.rb +9 -1
  101. data/lib/kontena/cli/vpn/config_command.rb +1 -0
  102. data/lib/kontena/cli/vpn/create_command.rb +1 -0
  103. data/lib/kontena/cli/vpn/delete_command.rb +2 -0
  104. data/lib/kontena/cli/vpn/remove_command.rb +15 -0
  105. data/lib/kontena/cli/vpn_command.rb +3 -1
  106. data/lib/kontena/machine/aws/node_destroyer.rb +1 -1
  107. data/lib/kontena/machine/cloud_config/cloudinit.yml +70 -0
  108. data/lib/kontena/machine/cloud_config/node_generator.rb +28 -0
  109. data/lib/kontena/machine/digital_ocean/cloudinit.yml +22 -0
  110. data/lib/kontena/machine/digital_ocean/node_destroyer.rb +4 -2
  111. data/lib/kontena/machine/random_name.rb +3 -3
  112. data/lib/kontena/scripts/completer +7 -3
  113. data/spec/fixtures/docker-compose.yml +8 -0
  114. data/spec/fixtures/kontena.yml +17 -0
  115. data/spec/fixtures/mysql.yml +3 -0
  116. data/spec/fixtures/wordpress-scaled.yml +3 -0
  117. data/spec/fixtures/wordpress.yml +2 -0
  118. data/spec/kontena/cli/app/common_spec.rb +42 -0
  119. data/spec/kontena/cli/app/deploy_command_spec.rb +4 -31
  120. data/spec/kontena/cli/app/scale_spec.rb +4 -23
  121. data/spec/kontena/cli/master/use_command_spec.rb +12 -3
  122. data/spec/kontena/cli/master/users/add_role_command_spec.rb +35 -0
  123. data/spec/kontena/cli/master/users/invite_command_spec.rb +35 -0
  124. data/spec/kontena/cli/master/users/remove_role_command_spec.rb +35 -0
  125. data/spec/kontena/cli/services/add_secret_command_spec.rb +61 -0
  126. data/spec/kontena/cli/services/link_command_spec.rb +43 -0
  127. data/spec/kontena/cli/services/remove_secret_command_spec.rb +48 -0
  128. data/spec/kontena/cli/services/restart_command_spec.rb +1 -23
  129. data/spec/kontena/cli/services/unlink_command_spec.rb +43 -0
  130. data/spec/kontena/cli/version_command_spec.rb +17 -0
  131. data/spec/spec_helper.rb +6 -1
  132. data/spec/support/client_helpers.rb +31 -0
  133. data/spec/support/fixtures_helpers.rb +7 -0
  134. metadata +67 -6
  135. data/lib/kontena/cli/deploy_command.rb +0 -164
  136. data/lib/kontena/cli/invite_command.rb +0 -13
  137. data/spec/kontena/cli/deploy_command_spec.rb +0 -239
@@ -4,6 +4,9 @@ require_relative 'nodes/show_command'
4
4
  require_relative 'nodes/update_command'
5
5
  require_relative 'nodes/ssh_command'
6
6
 
7
+ require_relative 'nodes/add_label_command'
8
+ require_relative 'nodes/remove_label_command'
9
+
7
10
  require_relative 'nodes/vagrant_command'
8
11
  require_relative 'nodes/digital_ocean_command'
9
12
  require_relative 'nodes/aws_command'
@@ -11,12 +14,15 @@ require_relative 'nodes/azure_command'
11
14
 
12
15
  class Kontena::Cli::NodeCommand < Clamp::Command
13
16
 
14
- subcommand "list", "List grid nodes", Kontena::Cli::Nodes::ListCommand
17
+ subcommand ["list","ls"], "List grid nodes", Kontena::Cli::Nodes::ListCommand
15
18
  subcommand "show", "Show node", Kontena::Cli::Nodes::ShowCommand
16
19
  subcommand "ssh", "Ssh into node", Kontena::Cli::Nodes::SshCommand
17
20
  subcommand "update", "Update node", Kontena::Cli::Nodes::UpdateCommand
18
21
  subcommand ["remove","rm"], "Remove node", Kontena::Cli::Nodes::RemoveCommand
19
22
 
23
+ subcommand "add-label", "Add label to node", Kontena::Cli::Nodes::AddLabelCommand
24
+ subcommand "remove-label", "Remove label from node", Kontena::Cli::Nodes::RemoveLabelCommand
25
+
20
26
  subcommand "vagrant", "Vagrant specific commands", Kontena::Cli::Nodes::VagrantCommand
21
27
  subcommand "digitalocean", "DigitalOcean specific commands", Kontena::Cli::Nodes::DigitalOceanCommand
22
28
  subcommand "aws", "AWS specific commands", Kontena::Cli::Nodes::AwsCommand
@@ -0,0 +1,19 @@
1
+ module Kontena::Cli::Nodes
2
+ class AddLabelCommand < Clamp::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NODE_ID", "Node id"
6
+ parameter "LABEL", "Label"
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_grid
11
+ token = require_token
12
+
13
+ node = client(token).get("grids/#{current_grid}/nodes/#{node_id}")
14
+ data = {}
15
+ data[:labels] = node['labels'].to_a | [label]
16
+ client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
17
+ end
18
+ end
19
+ end
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Aws
2
2
  class CreateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "[NAME]", "Node name"
6
7
  option "--access-key", "ACCESS_KEY", "AWS access key ID", required: true
@@ -36,4 +37,4 @@ module Kontena::Cli::Nodes::Aws
36
37
  )
37
38
  end
38
39
  end
39
- end
40
+ end
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Aws
2
2
  class RestartCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--access-key", "ACCESS_KEY", "AWS access key ID", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Aws
2
2
  class TerminateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--access-key", "ACCESS_KEY", "AWS access key ID", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Azure
2
2
  class CreateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  option "--subscription-id", "SUBSCRIPTION ID", "Azure subscription id", required: true
6
7
  option "--subscription-cert", "CERTIFICATE", "Path to Azure management certificate", attribute_name: :certificate, required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Azure
2
2
  class RestartCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--subscription-id", "SUBSCRIPTION ID", "Azure subscription id", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Azure
2
2
  class TerminateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--subscription-id", "SUBSCRIPTION ID", "Azure subscription id", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::DigitalOcean
2
2
  class CreateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "[NAME]", "Node name"
6
7
  option "--token", "TOKEN", "DigitalOcean API token", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::DigitalOcean
2
2
  class RestartCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--token", "TOKEN", "DigitalOcean API token", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::DigitalOcean
2
2
  class TerminateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
  option "--token", "TOKEN", "DigitalOcean API token", required: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes
2
2
  class ListCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  option ["--all"], :flag, "List nodes for all grids", default: false
6
7
 
@@ -11,7 +12,7 @@ module Kontena::Cli::Nodes
11
12
 
12
13
  if all?
13
14
  grids = client(token).get("grids")
14
- puts "%-30s %-30s %-40s %-15s %-30s %-10s" % [ 'Grid', 'Name', 'OS', 'Driver', 'Labels', 'Status']
15
+ puts "%-70s %-10s %-40s" % [ 'Name', 'Status', 'Labels']
15
16
 
16
17
  grids['grids'].each do |grid|
17
18
  nodes = client(token).get("grids/#{grid['name']}/nodes")
@@ -21,31 +22,26 @@ module Kontena::Cli::Nodes
21
22
  else
22
23
  status = 'offline'
23
24
  end
24
- puts "%-30.30s %-30.30s %-40.40s %-15s %-30.30s %-10s" % [
25
- grid['name'],
26
- node['name'],
27
- "#{node['os']} (#{node['kernel_version']})",
28
- node['driver'],
29
- (node['labels'] || ['-']).join(","),
30
- status
25
+ puts "%-70.70s %-10s %-40s" % [
26
+ "#{grid['name']}/#{node['name']}",
27
+ status,
28
+ (node['labels'] || ['-']).join(",")
31
29
  ]
32
30
  end
33
31
  end
34
32
  else
35
33
  nodes = client(token).get("grids/#{current_grid}/nodes")
36
- puts "%-30s %-40s %-15s %-30s %-10s" % ['Name', 'OS', 'Driver', 'Labels', 'Status']
34
+ puts "%-70s %-10s %-40s" % ['Name', 'Status', 'Labels']
37
35
  nodes['nodes'].each do |node|
38
36
  if node['connected']
39
37
  status = 'online'
40
38
  else
41
39
  status = 'offline'
42
40
  end
43
- puts "%-30.30s %-40.40s %-15s %-30.30s %-10s" % [
41
+ puts "%-70.70s %-10s %-40s" % [
44
42
  node['name'],
45
- "#{node['os']} (#{node['kernel_version']})",
46
- node['driver'],
47
- (node['labels'] || ['-']).join(","),
48
- status
43
+ status,
44
+ (node['labels'] || ['-']).join(",")
49
45
  ]
50
46
  end
51
47
  end
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes
2
2
  class RemoveCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NODE_ID", "Node id"
6
7
 
@@ -0,0 +1,23 @@
1
+ module Kontena::Cli::Nodes
2
+ class RemoveLabelCommand < Clamp::Command
3
+ include Kontena::Cli::Common
4
+
5
+ parameter "NODE_ID", "Node id"
6
+ parameter "LABEL", "Label"
7
+
8
+ def execute
9
+ require_api_url
10
+ require_current_grid
11
+ token = require_token
12
+
13
+ node = client(token).get("grids/#{current_grid}/nodes/#{node_id}")
14
+ unless node['labels'].include?(label)
15
+ abort("Node #{node['name']} does not have label #{label}")
16
+ end
17
+ node['labels'].delete(label)
18
+ data = {}
19
+ data[:labels] = node['labels']
20
+ client.put("nodes/#{node['id']}", data, {}, {'Kontena-Grid-Token' => node['grid']['token']})
21
+ end
22
+ end
23
+ end
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes
2
2
  class ShowCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NODE_ID", "Node id"
6
7
 
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes
2
2
  class SshCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NODE_ID", "Node id"
6
7
  option ["-i", "--identity-file"], "IDENTITY_FILE", "Path to ssh private key"
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes
2
2
  class UpdateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NODE_ID", "Node id"
6
7
  option ["-l", "--label"], "LABEL", "Node label", multivalued: true
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class CreateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "[NAME]", "Node name"
6
7
  option "--memory", "MEMORY", "How much memory node has", default: '1024'
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class RestartCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
 
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class SshCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
 
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class StartCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
 
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class StopCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
 
@@ -1,6 +1,7 @@
1
1
  module Kontena::Cli::Nodes::Vagrant
2
2
  class TerminateCommand < Clamp::Command
3
3
  include Kontena::Cli::Common
4
+ include Kontena::Cli::GridOptions
4
5
 
5
6
  parameter "NAME", "Node name"
6
7
 
@@ -3,84 +3,134 @@ require 'shell-spinner'
3
3
  module Kontena::Cli::Registry
4
4
  class CreateCommand < Clamp::Command
5
5
  include Kontena::Cli::Common
6
+ include Kontena::Cli::GridOptions
7
+
8
+ REGISTRY_VERSION = '2.2'
6
9
 
7
10
  option '--node', 'NODE', 'Node name'
8
- option '--auth-password', 'AUTH_PASSWORD', 'Password protect registry'
9
- option '--s3-access-key', 'S3_ACCESS_KEY', 'S3 access key'
10
- option '--s3-secret-key', 'S3_SECRET_KEY', 'S3 secret key'
11
11
  option '--s3-bucket', 'S3_BUCKET', 'S3 bucket'
12
12
  option '--s3-region', 'S3_REGION', 'S3 region', default: 'eu-west-1'
13
13
  option '--s3-encrypt', :flag, 'Encrypt S3 objects', default: false
14
14
  option '--s3-secure', :flag, 'Use secure connection in S3', default: true
15
15
  option '--azure-account-name', 'AZURE_ACCOUNT_NAME', 'Azure account name'
16
- option '--azure-account-key', 'AZURE_ACCOUNT_KEY', 'Azure account key'
17
16
  option '--azure-container-name', 'AZURE_CONTAINER_NAME', 'Azure container name'
18
17
 
19
18
  def execute
20
19
  require_api_url
21
20
  token = require_token
22
21
  preferred_node = node
22
+ secrets = []
23
+ affinity = []
24
+ stateful = true
25
+ instances = 1
23
26
 
24
27
  registry = client(token).get("services/#{current_grid}/registry") rescue nil
25
28
  abort('Registry already exists') if registry
26
29
 
27
30
  nodes = client(token).get("grids/#{current_grid}/nodes")
28
- if preferred_node.nil?
29
- node = nodes['nodes'].find{|n| n['connected']}
30
- abort('Cannot find any online nodes') if node.nil?
31
- else
32
- node = nodes['nodes'].find{|n| n['connected'] && n['name'] == preferred_node }
33
- abort('Node not found') if node.nil?
34
- end
35
31
 
36
- if s3_access_key || s3_secret_key
37
- abort('--s3-access-key is missing') if s3_access_key.nil?
38
- abort('--s3-secret-key is missing') if s3_secret_key.nil?
39
- abort('--s3-bucket is missing') if s3_bucket.nil?
32
+ if s3_bucket
33
+ ['REGISTRY_STORAGE_S3_ACCESSKEY', 'REGISTRY_STORAGE_S3_SECRETKEY'].each do |secret|
34
+ abort("#{secret} secret is missing from the vault") unless vault_secret_exists?(secret)
35
+ end
40
36
  env = [
41
37
  "REGISTRY_STORAGE=s3",
42
- "REGISTRY_STORAGE_S3_ACCESSKEY=#{s3_access_key}",
43
- "REGISTRY_STORAGE_S3_SECRETKEY=#{s3_secret_key}",
44
38
  "REGISTRY_STORAGE_S3_REGION=#{s3_region}",
45
39
  "REGISTRY_STORAGE_S3_BUCKET=#{s3_bucket}",
46
40
  "REGISTRY_STORAGE_S3_ENCRYPT=#{s3_encrypt?}",
47
- "REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}",
41
+ "REGISTRY_STORAGE_S3_SECURE=#{s3_secure?}"
42
+ ]
43
+ secrets = [
44
+ {secret: 'REGISTRY_STORAGE_S3_ACCESSKEY', name: 'REGISTRY_STORAGE_S3_ACCESSKEY', type: 'env'},
45
+ {secret: 'REGISTRY_STORAGE_S3_SECRETKEY', name: 'REGISTRY_STORAGE_S3_SECRETKEY', type: 'env'}
48
46
  ]
49
- elsif azure_account_name || azure_account_key
47
+ stateful = false
48
+ instances = 2 if nodes['nodes'].size > 1
49
+ elsif azure_account_name || azure_container_name
50
50
  abort('--azure-account-name is missing') if azure_account_name.nil?
51
- abort('--azure-account-key is missing') if azure_account_key.nil?
52
51
  abort('--azure-container-name is missing') if azure_container_name.nil?
52
+ abort('REGISTRY_STORAGE_AZURE_ACCOUNTKEY is not saved to vault') unless vault_secret_exists?('REGISTRY_STORAGE_AZURE_ACCOUNTKEY')
53
53
  env = [
54
54
  "REGISTRY_STORAGE=azure",
55
55
  "REGISTRY_STORAGE_AZURE_ACCOUNTNAME=#{azure_account_name}",
56
- "REGISTRY_STORAGE_AZURE_ACCOUNTKEY=#{azure_account_key}",
57
- "REGISTRY_STORAGE_AZURE_CONTAINERNAME=#{azure_container_name}"
56
+ "REGISTRY_STORAGE_AZURE_ACCOUNTKEY=#{azure_account_key}"
58
57
  ]
58
+ secrets = [
59
+ {secret: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', name: 'REGISTRY_STORAGE_AZURE_ACCOUNTKEY', type: 'env'}
60
+ ]
61
+ stateful = false
62
+ instances = 2 if nodes['nodes'].size > 1
59
63
  else
60
64
  env = [
61
65
  "REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY=/registry"
62
66
  ]
67
+ if preferred_node
68
+ node = nodes['nodes'].find{|n| n['connected'] && n['name'] == preferred_node }
69
+ abort('Node not found') if node.nil?
70
+ affinity << "node==#{node['name']}"
71
+ end
63
72
  end
64
73
 
65
- env << "REGISTRY_HTTP_ADDR=0.0.0.0:80"
66
- env << "AUTH_PASSWORD=#{auth_password}" if auth_password
74
+ if vault_secret_exists?('REGISTRY_AUTH_PASSWORD')
75
+ secrets << {secret: 'REGISTRY_AUTH_PASSWORD', name: 'AUTH_PASSWORD', type: 'env'}
76
+ configure_registry_auth(vault_secret('REGISTRY_AUTH_PASSWORD'))
77
+ end
78
+ if vault_secret_exists?('REGISTRY_HTTP_TLS_CERTIFICATE')
79
+ secrets << {secret: 'REGISTRY_HTTP_TLS_CERTIFICATE', name: 'REGISTRY_HTTP_TLS_CERTIFICATE', type: 'env'}
80
+ secrets << {secret: 'REGISTRY_HTTP_TLS_KEY', name: 'REGISTRY_HTTP_TLS_KEY', type: 'env'}
81
+ env << "REGISTRY_HTTP_ADDR=0.0.0.0:443"
82
+ else
83
+ env << "REGISTRY_HTTP_ADDR=0.0.0.0:80"
84
+ end
85
+ env << "REGISTRY_HTTP_SECRET=#{SecureRandom.hex(24)}"
67
86
 
68
87
  data = {
69
88
  name: 'registry',
70
- stateful: true,
71
- image: 'kontena/registry:2.1',
89
+ stateful: stateful,
90
+ container_count: instances,
91
+ image: "kontena/registry:#{REGISTRY_VERSION}",
72
92
  volumes: ['/registry'],
73
93
  env: env,
74
- affinity: ["node==#{node['name']}"]
94
+ secrets: secrets,
95
+ affinity: affinity
75
96
  }
76
97
  client(token).post("grids/#{current_grid}/services", data)
77
98
  client(token).post("services/#{current_grid}/registry/deploy", {})
78
99
  ShellSpinner "Deploying registry service " do
79
100
  sleep 1 until client(token).get("services/#{current_grid}/registry")['state'] != 'deploying'
80
101
  end
81
- puts "Docker Registry 2.1 is now running at registry.kontena.local."
82
- puts "Note: OpenVPN connection is needed to establish connection to this registry. See 'kontena vpn' for details."
83
- puts 'Note 2: you must set "--insecure-registry 10.81.0.0/19" to your client docker daemon before you are able to push to this registry.'
102
+ puts "\n"
103
+ puts "Docker Registry #{REGISTRY_VERSION} is now running at registry.#{current_grid}.kontena.local."
104
+ puts "Note: "
105
+ puts " - OpenVPN connection is needed to establish connection to this registry. See http://www.kontena.io/docs/using-kontena/vpn-access for details"
106
+ puts " - you must set '--insecure-registry registry.#{current_grid}.kontena.local' to your client docker daemon before you are able to push to this registry"
107
+ end
108
+
109
+ # @param [String] name
110
+ # @return [Boolean]
111
+ def vault_secret_exists?(name)
112
+ client(require_token).get("secrets/#{current_grid}/#{name}")
113
+ true
114
+ rescue
115
+ false
116
+ end
117
+
118
+ # @param [String] name
119
+ # @return [String]
120
+ def vault_secret(name)
121
+ secret = client(require_token).get("secrets/#{current_grid}/#{name}")
122
+ secret['value']
123
+ end
124
+
125
+ # @param [String] password
126
+ def configure_registry_auth(password)
127
+ data = {
128
+ username: 'admin',
129
+ password: password,
130
+ email: 'not@val.id',
131
+ url: "http://registry.#{current_grid}.kontena.local/"
132
+ }
133
+ client(require_token).post("grids/#{current_grid}/external_registries", data) rescue nil
84
134
  end
85
135
  end
86
136
  end