summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordanielsdeleo <dan@opscode.com>2014-01-15 16:24:24 -0800
committerdanielsdeleo <dan@opscode.com>2014-01-15 16:43:00 -0800
commit7a33179ef0c092c6e5707e9116eb73387acf7bed (patch)
treef865a9cf5e057e4193b0374bec0f2d34ed7c7280
parent95acf4e9aeceefc1edaf18873617a3f51eda9c4d (diff)
downloadohai-7a33179ef0c092c6e5707e9116eb73387acf7bed.tar.gz
Fix OpenStack plugin for v7 changes, add tests
OpenStack plugin was not correctly resolving constants set in ec2 mixin because of block scoping issues when defining classes with blocks. Reference constants by full namespace to resolve it. Also add unit tests based on data gathered from this plugin on ohai 6.20.0
-rw-r--r--lib/ohai/plugins/openstack.rb17
-rw-r--r--spec/unit/plugins/openstack_spec.rb214
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
+