kontena-cli 0.13.4 → 0.14.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/VERSION +1 -1
- data/kontena-cli.gemspec +2 -0
- data/lib/kontena/cli/app_command.rb +2 -0
- data/lib/kontena/cli/apps/common.rb +80 -74
- data/lib/kontena/cli/apps/config_command.rb +29 -0
- data/lib/kontena/cli/apps/deploy_command.rb +12 -81
- data/lib/kontena/cli/apps/docker_helper.rb +3 -3
- data/lib/kontena/cli/apps/init_command.rb +0 -3
- data/lib/kontena/cli/apps/list_command.rb +2 -3
- data/lib/kontena/cli/apps/logs_command.rb +2 -3
- data/lib/kontena/cli/apps/monitor_command.rb +3 -4
- data/lib/kontena/cli/apps/remove_command.rb +4 -4
- data/lib/kontena/cli/apps/restart_command.rb +2 -3
- data/lib/kontena/cli/apps/scale_command.rb +3 -5
- data/lib/kontena/cli/apps/service_generator.rb +123 -0
- data/lib/kontena/cli/apps/service_generator_v2.rb +26 -0
- data/lib/kontena/cli/apps/show_command.rb +1 -2
- data/lib/kontena/cli/apps/start_command.rb +2 -3
- data/lib/kontena/cli/apps/stop_command.rb +2 -3
- data/lib/kontena/cli/apps/yaml/reader.rb +150 -0
- data/lib/kontena/cli/apps/yaml/service_extender.rb +60 -0
- data/lib/kontena/cli/apps/yaml/validations.rb +79 -0
- data/lib/kontena/cli/apps/yaml/validator.rb +55 -0
- data/lib/kontena/cli/apps/yaml/validator_v2.rb +74 -0
- data/lib/kontena/cli/common.rb +23 -0
- data/lib/kontena/cli/etcd/remove_command.rb +2 -0
- data/lib/kontena/cli/grids/remove_command.rb +2 -0
- data/lib/kontena/cli/grids/users/remove_command.rb +3 -0
- data/lib/kontena/cli/master/azure/create_command.rb +0 -2
- data/lib/kontena/cli/master/packet/create_command.rb +42 -0
- data/lib/kontena/cli/master/packet_command.rb +14 -0
- data/lib/kontena/cli/master/upcloud/create_command.rb +39 -0
- data/lib/kontena/cli/master/upcloud_command.rb +13 -0
- data/lib/kontena/cli/master/users/remove_command.rb +3 -0
- data/lib/kontena/cli/master/users/roles/remove_command.rb +2 -0
- data/lib/kontena/cli/master_command.rb +4 -0
- data/lib/kontena/cli/node_command.rb +4 -0
- data/lib/kontena/cli/nodes/azure/create_command.rb +0 -2
- data/lib/kontena/cli/nodes/list_command.rb +4 -8
- data/lib/kontena/cli/nodes/packet/create_command.rb +35 -0
- data/lib/kontena/cli/nodes/packet/restart_command.rb +17 -0
- data/lib/kontena/cli/nodes/packet/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/packet_command.rb +15 -0
- data/lib/kontena/cli/nodes/remove_command.rb +2 -0
- data/lib/kontena/cli/nodes/show_command.rb +3 -1
- data/lib/kontena/cli/nodes/upcloud/create_command.rb +33 -0
- data/lib/kontena/cli/nodes/upcloud/restart_command.rb +20 -0
- data/lib/kontena/cli/nodes/upcloud/terminate_command.rb +20 -0
- data/lib/kontena/cli/nodes/upcloud_command.rb +15 -0
- data/lib/kontena/cli/registry/remove_command.rb +3 -0
- data/lib/kontena/cli/services/remove_command.rb +2 -0
- data/lib/kontena/cli/services/services_helper.rb +1 -0
- data/lib/kontena/cli/vault/list_command.rb +2 -0
- data/lib/kontena/cli/vault/read_command.rb +2 -0
- data/lib/kontena/cli/vault/remove_command.rb +4 -0
- data/lib/kontena/cli/vault/update_command.rb +8 -1
- data/lib/kontena/cli/vault/write_command.rb +2 -0
- data/lib/kontena/cli/vpn/remove_command.rb +3 -0
- data/lib/kontena/machine/azure/master_provisioner.rb +2 -2
- data/lib/kontena/machine/azure/node_provisioner.rb +7 -4
- data/lib/kontena/machine/digital_ocean/node_provisioner.rb +1 -1
- data/lib/kontena/machine/packet.rb +17 -0
- data/lib/kontena/machine/packet/cloudinit.yml +66 -0
- data/lib/kontena/machine/packet/cloudinit_master.yml +118 -0
- data/lib/kontena/machine/packet/master_provisioner.rb +93 -0
- data/lib/kontena/machine/packet/node_destroyer.rb +42 -0
- data/lib/kontena/machine/packet/node_provisioner.rb +77 -0
- data/lib/kontena/machine/packet/node_restarter.rb +41 -0
- data/lib/kontena/machine/packet/packet_common.rb +89 -0
- data/lib/kontena/machine/upcloud.rb +9 -0
- data/lib/kontena/machine/upcloud/cloudinit.yml +64 -0
- data/lib/kontena/machine/upcloud/cloudinit_master.yml +118 -0
- data/lib/kontena/machine/upcloud/master_provisioner.rb +136 -0
- data/lib/kontena/machine/upcloud/node_destroyer.rb +82 -0
- data/lib/kontena/machine/upcloud/node_provisioner.rb +119 -0
- data/lib/kontena/machine/upcloud/node_restarter.rb +47 -0
- data/lib/kontena/machine/upcloud/upcloud_common.rb +70 -0
- data/lib/kontena/scripts/completer +8 -3
- data/spec/fixtures/docker-compose_v2.yml +10 -0
- data/spec/fixtures/kontena-invalid.yml +4 -0
- data/spec/fixtures/kontena-with-variables.yml +19 -0
- data/spec/fixtures/kontena.yml +2 -2
- data/spec/fixtures/kontena_v2.yml +35 -0
- data/spec/kontena/cli/app/common_spec.rb +39 -101
- data/spec/kontena/cli/app/deploy_command_spec.rb +37 -388
- data/spec/kontena/cli/app/docker_helper_spec.rb +4 -4
- data/spec/kontena/cli/app/service_generator_spec.rb +374 -0
- data/spec/kontena/cli/app/service_generator_v2_spec.rb +74 -0
- data/spec/kontena/cli/app/yaml/reader_spec.rb +249 -0
- data/spec/kontena/cli/app/yaml/service_extender_spec.rb +104 -0
- data/spec/kontena/cli/app/yaml/validator_spec.rb +263 -0
- data/spec/kontena/cli/app/yaml/validator_v2_spec.rb +309 -0
- data/spec/kontena/cli/common_spec.rb +39 -1
- data/spec/kontena/cli/master/users/remove_command_spec.rb +9 -0
- data/spec/kontena/cli/master/users/roles/remove_command_spec.rb +2 -0
- metadata +86 -2
@@ -0,0 +1,60 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Kontena::Cli::Apps
|
4
|
+
module YAML
|
5
|
+
class ServiceExtender
|
6
|
+
attr_reader :service_config
|
7
|
+
|
8
|
+
# @param [Hash] service_config
|
9
|
+
def initialize(service_config)
|
10
|
+
@service_config = service_config
|
11
|
+
end
|
12
|
+
|
13
|
+
# @param [Hash] from
|
14
|
+
# @return [Hash]
|
15
|
+
def extend(from)
|
16
|
+
service_config['environment'] = extend_env_vars(
|
17
|
+
from['environment'],
|
18
|
+
service_config['environment']
|
19
|
+
)
|
20
|
+
service_config['secrets'] = extend_secrets(
|
21
|
+
from['secrets'],
|
22
|
+
service_config['secrets']
|
23
|
+
)
|
24
|
+
from.merge(service_config)
|
25
|
+
end
|
26
|
+
|
27
|
+
private
|
28
|
+
|
29
|
+
# @param [Array] from
|
30
|
+
# @param [Array] to
|
31
|
+
# @return [Array]
|
32
|
+
def extend_env_vars(from, to)
|
33
|
+
env_vars = to || []
|
34
|
+
if from
|
35
|
+
from.each do |env|
|
36
|
+
env_vars << env unless to && to.find do |key|
|
37
|
+
key.split('=').first == env.split('=').first
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
env_vars
|
42
|
+
end
|
43
|
+
|
44
|
+
# @param [Array] from
|
45
|
+
# @param [Array] to
|
46
|
+
# @return [Array]
|
47
|
+
def extend_secrets(from, to)
|
48
|
+
secrets = to || []
|
49
|
+
if from
|
50
|
+
from.each do |from_secret|
|
51
|
+
secrets << from_secret unless to && to.any? do |to_secret|
|
52
|
+
to_secret['secret'] == from_secret['secret']
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
secrets
|
57
|
+
end
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
@@ -0,0 +1,79 @@
|
|
1
|
+
module Kontena::Cli::Apps::YAML
|
2
|
+
module Validations
|
3
|
+
|
4
|
+
def append_common_validations(base)
|
5
|
+
base.optional('image').maybe(:str?)
|
6
|
+
base.optional('extends').schema do
|
7
|
+
key('service').required(:str?)
|
8
|
+
optional('file') { str? }
|
9
|
+
end
|
10
|
+
base.optional('stateful') { bool? }
|
11
|
+
base.optional('affinity') { array? { each { format?(/(?<=\!|\=)=/) } } }
|
12
|
+
base.optional('cap_add') { array? | none? }
|
13
|
+
base.optional('cap_drop') { array? | none? }
|
14
|
+
base.optional('command') { str? | none? }
|
15
|
+
base.optional('cpu_shares') { int? | none? }
|
16
|
+
base.optional('external_links') { array? }
|
17
|
+
base.optional('mem_limit') { int? | str? }
|
18
|
+
base.optional('memswap_limit') { int? | str? }
|
19
|
+
base.optional('environment') { array? | type?(Hash) }
|
20
|
+
base.optional('env_file') { str? | array? }
|
21
|
+
base.optional('instances') { int? }
|
22
|
+
base.optional('links') { array? | empty? }
|
23
|
+
base.optional('ports') { array? }
|
24
|
+
base.optional('volumes') { array? }
|
25
|
+
base.optional('volumes_from') { array? }
|
26
|
+
base.optional('deploy').schema do
|
27
|
+
optional('strategy') { inclusion?(%w(ha daemon random)) }
|
28
|
+
optional('wait_for_port') { int? }
|
29
|
+
optional('min_health') { float? }
|
30
|
+
end
|
31
|
+
base.optional('hooks').schema do
|
32
|
+
optional('post_start').each do
|
33
|
+
key('name').required
|
34
|
+
key('cmd').required
|
35
|
+
key('instances') { int? | eql?('*') }
|
36
|
+
optional('oneshot') { bool? }
|
37
|
+
end
|
38
|
+
optional('pre_build').each do
|
39
|
+
key('cmd').required
|
40
|
+
end
|
41
|
+
end
|
42
|
+
base.optional('secrets').each do
|
43
|
+
key('secret').required
|
44
|
+
key('name').required
|
45
|
+
key('type').required
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
##
|
50
|
+
# @param [Hash] service_config
|
51
|
+
def validate_options(service_config)
|
52
|
+
@yaml_schema.call(service_config)
|
53
|
+
end
|
54
|
+
|
55
|
+
##
|
56
|
+
# @param [Hash] service_config
|
57
|
+
# @return [Array<String>] errors
|
58
|
+
def validate_keys(service_config)
|
59
|
+
errors = {}
|
60
|
+
service_config.keys.each do |key|
|
61
|
+
error = validate_key(key)
|
62
|
+
errors[key] = error if error
|
63
|
+
end
|
64
|
+
errors
|
65
|
+
end
|
66
|
+
|
67
|
+
##
|
68
|
+
# @param [String] key
|
69
|
+
def validate_key(key)
|
70
|
+
if self.class::UNSUPPORTED_KEYS.include?(key)
|
71
|
+
['unsupported option']
|
72
|
+
elsif !self.class::VALID_KEYS.include?(key)
|
73
|
+
['invalid option']
|
74
|
+
else
|
75
|
+
nil
|
76
|
+
end
|
77
|
+
end
|
78
|
+
end
|
79
|
+
end
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'dry-validation'
|
2
|
+
module Kontena::Cli::Apps
|
3
|
+
module YAML
|
4
|
+
class Validator
|
5
|
+
require_relative 'validations'
|
6
|
+
include Validations
|
7
|
+
|
8
|
+
VALID_KEYS = %w(
|
9
|
+
affinity build dockerfile cap_add cap_drop command deploy env_file environment extends external_links
|
10
|
+
image links log_driver log_opt net pid ports volumes volumes_from cpu_shares
|
11
|
+
mem_limit memswap_limit privileged stateful user instances hooks secrets
|
12
|
+
).freeze
|
13
|
+
|
14
|
+
UNSUPPORTED_KEYS = %w(
|
15
|
+
cgroup_parent container_name devices depends_on dns dns_search tmpfs entrypoint
|
16
|
+
expose extra_hosts labels logging network_mode networks security_opt stop_signal ulimits volume_driver
|
17
|
+
cpu_quota cpuset domainname hostname ipc mac_address
|
18
|
+
read_only restart shm_size stdin_open tty working_dir
|
19
|
+
).freeze
|
20
|
+
|
21
|
+
##
|
22
|
+
# rubocop:disable Metrics/MethodLength,Metrics/AbcSize
|
23
|
+
def initialize(need_image=false)
|
24
|
+
base = self
|
25
|
+
@yaml_schema = Dry::Validation.Schema do
|
26
|
+
base.append_common_validations(self)
|
27
|
+
optional('build').maybe(:str?)
|
28
|
+
optional('dockerfile') { str? }
|
29
|
+
optional('net') { inclusion?(%w(host bridge)) }
|
30
|
+
optional('log_driver') { str? }
|
31
|
+
optional('log_opts') { type?(Hash) }
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
##
|
37
|
+
# @param [Hash] yaml
|
38
|
+
# @return [Array] validation_errors
|
39
|
+
def validate(yaml)
|
40
|
+
result = {
|
41
|
+
errors: [],
|
42
|
+
notifications: []
|
43
|
+
}
|
44
|
+
|
45
|
+
yaml.each do |service, options|
|
46
|
+
key_errors = validate_keys(options)
|
47
|
+
option_errors = validate_options(options)
|
48
|
+
result[:errors] << { service => option_errors.messages } if option_errors.failure?
|
49
|
+
result[:notifications] << { service => key_errors } if key_errors.size > 0
|
50
|
+
end
|
51
|
+
result
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
@@ -0,0 +1,74 @@
|
|
1
|
+
require 'dry-validation'
|
2
|
+
require_relative 'validator'
|
3
|
+
|
4
|
+
module Kontena::Cli::Apps
|
5
|
+
module YAML
|
6
|
+
class ValidatorV2
|
7
|
+
require_relative 'validations'
|
8
|
+
include Validations
|
9
|
+
|
10
|
+
VALID_KEYS = %w(
|
11
|
+
affinity build cap_add cap_drop command deploy depends_on env_file environment extends external_links
|
12
|
+
image links logging network_mode pid ports volumes volumes_from cpu_shares
|
13
|
+
mem_limit memswap_limit privileged stateful user instances hooks secrets
|
14
|
+
).freeze
|
15
|
+
|
16
|
+
UNSUPPORTED_KEYS = %w(
|
17
|
+
cgroup_parent container_name devices dns dns_search tmpfs entrypoint
|
18
|
+
expose extra_hosts labels log_driver log_opt net networks security_opt stop_signal ulimits volume_driver
|
19
|
+
cpu_quota cpuset domainname hostname ipc mac_address
|
20
|
+
read_only restart shm_size stdin_open tty working_dir
|
21
|
+
).freeze
|
22
|
+
|
23
|
+
##
|
24
|
+
# rubocop:disable Metrics/MethodLength,Metrics/AbcSize
|
25
|
+
def initialize
|
26
|
+
base = self
|
27
|
+
@yaml_schema = Dry::Validation.Schema do
|
28
|
+
base.append_common_validations(self)
|
29
|
+
optional('build') { str? | type?(Hash) }
|
30
|
+
|
31
|
+
rule(build_hash: ['build']) do |build|
|
32
|
+
build.type?(Hash) > build.schema do
|
33
|
+
key('context').required
|
34
|
+
optional('dockerfile') { str? }
|
35
|
+
end
|
36
|
+
end
|
37
|
+
optional('depends_on') { array? }
|
38
|
+
optional('network_mode') { inclusion?(%w(host bridge)) }
|
39
|
+
optional('logging').schema do
|
40
|
+
optional('driver') { str? }
|
41
|
+
optional('options') { type?(Hash) }
|
42
|
+
end
|
43
|
+
end
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# @param [Hash] yaml
|
48
|
+
# @return [Array] validation_errors
|
49
|
+
def validate(yaml)
|
50
|
+
result = {
|
51
|
+
errors: [],
|
52
|
+
notifications: []
|
53
|
+
}
|
54
|
+
if yaml.key?('services')
|
55
|
+
yaml['services'].each do |service, options|
|
56
|
+
key_errors = validate_keys(options)
|
57
|
+
option_errors = validate_options(options)
|
58
|
+
result[:errors] << { service => option_errors.messages } if option_errors.failure?
|
59
|
+
result[:notifications] << { service => key_errors } if key_errors.size > 0
|
60
|
+
end
|
61
|
+
else
|
62
|
+
result[:errors] << { 'file' => 'services missing' }
|
63
|
+
end
|
64
|
+
if yaml.key?('volumes')
|
65
|
+
result[:notifications] << { 'volumes' => 'Kontena does not support volumes yet. To persist data just define service as stateful (stateful: true)' }
|
66
|
+
end
|
67
|
+
if yaml.key?('networks')
|
68
|
+
result[:notifications] << { 'networks' => 'Kontena does not support multiple networks yet. You can reference services with Kontena\'s internal DNS (service_name.kontena.local)' }
|
69
|
+
end
|
70
|
+
result
|
71
|
+
end
|
72
|
+
end
|
73
|
+
end
|
74
|
+
end
|
data/lib/kontena/cli/common.rb
CHANGED
@@ -122,6 +122,29 @@ module Kontena
|
|
122
122
|
save_settings
|
123
123
|
end
|
124
124
|
|
125
|
+
def error(message = nil)
|
126
|
+
$stderr.puts(message) if message
|
127
|
+
exit(1)
|
128
|
+
end
|
129
|
+
|
130
|
+
def prompt(prefix = '> ')
|
131
|
+
require 'highline/import'
|
132
|
+
ask(prefix)
|
133
|
+
end
|
134
|
+
|
135
|
+
def confirm_command(name, message = nil)
|
136
|
+
puts message if message
|
137
|
+
puts "Destructive command. To proceed, type \"#{name}\" or re-run this command with --force option."
|
138
|
+
|
139
|
+
prompt == name || error("Confirmation did not match #{name}. Aborted command.")
|
140
|
+
end
|
141
|
+
|
142
|
+
def confirm(message = 'Destructive command. Are you sure? (y/n) or re-run this command with --force option.')
|
143
|
+
puts message
|
144
|
+
|
145
|
+
['y', 'yes'].include?(prompt) || error("Aborted command.")
|
146
|
+
end
|
147
|
+
|
125
148
|
def api_url=(api_url)
|
126
149
|
settings['servers'][current_master_index]['url'] = api_url
|
127
150
|
save_settings
|
@@ -9,11 +9,13 @@ module Kontena::Cli::Etcd
|
|
9
9
|
parameter "KEY", "Etcd key"
|
10
10
|
|
11
11
|
option "--recursive", :flag, "Remove keys recursively"
|
12
|
+
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
12
13
|
|
13
14
|
def execute
|
14
15
|
require_api_url
|
15
16
|
token = require_token
|
16
17
|
validate_key
|
18
|
+
confirm unless forced?
|
17
19
|
|
18
20
|
data = {}
|
19
21
|
data[:recursive] = true if recursive?
|
@@ -6,10 +6,12 @@ module Kontena::Cli::Grids
|
|
6
6
|
include Common
|
7
7
|
|
8
8
|
parameter "NAME", "Grid name"
|
9
|
+
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
9
10
|
|
10
11
|
def execute
|
11
12
|
require_api_url
|
12
13
|
token = require_token
|
14
|
+
confirm_command(name) unless forced?
|
13
15
|
grid = find_grid_by_name(name)
|
14
16
|
|
15
17
|
if !grid.nil?
|
@@ -7,10 +7,13 @@ module Kontena::Cli::Grids::Users
|
|
7
7
|
include Kontena::Cli::Grids::Common
|
8
8
|
|
9
9
|
parameter "EMAIL", "Email address"
|
10
|
+
option "--force", :flag, "Force remove", default: false, attribute_name: :forced
|
10
11
|
|
11
12
|
def execute
|
12
13
|
require_api_url
|
13
14
|
token = require_token
|
15
|
+
confirm_command(email) unless forced?
|
16
|
+
|
14
17
|
result = client(token).delete("grids/#{current_grid}/users/#{email}")
|
15
18
|
end
|
16
19
|
end
|
@@ -10,7 +10,6 @@ module Kontena::Cli::Master::Azure
|
|
10
10
|
option "--network", "NETWORK", "Virtual Network name"
|
11
11
|
option "--subnet", "SUBNET", "Subnet name"
|
12
12
|
option "--ssh-key", "SSH KEY", "SSH private key file", required: true
|
13
|
-
option "--password", "PASSWORD", "Password"
|
14
13
|
option "--location", "LOCATION", "Location", default: 'West Europe'
|
15
14
|
option "--ssl-cert", "SSL CERT", "SSL certificate file"
|
16
15
|
option "--vault-secret", "VAULT_SECRET", "Secret key for Vault"
|
@@ -22,7 +21,6 @@ module Kontena::Cli::Master::Azure
|
|
22
21
|
require 'kontena/machine/azure'
|
23
22
|
provisioner = Kontena::Machine::Azure::MasterProvisioner.new(subscription_id, certificate)
|
24
23
|
provisioner.run!(
|
25
|
-
password: password,
|
26
24
|
ssh_key: ssh_key,
|
27
25
|
ssl_cert: ssl_cert,
|
28
26
|
size: size,
|
@@ -0,0 +1,42 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
module Kontena::Cli::Master::Packet
|
4
|
+
class CreateCommand < Clamp::Command
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
|
7
|
+
option "--token", "TOKEN", "Packet API token", required: true
|
8
|
+
option "--project", "PROJECT ID", "Packet project id", required: true
|
9
|
+
option "--ssl-cert", "PATH", "SSL certificate file (optional)"
|
10
|
+
option "--type", "TYPE", "Server type (baremetal_0, baremetal_1, ..)", default: 'baremetal_0', attribute_name: :plan
|
11
|
+
option "--facility", "FACILITY CODE", "Facility", default: 'ams1'
|
12
|
+
option "--billing", "BILLING", "Billing cycle", default: 'hourly'
|
13
|
+
option "--ssh-key", "PATH", "Path to ssh public key (optional)"
|
14
|
+
option "--vault-secret", "VAULT_SECRET", "Secret key for Vault (optional)"
|
15
|
+
option "--vault-iv", "VAULT_IV", "Initialization vector for Vault (optional)"
|
16
|
+
option "--mongodb-uri", "URI", "External MongoDB uri (optional)"
|
17
|
+
option "--version", "VERSION", "Define installed Kontena version", default: 'latest'
|
18
|
+
option "--auth-provider-url", "AUTH_PROVIDER_URL", "Define authentication provider url"
|
19
|
+
|
20
|
+
def execute
|
21
|
+
|
22
|
+
require 'kontena/machine/packet'
|
23
|
+
|
24
|
+
provisioner = Kontena::Machine::Packet::MasterProvisioner.new(token)
|
25
|
+
provisioner.run!(
|
26
|
+
project: project,
|
27
|
+
billing: billing,
|
28
|
+
ssh_key: ssh_key,
|
29
|
+
ssl_cert: ssl_cert,
|
30
|
+
plan: plan,
|
31
|
+
facility: facility,
|
32
|
+
version: version,
|
33
|
+
auth_server: auth_provider_url,
|
34
|
+
vault_secret: vault_secret || SecureRandom.hex(24),
|
35
|
+
vault_iv: vault_iv || SecureRandom.hex(24),
|
36
|
+
mongodb_uri: mongodb_uri
|
37
|
+
)
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
@@ -0,0 +1,39 @@
|
|
1
|
+
require 'securerandom'
|
2
|
+
|
3
|
+
module Kontena::Cli::Master::Upcloud
|
4
|
+
class CreateCommand < Clamp::Command
|
5
|
+
include Kontena::Cli::Common
|
6
|
+
|
7
|
+
option "--username", "USER", "Upcloud username", required: true
|
8
|
+
option "--password", "PASS", "Upcloud password", required: true
|
9
|
+
option "--ssh-key", "SSH_KEY", "Path to ssh public key", required: true
|
10
|
+
option "--ssl-cert", "SSL CERT", "SSL certificate file (optional)"
|
11
|
+
option "--plan", "PLAN", "Server plan", default: '1xCPU-1GB'
|
12
|
+
option "--zone", "ZONE", "Zone", default: 'fi-hel1'
|
13
|
+
option "--vault-secret", "VAULT_SECRET", "Secret key for Vault (optional)"
|
14
|
+
option "--vault-iv", "VAULT_IV", "Initialization vector for Vault (optional)"
|
15
|
+
option "--mongodb-uri", "URI", "External MongoDB uri (optional)"
|
16
|
+
option "--version", "VERSION", "Define installed Kontena version", default: 'latest'
|
17
|
+
option "--auth-provider-url", "AUTH_PROVIDER_URL", "Define authentication provider url"
|
18
|
+
|
19
|
+
|
20
|
+
def execute
|
21
|
+
|
22
|
+
require 'kontena/machine/upcloud'
|
23
|
+
|
24
|
+
provisioner = Kontena::Machine::Upcloud::MasterProvisioner.new(username, password)
|
25
|
+
provisioner.run!(
|
26
|
+
ssh_key: ssh_key,
|
27
|
+
ssl_cert: ssl_cert,
|
28
|
+
plan: plan,
|
29
|
+
zone: zone,
|
30
|
+
version: version,
|
31
|
+
auth_server: auth_provider_url,
|
32
|
+
vault_secret: vault_secret || SecureRandom.hex(24),
|
33
|
+
vault_iv: vault_iv || SecureRandom.hex(24),
|
34
|
+
mongodb_uri: mongodb_uri
|
35
|
+
)
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|