configgin 0.17.0 → 0.18.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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: aa8713f79b21460455aa6549b7058438b92e8d58
4
- data.tar.gz: fc456cd39b9983f7c03bf3ab3190de6df98f5ea2
3
+ metadata.gz: 2fd6e663cebb90b482b7d3672a7247c0045c0f03
4
+ data.tar.gz: c3d44b7a474628a4ee744779a0e266ce600efa97
5
5
  SHA512:
6
- metadata.gz: f5ea0526b57743572c06ac2ced4a24973daacd1c12e4fefc2d2a3d446b762875a6af8c81f704ba1a10a00423bd96aeea1efd0ecf277b78b53442a66f618f7da7
7
- data.tar.gz: f3b3cff5cb6698e8a84bbd7db304fc1d16b837d9fed62dc34c9adc623713602220d26efb35671c8defb8ffe9340e7f488f98d8802dfdbfa8580e7fe465d6f802
6
+ metadata.gz: 50fc06f1a221322027a8b8e8a3765efbeefe072e1c7496362cee129ea2c09d2e57ab9bffeb079f688f9fd4b0ad0e3e88134d4e21fcbf263ec43730d6e6bc6648
7
+ data.tar.gz: f5994ae6ef79a9e97f0466ced1e8c1c8f4b5bff0fa457be66359a3904fc090c51848238a9530927f659ebe41677108e7774bfb62bf1f47ee8ee1678e61989fc1
data/.ruby-version CHANGED
@@ -1 +1 @@
1
- 2.1.7
1
+ 2.3.1
data/Gemfile CHANGED
@@ -5,4 +5,6 @@ gemspec
5
5
  group :test do
6
6
  gem 'rspec'
7
7
  gem 'rubocop'
8
+ gem 'guard'
9
+ gem 'guard-rspec'
8
10
  end
data/Gemfile.lock CHANGED
@@ -1,7 +1,7 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- configgin (0.17.0)
4
+ configgin (0.18.0)
5
5
  bosh-template (~> 2.0)
6
6
  deep_merge (~> 1.1)
7
7
  kubeclient (~> 2.0)
@@ -13,13 +13,30 @@ GEM
13
13
  specs:
14
14
  addressable (2.5.2)
15
15
  public_suffix (>= 2.0.2, < 4.0)
16
- ast (2.3.0)
16
+ ast (2.4.0)
17
17
  bosh-template (2.2.0)
18
18
  semi_semantic (~> 1.2.0)
19
+ coderay (1.1.2)
19
20
  deep_merge (1.2.1)
20
21
  diff-lcs (1.3)
21
22
  domain_name (0.5.20180417)
22
23
  unf (>= 0.0.5, < 1.0.0)
24
+ ffi (1.9.25)
25
+ formatador (0.2.5)
26
+ guard (2.14.2)
27
+ formatador (>= 0.2.4)
28
+ listen (>= 2.7, < 4.0)
29
+ lumberjack (>= 1.0.12, < 2.0)
30
+ nenv (~> 0.1)
31
+ notiffany (~> 0.0)
32
+ pry (>= 0.9.12)
33
+ shellany (~> 0.0)
34
+ thor (>= 0.18.1)
35
+ guard-compat (1.2.1)
36
+ guard-rspec (4.7.3)
37
+ guard (~> 2.1)
38
+ guard-compat (~> 1.1)
39
+ rspec (>= 2.99.0, < 4.0)
23
40
  http (2.2.2)
24
41
  addressable (~> 2.3)
25
42
  http-cookie (~> 1.0)
@@ -29,51 +46,75 @@ GEM
29
46
  domain_name (~> 0.5)
30
47
  http-form_data (1.0.3)
31
48
  http_parser.rb (0.6.0)
49
+ jaro_winkler (1.5.1)
32
50
  kubeclient (2.5.2)
33
51
  http (>= 0.98, < 3)
34
52
  recursive-open-struct (~> 1.0.0)
35
53
  rest-client
54
+ listen (3.1.5)
55
+ rb-fsevent (~> 0.9, >= 0.9.4)
56
+ rb-inotify (~> 0.9, >= 0.9.7)
57
+ ruby_dep (~> 1.2)
58
+ lumberjack (1.0.13)
59
+ method_source (0.9.0)
36
60
  mime-types (3.2.2)
37
61
  mime-types-data (~> 3.2015)
38
62
  mime-types-data (3.2018.0812)
