configgin 0.12.0 → 0.12.1

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: fe55c1b8c9250ee1bbcf96d1463e1068947fe63c
4
- data.tar.gz: a714834718cd1df992611bcb9e01ba9e2f0ecd73
3
+ metadata.gz: 0a14ee686893a48901c83384fa342249dabd5ece
4
+ data.tar.gz: 2f3ace7fcc6446438e0696c7c71e9593ac838437
5
5
  SHA512:
6
- metadata.gz: 9e1065338f5f08a1b7a25a0fe2d257d0caace026a9cccb88bdb2eef543ae7a6ad49df06df2d7d664ce56ac8b2d5d098b4ea271a91999121b8d50122b62b2f422
7
- data.tar.gz: 1caa910bd41c49f26384fc2b388e1fab57d7855c4e4c7a82e794abb8d8dc7ca57358e22e7999fd25cf994469ecca3cc6e63520f62691cd8a1be2c9d059099543
6
+ metadata.gz: 39fc144f17f7d07ea07449319f9be330f4b446dd1b71def1af6bb100da1c18ed168c47bf13118fbc278d1ded3c59120eb2c7825942dc848309d1f73fe5ba60d9
7
+ data.tar.gz: 6289287531569d97c1020b8e798b5fee52183f25d37301ffd8918a0845228e950973661a127fb65b6087e2636d0cc6c35b4130c54eba803af2d12541dff60dc3
data/.gitignore CHANGED
@@ -1,4 +1,4 @@
1
- /output
1
+ configgin-*.gem
2
2
  /vendor/cache/
3
3
  /vendor/sentinel
4
4
  /.bundle/
data/.rubocop_todo.yml CHANGED
@@ -9,9 +9,12 @@
9
9
  Metrics/AbcSize:
10
10
  Max: 26
11
11
 
12
+ Metrics/BlockLength:
13
+ Enabled: false
14
+
12
15
  # Offense count: 2
13
16
  Metrics/CyclomaticComplexity:
14
- Max: 10
17
+ Enabled: false
15
18
 
16
19
  # Offense count: 20
17
20
  # Configuration parameters: AllowURI, URISchemes.
data/Gemfile.lock CHANGED
@@ -1,26 +1,54 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- configgin (0.12.0)
5
- bosh-template (~> 1.3262.24.0)
6
- deep_merge (~> 1.0.1)
4
+ configgin (0.12.1)
5
+ bosh-template (~> 2.0)
6
+ deep_merge (~> 1.1)
7
+ kubeclient (~> 2.0)
7
8
  mustache (~> 1.0)
8
9
  rainbow (~> 2.0, != 2.2.1)
9
10
 
10
11
  GEM
11
12
  remote: https://rubygems.org/
12
13
  specs:
14
+ addressable (2.5.2)
15
+ public_suffix (>= 2.0.2, < 4.0)
13
16
  ast (2.3.0)
14
- bosh-template (1.3262.24.0)
17
+ bosh-template (2.0.0)
15
18
  semi_semantic (~> 1.2.0)
16
- deep_merge (1.0.1)
19
+ deep_merge (1.1.1)
17
20
  diff-lcs (1.3)
21
+ domain_name (0.5.20170404)
22
+ unf (>= 0.0.5, < 1.0.0)
23
+ http (0.9.8)
24
+ addressable (~> 2.3)
25
+ http-cookie (~> 1.0)
26
+ http-form_data (~> 1.0.1)
27
+ http_parser.rb (~> 0.6.0)
28
+ http-cookie (1.0.3)
29
+ domain_name (~> 0.5)
30
+ http-form_data (1.0.3)
31
+ http_parser.rb (0.6.0)
32
+ kubeclient (2.4.0)
33
+ http (= 0.9.8)
34
+ recursive-open-struct (= 1.0.0)
35
+ rest-client
36
+ mime-types (3.1)
37
+ mime-types-data (~> 3.2015)
38
+ mime-types-data (3.2016.0521)
18
39
  mustache (1.0.5)
40
+ netrc (0.11.0)
19
41
  parser (2.4.0.0)
20
42
  ast (~> 2.2)
21
43
  powerpack (0.1.1)
44
+ public_suffix (3.0.0)
22
45
  rainbow (2.1.0)
23
46
  rake (10.4.2)
