diff options
author | danielsdeleo <dan@opscode.com> | 2014-01-15 16:44:38 -0800 |
---|---|---|
committer | danielsdeleo <dan@opscode.com> | 2014-01-15 16:44:38 -0800 |
commit | 64dcca1f24ac7f9311d69f4c55afa560e5203430 (patch) | |
tree | f865a9cf5e057e4193b0374bec0f2d34ed7c7280 | |
parent | 95acf4e9aeceefc1edaf18873617a3f51eda9c4d (diff) | |
parent | 7a33179ef0c092c6e5707e9116eb73387acf7bed (diff) | |
download | ohai-64dcca1f24ac7f9311d69f4c55afa560e5203430.tar.gz |
Merge branch 'OC-11104'
Fix OpenStack for Ohai 7
-rw-r--r-- | lib/ohai/plugins/openstack.rb | 17 | ||||
-rw-r--r-- | spec/unit/plugins/openstack_spec.rb | 214 |
2 files changed, 222 insertions, 9 deletions
diff --git a/lib/ohai/plugins/openstack.rb b/lib/ohai/plugins/openstack.rb index afe14a1a..eb357336 100644 --- a/lib/ohai/plugins/openstack.rb +++ b/lib/ohai/plugins/openstack.rb @@ -16,29 +16,28 @@ # limitations under the License. require 'ohai/mixin/ec2_metadata' -extend Ohai::Mixin::Ec2Metadata Ohai.plugin(:Openstack) do provides "openstack" - # does it matter that it's not hitting latest? - #Ec2Metadata::EC2_METADATA_URL = "/latest/meta-data" + include Ohai::Mixin::Ec2Metadata collect_data do # Adds openstack Mash if hint?('openstack') || hint?('hp') Ohai::Log.debug("ohai openstack") - openstack Mash.new - #for now, use the metadata service - if can_metadata_connect?(EC2_METADATA_ADDR,80) + + if can_metadata_connect?(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR,80) + openstack Mash.new Ohai::Log.debug("connecting to the OpenStack metadata service") - self.fetch_metadata.each {|k, v| openstack[k] = v } - case - when hint?('hp') + fetch_metadata.each {|k, v| openstack[k] = v } + + if hint?('hp') openstack['provider'] = 'hp' else openstack['provider'] = 'openstack' end + else Ohai::Log.debug("unable to connect to the OpenStack metadata service") end diff --git a/spec/unit/plugins/openstack_spec.rb b/spec/unit/plugins/openstack_spec.rb new file mode 100644 index 00000000..d6bd08ce --- /dev/null +++ b/spec/unit/plugins/openstack_spec.rb @@ -0,0 +1,214 @@ +# +# Author:: Daniel DeLeo (dan@getchef.com) +# Copyright:: Copyright (c) 2014 Chef Software, Inc. +# License:: Apache License, Version 2.0 +# +# 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 +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDIT"Net::HTTP Response"NS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require 'spec_helper' +require 'ohai/plugins/openstack' + +describe "OpenStack Plugin" do + + let(:openstack_hint) { false } + let(:hp_hint) { false } + + let(:ohai_system) { Ohai::System.new } + let(:ohai_data) { ohai_system.data } + + let(:openstack_plugin) do + plugin = get_plugin("openstack", ohai_system) + plugin.stub(:hint?).with("openstack").and_return(openstack_hint) + plugin.stub(:hint?).with("hp").and_return(hp_hint) + plugin + end + + before do + end + + context "when there is no relevant hint" do + + it "does not set any openstack data" do + openstack_plugin.run + expect(ohai_data).to_not have_key("openstack") + end + + end + + context "when there is an `openstack` hint" do + let(:openstack_hint) { true } + + context "and the metadata service is not available" do + + before do + openstack_plugin.should_receive(:can_metadata_connect?). + with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR,80). + and_return(false) + end + + it "does not set any openstack data" do + openstack_plugin.run + expect(ohai_data).to_not have_key("openstack") + end + end + + context "and the metadata service is available" do + + let(:metadata_version) { "2009-04-04" } + + let(:metadata_root) do + <<EOM +reservation-id +public-keys/ +security-groups +public-ipv4 +ami-manifest-path +instance-type +instance-id +local-ipv4 +ari-id +local-hostname +placement/ +ami-launch-index +public-hostname +hostname +ami-id +instance-action +aki-id +block-device-mapping/ +EOM + end + + let(:metadata_values) do + { + "reservation-id" => "r-4tjvl99h", + "public-keys/" => "0=dan-default", + "public-keys/0/" => "openssh-key", + "public-keys/0/openssh-key" => "SSH KEY DATA", + "security-groups" => "default", + "public-ipv4" => "", + "ami-manifest-path" => "FIXME", + "instance-type" => "opc-tester", + "instance-id" => "i-0000162a", + "local-ipv4" => "172.31.7.23", + "ari-id" => "ari-00000037", + "local-hostname" => "ohai-7-system-test.opscode.us", + "placement/" => "availability-zone", + "placement/availability-zone" => "nova", + "ami-launch-index" => "0", + "public-hostname" => "ohai-7-system-test.opscode.us", + "hostname" => "ohai-7-system-test.opscode.us", + "ami-id" => "ami-00000035", + "instance-action" => "none", + "aki-id" => "aki-00000036", + "block-device-mapping/" => "ami\nroot", + "block-device-mapping/ami" => "vda", + "block-device-mapping/root" => "/dev/vda" + } + end + + let(:http_client) { double("Net::HTTP", :read_timeout= => nil) } + + def expect_get(url, response_body) + http_client.should_receive(:get). + with(url). + and_return(double("HTTP Response", :code => "200", :body => response_body)) + end + + before do + openstack_plugin.should_receive(:can_metadata_connect?). + with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR,80). + and_return(true) + + Net::HTTP.stub(:start). + with(Ohai::Mixin::Ec2Metadata::EC2_METADATA_ADDR). + and_return(http_client) + + openstack_plugin.stub(:best_api_version).and_return(metadata_version) + + expect_get("/#{metadata_version}/meta-data/", metadata_root) + + metadata_values.each do |md_id, md_value| + expect_get("/#{metadata_version}/meta-data/#{md_id}", md_value) + end + + openstack_plugin.run + end + + it "reads the reservation_id from the metadata service" do + expect(ohai_data['openstack']['reservation_id']).to eq("r-4tjvl99h") + end + it "reads the public_keys_0_openssh_key from the metadata service" do + expect(ohai_data['openstack']['public_keys_0_openssh_key']).to eq("SSH KEY DATA") + end + it "reads the security_groups from the metadata service" do + expect(ohai_data['openstack']['security_groups']).to eq(["default"]) + end + it "reads the public_ipv4 from the metadata service" do + expect(ohai_data['openstack']['public_ipv4']).to eq("") + end + it "reads the ami_manifest_path from the metadata service" do + expect(ohai_data['openstack']['ami_manifest_path']).to eq("FIXME") + end + it "reads the instance_type from the metadata service" do + expect(ohai_data['openstack']['instance_type']).to eq("opc-tester") + end + it "reads the instance_id from the metadata service" do + expect(ohai_data['openstack']['instance_id']).to eq("i-0000162a") + end + it "reads the local_ipv4 from the metadata service" do + expect(ohai_data['openstack']['local_ipv4']).to eq("172.31.7.23") + end + it "reads the ari_id from the metadata service" do + expect(ohai_data['openstack']['ari_id']).to eq("ari-00000037") + end + it "reads the local_hostname from the metadata service" do + expect(ohai_data['openstack']['local_hostname']).to eq("ohai-7-system-test.opscode.us") + end + it "reads the placement_availability_zone from the metadata service" do + expect(ohai_data['openstack']['placement_availability_zone']).to eq("nova") + end + it "reads the ami_launch_index from the metadata service" do + expect(ohai_data['openstack']['ami_launch_index']).to eq("0") + end + it "reads the public_hostname from the metadata service" do + expect(ohai_data['openstack']['public_hostname']).to eq("ohai-7-system-test.opscode.us") + end + it "reads the hostname from the metadata service" do + expect(ohai_data['openstack']['hostname']).to eq("ohai-7-system-test.opscode.us") + end + it "reads the ami_id from the metadata service" do + expect(ohai_data['openstack']['ami_id']).to eq("ami-00000035") + end + it "reads the instance_action from the metadata service" do + expect(ohai_data['openstack']['instance_action']).to eq("none") + end + it "reads the aki_id from the metadata service" do + expect(ohai_data['openstack']['aki_id']).to eq("aki-00000036") + end + it "reads the block_device_mapping_ami from the metadata service" do + expect(ohai_data['openstack']['block_device_mapping_ami']).to eq("vda") + end + it "reads the block_device_mapping_root from the metadata service" do + expect(ohai_data['openstack']['block_device_mapping_root']).to eq("/dev/vda") + end + it "reads the provider from the metadata service" do + expect(ohai_data['openstack']['provider']).to eq("openstack") + end + end + + + end +end + |