spec/functional/ssh_spec.rb in knife-17.10.95 vs spec/functional/ssh_spec.rb in knife-17.10.163

- old
+ new

@@ -1,352 +1,352 @@ -# -# Author:: Daniel DeLeo (<dan@chef.io>) -# Copyright:: Copyright (c) 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 CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -require "knife_spec_helper" -require "tiny_server" - -describe Chef::Knife::Ssh do - - before(:each) do - Chef::Knife::Ssh.load_deps - @server = TinyServer::Manager.new - @server.start - end - - after(:each) do - @server.stop - end - - let(:ssh_config) { {} } - before do - allow(Net::SSH).to receive(:configuration_for).and_return(ssh_config) - end - - describe "identity file" do - context "when knife[:ssh_identity_file] is set" do - before do - Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/aws.rsa" - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_identity_file" do - @knife.run - expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") - end - end - - context "when knife[:ssh_identity_file] is set and frozen" do - before do - Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/aws.rsa".freeze - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_identity_file" do - @knife.run - expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") - end - end - - context "when -i is provided" do - before do - Chef::Config[:knife][:ssh_identity_file] = nil - setup_knife(["-i ~/.ssh/aws.rsa", "*:*", "uptime"]) - end - - it "should use the value on the command line" do - @knife.run - expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") - end - - it "should override what is set in knife.rb" do - Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/other.rsa" - @knife.merge_configs - @knife.run - expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") - end - end - - context "when knife[:ssh_identity_file] is not provided]" do - before do - Chef::Config[:knife][:ssh_identity_file] = nil - setup_knife(["*:*", "uptime"]) - end - - it "uses the default" do - @knife.run - expect(@knife.config[:ssh_identity_file]).to eq(nil) - end - end - end - - describe "port" do - context "when -p 31337 is provided" do - before do - setup_knife(["-p 31337", "*:*", "uptime"]) - end - - it "uses the ssh_port" do - @knife.run - expect(@knife.config[:ssh_port]).to eq("31337") - end - end - end - - describe "user" do - context "when knife[:ssh_user] is set" do - before do - Chef::Config[:knife][:ssh_user] = "ubuntu" - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_user" do - @knife.run - expect(@knife.config[:ssh_user]).to eq("ubuntu") - end - end - - context "when knife[:ssh_user] is set and frozen" do - before do - Chef::Config[:knife][:ssh_user] = "ubuntu".freeze - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_user" do - @knife.run - expect(@knife.config[:ssh_user]).to eq("ubuntu") - end - end - - context "when -x is provided" do - before do - Chef::Config[:knife][:ssh_user] = nil - setup_knife(["-x ubuntu", "*:*", "uptime"]) - end - - it "should use the value on the command line" do - @knife.run - expect(@knife.config[:ssh_user]).to eq("ubuntu") - end - - it "should override what is set in knife.rb" do - Chef::Config[:knife][:ssh_user] = "root" - @knife.merge_configs - @knife.run - expect(@knife.config[:ssh_user]).to eq("ubuntu") - end - end - - context "when knife[:ssh_user] is not provided]" do - before do - Chef::Config[:knife][:ssh_user] = nil - setup_knife(["*:*", "uptime"]) - end - - it "uses the default (current user)" do - @knife.run - expect(@knife.config[:ssh_user]).to eq(nil) - end - end - end - - describe "attribute" do - context "when knife[:ssh_attribute] is set" do - before do - Chef::Config[:knife][:ssh_attribute] = "ec2.public_hostname" - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_attribute" do - @knife.run - expect(@knife.get_ssh_attribute({ "target" => "ec2.public_hostname" })).to eq("ec2.public_hostname") - end - end - - context "when knife[:ssh_attribute] is not provided" do - before do - Chef::Config[:knife][:ssh_attribute] = nil - setup_knife(["*:*", "uptime"]) - end - - it "uses the default" do - @knife.run - expect(@knife.get_ssh_attribute({ "fqdn" => "fqdn" })).to eq("fqdn") - end - end - - context "when -a ec2.public_public_hostname is provided" do - before do - Chef::Config[:knife][:ssh_attribute] = nil - setup_knife(["-a", "ec2.public_hostname", "*:*", "uptime"]) - end - - it "should use the value on the command line" do - @knife.run - expect(@knife.config[:ssh_attribute]).to eq("ec2.public_hostname") - end - - it "should override what is set in knife.rb" do - # This is the setting imported from knife.rb - Chef::Config[:knife][:ssh_attribute] = "fqdn" - @knife.merge_configs - # Then we run knife with the -a flag, which sets the above variable - setup_knife(["-a", "ec2.public_hostname", "*:*", "uptime"]) - @knife.run - expect(@knife.config[:ssh_attribute]).to eq("ec2.public_hostname") - end - end - end - - describe "prefix" do - context "when knife[:prefix_attribute] is set" do - before do - Chef::Config[:knife][:prefix_attribute] = "name" - setup_knife(["*:*", "uptime"]) - end - - it "uses the prefix_attribute" do - @knife.run - expect(@knife.get_prefix_attribute({ "prefix" => "name" })).to eq("name") - end - end - - context "when knife[:prefix_attribute] is not provided" do - before do - Chef::Config[:knife][:prefix_attribute] = nil - setup_knife(["*:*", "uptime"]) - end - - it "falls back to nil" do - @knife.run - expect(@knife.get_prefix_attribute({})).to eq(nil) - end - end - - context "when --prefix-attribute ec2.public_public_hostname is provided" do - before do - Chef::Config[:knife][:prefix_attribute] = nil - setup_knife(["--prefix-attribute", "ec2.public_hostname", "*:*", "uptime"]) - end - - it "should use the value on the command line" do - @knife.run - expect(@knife.config[:prefix_attribute]).to eq("ec2.public_hostname") - end - - it "should override what is set in knife.rb" do - # This is the setting imported from knife.rb - Chef::Config[:knife][:prefix_attribute] = "fqdn" - @knife.merge_configs - # Then we run knife with the -b flag, which sets the above variable - setup_knife(["--prefix-attribute", "ec2.public_hostname", "*:*", "uptime"]) - @knife.run - expect(@knife.config[:prefix_attribute]).to eq("ec2.public_hostname") - end - end - end - - describe "gateway" do - context "when knife[:ssh_gateway] is set" do - before do - Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_gateway" do - expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true }) - @knife.run - expect(@knife.config[:ssh_gateway]).to eq("user@ec2.public_hostname") - end - end - - context "when -G user@ec2.public_hostname is provided" do - before do - Chef::Config[:knife][:ssh_gateway] = nil - setup_knife(["-G user@ec2.public_hostname", "*:*", "uptime"]) - end - - it "uses the ssh_gateway" do - expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true }) - @knife.run - expect(@knife.config[:ssh_gateway]).to eq("user@ec2.public_hostname") - end - end - - context "when knife[:ssh_gateway_identity] is set" do - before do - Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" - Chef::Config[:knife][:ssh_gateway_identity] = "~/.ssh/aws-gateway.rsa" - setup_knife(["*:*", "uptime"]) - end - - it "uses the ssh_gateway_identity file" do - expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true, keys: File.expand_path("#{ENV["HOME"]}/.ssh/aws-gateway.rsa").squeeze("/"), keys_only: true }) - @knife.run - expect(@knife.config[:ssh_gateway_identity]).to eq("~/.ssh/aws-gateway.rsa") - end - end - - context "when -ssh-gateway-identity is provided and knife[:ssh_gateway] is set" do - before do - Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" - Chef::Config[:knife][:ssh_gateway_identity] = nil - setup_knife(["--ssh-gateway-identity", "~/.ssh/aws-gateway.rsa", "*:*", "uptime"]) - end - - it "uses the ssh_gateway_identity file" do - expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true, keys: File.expand_path("#{ENV["HOME"]}/.ssh/aws-gateway.rsa").squeeze("/"), keys_only: true }) - @knife.run - expect(@knife.config[:ssh_gateway_identity]).to eq("~/.ssh/aws-gateway.rsa") - end - end - - context "when the gateway requires a password" do - before do - Chef::Config[:knife][:ssh_gateway] = nil - setup_knife(["-G user@ec2.public_hostname", "*:*", "uptime"]) - allow(@knife.session).to receive(:via) do |host, user, options| - raise Net::SSH::AuthenticationFailed unless options[:password] - end - end - - it "should prompt the user for a password" do - expect(@knife.ui).to receive(:ask).with("Enter the password for user@ec2.public_hostname: ", echo: false).and_return("password") - @knife.run - end - end - end - - def setup_knife(params = []) - @knife = Chef::Knife::Ssh.new(params) - # We explicitly avoid running #configure_chef, which would read a knife.rb - # if available, but #merge_configs (which is called by #configure_chef) is - # necessary to have default options merged in. - @knife.merge_configs - allow(@knife).to receive(:ssh_command) { 0 } - @api = TinyServer::API.instance - @api.clear - - Chef::Config[:node_name] = nil - Chef::Config[:client_key] = nil - Chef::Config[:chef_server_url] = "http://localhost:9000" - - @api.post("/search/node?q=*:*&start=0&rows=1000", 200) do - %({"total":1, "start":0, "rows":[{"data": {"fqdn":"the.fqdn", "target": "the_public_hostname"}}]}) - end - end - -end +# +# Author:: Daniel DeLeo (<dan@chef.io>) +# Copyright:: Copyright (c) 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 CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +require "knife_spec_helper" +require "tiny_server" + +describe Chef::Knife::Ssh do + + before(:each) do + Chef::Knife::Ssh.load_deps + @server = TinyServer::Manager.new + @server.start + end + + after(:each) do + @server.stop + end + + let(:ssh_config) { {} } + before do + allow(Net::SSH).to receive(:configuration_for).and_return(ssh_config) + end + + describe "identity file" do + context "when knife[:ssh_identity_file] is set" do + before do + Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/aws.rsa" + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_identity_file" do + @knife.run + expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") + end + end + + context "when knife[:ssh_identity_file] is set and frozen" do + before do + Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/aws.rsa".freeze + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_identity_file" do + @knife.run + expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") + end + end + + context "when -i is provided" do + before do + Chef::Config[:knife][:ssh_identity_file] = nil + setup_knife(["-i ~/.ssh/aws.rsa", "*:*", "uptime"]) + end + + it "should use the value on the command line" do + @knife.run + expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") + end + + it "should override what is set in knife.rb" do + Chef::Config[:knife][:ssh_identity_file] = "~/.ssh/other.rsa" + @knife.merge_configs + @knife.run + expect(@knife.config[:ssh_identity_file]).to eq("~/.ssh/aws.rsa") + end + end + + context "when knife[:ssh_identity_file] is not provided]" do + before do + Chef::Config[:knife][:ssh_identity_file] = nil + setup_knife(["*:*", "uptime"]) + end + + it "uses the default" do + @knife.run + expect(@knife.config[:ssh_identity_file]).to eq(nil) + end + end + end + + describe "port" do + context "when -p 31337 is provided" do + before do + setup_knife(["-p 31337", "*:*", "uptime"]) + end + + it "uses the ssh_port" do + @knife.run + expect(@knife.config[:ssh_port]).to eq("31337") + end + end + end + + describe "user" do + context "when knife[:ssh_user] is set" do + before do + Chef::Config[:knife][:ssh_user] = "ubuntu" + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_user" do + @knife.run + expect(@knife.config[:ssh_user]).to eq("ubuntu") + end + end + + context "when knife[:ssh_user] is set and frozen" do + before do + Chef::Config[:knife][:ssh_user] = "ubuntu".freeze + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_user" do + @knife.run + expect(@knife.config[:ssh_user]).to eq("ubuntu") + end + end + + context "when -x is provided" do + before do + Chef::Config[:knife][:ssh_user] = nil + setup_knife(["-x ubuntu", "*:*", "uptime"]) + end + + it "should use the value on the command line" do + @knife.run + expect(@knife.config[:ssh_user]).to eq("ubuntu") + end + + it "should override what is set in knife.rb" do + Chef::Config[:knife][:ssh_user] = "root" + @knife.merge_configs + @knife.run + expect(@knife.config[:ssh_user]).to eq("ubuntu") + end + end + + context "when knife[:ssh_user] is not provided]" do + before do + Chef::Config[:knife][:ssh_user] = nil + setup_knife(["*:*", "uptime"]) + end + + it "uses the default (current user)" do + @knife.run + expect(@knife.config[:ssh_user]).to eq(nil) + end + end + end + + describe "attribute" do + context "when knife[:ssh_attribute] is set" do + before do + Chef::Config[:knife][:ssh_attribute] = "ec2.public_hostname" + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_attribute" do + @knife.run + expect(@knife.get_ssh_attribute({ "target" => "ec2.public_hostname" })).to eq("ec2.public_hostname") + end + end + + context "when knife[:ssh_attribute] is not provided" do + before do + Chef::Config[:knife][:ssh_attribute] = nil + setup_knife(["*:*", "uptime"]) + end + + it "uses the default" do + @knife.run + expect(@knife.get_ssh_attribute({ "fqdn" => "fqdn" })).to eq("fqdn") + end + end + + context "when -a ec2.public_public_hostname is provided" do + before do + Chef::Config[:knife][:ssh_attribute] = nil + setup_knife(["-a", "ec2.public_hostname", "*:*", "uptime"]) + end + + it "should use the value on the command line" do + @knife.run + expect(@knife.config[:ssh_attribute]).to eq("ec2.public_hostname") + end + + it "should override what is set in knife.rb" do + # This is the setting imported from knife.rb + Chef::Config[:knife][:ssh_attribute] = "fqdn" + @knife.merge_configs + # Then we run knife with the -a flag, which sets the above variable + setup_knife(["-a", "ec2.public_hostname", "*:*", "uptime"]) + @knife.run + expect(@knife.config[:ssh_attribute]).to eq("ec2.public_hostname") + end + end + end + + describe "prefix" do + context "when knife[:prefix_attribute] is set" do + before do + Chef::Config[:knife][:prefix_attribute] = "name" + setup_knife(["*:*", "uptime"]) + end + + it "uses the prefix_attribute" do + @knife.run + expect(@knife.get_prefix_attribute({ "prefix" => "name" })).to eq("name") + end + end + + context "when knife[:prefix_attribute] is not provided" do + before do + Chef::Config[:knife][:prefix_attribute] = nil + setup_knife(["*:*", "uptime"]) + end + + it "falls back to nil" do + @knife.run + expect(@knife.get_prefix_attribute({})).to eq(nil) + end + end + + context "when --prefix-attribute ec2.public_public_hostname is provided" do + before do + Chef::Config[:knife][:prefix_attribute] = nil + setup_knife(["--prefix-attribute", "ec2.public_hostname", "*:*", "uptime"]) + end + + it "should use the value on the command line" do + @knife.run + expect(@knife.config[:prefix_attribute]).to eq("ec2.public_hostname") + end + + it "should override what is set in knife.rb" do + # This is the setting imported from knife.rb + Chef::Config[:knife][:prefix_attribute] = "fqdn" + @knife.merge_configs + # Then we run knife with the -b flag, which sets the above variable + setup_knife(["--prefix-attribute", "ec2.public_hostname", "*:*", "uptime"]) + @knife.run + expect(@knife.config[:prefix_attribute]).to eq("ec2.public_hostname") + end + end + end + + describe "gateway" do + context "when knife[:ssh_gateway] is set" do + before do + Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_gateway" do + expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true }) + @knife.run + expect(@knife.config[:ssh_gateway]).to eq("user@ec2.public_hostname") + end + end + + context "when -G user@ec2.public_hostname is provided" do + before do + Chef::Config[:knife][:ssh_gateway] = nil + setup_knife(["-G user@ec2.public_hostname", "*:*", "uptime"]) + end + + it "uses the ssh_gateway" do + expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true }) + @knife.run + expect(@knife.config[:ssh_gateway]).to eq("user@ec2.public_hostname") + end + end + + context "when knife[:ssh_gateway_identity] is set" do + before do + Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" + Chef::Config[:knife][:ssh_gateway_identity] = "~/.ssh/aws-gateway.rsa" + setup_knife(["*:*", "uptime"]) + end + + it "uses the ssh_gateway_identity file" do + expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true, keys: File.expand_path("#{ENV["HOME"]}/.ssh/aws-gateway.rsa").squeeze("/"), keys_only: true }) + @knife.run + expect(@knife.config[:ssh_gateway_identity]).to eq("~/.ssh/aws-gateway.rsa") + end + end + + context "when -ssh-gateway-identity is provided and knife[:ssh_gateway] is set" do + before do + Chef::Config[:knife][:ssh_gateway] = "user@ec2.public_hostname" + Chef::Config[:knife][:ssh_gateway_identity] = nil + setup_knife(["--ssh-gateway-identity", "~/.ssh/aws-gateway.rsa", "*:*", "uptime"]) + end + + it "uses the ssh_gateway_identity file" do + expect(@knife.session).to receive(:via).with("ec2.public_hostname", "user", { append_all_supported_algorithms: true, keys: File.expand_path("#{ENV["HOME"]}/.ssh/aws-gateway.rsa").squeeze("/"), keys_only: true }) + @knife.run + expect(@knife.config[:ssh_gateway_identity]).to eq("~/.ssh/aws-gateway.rsa") + end + end + + context "when the gateway requires a password" do + before do + Chef::Config[:knife][:ssh_gateway] = nil + setup_knife(["-G user@ec2.public_hostname", "*:*", "uptime"]) + allow(@knife.session).to receive(:via) do |host, user, options| + raise Net::SSH::AuthenticationFailed unless options[:password] + end + end + + it "should prompt the user for a password" do + expect(@knife.ui).to receive(:ask).with("Enter the password for user@ec2.public_hostname: ", echo: false).and_return("password") + @knife.run + end + end + end + + def setup_knife(params = []) + @knife = Chef::Knife::Ssh.new(params) + # We explicitly avoid running #configure_chef, which would read a knife.rb + # if available, but #merge_configs (which is called by #configure_chef) is + # necessary to have default options merged in. + @knife.merge_configs + allow(@knife).to receive(:ssh_command) { 0 } + @api = TinyServer::API.instance + @api.clear + + Chef::Config[:node_name] = nil + Chef::Config[:client_key] = nil + Chef::Config[:chef_server_url] = "http://localhost:9000" + + @api.post("/search/node?q=*:*&start=0&rows=1000", 200) do + %({"total":1, "start":0, "rows":[{"data": {"fqdn":"the.fqdn", "target": "the_public_hostname"}}]}) + end + end + +end