47
+ recursive-open-struct (1.0.0)
48
+ rest-client (2.0.2)
49
+ http-cookie (>= 1.0.2, < 2.0)
50
+ mime-types (>= 1.16, < 4.0)
51
+ netrc (~> 0.8)
24
52
  rspec (3.5.0)
25
53
  rspec-core (~> 3.5.0)
26
54
  rspec-expectations (~> 3.5.0)
@@ -42,13 +70,16 @@ GEM
42
70
  unicode-display_width (~> 1.0, >= 1.0.1)
43
71
  ruby-progressbar (1.8.1)
44
72
  semi_semantic (1.2.0)
73
+ unf (0.1.4)
74
+ unf_ext
75
+ unf_ext (0.0.7.4)
45
76
  unicode-display_width (1.2.1)
46
77
 
47
78
  PLATFORMS
48
79
  ruby
49
80
 
50
81
  DEPENDENCIES
51
- bundler (~> 1.14)
82
+ bundler (~> 1.10)
52
83
  configgin!
53
84
  rake (~> 10.0)
54
85
  rspec
data/LICENSE.md CHANGED
@@ -1,4 +1,4 @@
1
- © Copyright 2016 Hewlett Packard Enterprise Development LP
1
+ Copyright (c) 2017 SUSE LLC
2
2
 
3
3
  Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at
4
4
 
data/Makefile CHANGED
@@ -1,6 +1,6 @@
1
1
  #!/usr/bin/env make
2
2
 
3
- GIT_ROOT:=$(shell git rev-parse --show-toplevel)
3
+ GIT_ROOT := $(shell git rev-parse --show-toplevel)
4
4
 
5
5
  .PHONY: lint test dist
6
6
 
@@ -16,4 +16,4 @@ dist:
16
16
  gem build ${GIT_ROOT}/configgin.gemspec
17
17
 
18
18
  clean:
19
- rm -rf output
19
+ rm -rf configgin-*.gem
data/bin/configgin CHANGED
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env ruby
2
2
 
3
- require_relative "../lib/configgin"
3
+ require 'json'
4
+ require_relative '../lib/configgin'
4
5
 
5
6
  options = {}
6
7
  parser = Cli.make_option_parser(options)
@@ -14,23 +15,54 @@ rescue ArgMissingError => e
14
15
  exit(1)
15
16
  end
16
17
 
17
- jobs = JSON.load(File.read(options[:jobs]))
18
+ job_configs = JSON.parse(File.read(options[:jobs]))
18
19
  templates = YAML.load_file(options[:env2conf])
19
20
 
20
- jobs.each do |job, job_config|
21
- base_config = JSON.load(File.read(job_config['base']))
22
-
23
- job_config['files'].each do |infile, outfile|
24
- begin
25
- bosh_spec = EnvironmentConfigTransmogrifier.transmogrify(base_config,
26
- templates,
27
- secrets: '/etc/secrets')
28
- rescue NonHashValueOverride => e
29
- STDERR.puts e.to_s
30
- STDERR.puts "Error generating #{job}: #{outfile} from #{infile}"
31
- exit 1
32
- end
33
-
34
- Generate.generate(bosh_spec, infile, outfile)
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_namespace = File.read("#{SVC_ACC_PATH}/namespace")
37
+
38
+ jobs = {}
39
+ job_configs.each do |job, job_config|
40
+ base_config = JSON.parse(File.read(job_config['base']))
41
+
42
+ begin
43
+ bosh_spec = EnvironmentConfigTransmogrifier.transmogrify(base_config,
44
+ templates,
45
+ secrets: '/etc/secrets')
46
+ rescue NonHashValueOverride => e
47
+ STDERR.puts e.to_s
48
+ STDERR.puts "Error generating #{job}: #{outfile} from #{infile}"
49
+ exit 1
50
+ end
51
+
52
+ jobs[job] = Job.new(bosh_spec, kube_namespace, kube_client)
53
+ end
54
+
55
+ exported_properties = Hash[jobs.map { |name, job| [name, job.exported_properties] }]
56
+ kube_client.patch_pod(
57
+ ENV['HOSTNAME'],
58
+ { metadata: { annotations: { :'skiff-exported-properties' => exported_properties.to_json } } },
59
+ kube_namespace
60
+ )
61
+
62
+ jobs.each do |job_name, job|
63
+ dns_encoder = KubeDNSEncoder.new(job.spec['links'])
64
+
65
+ job_configs[job_name]['files'].each do |infile, outfile|
66
+ job.generate(infile, outfile, dns_encoder)
35
67
  end
