kontena-cli 0.11.7 → 0.12.0

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.
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