39
63
  mustache (1.0.5)
64
+ nenv (0.3.0)
40
65
  netrc (0.11.0)
41
- parser (2.4.0.0)
42
- ast (~> 2.2)
43
- powerpack (0.1.1)
66
+ notiffany (0.1.1)
67
+ nenv (~> 0.1)
68
+ shellany (~> 0.0)
69
+ parallel (1.12.1)
70
+ parser (2.5.1.2)
71
+ ast (~> 2.4.0)
72
+ powerpack (0.1.2)
73
+ pry (0.11.3)
74
+ coderay (~> 1.1.0)
75
+ method_source (~> 0.9.0)
44
76
  public_suffix (3.0.3)
45
- rainbow (2.1.0)
46
- rake (10.4.2)
77
+ rainbow (2.2.2)
78
+ rake
79
+ rake (10.5.0)
80
+ rb-fsevent (0.10.3)
81
+ rb-inotify (0.9.10)
82
+ ffi (>= 0.5.0, < 2)
47
83
  recursive-open-struct (1.0.5)
48
84
  rest-client (2.0.2)
49
85
  http-cookie (>= 1.0.2, < 2.0)
50
86
  mime-types (>= 1.16, < 4.0)
51
87
  netrc (~> 0.8)
52
- rspec (3.5.0)
53
- rspec-core (~> 3.5.0)
54
- rspec-expectations (~> 3.5.0)
55
- rspec-mocks (~> 3.5.0)
56
- rspec-core (3.5.4)
57
- rspec-support (~> 3.5.0)
58
- rspec-expectations (3.5.0)
88
+ rspec (3.8.0)
89
+ rspec-core (~> 3.8.0)
90
+ rspec-expectations (~> 3.8.0)
91
+ rspec-mocks (~> 3.8.0)
92
+ rspec-core (3.8.0)
93
+ rspec-support (~> 3.8.0)
94
+ rspec-expectations (3.8.1)
59
95
  diff-lcs (>= 1.2.0, < 2.0)
60
- rspec-support (~> 3.5.0)
61
- rspec-mocks (3.5.0)
96
+ rspec-support (~> 3.8.0)
97
+ rspec-mocks (3.8.0)
62
98
  diff-lcs (>= 1.2.0, < 2.0)
63
- rspec-support (~> 3.5.0)
64
- rspec-support (3.5.0)
65
- rubocop (0.48.1)
66
- parser (>= 2.3.3.1, < 3.0)
99
+ rspec-support (~> 3.8.0)
100
+ rspec-support (3.8.0)
101
+ rubocop (0.59.2)
102
+ jaro_winkler (~> 1.5.1)
103
+ parallel (~> 1.10)
104
+ parser (>= 2.5, != 2.5.1.1)
67
105
  powerpack (~> 0.1)
68
- rainbow (>= 1.99.1, < 3.0)
106
+ rainbow (>= 2.2.2, < 4.0)
69
107
  ruby-progressbar (~> 1.7)
70
108
  unicode-display_width (~> 1.0, >= 1.0.1)
71
- ruby-progressbar (1.8.1)
109
+ ruby-progressbar (1.10.0)
110
+ ruby_dep (1.5.0)
72
111
  semi_semantic (1.2.0)
112
+ shellany (0.0.1)
113
+ thor (0.20.0)
73
114
  unf (0.1.4)
74
115
  unf_ext
75
116
  unf_ext (0.0.7.5)
76
- unicode-display_width (1.2.1)
117
+ unicode-display_width (1.4.0)
77
118
 
78
119
  PLATFORMS
79
120
  ruby
@@ -81,9 +122,11 @@ PLATFORMS
81
122
  DEPENDENCIES
82
123
  bundler (~> 1.10)
83
124
  configgin!
125
+ guard
126
+ guard-rspec
84
127
  rake (~> 10.0)
85
128
  rspec
86
129
  rubocop
87
130
 
88
131
  BUNDLED WITH
89
- 1.16.1
132
+ 1.16.4
data/Guardfile ADDED
@@ -0,0 +1,14 @@
1
+ guard :rspec, cmd: "bundle exec rspec" do
2
+ require "guard/rspec/dsl"
3
+ dsl = Guard::RSpec::Dsl.new(self)
4
+
5
+ # RSpec files
6
+ rspec = dsl.rspec
7
+ watch(rspec.spec_helper) { rspec.spec_dir }
8
+ watch(rspec.spec_support) { rspec.spec_dir }
9
+ watch(rspec.spec_files)
10
+
11
+ # Ruby files
12
+ ruby = dsl.ruby
13
+ dsl.watch_spec_files_for(ruby.lib_files)
14
+ end
data/bin/configgin CHANGED
@@ -15,68 +15,4 @@ rescue ArgMissingError => e
15
15
  exit(1)