36
68
  end
data/configgin.gemspec CHANGED
@@ -1,30 +1,32 @@
1
1
  # coding: utf-8
2
+
2
3
  lib = File.expand_path('../lib', __FILE__)
3
4
  $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
4
5
  require 'configgin/version'
5
6
 
6
7
  Gem::Specification.new do |spec|
7
- spec.name = "configgin"
8
+ spec.name = 'configgin'
8
9
  spec.version = Configgin::VERSION
9
- spec.authors = ["SUSE Linux"]
10
- spec.license = "Apache-2.0"
10
+ spec.authors = ['SUSE']
11
11
 
12
- spec.summary = "A simple cli app in Ruby to generate configurations using BOSH ERB templates and a BOSH spec."
13
- spec.description = "A simple cli app in Ruby to generate configurations using BOSH ERB templates and a BOSH spec, but also using configurations based on environment variables, processed using a set of templates."
14
- spec.homepage = "https://github.com/hpcloud/configgin"
12
+ spec.summary = 'A simple cli app in Ruby to generate configurations using BOSH ERB templates and a BOSH spec.'
13
+ spec.description = 'A simple cli app in Ruby to generate configurations using BOSH ERB templates and a BOSH spec, but also using configurations based on environment variables, processed using a set of templates.'
14
+ spec.homepage = 'https://github.com/SUSE/configgin'
15
+ spec.licenses = ['Apache-2.0']
15
16
 
16
17
  spec.files = `git ls-files -z`.split("\x0").reject do |f|
17
18
  f.match(%r{^(test|spec|features)/})
18
19
  end
19
- spec.bindir = "bin"
20
+ spec.bindir = 'bin'
20
21
  spec.executables = spec.files.grep(%r{^bin/}) { |f| File.basename(f) }
21
- spec.require_paths = ["lib"]
22
+ spec.require_paths = ['lib']
22
23
 
23
- spec.add_development_dependency "bundler", "~> 1.14"
24
- spec.add_development_dependency "rake", "~> 10.0"
24
+ spec.add_development_dependency 'bundler', '~> 1.10'
25
+ spec.add_development_dependency 'rake', '~> 10.0'
25
26
 
26
- spec.add_dependency 'bosh-template', '~> 1.3262.24.0'
27
+ spec.add_dependency 'bosh-template', '~> 2.0'
27
28
  spec.add_dependency 'rainbow', '~>2.0', '!=2.2.1'
28
- spec.add_dependency 'deep_merge', '~> 1.0.1'
29
+ spec.add_dependency 'deep_merge', '~> 1.1'
29
30
  spec.add_dependency 'mustache', '~> 1.0'
31
+ spec.add_dependency 'kubeclient', '~>2.0'
30
32
  end
data/lib/cli.rb CHANGED
@@ -1,6 +1,6 @@
1
1
  require 'optparse'
2
- require 'generate'
3
- require 'exceptions'
2
+ require_relative 'exceptions'
3
+ require_relative 'configgin/version'
4
4
 
5
5
  # Cli is a helper module for dealing with command line flags
6
6
  module Cli
@@ -8,7 +8,7 @@ module Cli
8
8
  #
9
9
  # @param options [Hash] The options to check
10
10
  def self.check_opts(options)
11
- [:jobs, :env2conf].each do |key|
11
+ %i[jobs env2conf].each do |key|
12
12
  if options[key].nil? || options[key].empty?
13
13
  raise ArgMissingError, key.to_s
14
14
  end
@@ -33,6 +33,11 @@ module Cli
33
33
  'Environment to configuration templates YAML') do |e|
34
34
  options[:env2conf] = e
35
35
  end
36
+
37
+ opts.on('--version', 'Print the configgin version') do
38
+ puts Configgin::VERSION
39
+ exit 0
40
+ end
36
41
  end
37
42
  end
38
43
  end
data/lib/configgin.rb CHANGED
@@ -1,3 +1,4 @@
1
- require 'cli'
2
- require 'generate'
3
- require 'environment_config_transmogrifier'
1
+ require_relative 'cli'
2
+ require_relative 'job'
3
+ require_relative 'environment_config_transmogrifier'
4
+ require_relative 'kube_link_generator'
@@ -1,5 +1,3 @@
1
1
  module Configgin
