ky 0.4.0 → 0.4.2
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.
- checksums.yaml +4 -4
- data/ky.gemspec +1 -0
- data/lib/ky/cli.rb +13 -13
- data/lib/ky/compilation.rb +20 -0
- data/lib/ky/configuration.rb +51 -0
- data/lib/ky/deploy_generation.rb +16 -12
- data/lib/ky/env_generation.rb +20 -10
- data/lib/ky/manipulation.rb +14 -1
- data/lib/ky/template.rb +8 -10
- data/lib/ky/version.rb +2 -2
- data/lib/ky.rb +3 -76
- data/spec/ky_bin_spec.rb +38 -13
- metadata +18 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: a3e2cbbf671a3e7fd09fb7eac2e4b209cc2eccc5
|
4
|
+
data.tar.gz: aea2bbb6db0bde006fea255fdbbcc53bb502b79f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: a486fa1c392976cd44a83a5498728fb60f6ebd222432725537bc2b82609a6f035956a6a24fd1feaa583ed715168fa9af38a3b7e10787019eb409c22afb93f5dc
|
7
|
+
data.tar.gz: 0def538f73dcbbe5a574363911feff3b94e58f92646b8370074b375bdcfb3288b66424ca67f64eb87279934e7c7bd0356e121d927dce37db3d5cf77d236357ff
|
data/ky.gemspec
CHANGED
@@ -17,6 +17,7 @@ Gem::Specification.new do |s|
|
|
17
17
|
s.add_development_dependency 'rspec', '~> 3.5'
|
18
18
|
s.add_development_dependency 'pry', '~> 0.10'
|
19
19
|
s.add_runtime_dependency 'thor', '~> 0.19'
|
20
|
+
s.add_runtime_dependency 'activesupport', '>= 3.0'
|
20
21
|
s.add_runtime_dependency 'deep_merge', '~> 1.1'
|
21
22
|
|
22
23
|
s.description = <<-DESC
|
data/lib/ky/cli.rb
CHANGED
@@ -1,40 +1,40 @@
|
|
1
1
|
require_relative '../ky'
|
2
2
|
require 'thor'
|
3
|
-
|
3
|
+
module KY
|
4
4
|
class Cli < Thor
|
5
5
|
MissingParametersError = Class.new(StandardError)
|
6
6
|
desc "encode secrets.yml", "base64 encoded yaml version of data attributes in secrets.yml"
|
7
7
|
def encode(input_source=$stdin, output_source=$stdout)
|
8
8
|
input_output(input_source, output_source) do |input_object, output_object|
|
9
|
-
|
9
|
+
Manipulation.encode(output_object, input_object)
|
10
10
|
end
|
11
11
|
end
|
12
12
|
|
13
13
|
desc "decode secrets.yml", "decoded yaml version of secrets.yml with base64 encoded data attributes"
|
14
14
|
def decode(input_source=$stdin, output_source=$stdout)
|
15
15
|
input_output(input_source, output_source) do |input_object, output_object|
|
16
|
-
|
16
|
+
Manipulation.decode(output_object, input_object)
|
17
17
|
end
|
18
18
|
end
|
19
19
|
|
20
20
|
desc "merge base.yml env.yml", "deep merged/combined yaml of two seperate files"
|
21
21
|
def merge(input_source1, input_source2=$stdin, output_source=$stdout)
|
22
22
|
input_output(input_source1, output_source) do |input_object1, output_object|
|
23
|
-
with(input_source2, 'r') {|input_object2|
|
23
|
+
with(input_source2, 'r') {|input_object2| Manipulation.merge(output_object, input_object1, input_object2) }
|
24
24
|
end
|
25
25
|
end
|
26
26
|
|
27
27
|
desc "env config.yml secrets.yml", "generate env variables section of a deployment from a config and a secrets file"
|
28
28
|
def env(input_source1, input_source2=$stdin, output_source=$stdout)
|
29
29
|
input_output(input_source1, output_source) do |input_object1, output_object|
|
30
|
-
with(input_source2, 'r') {|input_object2|
|
30
|
+
with(input_source2, 'r') {|input_object2| EnvGeneration.env(output_object, input_object1, input_object2) }
|
31
31
|
end
|
32
32
|
end
|
33
33
|
|
34
|
-
desc "compile
|
35
|
-
Generate kubernetes deployment.yml from Procfile;
|
34
|
+
desc "compile (config.yml secrets.yml output)", <<-DOC.strip_heredoc
|
35
|
+
Generate kubernetes deployment.yml from Procfile and env files;
|
36
36
|
also generate/copy config/secrets files to output_dir, base64 encode secrets if unencoded.
|
37
|
-
Procfile path may
|
37
|
+
Procfile path may be specified in configuration as procfile_path or via flag.
|
38
38
|
ConfigMap.yml file path may also be specified in configuration as config_path
|
39
39
|
secrets.yml file path may also be specified in configuration as secret_path
|
40
40
|
Output directory may also be specified in configuration as output_dir
|
@@ -42,15 +42,15 @@ class KY
|
|
42
42
|
method_option :namespace, type: :string, aliases: "-n"
|
43
43
|
method_option :environment, type: :string, aliases: "-e"
|
44
44
|
method_option :image_tag, type: :string, aliases: "-t"
|
45
|
-
|
46
|
-
|
47
|
-
|
45
|
+
method_option :procfile_path, type: :string, aliases: "-p"
|
46
|
+
def compile(config_or_secrets_path=nil, secrets_or_config_path=nil, output_dir=nil)
|
47
|
+
instance = Compilation.new(options.with_indifferent_access)
|
48
48
|
config_or_secrets_path ||= instance.configuration['config_path'] || instance.configuration['secret_path']
|
49
49
|
secrets_or_config_path ||= instance.configuration['secret_path'] || instance.configuration['config_path']
|
50
50
|
output_dir ||= instance.configuration['output_dir']
|
51
|
-
raise MissingParametersError unless
|
51
|
+
raise MissingParametersError unless config_or_secrets_path && secrets_or_config_path && output_dir && instance.configuration['procfile_path']
|
52
52
|
input_input(config_or_secrets_path, secrets_or_config_path) do |input1, input2|
|
53
|
-
instance.compile(
|
53
|
+
instance.compile(input1, input2, output_dir)
|
54
54
|
end
|
55
55
|
end
|
56
56
|
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module KY
|
2
|
+
class Compilation
|
3
|
+
attr_reader :configuration
|
4
|
+
|
5
|
+
def initialize(opts={})
|
6
|
+
@configuration = Configuration.new(opts)
|
7
|
+
end
|
8
|
+
|
9
|
+
def compile(env1path, env2path, base_output_dir)
|
10
|
+
full_output_dir = Pathname.new(base_output_dir).join(configuration[:environment].to_s).to_s
|
11
|
+
FileUtils.mkdir_p(full_output_dir)
|
12
|
+
env_obj = EnvGeneration.new(env1path, env2path, configuration)
|
13
|
+
deploys_hash = DeployGeneration.new(full_output_dir, env_obj.project, configuration).to_h
|
14
|
+
deploys_hash.each do |file_path, deploy_hash|
|
15
|
+
File.write(file_path, Manipulation.merge_hash(deploy_hash, env_obj.to_h).to_plain_yaml)
|
16
|
+
end
|
17
|
+
Manipulation.write_configs_encode_if_needed(env_obj.config_hsh, env_obj.secret_hsh, full_output_dir, configuration[:project_name])
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,51 @@
|
|
1
|
+
module KY
|
2
|
+
class Configuration
|
3
|
+
AmbiguousEnvironmentFile = Class.new(StandardError)
|
4
|
+
attr_reader :configuration, :opts
|
5
|
+
|
6
|
+
def initialize(opts={})
|
7
|
+
@opts = opts
|
8
|
+
@configuration = build_configuration
|
9
|
+
end
|
10
|
+
|
11
|
+
def [](key)
|
12
|
+
configuration[key]
|
13
|
+
end
|
14
|
+
|
15
|
+
def keys
|
16
|
+
configuration.keys
|
17
|
+
end
|
18
|
+
|
19
|
+
def build_configuration
|
20
|
+
config = if config_file_location
|
21
|
+
YAML.load(File.read(config_file_location)).with_indifferent_access
|
22
|
+
else
|
23
|
+
DEFAULT_CONFIG
|
24
|
+
end
|
25
|
+
config.merge(current_environment_hash(config))
|
26
|
+
end
|
27
|
+
|
28
|
+
def current_environment_hash(partial_config)
|
29
|
+
current_config = partial_config || configuration
|
30
|
+
current_environment = opts[:environment] || current_config[:environment]
|
31
|
+
env_file_paths = environment_files(current_config).select {|file| file.match(current_environment) if current_environment }
|
32
|
+
if env_file_paths.count <= 1 # workaround for current possible env/path ambiguity
|
33
|
+
env_file_path = env_file_paths.first
|
34
|
+
else
|
35
|
+
raise AmbiguousEnvironmentFile.new("More than one file path matched the environment")
|
36
|
+
end
|
37
|
+
hsh = env_file_path ? YAML.load(File.read(env_file_path)).with_indifferent_access : {}
|
38
|
+
(hsh[:configuration] ? hsh[:configuration].merge(opts) : hsh.merge(opts)).with_indifferent_access
|
39
|
+
end
|
40
|
+
|
41
|
+
def environment_files(partial_config)
|
42
|
+
environments = (partial_config || configuration)[:environments].flat_map {|env| ["#{env}.yml", "#{env}.yaml"]}
|
43
|
+
(CONFIG_LOCATIONS * environments.count).zip(environments).map(&:join).select {|path| File.exist?(path) && !File.directory?(path) }
|
44
|
+
end
|
45
|
+
|
46
|
+
def config_file_location
|
47
|
+
(CONFIG_LOCATIONS * CONFIG_FILE_NAMES.count).zip(CONFIG_FILE_NAMES).map(&:join).find {|path| File.exist?(path) && !File.directory?(path) }
|
48
|
+
end
|
49
|
+
|
50
|
+
end
|
51
|
+
end
|
data/lib/ky/deploy_generation.rb
CHANGED
@@ -1,14 +1,13 @@
|
|
1
|
-
|
1
|
+
module KY
|
2
2
|
class DeployGeneration
|
3
|
-
def initialize(
|
4
|
-
@
|
5
|
-
@proc_commands = File.read(
|
3
|
+
def initialize(full_output_dir, project_name, configuration=Configuration.new)
|
4
|
+
@configuration = configuration
|
5
|
+
@proc_commands = File.read(configuration[:procfile_path]).split("\n")
|
6
6
|
.map {|line| line.split(':', 2) }
|
7
7
|
.map {|k, v| [k, ["/bin/bash","-c", v]] }
|
8
8
|
.to_h
|
9
9
|
@full_output_dir = full_output_dir
|
10
|
-
@project_name = project_name ||
|
11
|
-
@current_namespace = current_namespace || instance.configuration[:namespace]
|
10
|
+
@project_name = project_name || configuration[:project_name]
|
12
11
|
@deployment_yaml = read_deployment_yaml
|
13
12
|
end
|
14
13
|
|
@@ -25,11 +24,11 @@ class KY
|
|
25
24
|
end
|
26
25
|
|
27
26
|
private
|
28
|
-
attr_reader :proc_commands, :full_output_dir, :project_name, :
|
27
|
+
attr_reader :proc_commands, :full_output_dir, :project_name, :deployment_yaml, :configuration
|
29
28
|
|
30
29
|
def read_deployment_yaml
|
31
|
-
if
|
32
|
-
File.read(
|
30
|
+
if configuration['deployment']
|
31
|
+
File.read(configuration['deployment'])
|
33
32
|
else
|
34
33
|
File.read(default_deployment_template)
|
35
34
|
end
|
@@ -40,14 +39,19 @@ class KY
|
|
40
39
|
end
|
41
40
|
|
42
41
|
def template_hash(id, command_array)
|
43
|
-
app_name =
|
44
|
-
template_context = Template.context(app_name: app_name, id: id, command_array: command_array)
|
42
|
+
app_name = configuration['app_name'] || "#{project_name}-#{id}"
|
43
|
+
template_context = Template.new(configuration).context(app_name: app_name, id: id, command_array: command_array)
|
45
44
|
tmp = Manipulation.merge_hash(
|
46
45
|
YAML.load(
|
47
46
|
ERB.new(deployment_yaml).result(template_context)
|
48
47
|
),
|
49
|
-
|
48
|
+
deploy_merge(id)
|
50
49
|
)
|
51
50
|
end
|
51
|
+
|
52
|
+
def deploy_merge(id)
|
53
|
+
return {} unless configuration[:merge]
|
54
|
+
configuration[:merge][id].to_h
|
55
|
+
end
|
52
56
|
end
|
53
57
|
end
|
data/lib/ky/env_generation.rb
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
require 'active_support'
|
2
2
|
require 'active_support/core_ext'
|
3
3
|
require 'securerandom'
|
4
|
-
|
4
|
+
module KY
|
5
5
|
class EnvGeneration
|
6
6
|
ConflictingProjectError = Class.new(StandardError)
|
7
7
|
|
@@ -10,14 +10,24 @@ class KY
|
|
10
10
|
define_method(raw_string.underscore) { raw_string }
|
11
11
|
end
|
12
12
|
|
13
|
-
def self.
|
14
|
-
|
13
|
+
def self.env(output, input1, input2)
|
14
|
+
output << generate_env(input1, input2).to_plain_yaml
|
15
|
+
rescue ConflictingProjectError => e
|
16
|
+
$stderr << "Error processing yml files, please provide a config and a secrets file from the same kubernetes project/name"
|
17
|
+
exit(1)
|
15
18
|
end
|
16
19
|
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
20
|
+
def self.generate_env(input1, input2)
|
21
|
+
new(input1, input2).to_h
|
22
|
+
end
|
23
|
+
|
24
|
+
attr_reader :config_hsh, :secret_hsh, :configuration
|
25
|
+
def initialize(input1, input2, configuration = Configuration.new)
|
26
|
+
input_hashes = YAML.load(input1.read).with_indifferent_access, YAML.load(input2.read).with_indifferent_access
|
27
|
+
@configuration = configuration
|
28
|
+
input_hashes.each do |env_hsh|
|
29
|
+
env_hsh[:metadata][:namespace] = configuration[:namespace]
|
30
|
+
end
|
21
31
|
@config_hsh = input_hashes.find {|h| h[kind] == config_map }
|
22
32
|
@secret_hsh = input_hashes.find {|h| h[kind] == secret }
|
23
33
|
raise ConflictingProjectError.new("Config and Secret metadata names do not agree") unless secret_hsh[metadata][name] == project
|
@@ -34,7 +44,7 @@ class KY
|
|
34
44
|
private
|
35
45
|
|
36
46
|
def force_config
|
37
|
-
return [] unless
|
47
|
+
return [] unless configuration[:force_configmap_apply]
|
38
48
|
[inline_env_map(config_map_key_ref, "force-configmap-apply", SecureRandom.hex)]
|
39
49
|
end
|
40
50
|
|
@@ -47,12 +57,12 @@ class KY
|
|
47
57
|
end
|
48
58
|
|
49
59
|
def inline_config?
|
50
|
-
|
60
|
+
configuration[:inline_config]
|
51
61
|
end
|
52
62
|
|
53
63
|
|
54
64
|
def inline_secret?
|
55
|
-
|
65
|
+
configuration[:inline_secret]
|
56
66
|
end
|
57
67
|
|
58
68
|
def inline_env_map(type, kebab_version, env_value)
|
data/lib/ky/manipulation.rb
CHANGED
@@ -1,10 +1,23 @@
|
|
1
1
|
require 'deep_merge/rails_compat'
|
2
|
-
|
2
|
+
module KY
|
3
3
|
module Manipulation
|
4
4
|
DEFAULT_DATA_KEY = 'data'
|
5
5
|
MAGIC_DELIMITER = '@'
|
6
6
|
BASE_64_DETECTION_REGEX = /^([A-Za-z0-9+]{4})*([A-Za-z0-9+]{4}|[A-Za-z0-9+]{3}=|[A-Za-z0-9+]{2}==)$/
|
7
7
|
class << self
|
8
|
+
|
9
|
+
def decode(output, input)
|
10
|
+
output << code_yaml(input, :decode)
|
11
|
+
end
|
12
|
+
|
13
|
+
def encode(output, input)
|
14
|
+
output << code_yaml(input, :encode)
|
15
|
+
end
|
16
|
+
|
17
|
+
def merge(output, input1, input2)
|
18
|
+
output << merge_yaml(input1, input2)
|
19
|
+
end
|
20
|
+
|
8
21
|
def merge_yaml(input1, input2)
|
9
22
|
combined = {}
|
10
23
|
YAML.load(input1.read).tap { |hsh|
|
data/lib/ky/template.rb
CHANGED
@@ -1,19 +1,17 @@
|
|
1
|
-
|
1
|
+
module KY
|
2
2
|
class Template
|
3
|
-
def self.context(hsh)
|
4
|
-
new(hsh).context
|
5
|
-
end
|
6
3
|
|
7
|
-
|
8
|
-
|
9
|
-
@context_hash = hsh
|
4
|
+
def initialize(configuration)
|
5
|
+
define_methods_from_config(configuration)
|
10
6
|
end
|
11
7
|
|
12
|
-
def
|
13
|
-
|
8
|
+
def define_methods_from_config(config)
|
9
|
+
config.keys.each do |key|
|
10
|
+
define_singleton_method(key) { config[key] }
|
11
|
+
end
|
14
12
|
end
|
15
13
|
|
16
|
-
def context
|
14
|
+
def context(context_hash)
|
17
15
|
template_context = binding
|
18
16
|
context_hash.each do |var, value|
|
19
17
|
template_context.local_variable_set(var, value)
|
data/lib/ky/version.rb
CHANGED
@@ -1,3 +1,3 @@
|
|
1
|
-
|
2
|
-
VERSION = "0.4.
|
1
|
+
module KY
|
2
|
+
VERSION = "0.4.2"
|
3
3
|
end
|
data/lib/ky.rb
CHANGED
@@ -3,6 +3,8 @@ require 'base64'
|
|
3
3
|
require 'open-uri'
|
4
4
|
require 'fileutils'
|
5
5
|
require 'pathname'
|
6
|
+
require_relative 'ky/configuration'
|
7
|
+
require_relative 'ky/compilation'
|
6
8
|
require_relative 'ky/manipulation'
|
7
9
|
require_relative 'ky/env_generation'
|
8
10
|
require_relative 'ky/template'
|
@@ -10,7 +12,7 @@ require_relative 'ky/deploy_generation'
|
|
10
12
|
require_relative 'ky/hash'
|
11
13
|
|
12
14
|
|
13
|
-
|
15
|
+
module KY
|
14
16
|
CONFIG_FILE_NAMES = [".ky.yml", ".ky.yaml", "Lubefile"]
|
15
17
|
CONFIG_LOCATIONS = ["#{Dir.pwd}/", "#{Dir.home}/"]
|
16
18
|
DEFAULT_CONFIG = {
|
@@ -27,79 +29,4 @@ class KY
|
|
27
29
|
force_configmap_apply: false
|
28
30
|
}.with_indifferent_access
|
29
31
|
|
30
|
-
attr_reader :opts, :configuration
|
31
|
-
|
32
|
-
def initialize(opts={})
|
33
|
-
@opts=opts
|
34
|
-
@configuration = build_configuration
|
35
|
-
define_methods_from_config(configuration)
|
36
|
-
end
|
37
|
-
|
38
|
-
def decode(output, input)
|
39
|
-
output << Manipulation.code_yaml(input, :decode)
|
40
|
-
end
|
41
|
-
|
42
|
-
def encode(output, input)
|
43
|
-
output << Manipulation.code_yaml(input, :encode)
|
44
|
-
end
|
45
|
-
|
46
|
-
def merge(output, input1, input2)
|
47
|
-
output << Manipulation.merge_yaml(input1, input2)
|
48
|
-
end
|
49
|
-
|
50
|
-
def env(output, input1, input2)
|
51
|
-
output << EnvGeneration.generate_env(self, input1, input2).to_plain_yaml
|
52
|
-
rescue KY::EnvGeneration::ConflictingProjectError => e
|
53
|
-
$stderr << "Error processing yml files, please provide a config and a secrets file from the same kubernetes project/name"
|
54
|
-
exit(1)
|
55
|
-
end
|
56
|
-
|
57
|
-
def compile(proc_path, env1path, env2path, base_output_dir)
|
58
|
-
full_output_dir = Pathname.new(base_output_dir).join(configuration[:environment].to_s).to_s
|
59
|
-
FileUtils.mkdir_p(full_output_dir)
|
60
|
-
env_obj = EnvGeneration.new(self, env1path, env2path)
|
61
|
-
deploys_hash = DeployGeneration.new(self, proc_path, full_output_dir, env_obj.project, configuration[:namespace]).to_h
|
62
|
-
deploys_hash.each do |file_path, deploy_hash|
|
63
|
-
File.write(file_path, Manipulation.merge_hash(deploy_hash, env_obj.to_h).to_plain_yaml)
|
64
|
-
end
|
65
|
-
Manipulation.write_configs_encode_if_needed(env_obj.config_hsh, env_obj.secret_hsh, full_output_dir, configuration[:project_name])
|
66
|
-
end
|
67
|
-
|
68
|
-
def build_configuration
|
69
|
-
config = if config_file_location
|
70
|
-
YAML.load(File.read(config_file_location))
|
71
|
-
else
|
72
|
-
DEFAULT_CONFIG
|
73
|
-
end.with_indifferent_access
|
74
|
-
config.merge!(current_environment_hash(config))
|
75
|
-
config
|
76
|
-
end
|
77
|
-
|
78
|
-
def deploy_merge(id)
|
79
|
-
return {} unless configuration[:merge]
|
80
|
-
configuration[:merge][id].to_h
|
81
|
-
end
|
82
|
-
|
83
|
-
def current_environment_hash(partial_config)
|
84
|
-
current_config = partial_config || configuration
|
85
|
-
env_file_path = environment_files(current_config).find {|file| file.match(opts[:environment] || current_config[:environment]) } if opts[:environment] || current_config[:environment] # ugh, this find is accident waiting to happen, REFACTOR/RETHINK!
|
86
|
-
hsh = env_file_path ? YAML.load(File.read(env_file_path)).with_indifferent_access : {}
|
87
|
-
(hsh[:configuration] ? hsh[:configuration].merge(opts) : hsh.merge(opts)).with_indifferent_access
|
88
|
-
end
|
89
|
-
|
90
|
-
def environment_files(partial_config)
|
91
|
-
environments = (partial_config || configuration)[:environments].flat_map {|env| ["#{env}.yml", "#{env}.yaml"]}
|
92
|
-
(CONFIG_LOCATIONS * environments.count).zip(environments).map(&:join).select {|path| File.exist?(path) && !File.directory?(path) }
|
93
|
-
end
|
94
|
-
|
95
|
-
def config_file_location
|
96
|
-
(CONFIG_LOCATIONS * CONFIG_FILE_NAMES.count).zip(CONFIG_FILE_NAMES).map(&:join).find {|path| File.exist?(path) && !File.directory?(path) }
|
97
|
-
end
|
98
|
-
|
99
|
-
def define_methods_from_config(config)
|
100
|
-
config.keys.each do |key|
|
101
|
-
Template.send(:define_method, key) { config[key] }
|
102
|
-
end
|
103
|
-
end
|
104
|
-
|
105
32
|
end
|
data/spec/ky_bin_spec.rb
CHANGED
@@ -64,11 +64,14 @@ describe "ky cli" do
|
|
64
64
|
describe "primary cli command generates and" do
|
65
65
|
let(:instance) { KY.new }
|
66
66
|
let(:fake_tag) { 'fake_tag' }
|
67
|
+
let(:fake_namespace) { 'fake_namespace' }
|
67
68
|
let(:tmpdir) { 'spec/support/tmpdir' }
|
68
69
|
after { `rm -r #{tmpdir}` }
|
69
70
|
describe "compiles Procfile and env secrets/configs into entire deployments" do
|
70
71
|
it "to directory" do
|
71
|
-
KY::Cli.new
|
72
|
+
instance = KY::Cli.new
|
73
|
+
instance.options = {procfile_path: 'spec/support/Procfile'}
|
74
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
72
75
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
73
76
|
expect(File.exists?("#{tmpdir}/worker.deployment.yml")).to be true
|
74
77
|
expect(File.exists?("#{tmpdir}/jobs.deployment.yml")).to be true
|
@@ -78,7 +81,8 @@ describe "ky cli" do
|
|
78
81
|
describe "encodes secrets.yml when compiling from Procfile without image_tag" do
|
79
82
|
it "to directory" do
|
80
83
|
instance = KY::Cli.new
|
81
|
-
instance.
|
84
|
+
instance.options = {procfile_path: 'spec/support/Procfile'}
|
85
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
82
86
|
expect(File.exists?("#{tmpdir}/global.secret.yml")).to be true
|
83
87
|
YAML.load(File.read("#{tmpdir}/global.secret.yml"))['data'].each do |_k, v|
|
84
88
|
expect(v).to match(KY::Manipulation::BASE_64_DETECTION_REGEX)
|
@@ -89,8 +93,8 @@ describe "ky cli" do
|
|
89
93
|
describe "encodes secrets.yml when compiling from Procfile with image_tag" do
|
90
94
|
it "to directory" do
|
91
95
|
instance = KY::Cli.new
|
92
|
-
instance.options = {image_tag: fake_tag}
|
93
|
-
instance.compile('spec/support/
|
96
|
+
instance.options = {image_tag: fake_tag, procfile_path: 'spec/support/Procfile'}
|
97
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
94
98
|
expect(File.exists?("#{tmpdir}/global.secret.yml")).to be true
|
95
99
|
YAML.load(File.read("#{tmpdir}/global.secret.yml"))['data'].each do |_k, v|
|
96
100
|
expect(v).to match(KY::Manipulation::BASE_64_DETECTION_REGEX)
|
@@ -101,8 +105,8 @@ describe "ky cli" do
|
|
101
105
|
describe "uses image_tag when passed in as option" do
|
102
106
|
it "to directory" do
|
103
107
|
instance = KY::Cli.new
|
104
|
-
instance.options = {image_tag: fake_tag}
|
105
|
-
instance.compile('spec/support/
|
108
|
+
instance.options = {image_tag: fake_tag, procfile_path: 'spec/support/Procfile'}
|
109
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
106
110
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
107
111
|
expect(File.read("#{tmpdir}/web.deployment.yml")).to match(fake_tag)
|
108
112
|
end
|
@@ -111,10 +115,10 @@ describe "ky cli" do
|
|
111
115
|
describe "uses namespace when passed in as option" do
|
112
116
|
it "to directory" do
|
113
117
|
instance = KY::Cli.new
|
114
|
-
instance.options = {namespace:
|
115
|
-
instance.compile('spec/support/
|
118
|
+
instance.options = {namespace: fake_namespace, procfile_path: 'spec/support/Procfile'}
|
119
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
116
120
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
117
|
-
expect(File.read("#{tmpdir}/web.deployment.yml")).to match(
|
121
|
+
expect(File.read("#{tmpdir}/web.deployment.yml")).to match(fake_namespace)
|
118
122
|
end
|
119
123
|
end
|
120
124
|
|
@@ -123,7 +127,8 @@ describe "ky cli" do
|
|
123
127
|
after { `rm Lubefile` }
|
124
128
|
it "to directory" do
|
125
129
|
instance = KY::Cli.new
|
126
|
-
instance.
|
130
|
+
instance.options = {procfile_path: 'spec/support/Procfile'}
|
131
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
127
132
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
128
133
|
expect(File.exists?("#{tmpdir}/jobs.deployment.yml")).to be true
|
129
134
|
expect(File.read("#{tmpdir}/web.deployment.yml")).to match('port')
|
@@ -136,7 +141,7 @@ describe "ky cli" do
|
|
136
141
|
after { `rm Lubefile` }
|
137
142
|
it "to directory" do
|
138
143
|
instance = KY::Cli.new
|
139
|
-
instance.compile('spec/support/
|
144
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
140
145
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
141
146
|
expect(File.read("#{tmpdir}/web.deployment.yml")).not_to match('HashWithIndifferentAccess')
|
142
147
|
end
|
@@ -147,13 +152,33 @@ describe "ky cli" do
|
|
147
152
|
after { `rm Lubefile` }
|
148
153
|
it "to directory" do
|
149
154
|
instance = KY::Cli.new
|
150
|
-
instance.options = {force_configmap_apply: true}
|
151
|
-
instance.compile('spec/support/
|
155
|
+
instance.options = {procfile_path: 'spec/support/Procfile', force_configmap_apply: true}
|
156
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
152
157
|
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
153
158
|
expect(File.read("#{tmpdir}/web.deployment.yml")).to match('FORCE_CONFIGMAP_APPLY')
|
154
159
|
end
|
155
160
|
end
|
156
161
|
|
162
|
+
describe "applies namespace to generated" do
|
163
|
+
|
164
|
+
before do
|
165
|
+
instance = KY::Cli.new
|
166
|
+
instance.options = {namespace: fake_namespace, procfile_path: 'spec/support/Procfile'}
|
167
|
+
instance.compile('spec/support/config.yml', 'spec/support/decoded.yml', tmpdir)
|
168
|
+
end
|
169
|
+
|
170
|
+
it "configmaps" do
|
171
|
+
expect(File.exists?("#{tmpdir}/global.configmap.yml")).to be true
|
172
|
+
expect(YAML.load(File.read("#{tmpdir}/global.configmap.yml"))['metadata']['namespace']).to match(fake_namespace)
|
173
|
+
end
|
174
|
+
|
175
|
+
it "deployments" do
|
176
|
+
expect(File.exists?("#{tmpdir}/web.deployment.yml")).to be true
|
177
|
+
expect(YAML.load(File.read("#{tmpdir}/web.deployment.yml"))['metadata']['namespace']).to match(fake_namespace)
|
178
|
+
end
|
179
|
+
|
180
|
+
end
|
181
|
+
|
157
182
|
end
|
158
183
|
end
|
159
184
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: ky
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Brian Glusman
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-
|
11
|
+
date: 2016-11-01 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rspec
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - "~>"
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0.19'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ">="
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '3.0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ">="
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '3.0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: deep_merge
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|
@@ -88,6 +102,8 @@ files:
|
|
88
102
|
- ky.gemspec
|
89
103
|
- lib/ky.rb
|
90
104
|
- lib/ky/cli.rb
|
105
|
+
- lib/ky/compilation.rb
|
106
|
+
- lib/ky/configuration.rb
|
91
107
|
- lib/ky/deploy_generation.rb
|
92
108
|
- lib/ky/env_generation.rb
|
93
109
|
- lib/ky/hash.rb
|