16
16
  end
17
17
 
18
- job_configs = JSON.parse(File.read(options[:jobs]))
19
- templates = YAML.load_file(options[:env2conf])
20
-
21
- # SVC_ACC_PATH is the location of the service account secrets
22
- SVC_ACC_PATH = '/var/run/secrets/kubernetes.io/serviceaccount'.freeze
23
-
24
- kube_client = Kubeclient::Client.new(
25
- URI::HTTPS.build(host: ENV['KUBERNETES_SERVICE_HOST'],
26
- port: ENV['KUBERNETES_SERVICE_PORT_HTTPS']),
27
- 'v1',
28
- ssl_options: {
29
- ca_file: "#{SVC_ACC_PATH}/ca.crt",
30
- verify_ssl: OpenSSL::SSL::VERIFY_PEER
31
- },
32
- auth_options: {
33
- bearer_token: File.read("#{SVC_ACC_PATH}/token")
34
- }
35
- )
36
- kube_client_stateful_set = Kubeclient::Client.new(
37
- URI::HTTPS.build(host: ENV['KUBERNETES_SERVICE_HOST'],
38
- port: ENV['KUBERNETES_SERVICE_PORT_HTTPS'],
39
- path: '/apis/apps'),
40
- 'v1beta1',
41
- ssl_options: {
42
- ca_file: "#{SVC_ACC_PATH}/ca.crt",
43
- verify_ssl: OpenSSL::SSL::VERIFY_PEER
44
- },
45
- auth_options: {
46
- bearer_token: File.read("#{SVC_ACC_PATH}/token")
47
- }
48
- )
49
- kube_namespace = File.read("#{SVC_ACC_PATH}/namespace")
50
-
51
- jobs = {}
52
- job_configs.each do |job, job_config|
53
- base_config = JSON.parse(File.read(job_config['base']))
54
-
55
- begin
56
- bosh_spec = EnvironmentConfigTransmogrifier.transmogrify(base_config,
57
- templates,
58
- secrets: '/etc/secrets')
59
- rescue NonHashValueOverride => e
60
- STDERR.puts e.to_s
61
- STDERR.puts "Error generating #{job}: #{outfile} from #{infile}"
62
- exit 1
63
- end
64
-
65
- jobs[job] = Job.new(bosh_spec, kube_namespace, kube_client, kube_client_stateful_set)
66
- end
67
-
68
- jobs.each do |name, job|
69
- kube_client.patch_pod(
70
- ENV['HOSTNAME'],
71
- { metadata: { annotations: { :"skiff-exported-properties-#{name}" => job.exported_properties.to_json } } },
72
- kube_namespace
73
- )
74
- end
75
-
76
- jobs.each do |job_name, job|
77
- dns_encoder = KubeDNSEncoder.new(job.spec['links'])
78
-
79
- job_configs[job_name]['files'].each do |infile, outfile|
80
- job.generate(infile, outfile, dns_encoder)
81
- end
82
- end
18
+ Configgin.new(options).run
@@ -0,0 +1,31 @@
1
+ # BaseTransmogrifier holds shared code for the transmogrifier classes
2
+ class BaseTransmogrifier
3
+ def self.inject_value(hash, key_grams, value, original_key)
4
+ # if we only have 1 gram, we can set the value
5
+ if key_grams.size == 1
6
+ # If the new value is nil, and the old value was a hash, it's because
7
+ # somebody didn't provide a full default value; ignore it.
8
+ unless value.nil? && hash[key_grams[0]].is_a?(Hash)
9
+ hash[key_grams[0]] = value
10
+ end
11
+ return
12
+ end
13
+
14
+ # if there's more than one gram, keep going
15
+
16
+ # Initialize a hash if we're going deeper than what's currently available;
17
+ # sometimes we want to override when the old value is nil (i.e. no default)
18
+ # but the new value is a hash.
19
+ hash[key_grams[0]] = {} if hash[key_grams[0]].nil?
20
+ # error out if we're trying to override
21
+ # an existing value that's not a hash
22
+ unless hash[key_grams[0]].is_a?(Hash)
23
+ raise NonHashValueOverride, \
24
+ "Refusing to override non-hash value #{hash[key_grams[0]].inspect} " \
25
+ "with #{value.inspect}: '#{key_grams.join('.')}'" \
26
+ " - Complete key: '#{original_key}'"
27
+ end
28
+ # keep going deeper
29
+ inject_value(hash[key_grams[0]], key_grams.drop(1), value, original_key)
30
+ end
31
+ end
@@ -0,0 +1,40 @@
1
+ require 'yaml'
2
+
3
+ # BoshDeploymentManifest is used to parse BOSH manifests
4
+ class BoshDeploymentManifest
5
+ def initialize(path)
6
+ @manifest = YAML.load_file(path)
7
+ end
8
+
9
+ def properties_for_instance_group(instance_group_name)
10
+ return @properties[instance_group] if @properties && @properties[instance_group]
11
+
12
+ instance_group = @manifest['instance_groups'].find { |group| group['name'] == instance_group_name }
13
+ return [] unless instance_group
14
+
15
+ properties = {}
16
+ instance_group['jobs'].each do |job|
17
+ next unless job.key?('properties')
18
+
19
+ job['properties'].each do |key, value|
20
+ inject_properties(properties, job, key, value)
21
+ end
22
+ end
23
+
24
+ @properties ||= {}
25
+ @properties[instance_group] = properties
26
+ end
27
+
28
+ private
29
+
30
+ def inject_properties(properties, job, key, value)
31
+ case value
32
+ when Hash
33
+ value.each do |sub_key, sub_value|
34
+ inject_properties(properties, job, "#{key}.#{sub_key}", sub_value)
35
+ end
36
+ else
37
+ properties["#{job['name']}.#{key}"] = value
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,13 @@
1
+ require_relative 'base_transmogrifier'
2
+
3
+ # BoshDeploymentManifestConfigTransmogrifier extracts property values from a bosh
4
+ # manifest and updates the config accordingly.
5
+ class BoshDeploymentManifestConfigTransmogrifier < BaseTransmogrifier
6
+ def self.transmogrify(base_config, instance_group, bosh_deployment_manifest)
7
+ bosh_deployment_manifest.properties_for_instance_group(instance_group).each do |key, value|
8
+ full_key = 'properties.' + key
9
+ inject_value(base_config, full_key.split('.'), value, full_key)
10
+ end
11
+ base_config
12
+ end
13
+ end
data/lib/cli.rb CHANGED
@@ -34,6 +34,11 @@ module Cli
34
34
  options[:env2conf] = e