2
-
3
- VERSION = "0.12.0"
4
-
2
+ VERSION = '0.12.1'.freeze
5
3
  end
@@ -46,7 +46,7 @@ module EnvironmentConfigTransmogrifier
46
46
  inject_value(base_config, key.split('.'), value, key)
47
47
  end
48
48
 
49
- base_config['bootstrap'] = (base_config['index'] || 0) == 0
49
+ base_config['bootstrap'] = (base_config['index'] || 0).zero?
50
50
 
51
51
  base_config
52
52
  end
@@ -61,7 +61,7 @@ module EnvironmentConfigTransmogrifier
61
61
  # replace new lines with double new lines for proper new-line YAML parsing
62
62
  mustache_value = mustache_value.to_s.gsub("\n", "\n\n")
63
63
  @@memoize_mustache[value] ||= {}
64
- @@memoize_mustache[value][input_hash] = YAML.load(mustache_value)
64
+ @@memoize_mustache[value][input_hash] = YAML.safe_load(mustache_value)
65
65
  rescue => e
66
66
  msg = mustacheMessageFromError(e)
67
67
  raise LoadYamlFromMustacheError, "Could not load config key '#{key}': #{msg}"
data/lib/exceptions.rb CHANGED
@@ -2,3 +2,4 @@ class ArgMissingError < StandardError; end
2
2
  class NonHashValueOverride < StandardError; end
3
3
  class NoDataProvided < StandardError; end
4
4
  class LoadYamlFromMustacheError < StandardError; end
5
+ class LinkResolveError < StandardError; end
@@ -1,17 +1,44 @@
1
1
  require 'bosh/template/renderer'
2
2
  require 'json'
3
+ require_relative 'kube_link_generator'
3
4
 
4
- # Generate has methods for manipulating streams and generating configuration
5
- # files using those streams.
6
- module Generate
7
- # Proces the given template using a provided spec and output filename
5
+ # Job describes a single BOSH job
6
+ class Job
7
+ def initialize(spec, namespace, client)
8
+ @spec = spec
9
+ @namespace = namespace
10
+ @client = client
11
+ @spec['links'] = KubeLinkSpecs.new(@spec, @namespace, @client)
12
+ end
13
+
14
+ attr_reader :spec
15
+
16
+ def exported_properties
17
+ return @exported_propertes if @exported_properties
18
+ exported_properties = {}
19
+ spec['exported_properties'].each do |prop|
20
+ src = spec['properties']
21
+ dst = exported_properties
22
+ keys = prop.split('.')
23
+ leaf = keys.pop
24
+ keys.each do |key|
25
+ dst[key] ||= {}
26
+ dst = dst[key]
27
+ src = src.fetch(key, {})
28
+ end
29
+ dst[leaf] = src[leaf]
30
+ end
31
+ @exported_properties = exported_properties
32
+ end
33
+
34
+ # Process the given template using a provided spec and output filename
8
35
  #
9
- # @param bosh_spec [Hash] The input data as a hash
10
36
  # @param input_file_path [String] The input filepath for the template
11
37
  # @param output_file_path [String] The output filepath
12
- def self.generate(bosh_spec, input_file_path, output_file_path, &_block)
38
+ # @param dns_encoder [KubeDNSEncoder] BOSH DNS encoder
39
+ def generate(input_file_path, output_file_path, dns_encoder)
13
40
  # Make sure we're getting all the parameters we need
14
- raise NoDataProvided if bosh_spec.nil?
41
+ raise NoDataProvided if spec.nil?
15
42
  raise NoInputFileProvided if input_file_path.nil?
16
43
  raise NoOutputFileProvided if output_file_path.nil?
17
44
 
@@ -25,7 +52,7 @@ module Generate
25
52
  end
26
53
 
27
54
  # Create a BOSH evaluation context
28
- evaluation_context = Bosh::Template::EvaluationContext.new(bosh_spec)
55
+ evaluation_context = Bosh::Template::EvaluationContext.new(spec, dns_encoder)
29
56
  # Process the Template
30
57
  output = erb_template.result(evaluation_context.get_binding)
31
58
 
