summaryrefslogtreecommitdiff
path: root/spec/unit/knife/ssh_spec.rb
diff options
context:
space:
mode:
Diffstat (limited to 'spec/unit/knife/ssh_spec.rb')
-rw-r--r--spec/unit/knife/ssh_spec.rb182
1 files changed, 182 insertions, 0 deletions
diff --git a/spec/unit/knife/ssh_spec.rb b/spec/unit/knife/ssh_spec.rb
new file mode 100644
index 0000000000..6e90a87f01
--- /dev/null
+++ b/spec/unit/knife/ssh_spec.rb
@@ -0,0 +1,182 @@
+#
+# Author:: Bryan McLellan <btm@opscode.com>
+# Copyright:: Copyright (c) 2012 Opscode, 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 CONDITIONS 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 'net/ssh'
+require 'net/ssh/multi'
+
+describe Chef::Knife::Ssh do
+ before(:all) do
+ @original_config = Chef::Config.hash_dup
+ @original_knife_config = Chef::Config[:knife].dup
+ Chef::Config[:client_key] = CHEF_SPEC_DATA + "/ssl/private_key.pem"
+ end
+
+ after(:all) do
+ Chef::Config.configuration = @original_config
+ Chef::Config[:knife] = @original_knife_config
+ end
+
+ before do
+ @knife = Chef::Knife::Ssh.new
+ @knife.config.clear
+ @knife.config[:attribute] = "fqdn"
+ @node_foo = Chef::Node.new
+ @node_foo.automatic_attrs[:fqdn] = "foo.example.org"
+ @node_foo.automatic_attrs[:ipaddress] = "10.0.0.1"
+ @node_bar = Chef::Node.new
+ @node_bar.automatic_attrs[:fqdn] = "bar.example.org"
+ @node_bar.automatic_attrs[:ipaddress] = "10.0.0.2"
+ end
+
+ describe "#configure_session" do
+ context "manual is set to false (default)" do
+ before do
+ @knife.config[:manual] = false
+ @query = Chef::Search::Query.new
+ end
+
+ def configure_query(node_array)
+ @query.stub!(:search).and_return([node_array])
+ Chef::Search::Query.stub!(:new).and_return(@query)
+ end
+
+ def self.should_return_specified_attributes
+ it "returns an array of the attributes specified on the command line OR config file, if only one is set" do
+ @knife.config[:attribute] = "ipaddress"
+ @knife.config[:override_attribute] = "ipaddress"
+ configure_query([@node_foo, @node_bar])
+ @knife.should_receive(:session_from_list).with(['10.0.0.1', '10.0.0.2'])
+ @knife.configure_session
+ end
+
+ it "returns an array of the attributes specified on the command line even when a config value is set" do
+ @knife.config[:attribute] = "config_file" # this value will be the config file
+ @knife.config[:override_attribute] = "ipaddress" # this is the value of the command line via #configure_attribute
+ configure_query([@node_foo, @node_bar])
+ @knife.should_receive(:session_from_list).with(['10.0.0.1', '10.0.0.2'])
+ @knife.configure_session
+ end
+ end
+
+ it "searchs for and returns an array of fqdns" do
+ configure_query([@node_foo, @node_bar])
+ @knife.should_receive(:session_from_list).with(['foo.example.org', 'bar.example.org'])
+ @knife.configure_session
+ end
+
+ should_return_specified_attributes
+
+ context "when cloud hostnames are available" do
+ before do
+ @node_foo.automatic_attrs[:cloud][:public_hostname] = "ec2-10-0-0-1.compute-1.amazonaws.com"
+ @node_bar.automatic_attrs[:cloud][:public_hostname] = "ec2-10-0-0-2.compute-1.amazonaws.com"
+ end
+
+ it "returns an array of cloud public hostnames" do
+ configure_query([@node_foo, @node_bar])
+ @knife.should_receive(:session_from_list).with(['ec2-10-0-0-1.compute-1.amazonaws.com', 'ec2-10-0-0-2.compute-1.amazonaws.com'])
+ @knife.configure_session
+ end
+
+ should_return_specified_attributes
+ end
+
+ it "should raise an error if no host are found" do
+ configure_query([ ])
+ @knife.ui.should_receive(:fatal)
+ @knife.should_receive(:exit).with(10)
+ @knife.configure_session
+ end
+
+ context "when there are some hosts found but they do not have an attribute to connect with" do
+ before do
+ @query.stub!(:search).and_return([[@node_foo, @node_bar]])
+ @node_foo.automatic_attrs[:fqdn] = nil
+ @node_bar.automatic_attrs[:fqdn] = nil
+ Chef::Search::Query.stub!(:new).and_return(@query)
+ end
+
+ it "should raise a specific error (CHEF-3402)" do
+ @knife.ui.should_receive(:fatal).with(/^2 nodes found/)
+ @knife.should_receive(:exit).with(10)
+ @knife.configure_session
+ end
+ end
+ end
+
+ context "manual is set to true" do
+ before do
+ @knife.config[:manual] = true
+ end
+
+ it "returns an array of provided values" do
+ @knife.instance_variable_set(:@name_args, ["foo.example.org bar.example.org"])
+ @knife.should_receive(:session_from_list).with(['foo.example.org', 'bar.example.org'])
+ @knife.configure_session
+ end
+ end
+ end
+
+ describe "#configure_attribute" do
+ before do
+ Chef::Config[:knife][:ssh_attribute] = nil
+ @knife.config[:attribute] = nil
+ end
+
+ it "should return fqdn by default" do
+ @knife.configure_attribute
+ @knife.config[:attribute].should == "fqdn"
+ end
+
+ it "should return the value set in the configuration file" do
+ Chef::Config[:knife][:ssh_attribute] = "config_file"
+ @knife.configure_attribute
+ @knife.config[:attribute].should == "config_file"
+ end
+
+ it "should return the value set on the command line" do
+ @knife.config[:attribute] = "command_line"
+ @knife.configure_attribute
+ @knife.config[:attribute].should == "command_line"
+ end
+
+ it "should set override_attribute to the value of attribute from the command line" do
+ @knife.config[:attribute] = "command_line"
+ @knife.configure_attribute
+ @knife.config[:attribute].should == "command_line"
+ @knife.config[:override_attribute].should == "command_line"
+ end
+
+ it "should set override_attribute to the value of attribute from the config file" do
+ Chef::Config[:knife][:ssh_attribute] = "config_file"
+ @knife.configure_attribute
+ @knife.config[:attribute].should == "config_file"
+ @knife.config[:override_attribute].should == "config_file"
+ end
+
+ it "should prefer the command line over the config file for the value of override_attribute" do
+ Chef::Config[:knife][:ssh_attribute] = "config_file"
+ @knife.config[:attribute] = "command_line"
+ @knife.configure_attribute
+ @knife.config[:override_attribute].should == "command_line"
+ end
+ end
+
+end
+