35
35
  end
36
36
 
37
+ # Bosh deployment manifest
38
+ opts.on('-b', '--bosh-deployment-manifest', 'Bosh deployment manifest') do |b|
39
+ options[:bosh_deployment_manifest] = b
40
+ end
41
+
37
42
  opts.on('--version', 'Print the configgin version') do
38
43
  puts Configgin::VERSION
39
44
  exit 0
data/lib/configgin.rb CHANGED
@@ -1,4 +1,112 @@
1
1
  require_relative 'cli'
2
2
  require_relative 'job'
3
3
  require_relative 'environment_config_transmogrifier'
4
+ require_relative 'bosh_deployment_manifest_config_transmogrifier'
4
5
  require_relative 'kube_link_generator'
6
+ require_relative 'bosh_deployment_manifest'
7
+
8
+ # Configgin is the main class which puts all the pieces together and configures
9
+ # the container according to the options.
10
+ class Configgin
11
+ # SVC_ACC_PATH is the location of the service account secrets
12
+ SVC_ACC_PATH = '/var/run/secrets/kubernetes.io/serviceaccount'.freeze
13
+
14
+ def initialize(options)
15
+ @job_configs = JSON.parse(File.read(options[:jobs]))
16
+ @templates = YAML.load_file(options[:env2conf])
17
+ @bosh_deployment_manifest = options[:bosh_deployment_manifest]
18
+ end
19
+
20
+ def run
21
+ jobs = generate_jobs(@job_configs, @templates)
22
+ set_job_metadata(jobs)
23
+ render_job_templates(jobs, @job_configs)
24
+ end
25
+
26
+ def generate_jobs(job_configs, templates)
27
+ jobs = {}
28
+ job_configs.each do |job, job_config|
29
+ base_config = JSON.parse(File.read(job_config['base']))
30
+
31
+ begin
32
+ bosh_spec = EnvironmentConfigTransmogrifier.transmogrify(base_config, templates, secrets: '/etc/secrets')
33
+
34
+ if @bosh_deployment_manifest
35
+ manifest = BoshDeploymentManifest.new(@bosh_deployment_manifest)
36
+ bosh_spec = BoshDeploymentManifestConfigTransmogrifier.transmogrify(bosh_spec, ENV['HOSTNAME'], manifest)
37
+ end
38
+ rescue NonHashValueOverride => e
39
+ STDERR.puts e.to_s
40
+ STDERR.puts "Error generating #{job}: #{outfile} from #{infile}"
41
+ exit 1
42
+ end
43
+
44
+ jobs[job] = Job.new(bosh_spec, @kube_namespace, kube_client, kube_client_stateful_set)
45
+ end
46
+ end
47
+
48
+ def set_job_metadata(jobs)
49
+ jobs.each do |name, job|
50
+ kube_client.patch_pod(
51
+ ENV['HOSTNAME'],
52
+ { metadata: { annotations: { :"skiff-exported-properties-#{name}" => job.exported_properties.to_json } } },
53
+ @kube_namespace
54
+ )
55
+ end
56
+ end
57
+
58
+ def render_job_templates(jobs, job_configs)
59
+ jobs.each do |job_name, job|
60
+ dns_encoder = KubeDNSEncoder.new(job.spec['links'])
61
+
62
+ job_configs[job_name]['files'].each do |infile, outfile|
63
+ job.generate(infile, outfile, dns_encoder)
64
+ end
65
+ end
66
+ end
67
+
68
+ def kube_namespace
69
+ @kube_namespace ||= File.read("#{SVC_ACC_PATH}/namespace")
70
+ end
71
+
72
+ def kube_token
73
+ @kube_token ||= File.read("#{SVC_ACC_PATH}/token")
74
+ end
75
+
76
+ private
77
+
78
+ def kube_client
79
+ @kube_client ||= Kubeclient::Client.new(
80
+ URI::HTTPS.build(
81
+ host: ENV['KUBERNETES_SERVICE_HOST'],
82
+ port: ENV['KUBERNETES_SERVICE_PORT_HTTPS']
83
+ ),
84
+ 'v1',
85
+ ssl_options: {
86
+ ca_file: "#{SVC_ACC_PATH}/ca.crt",
87
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER
88
+ },
89
+ auth_options: {
90
+ bearer_token: kube_token
91
+ }
92
+ )
93
+ end
94
+
95
+ def kube_client_stateful_set
96
+ @kube_client_stateful_set ||= Kubeclient::Client.new(
97
+ URI::HTTPS.build(
98
+ host: ENV['KUBERNETES_SERVICE_HOST'],
99
+ port: ENV['KUBERNETES_SERVICE_PORT_HTTPS'],
100
+ path: '/apis/apps'
101
+ ),
102
+ 'v1beta1',
103
+ ssl_options: {
104
+ ca_file: "#{SVC_ACC_PATH}/ca.crt",
105
+ verify_ssl: OpenSSL::SSL::VERIFY_PEER
106
+ },
107
+ auth_options: {
108
+ bearer_token: kube_token
109
+ }
110
+ )
111
+ end
112
+ end
@@ -1,3 +1,3 @@
1
- module Configgin
2
- VERSION = '0.17.0'.freeze
1
+ class Configgin
2
+ VERSION = '0.18.0'.freeze
3
3
  end