@@ -0,0 +1,126 @@
1
+ require 'kubeclient'
2
+ require 'uri'
3
+ require_relative 'exceptions'
4
+
5
+ # KubeLinkSpecs provides the information required to generate BOSH links by
6
+ # pretending to be a hash.
7
+ class KubeLinkSpecs
8
+ # ANNOTATION_AZ is the Kube annotation for the (availability) zone
9
+ ANNOTATION_AZ = 'failure-domain.beta.kubernetes.io/zone'.freeze
10
+
11
+ def initialize(spec, namespace, kube_client)
12
+ @links = {}
13
+ @client = kube_client
14
+ @namespace = namespace
15
+ @spec = spec || {}
16
+ end
17
+
18
+ def this_name
19
+ @spec['job']['name']
20
+ end
21
+
22
+ # pod_index returns a number for the given mod name. The number is expected to
23
+ # be unique across all pods for the role.
24
+ def pod_index(name)
25
+ index = name.rpartition('-').last
26
+ return index.to_i if /^\d+$/ =~ index
27
+ # The pod name is something like role-abcxyz
28
+ # Derive the index from the randomness that went into the suffix.
29
+ # chars are the characters kubernetes might use to generate names
30
+ # Copied from https://github.com/kubernetes/kubernetes/blob/52a6ad0acb26/staging/src/k8s.io/client-go/pkg/util/rand/rand.go#L73
31
+ chars = 'bcdfghjklmnpqrstvwxz0123456789'
32
+ index.chars.map { |c| chars.index(c) }.reduce(0) { |v, c| v * chars.length + c }
33
+ end
34
+
35
+ def get_pods_for_role(role_name, wait_for_ip)
36
+ loop do
37
+ # The 30.times loop exists to print out status messages
38
+ 30.times do
39
+ 1.times do
40
+ pods = @client.get_pods(namespace: @namespace, label_selector: "skiff-role-name=#{role_name}")
41
+ if wait_for_ip
42
+ # Wait until all pods have IP addresses and properties
43
+ break unless pods.all? { |pod| pod.status.podIP }
44
+ break unless pods.all? { |pod| pod.metadata.annotations['skiff-exported-properties'] }
45
+ else
46
+ # We just need one pod with exported properties
47
+ pods.select! { |pod| pod.status.podIP }
48
+ pods.select! { |pod| pod.metadata.annotations['skiff-exported-properties'] }
49
+ end
50
+ return pods unless pods.empty?
51
+ end
52
+ sleep 1
53
+ end
54
+ $stdout.puts "Waiting for pods for role #{role_name} (at #{Time.now})..."
55
+ end
56
+ end
57
+
58
+ def get_pod_instance_info(pod, job)
59
+ index = pod_index(pod.metadata.name)
60
+ properties = JSON.parse(pod.metadata.annotations['skiff-exported-properties'])
61
+ {
62
+ 'name' => pod.metadata.name,
63
+ 'index' => index,
64
+ 'id' => pod.metadata.name,
65
+ 'az' => pod.metadata.annotations['failure-domain.beta.kubernetes.io/zone'] || 'az0',
66
+ 'address' => pod.status.podIP,
67
+ 'properties' => properties.fetch(job, {}),
68
+ 'bootstrap' => index.zero?
69
+ }
70
+ end
71
+
72
+ def get_svc_instance_info(role_name, job)
73
+ svc = @client.get_service(role_name, @namespace)
74
+ pod = get_pods_for_role(role_name, false).first
75
+ properties = JSON.parse(pod.metadata.annotations['skiff-exported-properties'])
76
+ {
77
+ 'name' => svc.metadata.name,
78
+ 'index' => 0, # Completely made up index; there is only ever one service
79
+ 'id' => svc.metadata.name,
80
+ 'az' => pod.metadata.annotations['failure-domain.beta.kubernetes.io/zone'] || 'az0',
81
+ 'address' => svc.spec.clusterIP,
82
+ 'properties' => properties.fetch(job, {}),
83
+ 'bootstrap' => true
84
+ }
85
+ end
86
+
87
+ def [](key)
88
+ return @links[key] if @links.key? key
89
+
90
+ # Resolve the role we're looking for
91
+ provider = @spec['consumes'][key]
92
+ unless provider
93
+ $stderr.puts "No link provider found for #{key}"
94
+ @links[key] = nil
95
+ return @links[key]
96
+ end
97
+
98
+ if provider['role'] == this_name
99
+ $stderr.puts "Resolving link #{key} via self provider #{provider}"
100
+ pods = get_pods_for_role(provider['role'], true)
101
+ instances = pods.map { |p| get_pod_instance_info(p, provider['job']) }
102
+ else
103
+ # Getting pods for a different service; since we have kube services, we don't handle it in configgin
104
+ $stderr.puts "Resolving link #{key} via service #{provider}"
105
+ instances = [get_svc_instance_info(provider['role'], provider['job'])]
106
+ end
107
+
108
+ @links[key] = {
109
+ 'address' => "#{provider['role']}.#{ENV['KUBE_SERVICE_DOMAIN_SUFFIX']}",
110
+ 'instance_group' => '',
111
+ 'default_network' => '',
112
+ 'deployment_name' => @namespace,
113
+ 'domain' => ENV['KUBE_SERVICE_DOMAIN_SUFFIX'],
114
+ 'root_domain' => ENV['KUBE_SERVICE_DOMAIN_SUFFIX'],
115
+ 'instances' => instances,
116
+ 'properties' => instances.first['properties']
117
+ }
118
+ end
119
+ end
120
+
121
+ # KubeDNSEncoder is a BOSH DNS encoder object. It is unclear at this point what it does.
122
+ class KubeDNSEncoder
123
+ def initialize(link_specs)
124
+ @link_specs = link_specs
125
+ end
126
+ end
@@ -3,7 +3,7 @@
3
3
  set -o errexit
