From 98683dee5df6c9b1c094514e7cc84e0387552e2c Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Wed, 10 Aug 2016 10:55:59 +0200 Subject: [PATCH 01/11] multi cpi: allowing openstack properties to by overwritten by context (refactored cpi lambda to test this) --- src/bosh_openstack_cpi/bin/openstack_cpi | 17 +---- src/bosh_openstack_cpi/lib/cloud/openstack.rb | 1 + .../lib/cloud/openstack/cpi_lambda.rb | 28 +++++++++ .../spec/unit/cpi_lambda_spec.rb | 63 +++++++++++++++++++ 4 files changed, 93 insertions(+), 16 deletions(-) create mode 100644 src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb create mode 100644 src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb diff --git a/src/bosh_openstack_cpi/bin/openstack_cpi b/src/bosh_openstack_cpi/bin/openstack_cpi index c2d19a31..02af17ce 100755 --- a/src/bosh_openstack_cpi/bin/openstack_cpi +++ b/src/bosh_openstack_cpi/bin/openstack_cpi @@ -15,22 +15,7 @@ Bosh::Clouds::Config.configure(cloud_config) cpi_log = StringIO.new -cpi_lambda = lambda do - unless cpi_config.has_key?('cloud') && cpi_config['cloud'].has_key?('properties') - raise "Could not find cloud properties in the configuration" - end - - cloud_properties = cpi_config['cloud']['properties'] - cloud_properties['cpi_log'] = cpi_log - connection_options = cloud_properties['openstack']['connection_options'] - # If 'ca_cert' is set we render non-empty `config/openstack.crt` - if connection_options && connection_options['ca_cert'] - connection_options['ssl_ca_file'] = ssl_ca_file - connection_options.delete('ca_cert') - end - Bosh::Clouds::Openstack.new(cloud_properties) -end - +cpi_lambda = Bosh::OpenStackCloud::CpiLambda.create(cpi_config, ssl_ca_file, cpi_log) cli = Bosh::Cpi::Cli.new(cpi_lambda, cpi_log, STDOUT) cli.run(ARGF.read) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack.rb b/src/bosh_openstack_cpi/lib/cloud/openstack.rb index 0b873737..af3aa572 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack.rb @@ -22,6 +22,7 @@ module OpenStackCloud; end require "cloud" require "cloud/openstack/helpers" require "cloud/openstack/cloud" +require "cloud/openstack/cpi_lambda" require "cloud/openstack/openstack" require "cloud/openstack/tag_manager" diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb new file mode 100644 index 00000000..65145928 --- /dev/null +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -0,0 +1,28 @@ +module Bosh::OpenStackCloud + class CpiLambda + def self.create(cpi_config, ssl_ca_file, cpi_log) + lambda do |context| + unless cpi_config.has_key?('cloud') && cpi_config['cloud'].has_key?('properties') + raise "Could not find cloud properties in the configuration" + end + + cloud_properties = cpi_config['cloud']['properties'] + + cloud_properties['cpi_log'] = cpi_log + connection_options = cloud_properties['openstack']['connection_options'] + # If 'ca_cert' is set we render non-empty `config/openstack.crt` + if connection_options && connection_options['ca_cert'] + connection_options['ssl_ca_file'] = ssl_ca_file + connection_options.delete('ca_cert') + end + + # allow openstack config to be overwritten dynamically by context + if context && context['cpi_properties'] + cloud_properties['openstack'] = context['cpi_properties'] + end + + Bosh::Clouds::Openstack.new(cloud_properties) + end + end + end +end \ No newline at end of file diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb new file mode 100644 index 00000000..5714d540 --- /dev/null +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -0,0 +1,63 @@ +require "spec_helper" + +describe Bosh::OpenStackCloud::CpiLambda do + subject { described_class.create(cpi_config, ssl_ca_file, cpi_log) } + let(:cpi_config) { + { + 'cloud' => { + 'properties' => { + 'openstack' => { + 'key1' => 'value1', + 'key2' => 'value2' + } + } + } + } + } + let(:ssl_ca_file) { 'feel-free-to-change' } + let(:cpi_log) { StringIO.new } + + describe 'when creating a cloud' do + it 'passes parts of the cpi config to openstack' do + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => cpi_config['cloud']['properties']['openstack'], + 'cpi_log' => cpi_log}) + subject.call({}) + end + + context 'if invalid cpi config is given' do + let(:cpi_config) {{'empty' => 'config'}} + + it 'raises an error' do + expect { + subject.call({}) + }.to raise_error /Could not find cloud properties in the configuration/ + end + end + + context 'if using ca_certs in config' do + let(:cpi_config) {{ 'cloud' => {'properties' => { 'openstack' => {'connection_options' => {'ca_cert' => 'xyz'}}}}}} + + it 'sets ssl_ca_file that is passed and removes ca_certs' do + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => + {"connection_options" => {"ssl_ca_file" => ssl_ca_file}}, + 'cpi_log' => cpi_log}) + subject.call({}) + end + end + + context 'if cpi_properties are provided in the context' do + it 'overwrites the openstack properties' do + context = { + 'cpi_properties' => { + 'newkey' => 'newvalue', + 'newkey2' => 'newvalue2', + } + } + + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => context['cpi_properties'], + 'cpi_log' => cpi_log}) + subject.call(context) + end + end + end +end \ No newline at end of file From 1efd1db38ed03312ea73ad8aa9ef77a8a76e5d40 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Wed, 17 Aug 2016 11:08:58 +0200 Subject: [PATCH 02/11] multi-cpi: supporting ca_cert for context properties --- src/bosh_openstack_cpi/bin/openstack_cpi | 2 +- .../lib/cloud/openstack/cpi_lambda.rb | 22 +++++++++++----- .../spec/unit/cpi_lambda_spec.rb | 25 ++++++++++++++++--- 3 files changed, 38 insertions(+), 11 deletions(-) diff --git a/src/bosh_openstack_cpi/bin/openstack_cpi b/src/bosh_openstack_cpi/bin/openstack_cpi index 02af17ce..d8173586 100755 --- a/src/bosh_openstack_cpi/bin/openstack_cpi +++ b/src/bosh_openstack_cpi/bin/openstack_cpi @@ -15,7 +15,7 @@ Bosh::Clouds::Config.configure(cloud_config) cpi_log = StringIO.new -cpi_lambda = Bosh::OpenStackCloud::CpiLambda.create(cpi_config, ssl_ca_file, cpi_log) +cpi_lambda = Bosh::OpenStackCloud::CpiLambda.create(cpi_config, cpi_log, ssl_ca_file) cli = Bosh::Cpi::Cli.new(cpi_lambda, cpi_log, STDOUT) cli.run(ARGF.read) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 65145928..21cd0171 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -1,6 +1,8 @@ module Bosh::OpenStackCloud class CpiLambda - def self.create(cpi_config, ssl_ca_file, cpi_log) + CONTEXT_CA_PATH = '/var/vcap/jobs/openstack_cpi/config/cacert_context.pem' + + def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=CONTEXT_CA_PATH) lambda do |context| unless cpi_config.has_key?('cloud') && cpi_config['cloud'].has_key?('properties') raise "Could not find cloud properties in the configuration" @@ -9,20 +11,28 @@ def self.create(cpi_config, ssl_ca_file, cpi_log) cloud_properties = cpi_config['cloud']['properties'] cloud_properties['cpi_log'] = cpi_log - connection_options = cloud_properties['openstack']['connection_options'] + # If 'ca_cert' is set we render non-empty `config/openstack.crt` - if connection_options && connection_options['ca_cert'] - connection_options['ssl_ca_file'] = ssl_ca_file - connection_options.delete('ca_cert') - end + set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_config) # allow openstack config to be overwritten dynamically by context if context && context['cpi_properties'] cloud_properties['openstack'] = context['cpi_properties'] + set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_context, true) end Bosh::Clouds::Openstack.new(cloud_properties) end end + + private + def self.set_ca_cert_in_connection_options(cloud_properties, ca_cert_path, write_to_disk=false) + connection_options = cloud_properties['openstack']['connection_options'] + if connection_options && connection_options['ca_cert'] + File.write(ca_cert_path, connection_options['ca_cert']) if write_to_disk + connection_options['ssl_ca_file'] = ca_cert_path + connection_options.delete('ca_cert') + end + end end end \ No newline at end of file diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb index 5714d540..c215bd17 100644 --- a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" describe Bosh::OpenStackCloud::CpiLambda do - subject { described_class.create(cpi_config, ssl_ca_file, cpi_log) } + subject { described_class.create(cpi_config, cpi_log, ssl_ca_file) } let(:cpi_config) { { 'cloud' => { @@ -38,8 +38,7 @@ let(:cpi_config) {{ 'cloud' => {'properties' => { 'openstack' => {'connection_options' => {'ca_cert' => 'xyz'}}}}}} it 'sets ssl_ca_file that is passed and removes ca_certs' do - expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => - {"connection_options" => {"ssl_ca_file" => ssl_ca_file}}, + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => {'connection_options' => {'ssl_ca_file' => ssl_ca_file}}, 'cpi_log' => cpi_log}) subject.call({}) end @@ -54,10 +53,28 @@ } } - expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => context['cpi_properties'], + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', 'newkey2' => 'newvalue2' }, 'cpi_log' => cpi_log}) subject.call(context) end + + it 'writes the given ca_cert to the disk and sets ssl_ca_file to its path' do + ca_file = Tempfile.new('ca_cert') + + context = { + 'cpi_properties' => { + 'newkey' => 'newvalue', + 'connection_options' => {'ca_cert' => 'xyz'} + } + } + + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', + 'connection_options' => {'ssl_ca_file' => ca_file.path}}, + 'cpi_log' => cpi_log}) + + described_class.create(cpi_config, cpi_log, ssl_ca_file, ca_file.path).call(context) + expect(File.read(ca_file.path)).to eq('xyz') + end end end end \ No newline at end of file From 7304e30c8c7fdd08c2251ca2a0bfd81e3cda4be9 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Wed, 17 Aug 2016 11:37:34 +0200 Subject: [PATCH 03/11] multi-cpi: separating writing ca file to disk from setting it in options --- .../lib/cloud/openstack/cpi_lambda.rb | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 21cd0171..ba56f623 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -18,7 +18,9 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C # allow openstack config to be overwritten dynamically by context if context && context['cpi_properties'] cloud_properties['openstack'] = context['cpi_properties'] - set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_context, true) + + write_ca_cert_to_disk(cloud_properties, ca_cert_from_context) + set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_context) end Bosh::Clouds::Openstack.new(cloud_properties) @@ -26,13 +28,17 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C end private - def self.set_ca_cert_in_connection_options(cloud_properties, ca_cert_path, write_to_disk=false) + def self.set_ca_cert_in_connection_options(cloud_properties, ca_cert_path) connection_options = cloud_properties['openstack']['connection_options'] if connection_options && connection_options['ca_cert'] - File.write(ca_cert_path, connection_options['ca_cert']) if write_to_disk connection_options['ssl_ca_file'] = ca_cert_path connection_options.delete('ca_cert') end end + + def self.write_ca_cert_to_disk(cloud_properties, ca_cert_path) + connection_options = cloud_properties['openstack']['connection_options'] + File.write(ca_cert_path, connection_options['ca_cert']) if connection_options && connection_options['ca_cert'] + end end end \ No newline at end of file From a80a313e050c20382dc1e0c6eca3860d146ab3c2 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Wed, 17 Aug 2016 16:46:01 +0200 Subject: [PATCH 04/11] multi-cpi: next try to make cert handling cleaner --- .../lib/cloud/openstack/cpi_lambda.rb | 30 +++++++------------ 1 file changed, 11 insertions(+), 19 deletions(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index ba56f623..b1f8f836 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -9,36 +9,28 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C end cloud_properties = cpi_config['cloud']['properties'] - cloud_properties['cpi_log'] = cpi_log - # If 'ca_cert' is set we render non-empty `config/openstack.crt` - set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_config) + # If 'ca_cert' is set in job config we render non-empty `config/openstack.crt` (excon needs it as a file) + connection_options = cloud_properties['openstack']['connection_options'] + if connection_options && connection_options.delete('ca_cert') + connection_options['ssl_ca_file'] = ca_cert_from_config + end # allow openstack config to be overwritten dynamically by context if context && context['cpi_properties'] cloud_properties['openstack'] = context['cpi_properties'] - write_ca_cert_to_disk(cloud_properties, ca_cert_from_context) - set_ca_cert_in_connection_options(cloud_properties, ca_cert_from_context) + # write ca cert to disk if given in context + connection_options = cloud_properties['openstack']['connection_options'] + if connection_options && (ca_cert = connection_options.delete('ca_cert')) + File.write(ca_cert_from_context, ca_cert) + connection_options['ssl_ca_file'] = ca_cert_from_context + end end Bosh::Clouds::Openstack.new(cloud_properties) end end - - private - def self.set_ca_cert_in_connection_options(cloud_properties, ca_cert_path) - connection_options = cloud_properties['openstack']['connection_options'] - if connection_options && connection_options['ca_cert'] - connection_options['ssl_ca_file'] = ca_cert_path - connection_options.delete('ca_cert') - end - end - - def self.write_ca_cert_to_disk(cloud_properties, ca_cert_path) - connection_options = cloud_properties['openstack']['connection_options'] - File.write(ca_cert_path, connection_options['ca_cert']) if connection_options && connection_options['ca_cert'] - end end end \ No newline at end of file From 1fd522ddb03ddcc6b48878956af9773bfff298a1 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Fri, 26 Aug 2016 12:06:36 +0200 Subject: [PATCH 05/11] multi-cpi: bosh_cpi now merges cpi properties in context so we can use context['openstack'] --- src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb | 4 ++-- src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index b1f8f836..5306a09c 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -18,8 +18,8 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C end # allow openstack config to be overwritten dynamically by context - if context && context['cpi_properties'] - cloud_properties['openstack'] = context['cpi_properties'] + if context && context['openstack'] + cloud_properties['openstack'] = context['openstack'] # write ca cert to disk if given in context connection_options = cloud_properties['openstack']['connection_options'] diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb index c215bd17..5f0c942d 100644 --- a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -44,10 +44,10 @@ end end - context 'if cpi_properties are provided in the context' do + context 'if openstack properties are provided in the context' do it 'overwrites the openstack properties' do context = { - 'cpi_properties' => { + 'openstack' => { 'newkey' => 'newvalue', 'newkey2' => 'newvalue2', } @@ -62,7 +62,7 @@ ca_file = Tempfile.new('ca_cert') context = { - 'cpi_properties' => { + 'openstack' => { 'newkey' => 'newvalue', 'connection_options' => {'ca_cert' => 'xyz'} } From 04ad815a4b3c26169c80865ad9bd4b75b5bfedb3 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Wed, 12 Oct 2016 11:16:14 +0200 Subject: [PATCH 06/11] multi-cpi: don't just overwrite openstack properties but merge, so that defaults from bosh release spec are respected --- src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb | 2 +- src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 5306a09c..4fa16330 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -19,7 +19,7 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C # allow openstack config to be overwritten dynamically by context if context && context['openstack'] - cloud_properties['openstack'] = context['openstack'] + cloud_properties['openstack'].merge!(context['openstack']) # write ca cert to disk if given in context connection_options = cloud_properties['openstack']['connection_options'] diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb index 5f0c942d..8be4344b 100644 --- a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -45,7 +45,7 @@ end context 'if openstack properties are provided in the context' do - it 'overwrites the openstack properties' do + it 'merges the openstack properties' do context = { 'openstack' => { 'newkey' => 'newvalue', @@ -53,7 +53,10 @@ } } - expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', 'newkey2' => 'newvalue2' }, + expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'key1' => 'value1', + 'key2' => 'value2', + 'newkey' => 'newvalue', + 'newkey2' => 'newvalue2'}, 'cpi_log' => cpi_log}) subject.call(context) end @@ -69,6 +72,8 @@ } expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', + 'key1' => 'value1', + 'key2' => 'value2', 'connection_options' => {'ssl_ca_file' => ca_file.path}}, 'cpi_log' => cpi_log}) From 77970370f428447586925001414c4a84cb892d6d Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Tue, 1 Nov 2016 15:01:53 +0100 Subject: [PATCH 07/11] multi-cpi: no need to check for context.nil? since it's always provided as not-nil by bosh --- src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 4fa16330..61bed34e 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -18,7 +18,7 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C end # allow openstack config to be overwritten dynamically by context - if context && context['openstack'] + if context['openstack'] cloud_properties['openstack'].merge!(context['openstack']) # write ca cert to disk if given in context From 3af0c10c038197c953c454255599410537ab7259 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Thu, 17 Nov 2016 13:20:39 +0100 Subject: [PATCH 08/11] multi-cpi: updating upstream bosh gems to contain context passing --- src/bosh_openstack_cpi/Gemfile.lock | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/bosh_openstack_cpi/Gemfile.lock b/src/bosh_openstack_cpi/Gemfile.lock index 06c36ab6..af08ef64 100644 --- a/src/bosh_openstack_cpi/Gemfile.lock +++ b/src/bosh_openstack_cpi/Gemfile.lock @@ -2,10 +2,11 @@ GEM remote: https://rubygems.org/ specs: addressable (2.4.0) - bosh_common (1.3215.3.0) + bosh_common (1.3262.24.0) logging (~> 1.8.2) - semi_semantic (~> 1.1.0) - bosh_cpi (1.3215.3.1) + semi_semantic (~> 1.2.0) + bosh_cpi (2.0.1) + bosh_common (~> 1.3262.24.0) logging (~> 1.8.2) membrane (~> 1.1.0) builder (3.2.2) @@ -53,7 +54,7 @@ GEM rspec-support (~> 3.3.0) rspec-support (3.3.0) safe_yaml (1.0.4) - semi_semantic (1.1.0) + semi_semantic (1.2.0) timecop (0.7.4) webmock (2.1.0) addressable (>= 2.3.6) From 83163044b39ba49d6fb3283f5f8580114e247f12 Mon Sep 17 00:00:00 2001 From: Matthias Winzeler Date: Mon, 21 Nov 2016 15:47:15 +0100 Subject: [PATCH 09/11] multi-cpi: vendored updated upstream bosh gems --- .../vendor/package/bosh_common-1.3215.3.0.gem | Bin 12288 -> 0 bytes .../vendor/package/bosh_common-1.3262.24.0.gem | Bin 0 -> 12288 bytes .../vendor/package/bosh_cpi-1.3215.3.1.gem | Bin 10752 -> 0 bytes .../vendor/package/bosh_cpi-2.0.1.gem | Bin 0 -> 11264 bytes .../vendor/package/semi_semantic-1.1.0.gem | Bin 5632 -> 0 bytes .../vendor/package/semi_semantic-1.2.0.gem | Bin 0 -> 6656 bytes 6 files changed, 0 insertions(+), 0 deletions(-) delete mode 100644 src/bosh_openstack_cpi/vendor/package/bosh_common-1.3215.3.0.gem create mode 100644 src/bosh_openstack_cpi/vendor/package/bosh_common-1.3262.24.0.gem delete mode 100644 src/bosh_openstack_cpi/vendor/package/bosh_cpi-1.3215.3.1.gem create mode 100644 src/bosh_openstack_cpi/vendor/package/bosh_cpi-2.0.1.gem delete mode 100644 src/bosh_openstack_cpi/vendor/package/semi_semantic-1.1.0.gem create mode 100644 src/bosh_openstack_cpi/vendor/package/semi_semantic-1.2.0.gem diff --git a/src/bosh_openstack_cpi/vendor/package/bosh_common-1.3215.3.0.gem b/src/bosh_openstack_cpi/vendor/package/bosh_common-1.3215.3.0.gem deleted file mode 100644 index 8e9119bb31e07c418dc7eb5ceee0aabb444e1d1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12288 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 diff --git a/src/bosh_openstack_cpi/vendor/package/bosh_common-1.3262.24.0.gem b/src/bosh_openstack_cpi/vendor/package/bosh_common-1.3262.24.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..210c1ef554b34d1c0ec61f9947ed4500913fb082 GIT binary patch literal 12288 zcmeHtQ*b8C*6thIoFo%_V%wNZY}=YlY}+;_wr$(C?Y!}X@A>|7F7{vh;+(6!|9z^y zbZhuEJ+`J!h9-tih79H&fPa-S{bg)yY=Hl&|FVCsnOT`Q0Dl!s94xGC z9PAtbCT3PPHdX*J)4$50|GuuXqm!Y-UoN>?n3~%B_kn+E|G&on&)NQQxPO}dpV}pg zgauS{f6)MkxKiJ-TVO)wf zxht@4aN0tdr7SE`UD)()7WD0IU^K*qp3%u>XHE2m@E_xym2xl=9xcKoC@Rw!VkZ|i z^Gb&=VAq`PbH5|k&d7OUz=llC6?Z}<8dCJaok~|FNF6>Sx6o$MGq%i<*TBv4`P28c z5&K}*lm2V;7>nl7{M>H65ja6{{$WD<`(5%80UX*4j^v&Z+Vp{efPA|ho4#(Jc}id~ zZRn5hrxNMtJ{=-#gKfXdVd#}#_pp8lFZ;)az_-Z0EUe4!qGb)+(35yS`4HVWqg)*@ zY`t2GcBMHXfZNb1O6$lLvc>iB{L1z7WMOQ(t6k>%s^~^O-h!!}o*$=r`-ep^b{`~r zoN`BR>hg~GnLa$icq8uS+ufta73!!kj4aCUH|{I^+KlJ9&iPx+2M{kB{wa0pnK0dl zKt=Bo!bv2*4Kq+DN0p=E^uDx=7g`g<;@r*VoZLZ43LA)k%6=y^r@2np_sd_Q=|fL| zC#QWg%!x)l?URVUI$^Dn$h=jY0YB3bAdMAbOG)@EraY)D{f`a%6H;>r!5^)?LC(sR z^Bko$VJo~98{vFwEi_8Po29{!B8Z$4+o=JxK3$mFVHtds372f|K*2G6vQ8 zgQi`@a3|vxLSY1j^Xc9#^6G#e1$}n`3Dsha0_jum;ilP5eY_h{$8uc7g}K11g8QbU z{Gi+_Z8qYP{RFDM8U0DT*s@AK2hyUxw`$L2sJ1huQj~iVY2}GJo#40ev=UpNV%~^j z`)U2DKZ@NuSy%XveUYaIGWmcjqMYv?XHhL(YRpzLnu>8|(@wgOHb3I^@Jokp>q|=| zWM*jqcChh`6W{78ISilwFiOF{U)+txI>odf^IR>Rw- zht-b&6FF)nQ6&MM+s~&eS^`Mn^U>iesps!E6xeXN3e<~WDpY zt~0-n_7)jsPgdsX)EPAxBN-MF~q$yvMJ7=QrhH!T^SJ9WpdD8O`zG8_onmDDU4 zgme0DEili#FE+IY79RL-2NOw4Fv!;Iu3DEREh~DH_?OOHzrHbpRwiS)E2KE~>b|TyfOXX2utAZ1N^)XTi_xkCXI1wIuGk7=EEpj5`8eq z8Qyx0Pn{ELNlugj5m)F$e{_TrfO;}rtC^)wsX#$+v?gU$7zwUOQPr`){WJQfNNPzT z5y1y=D`}(z?2Xag}eo<0_NUZ$|t|WGwv4aRjr?7rF|O zBLugrVnq~yi>72!htK>y@5EUvc2>8oVg- zXrJPcm~fGt&a zS_@MuKle`GlMk!_Ckn2I1D*0hLYg}^VXO<1dKtk3mHruh4Qx*X_UezkJp`WYOrx~r zmTK&hth>zR3@1FIMS0rHy8!H0uzN|mC?)?bqYR4saO_|m=VDqxT(H>v)sCeH>CX>H zF=1LVos+{Yc^p*&m!^tB_??b1HsHdmG_F@i^iWqrB8p^*|uycL*M7#3(eT$m_5QFt{TCf zkQ7OrGk6Hu(Ex>UC7GEdh|9VK4E|lxtaVEOighyaAzJWu0i!nq#75oWt^;A6MpLT@+d$;gVk2wUH?HY^U`cD2bYr?5jk7 zMl+!-Gd}{3eva0xm2~Jk-NG$FBi|`8bq0j{fqq5%*^s6EM!{!NHfAIQpO}pRVB7XO zG5@lVfJC}qm)5v^sr>|8%lMn{!CBK}y3ruwoAV#2`y4==lT?xkvGodw=KZFvo&^|+ zP>{MK;+L+AVf3;W&|K`0nh~#TBd+L+W41I0bz>Ib2-SGc78@gP&GgH7N=uDFnigWJ zvK<+AWq`-#a+mU8yTY$_2@{=L&*NVzlZq7_N!K(D~P( z(9#Eh;7u+eq<7BHE)ceh0CPMT4wTj*?-H*`yW(D7rl~;bSsn_4)+>RvX^opC==JAc z*?2VgbX4$abyEA$FYlIVtZYl3nYKMXGfKYwhF2Y35u4~E_2;&b6OLPVigMEaha4y8 zWRZj>FFDzzIWZ87QaKRrh?JACj&mOrE#1IcW(RkPI52Pkfek-S^Y_k<8-QH^-OQz-pgDU6^ z>smo$uusRWY|6@7100sgq)F?|ldx?x*ZKz}2@TjsuG@a?C3r*`k10bMV$Ff6z`i_O zq1o$#1oV*Kf4tx~Fk&gy%C{@c4F{0gNtRA__s}~OTnoE))22j9v2ax} zEJse`IO6QBnytMDA$_Jp&ACk)*M=38PV3UFAhV!?zHNBkL7I*EkGn={h_Z_Nz-swv zy)JdwG!plbGx%-epaj2KHt5ze5wqL~FM!-$+qZn2eLnqLH_#I^r2txbxIq(a+0892 zZKq?wx-T5-usG)`Ur+lpsZd)9IK@=ab0Ln~`v?=ml`gdXAIi!jQ^c2C2Z`NuI5Q{p z@6M6Gbi$ zzFuBcAAvT)Kg-(RyvJ}h4&_I|Cfeoq5P=~VbZv*VqJzVF-*1IC=TJW8 z!bWN>%~!VRZByTYw6CMd2;XgNDIPHVROSdxz*GkUubM-J1}U8}hi0?3Bv^yE5A}#$ z3Quu!hWcCRNx-y}by;r>R}NzV@R#WT;kv%$50p++*H#}cShG^vF@1S_eYkP_ez})~ zN3zqg0Rfg0rk}3-WzOPZY(%AeMsT*PgQ%pZ4#2svvhN^Y_V24M>>C38#oZY?5)B4n zVX_6}x26Q&TW}Vr`b!fuzD!#A5OJp=8V*qLFzYIVi%C{f#y_-v45T(b2bv+NT@4@t zoqDS~Tj67YHD|a&_0842t)Xa8poo=?v7&?hOJd>?C`iwK7)6|~ypf7vzZPp1CS=VZ z4)a9S6H8It(Z^Dd4VuY{5+?7{7Q8X`J4!*iA z0*wVA!@m^LNre*A95To?m5^r?DI-QnvdNc6#2}NNuZb0?7~H5lD%Hmw6{_2Fvrln{ zvx?a}?{s@0)Y4eVAP*AaAaiVTpuXCE!4usRA;5Y>cc_`+f0U~kRt9Twjt`hy;FRb zL^3!n6`8JNybO}Gf&LF7D0yIGc0CY^ezZqNMC-`^TU2jJE!>c`zoVnm1SZ_D{PzYA zx}flvdT-U24g2@v z*sq7p)Nfxx24G?6V2j*4dvT!ErFBhQwwOv@+A_>XuC2a6l~SqUU=QOU7V_#XLNwH& zRR&`vi+RC0k8%TERePy}J);H6&l>>Z-;Z+ zuLnsHWI*0pIe6V=R`2e~CAk>CM~+WHM-U^2)$=8k#xcnA)oJ7j#P8j{4e||q^UV{c z#lK|h!H(iKT`$f(w;(^vu$yJB0-^ofD{G8H3sefj4h|@G1w!;6dBIwHg zZ49xI%amRiYfk5QLIb;Hle~M>WEZ(iW&c`IGkv)ui~_B->lb|4pBl*L!o z?vY3RNeEnae@K3TzIDOKlU&wgd`^t0MsnXm+D+~fd#8h{mN)!|KFIGW@V#-l!F8lw7i zsetcr4@#J*F&!3*9Oo`8ZhnGsu@A0EUTta7Qx^?*iNs_qrEX&e4TsPma~C7vSb_k- zCzpKT$5tC6$9-4}Q#+UYy!8WFn~)4@5KZ(b8yerg9T$R*D89Cf`g&}9&0SRE>qhY1 zB;(fwCX}xU2uD?w3!(AG!R=e?uvlr`&}yebYk1s)t@f1q3FyxG7TU=LvP@kHbaqF5d*nTO}I!2vV!bS7`wSi4T+{j^^>y=&IiI z1{L3F+CM6<2iJ^ca_q0md4Q(s{f_P}p+y6949)anrWNuTf=9xMYN9>yB^H0C*x(HT z2H+k_G-l4H1nQig9CBT4^3C`mDQGYsQ3b!tfz@FZeQb-yx|YT`V$ii;p5{+$w0}+netVSX%q0-|bJKG^rqxON&?;fCPdh(1X^sE@viZupShcc*Dqn4$~@HnKDq6c;-4CMTiCNxH013wVZ5Tbl0TlZ&>4h8ELyaMi*h zgr#P8E}g4+&QK59I%lHdPu)^O9#7-l4tyT`K?QS$x=!Z?PFhKaNgiMFy{_cnVz)sQ zQozhYU&bxa75nq$`^`u8$K&S>*t2hCNQsC)1pJ%8i&F|@h!X#?{dw%We`>jNhMO-( z!GYcw%3KFEMNy_^lldiP3p@tHbR_0AKN{-xI0d+#E`Ui-Y17C@`Gp-P#a~U-iy)GxG z;S^4BuT^1-ybAW$i;)<5EsgmNcO?#XXOVtPE4r0z#sO5bT3^1sz6uz8j5dvnO&X;(Y(T)=$h zQXNBt{_YwT_0Ogzqhse0{A1i(uqEK>+$g%5hJ=mmI(_KH+=HXl3KwhmVz3~TWD048 zg~05YHzQfQ7INpPvDBMs-8_VxaT)%nrb&H!9Di?0MWWzlP5%iw!#Cv7tO!z=AAfig zv*M_jLQsBa+$UiY77D{eYDJ$bxVTmOzSYZiK*Ra1_5NV(>1`SY1kYHqF5t6*_Hs~f zW!aszeNg@E+X#|oRLp(`HmkIQUu|;)N^j3DZa4b ziRTi#*y&rFVY7JyoXoM|1A7946a$;N6HDZ@#av`{M|AQf(R zU!@T|k3Ub6+tyDKKM>Fwob;|+w%Q>iau}>CI|5CipjDMi#J!h$@PWxju>5n@xy&e* zOX_f6bR45wJX==&+5r22`8blJ``Rc%r^&tHmPY?PLR;D6Gw%Am>V|+zDR9hk%>)PD zKeG6OqXUT&ct!Jm@#pt~f$yvGfEXlQkAzNvP38Ba^ek+P4IbpeOr)*Vd4)TDO<%0! zFShY>P^9Gwklij|pJ5rQoFH>+$NDC2z8$ZnZLf`OKF12=;t>_jOc>F>{$P{>HAUP@ z+9;d|6ShjckD>-Q2(p0|ZnaB(R9Ff9NiIyvCO>JRW$%ut)Gz^2v%^%C#UGWfl?*$u zUpgH91Px8Nt;p~ghMVSB@qd|wMply@@Frvwb=zF>O|uu&Uiu- zEwV!3K}EVJ(Iz`G!os{)onj~@>i~c1;VI^he5gS4%UED^ zawj8`bYWZk`2?3(l&0V-``Y~1t+(V87}!AzQ}8jSe#K1UA^d0u!3fG1ND}9T9!OP% zOdc>P*DN$Z!-3*l^W26W`dSRXGj03KNXUgsmLR)MwAyf3Jd;06hxr*(J2K8!vLoc;qV<%{3WX3uKXdIFZ@R7!DKizN;L!3i9 z1@Tv`N4O}XzzpVtER-GZkW%JN2~FX*$3<==g?lj-IsxMFLcbr&}S-K5in!$261;i92$gd1fZc z48ib2^94tP@$*Es?Hq>(_~uxk_z7qYOsUsWQjt+pfDV8BQ1+~B#tb>tmAsWCG`AFS zzE(Lt$Ud++@U*`c%-bVVPsb@$G}LE;2<73WhR8#LKg9|(zQ=Pz?sqXOv?B){HWWYT z4VJAEh*^?9o(saZCt$p39lys?)zaTHZ=B-tW_8@jPOCdWuPHY&uSqrDoTvVNl}4h z?k;(JH^88v>|f55^DSWi*^uexid8y1_1-u+OdTC;SFu}oOW$ zIa{8sAPXxo;;NaTU7XXrD2dJa+!&9dOn@c}cuVeROf%jSsnq#9!5B@wXH0qEZ0N#d zfqqR31&@O*f!0eyn<@>I^Uz}y!~)ZBnxMNfU*9S46vnC{$cd_PG7Cu!Vy(D)iJ9g6)kot<@4&-P{c|<;s z+2#UVp2q*}i|j+ZJsT637jnQ@UUy|GS49-5j)cIbeffvvmh zU;Is9^lP_TZa~}`pw9`23s6@7&N94jj(2UEiH~?sCuWirAE1W%On?F#QL~dt$VcP8%K+w0Odqvr2mj^Dvb6D ze%H>%XN}Vth#kR?;>p+5b>|7xmjX1f1@%C^fr_BtMigN9cjmVqi&FVPOWj3zHrl1t zT6vjQ%#{Av7&STVJs(EC$1tLfBWb+fy&kXHsBetFB}WTqHIwzTlbOmx+8lo zyZ`JyW9&gQWi+ zo7HGNay*{*%#*?)XH5ORJ82_cxYu}(z&webu=#5Af_}6urL-<%q{cS)g$8|5%j%=qCDeR#jSEXpzhWJ`yj;%OF=(RV z+lC_yv&p@vFt2<_3Pk>~xFWDi>8FfQV#t@=r1HG6#11gudo*p%9&_?$>Yso>HJ!l4 zK1YY;YcGiL(%m+~M-$>0j90%E}zvawt(0q{dz_EYAnrH7cPApfr z6xI+wBeCAhX;vE6tKvNMXtiEL7;-UcsV`i!f|nU7_g>KPDxiX|TpsS>{B9UpHTF784P8VbB8KBdq%NLS&D5Yj#b&*LmC&-UWd~)VQ zc%G3nerqnY1*b^Zze2FO4ebeJk8bP274yNAD)HKl_1X>Wq$;M%<@=p-tm;r9!IYZl zEPhf|Y!2r`vFPj%af|oOh?|wtlJV7E+-@XXb?#t9!rM5_)Hcd!Yb!ev{2*5+TM0{Jg#-2X-Y z$Hd0W`cL`~HV!7vzx5ygj==bb{=+nmSI$Nl5$axZ$i_h7ZQ~~ki-X!O; zzk>9qGjW$O=PcB-k`Sjgs*nQPh*MI9K^joNSe)2f*ondjh2dqoFHgt@!h&?M~NckLF2OUhin{4R1iake8?Vg1!i_ z%1}iJTXvb|=Taq49c*66pfE6M;C#Yd@4rA3an#*-!Jtqm-Lu-v#L1vTkZ#9QNpit{ nBQ+fmsCcg|b$){eT}Hd+gZ(?e{(FzV5%?Q{zY+KkLg0S^NDNad literal 0 HcmV?d00001 diff --git a/src/bosh_openstack_cpi/vendor/package/bosh_cpi-1.3215.3.1.gem b/src/bosh_openstack_cpi/vendor/package/bosh_cpi-1.3215.3.1.gem deleted file mode 100644 index 9af0ff325f9742dfce78b8f2062248bf22e29c9a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10752 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 O@HYZ~Bk-Suz<&WjNN(f+ diff --git a/src/bosh_openstack_cpi/vendor/package/bosh_cpi-2.0.1.gem b/src/bosh_openstack_cpi/vendor/package/bosh_cpi-2.0.1.gem new file mode 100644 index 0000000000000000000000000000000000000000..55c1bd8c043b7bc6619f4164aeeef5321b1c19ab GIT binary patch literal 11264 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 pt}2P}o~s~%KN$GIz+c0_KL8uh%KiWV diff --git a/src/bosh_openstack_cpi/vendor/package/semi_semantic-1.2.0.gem b/src/bosh_openstack_cpi/vendor/package/semi_semantic-1.2.0.gem new file mode 100644 index 0000000000000000000000000000000000000000..b33cd45bedc360221cdcd22b50c5c9f9203d29ed GIT binary patch literal 6656 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 Date: Wed, 23 Nov 2016 10:57:33 +0100 Subject: [PATCH 10/11] multi-cpi: cpi properties are no longer in openstack subkey of context, but in toplevel --- .../lib/cloud/openstack/cpi_lambda.rb | 14 ++++++-------- .../spec/unit/cpi_lambda_spec.rb | 12 ++++-------- 2 files changed, 10 insertions(+), 16 deletions(-) diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 61bed34e..15b2d3f5 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -18,15 +18,13 @@ def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=C end # allow openstack config to be overwritten dynamically by context - if context['openstack'] - cloud_properties['openstack'].merge!(context['openstack']) + cloud_properties['openstack'].merge!(context) - # write ca cert to disk if given in context - connection_options = cloud_properties['openstack']['connection_options'] - if connection_options && (ca_cert = connection_options.delete('ca_cert')) - File.write(ca_cert_from_context, ca_cert) - connection_options['ssl_ca_file'] = ca_cert_from_context - end + # write ca cert to disk if given in context + connection_options = cloud_properties['openstack']['connection_options'] + if connection_options && (ca_cert = connection_options.delete('ca_cert')) + File.write(ca_cert_from_context, ca_cert) + connection_options['ssl_ca_file'] = ca_cert_from_context end Bosh::Clouds::Openstack.new(cloud_properties) diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb index 8be4344b..448f5a08 100644 --- a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -47,10 +47,8 @@ context 'if openstack properties are provided in the context' do it 'merges the openstack properties' do context = { - 'openstack' => { - 'newkey' => 'newvalue', - 'newkey2' => 'newvalue2', - } + 'newkey' => 'newvalue', + 'newkey2' => 'newvalue2', } expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'key1' => 'value1', @@ -65,10 +63,8 @@ ca_file = Tempfile.new('ca_cert') context = { - 'openstack' => { - 'newkey' => 'newvalue', - 'connection_options' => {'ca_cert' => 'xyz'} - } + 'newkey' => 'newvalue', + 'connection_options' => {'ca_cert' => 'xyz'} } expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', From 7f24b4f86d63bb061a39d4ab438e1445708b64bf Mon Sep 17 00:00:00 2001 From: Felix Riegger Date: Tue, 20 Dec 2016 11:41:27 +0100 Subject: [PATCH 11/11] Fix context cacert handling Vcap user is not allowed to write to `/var/vcap/jobs/openstack_cpi/config/cacert_context.pem`. Instead of using this fixed path, a tmpdir is created for each cpi call. The lambda writes the cacert into this tmpdir. The tmpdir is deleted after the cpi call has finished. [#134693605](https://www.pivotaltracker.com/story/show/134693605) Signed-off-by: Jan von Loewenstein --- src/bosh_openstack_cpi/bin/openstack_cpi | 9 ++++---- .../lib/cloud/openstack/cpi_lambda.rb | 6 ++---- .../spec/unit/cpi_lambda_spec.rb | 21 +++++++++++++------ 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/src/bosh_openstack_cpi/bin/openstack_cpi b/src/bosh_openstack_cpi/bin/openstack_cpi index d8173586..8b720571 100755 --- a/src/bosh_openstack_cpi/bin/openstack_cpi +++ b/src/bosh_openstack_cpi/bin/openstack_cpi @@ -14,8 +14,9 @@ cloud_config = OpenStruct.new(:logger => Logger.new(STDERR)) Bosh::Clouds::Config.configure(cloud_config) cpi_log = StringIO.new +Dir.mktmpdir do |dir| + cpi_lambda = Bosh::OpenStackCloud::CpiLambda.create(cpi_config, cpi_log, ssl_ca_file, File.join(dir, 'cacert_context.pem')) + cli = Bosh::Cpi::Cli.new(cpi_lambda, cpi_log, STDOUT) -cpi_lambda = Bosh::OpenStackCloud::CpiLambda.create(cpi_config, cpi_log, ssl_ca_file) -cli = Bosh::Cpi::Cli.new(cpi_lambda, cpi_log, STDOUT) - -cli.run(ARGF.read) + cli.run(ARGF.read) +end \ No newline at end of file diff --git a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb index 15b2d3f5..f5fb3cf6 100644 --- a/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb +++ b/src/bosh_openstack_cpi/lib/cloud/openstack/cpi_lambda.rb @@ -1,11 +1,9 @@ module Bosh::OpenStackCloud class CpiLambda - CONTEXT_CA_PATH = '/var/vcap/jobs/openstack_cpi/config/cacert_context.pem' - - def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context=CONTEXT_CA_PATH) + def self.create(cpi_config, cpi_log, ca_cert_from_config, ca_cert_from_context) lambda do |context| unless cpi_config.has_key?('cloud') && cpi_config['cloud'].has_key?('properties') - raise "Could not find cloud properties in the configuration" + raise 'Could not find cloud properties in the configuration' end cloud_properties = cpi_config['cloud']['properties'] diff --git a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb index 448f5a08..be1edbff 100644 --- a/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb +++ b/src/bosh_openstack_cpi/spec/unit/cpi_lambda_spec.rb @@ -1,7 +1,7 @@ require "spec_helper" describe Bosh::OpenStackCloud::CpiLambda do - subject { described_class.create(cpi_config, cpi_log, ssl_ca_file) } + subject { described_class.create(cpi_config, cpi_log, ssl_ca_file, ca_cert_from_context) } let(:cpi_config) { { 'cloud' => { @@ -16,6 +16,7 @@ } let(:ssl_ca_file) { 'feel-free-to-change' } let(:cpi_log) { StringIO.new } + let(:ca_cert_from_context) { Tempfile.new('ca_cert').path } describe 'when creating a cloud' do it 'passes parts of the cpi config to openstack' do @@ -60,8 +61,6 @@ end it 'writes the given ca_cert to the disk and sets ssl_ca_file to its path' do - ca_file = Tempfile.new('ca_cert') - context = { 'newkey' => 'newvalue', 'connection_options' => {'ca_cert' => 'xyz'} @@ -70,11 +69,21 @@ expect(Bosh::Clouds::Openstack).to receive(:new).with({'openstack' => { 'newkey' => 'newvalue', 'key1' => 'value1', 'key2' => 'value2', - 'connection_options' => {'ssl_ca_file' => ca_file.path}}, + 'connection_options' => {'ssl_ca_file' => ca_cert_from_context}}, 'cpi_log' => cpi_log}) - described_class.create(cpi_config, cpi_log, ssl_ca_file, ca_file.path).call(context) - expect(File.read(ca_file.path)).to eq('xyz') + subject.call(context) + expect(File.read(ca_cert_from_context)).to eq('xyz') + end + + context 'when the context does not include a ca_cert' do + it 'does not write into the file' do + allow(Bosh::Clouds::Openstack).to receive(:new) + + subject.call({}) + + expect(File.read(ca_cert_from_context)).to eq('') + end end end end