@@ -1,10 +1,13 @@
1
1
  require 'yaml'
2
2
  require 'mustache'
3
3
  require 'shellwords'
4
+ require 'tmpdir'
5
+
6
+ require_relative 'base_transmogrifier'
4
7
 
5
8
  # EnvironmentConfigTransmogrifier uses environment variables to generate config values
6
9
  # for specific keys.
7
- module EnvironmentConfigTransmogrifier
10
+ class EnvironmentConfigTransmogrifier < BaseTransmogrifier
8
11
  @@memoize_mustache = {}
9
12
 
10
13
  # NoEscapeMustache does not escape these characters: & \ " < > '
@@ -98,33 +101,4 @@ module EnvironmentConfigTransmogrifier
98
101
  hash[key.upcase.tr('-', '_')] = value
99
102
  end
100
103
  end
101
-
102
- def self.inject_value(hash, key_grams, value, original_key)
103
- # if we only have 1 gram, we can set the value
104
- if key_grams.size == 1
105
- # If the new value is nil, and the old value was a hash, it's because
106
- # somebody didn't provide a full default value; ignore it.
107
- unless value.nil? && hash[key_grams[0]].is_a?(Hash)
108
- hash[key_grams[0]] = value
109
- end
110
- return
111
- end
112
-
113
- # if there's more than one gram, keep going
114
-
115
- # Initialize a hash if we're going deeper than what's currently available;
116
- # sometimes we want to override when the old value is nil (i.e. no default)
117
- # but the new value is a hash.
118
- hash[key_grams[0]] = {} if hash[key_grams[0]].nil?
119
- # error out if we're trying to override
120
- # an existing value that's not a hash
121
- unless hash[key_grams[0]].is_a?(Hash)
122
- raise NonHashValueOverride, \
123
- "Refusing to override non-hash value #{hash[key_grams[0]].inspect} " \
124
- "with #{value.inspect}: '#{key_grams.join('.')}'" \
125
- " - Complete key: '#{original_key}'"
126
- end
127
- # keep going deeper
128
- inject_value(hash[key_grams[0]], key_grams.drop(1), value, original_key)
129
- end
130
104
  end