4
4
 
5
5
  if [ "$(uname)" == "Darwin" ]; then
6
- DOCKER_RUNTIME=${DOCKER_RUNTIME:-'helioncf/hcf-pipeline-ruby-bosh'}
6
+ DOCKER_RUNTIME=${DOCKER_RUNTIME:-'splatform/bosh-cli'}
7
7
 
8
8
  # We need to mount the enclosing repo in case we are just a submodule
9
9
  # (still doesn't support being a nested submodule though)
@@ -0,0 +1,110 @@
1
+ #!/bin/bash
2
+
3
+ # This script will replace the stemcell on a vagrant box with one that has a
4
+ # copy of configgin built from the current directory. This is (obviously) only
5
+ # meant as a testing tool.
6
+
7
+ # Pre-requisites:
8
+ # - SCF checkout (preferably in ../scf, override in $REPO)
9
+ # - vagrant VM running for that checkout
10
+ # - docker daemon running on the host (requires volumes)
11
+
12
+ set -o errexit -o nounset
13
+
14
+ REPO="${REPO:-scf}"
15
+
16
+ IMAGE="$( cd "../${REPO}" && source .envrc && echo "${FISSILE_STEMCELL}" )"
17
+
18
+ name="${IMAGE%%:*}"
19
+ tag="${IMAGE##*:}"
20
+
21
+ unset container
22
+ unset KUBECONFIG
23
+
24
+ cleanup() {
25
+ if test -n "${container:-}" ; then
26
+ docker rm -f "${container}"
27
+ fi
28
+ if test -n "${KUBECONFIG:-}" ; then
29
+ rm -f "${KUBECONFIG}"
30
+ fi
31
+ }
32
+ trap cleanup EXIT
33
+
34
+ # Force use the vagrant kubectl context
35
+ export KUBECONFIG="$(mktemp)"
36
+ kubectl config set-cluster vagrant --server=http://cf-dev.io:8080
37
+ kubectl config set-context vagrant --cluster=vagrant --user=""
38
+ kubectl config use-context vagrant
39
+
40
+ vagrant_ready=""
41
+ if test -z "${NO_RUN:-}" ; then
42
+ if ( cd "$(dirname "$0")/../${REPO}" && (vagrant status 2>/dev/null | grep --quiet running) ) ; then
43
+ vagrant_ready="true"
44
+ releases=$(helm list --short)
45
+ if test -n "${releases}" ; then
46
+ helm delete --purge ${releases}
47
+ fi
48
+ kubectl delete ns cf ||:
49
+ kubectl delete ns uaa ||:
50
+ fi
51
+ fi
52
+
53
+ if test -z "$(docker images --quiet "${name}:${tag}-orig" 2>/dev/null)" ; then
54
+ docker pull "${IMAGE}"
55
+ container=$(docker run --detach "${IMAGE}" /bin/bash -c "sleep 1d")
56
+ docker exec -t "${container}" zypper install -y git
57
+ docker commit "${container}" "${name}:${tag}-orig"
58
+ fi
59
+
60
+ container=$(docker run \
61
+ --volume "${PWD}:/src" \
62
+ --detach \
63
+ "${name}:${tag}-orig" \
64
+ /bin/bash -c "sleep 1d")
65
+ docker exec -t "${container}" /bin/bash -c "source /usr/local/rvm/scripts/rvm && make -C /src all"
66
+ docker exec -t "${container}" /bin/bash -c "source /usr/local/rvm/scripts/rvm && gem install /src/configgin-*.gem"
67
+ docker commit "${container}" "${IMAGE}"
68
+
69
+ test -z "${NO_RUN:-}" || exit
70
+
71
+ if command -v docker-credential-osxkeychain >/dev/null 2>/dev/null ; then
72
+ docker_user=$(docker-credential-osxkeychain list | jq -r '."https://index.docker.io/v1/"')
73
+ else
74
+ docker_user=$(docker system info | awk -F: '{ if ($1 == "Username") { print $2} }' | tr -d '[:space:]' ||:)
75
+ fi
76
+
77
+ if test -z "${docker_user:-}" ; then
78
+ echo "Can't determine docker user. Are you logged in?"
79
+ exit
80
+ fi
81
+
82
+ docker tag "${IMAGE}" "${docker_user}/${name##*/}:${tag}"
83
+ docker push "${docker_user}/${name##*/}:${tag}"
84
+
85
+ test -n "${vagrant_ready}" || exit
86
+
87
+ cd "$(dirname "$0")/../${REPO}"
88
+
89
+ vagrant ssh -- -tt <<EOF
90
+ set -o errexit -o nounset
91
+ docker pull ${docker_user}/${name##*/}:${tag}
92
+ docker tag ${docker_user}/${name##*/}:${tag} ${IMAGE}
93
+ cd scf
94
+ source .envrc
95
+ while kubectl get namespace cf >/dev/null 2>/dev/null ; do
96
+ sleep 1
97
+ done
98
+ while kubectl get namespace uaa >/dev/null 2>/dev/null ; do
99
+ sleep 1
100
+ done
101
+ docker images --format={{.Repository}}:{{.Tag}} | \
102
+ grep -E '/scf-|role-packages' | \
103
+ xargs --no-run-if-empty docker rmi -f
104
+ docker images | \
105
+ awk '/<none>/ { print \$3 }' | \
106
+ xargs --no-run-if-empty docker rmi -f || \
107
+ :
108
+ make compile images helm kube run </dev/null
109
+ exit 0
110
+ EOF
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.12.0
4
+ version: 0.12.1
5
5
  platform: ruby
6
6
  authors:
7
- - SUSE Linux
7
+ - SUSE
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2017-06-01 00:00:00.000000000 Z
11
+ date: 2017-10-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -16,14 +16,14 @@ dependencies:
16
16
  requirements:
17
17
  - - "~>"
18
18
  - !ruby/object:Gem::Version
19
- version: '1.14'
19
+ version: '1.10'
20
20
  type: :development
21
21
  prerelease: false
22
22
  version_requirements: !ruby/object:Gem::Requirement
23
23
  requirements:
24
24
  - - "~>"
25
25
  - !ruby/object:Gem::Version
26
- version: '1.14'
26
+ version: '1.10'
27
27
  - !ruby/object:Gem::Dependency
28
28
  name: rake
29
29
  requirement: !ruby/object:Gem::Requirement
@@ -44,14 +44,14 @@ dependencies:
44
44
  requirements:
45
45
  - - "~>"
46
46
  - !ruby/object:Gem::Version
47
- version: 1.3262.24.0
47
+ version: '2.0'
48
48
  type: :runtime
49
49
  prerelease: false
50
50
  version_requirements: !ruby/object:Gem::Requirement
51
51
  requirements:
52
52
  - - "~>"
53
53
  - !ruby/object:Gem::Version
54
- version: 1.3262.24.0
54
+ version: '2.0'
55
55
  - !ruby/object:Gem::Dependency
56
56
  name: rainbow
57
57
  requirement: !ruby/object:Gem::Requirement
@@ -78,14 +78,14 @@ dependencies:
78
78
  requirements:
79
79
  - - "~>"
80
80
  - !ruby/object:Gem::Version
81
- version: 1.0.1
81
+ version: '1.1'
82
82
  type: :runtime
83
83
  prerelease: false
84
84
  version_requirements: !ruby/object:Gem::Requirement
85
85
  requirements:
86
86
  - - "~>"
87
87
  - !ruby/object:Gem::Version
88
- version: 1.0.1
88
+ version: '1.1'
89
89
  - !ruby/object:Gem::Dependency
90
90
  name: mustache
91
91
  requirement: !ruby/object:Gem::Requirement
@@ -100,6 +100,20 @@ dependencies:
100
100
  - - "~>"
101
101
  - !ruby/object:Gem::Version
102
102
  version: '1.0'
103
+ - !ruby/object:Gem::Dependency
104
+ name: kubeclient
105
+ requirement: !ruby/object:Gem::Requirement
106
+ requirements:
107
+ - - "~>"
108
+ - !ruby/object:Gem::Version
109
+ version: '2.0'
110
+ type: :runtime
111
+ prerelease: false
112
+ version_requirements: !ruby/object:Gem::Requirement
113
+ requirements:
114
+ - - "~>"
115
+ - !ruby/object:Gem::Version
116
+ version: '2.0'
103
117
  description: A simple cli app in Ruby to generate configurations using BOSH ERB templates
104
118
  and a BOSH spec, but also using configurations based on environment variables, processed
105
119
  using a set of templates.
@@ -130,11 +144,12 @@ files:
130
144
  - lib/configgin/version.rb
131
145
  - lib/environment_config_transmogrifier.rb
132
146
  - lib/exceptions.rb
133
- - lib/generate.rb
147
+ - lib/job.rb
148
+ - lib/kube_link_generator.rb
134
149
  - make/include/darwin-support
135
- - make/include/versioning
136
150
  - make/lint
137
151
  - make/test
152
+ - update-stemcell.sh
138
153
  - vendor/github.com/hpe-cloud-garage/git-notary/.gitignore
139
154
  - vendor/github.com/hpe-cloud-garage/git-notary/LICENSE.txt
140
155
  - vendor/github.com/hpe-cloud-garage/git-notary/README.org
@@ -142,7 +157,7 @@ files:
142
157
  - vendor/github.com/hpe-cloud-garage/git-notary/git-notary.gemspec
143
158
  - vendor/github.com/hpe-cloud-garage/git-notary/hooks/pre-push/branch-has-notes
144
159
  - vendor/github.com/hpe-cloud-garage/git-notary/hooks/pre-push/sync-notes
145
- homepage: https://github.com/hpcloud/configgin
160
+ homepage: https://github.com/SUSE/configgin
146
161
  licenses:
147
162
  - Apache-2.0
148
163
  metadata: {}
@@ -1,20 +0,0 @@
1
- #!/bin/sh
2
-
3
- test -n "${XTRACE}" && set -o xtrace
4
-
5
- set -o errexit -o nounset
6
-
7
- GIT_ROOT=${GIT_ROOT:-$(git rev-parse --show-toplevel)}
8
- GIT_DESCRIBE=${GIT_DESCRIBE:-$(git describe --tags --long)}
9
- GIT_BRANCH=${GIT_BRANCH:-$(git name-rev --name-only HEAD)}
10
-
11
- GIT_TAG=${GIT_TAG:-$(echo ${GIT_DESCRIBE} | awk -F - '{ print $1 }' )}
12
- GIT_COMMITS=${GIT_COMMITS:-$(echo ${GIT_DESCRIBE} | awk -F - '{ print $2 }' )}
13
- GIT_SHA=${GIT_SHA:-$(echo ${GIT_DESCRIBE} | awk -F - '{ print $3 }' )}
14
-
15
- ARTIFACT_NAME=${ARTIFACT_NAME:-$(basename $(git config --get remote.origin.url) .git | sed s/^hcf-//)}
16
- ARTIFACT_VERSION=${GIT_TAG}+${GIT_COMMITS}.${GIT_SHA}
17
-
18
- APP_VERSION=${ARTIFACT_NAME}-${ARTIFACT_VERSION}
19
-
20
- set +o errexit +o nounset +o xtrace