data/lib/job.rb CHANGED
@@ -11,7 +11,7 @@ class Job
11
11
  links = @spec['links'] = KubeLinkSpecs.new(@spec, @namespace, @client, client_stateful_set)
12
12
 
13
13
  # Figure out whether _this_ should bootstrap
14
- pods = @client.get_pods(namespace: @namespace, label_selector: "skiff-role-name=#{self_role}")
14
+ pods = @client.get_pods(namespace: @namespace, label_selector: "app.kubernetes.io/component=#{self_role}")
15
15
  pods_per_image = links.get_pods_per_image(pods)
16
16
  @spec['bootstrap'] = pods_per_image[self_pod.metadata.uid] < 2
17
17
  end
@@ -41,7 +41,7 @@ class Job
41
41
  end
42
42
 
43
43
  def self_role
44
- self_pod['metadata']['labels']['skiff-role-name']
44
+ self_pod['metadata']['labels']['app.kubernetes.io/component']
45
45
  end
46
46
 
47
47
  # Process the given template using a provided spec and output filename
@@ -37,7 +37,7 @@ class KubeLinkSpecs
37
37
  end
38
38
 
39
39
  def _get_pods_for_role(role_name)
40
- client.get_pods(namespace: namespace, label_selector: "skiff-role-name=#{role_name}")
40
+ client.get_pods(namespace: namespace, label_selector: "app.kubernetes.io/component=#{role_name}")
41
41
  end
42
42
 
43
43
  def get_pods_for_role(role_name, job, options = {})
@@ -20,7 +20,7 @@ if [ "$(uname)" == "Darwin" ]; then
20
20
  --workdir ${WORK_DIR} \
21
21
  --entrypoint bash \
22
22
  ${DOCKER_RUNTIME} \
23
- -l -c "export RBENV_VERSION=2.1.7 && ${BASH_SOURCE[1]}"
23
+ -l -c "${BASH_SOURCE[1]}"
24
24
 
25
25
  exit
26
26
  fi
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: configgin
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.17.0
4
+ version: 0.18.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - SUSE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2018-09-11 00:00:00.000000000 Z
11
+ date: 2018-10-04 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -132,6 +132,7 @@ files:
132
132
  - ".ruby-version"
133
133
  - Gemfile
134
134
  - Gemfile.lock
135
+ - Guardfile
135
136
  - LICENSE.md
136
137
  - Makefile
137
138
  - NOTICE
@@ -139,6 +140,9 @@ files:
139
140
  - bin/configgin
140
141
  - bin/setup
141
142
  - configgin.gemspec
143
+ - lib/base_transmogrifier.rb
144
+ - lib/bosh_deployment_manifest.rb
145
+ - lib/bosh_deployment_manifest_config_transmogrifier.rb
142
146
  - lib/cli.rb
143
147
  - lib/configgin.rb
144
148
  - lib/configgin/version.rb
@@ -177,7 +181,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
177
181
  version: '0'
178
182
  requirements: []
179
183
  rubyforge_project:
180
- rubygems_version: 2.2.5
184
+ rubygems_version: 2.6.13
181
185
  signing_key:
182
186
  specification_version: 4
183
187
  summary: A simple cli app in Ruby to generate configurations using BOSH ERB templates