\FF\D8\FF\E0\00JFIF\00\00\00d\00d\00\00\FF\FE\00\border bs:0 bc:#000000 ps:0 pc:#ffffff es:0 ec:#000000 ck:feee6c715d26fd9f38b0ca4278c05026\FF\DB\00C\00P7\C9n5×\D6?\BDê\9Ds\EBp\9F[`8m\B7)o\B5\E8\E6I\99\FE3]]A2\BA\8Cw\D6E\93\\DEv\C8\009\F2\F1NI?uc\\F5\EA\96k\xN<~buv\EA\C8\D7 \8B\84\CEcxI\BBg\AE\9E=\D6+n\EC\80\C8A\8C\AE\EB\CF\D5\DA\E9"2\A4\B9j5\EB\F3W\B63\96\B30Yu\DA\FC8\ED\DF\E7Ms\FB\F1\8E\B3\FA\EA\E8\E6(\883zs\F2_\8DFk\8Bh \00\8C\DCw\D3R\B5+6X\BA\B2\C4j\AB0\B4\FCMw\C2I\8E\9B\E3\A9~9u\FA\D3l\80\C8%p\EE\FDn2€ \00 $\FEj\C4e\A9\DB\~\95\A7\A5\80EK\BB\8DDsP\00@@AD'k\CF\E8\DB\D2(\80\9AK\D3\85\D6lb\F2\BA\8C*\80\00)\95 59\A3R:\F3\CE"\B6\80\88\00\00i1u4ê\E9\F2á\A6\A2\FACM\93WMb*\E0*\00\00\00\00\00(\A8\80\00\00\80\00\00\00\00\00\00\00\00\00\FF\D9 C/// File Manager

File Manager

Path: /opt/chef/embedded/lib/ruby/gems/2.7.0/gems/chef-16.3.45/spec/integration/knife/

Viewing File: config_get_spec.rb

#
# Copyright 2018, Noah Kantrowitz
#
# 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 "support/shared/integration/integration_helper"
require "support/shared/context/config"

describe "knife config get", :workstation do
  include IntegrationSupport
  include KnifeSupport

  include_context "default config options"
  include_context "with a chef repo"

  let(:cmd_args) { [] }

  subject do
    cmd = knife("config", "get", *cmd_args, instance_filter: lambda { |instance|
      # Clear the stub set up in KnifeSupport.
      allow(File).to receive(:file?).and_call_original
      # Lies, damn lies, and config files. We need to allow normal config loading
      # behavior to be able to test stuff.
      instance.config.delete(:config_file)
      $__KNIFE_INTEGRATION_FAILSAFE_CHECK << " ole"
    })
    cmd.stdout
  end

  around do |ex|
    # Store and reset the value of some env vars.
    old_chef_home = ENV["CHEF_HOME"]
    old_knife_home = ENV["KNIFE_HOME"]
    old_home = ENV["HOME"]
    old_wd = Dir.pwd
    ChefConfig::PathHelper.per_tool_home_environment = "KNIFE_HOME"
    # Clear these out because they are cached permanently.
    ChefConfig::PathHelper.class_exec { remove_class_variable(:@@home_dir) }
    Chef::Knife::ConfigGet.reset_config_loader!
    begin
      ex.run
    ensure
      ENV["CHEF_HOME"] = old_chef_home
      ENV["KNIFE_HOME"] = old_knife_home
      ENV["HOME"] = old_home
      Dir.chdir(old_wd)
      ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
      ChefConfig::PathHelper.per_tool_home_environment = nil
    end
  end

  before do
    # Always run from the temp folder. This can't be in the `around` block above
    # because it has to run after the before set in the "with a chef repo" shared context.
    directory("repo")
    Dir.chdir(path_to("repo"))
    ENV[ChefUtils.windows? ? "CD" : "PWD"] = Dir.pwd
    ENV["HOME"] = path_to(".")
  end

  context "with a global knife.rb" do
    before { file(".chef/knife.rb", "node_name 'one'\n") }

    it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/.chef/knife.rb$}) }
    it { is_expected.to match(/^node_name:\s+one$/) }
  end

  context "with a repo knife.rb" do
    before { file("repo/.chef/knife.rb", "node_name 'two'\n") }

    it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/repo/.chef/knife.rb$}) }
    it { is_expected.to match(/^node_name:\s+two$/) }
  end

  context "with both knife.rb" do
    before do
      file(".chef/knife.rb", "node_name 'one'\n")
      file("repo/.chef/knife.rb", "node_name 'two'\n")
    end

    it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/repo/.chef/knife.rb$}) }
    it { is_expected.to match(/^node_name:\s+two$/) }
  end

  context "with a credentials file" do
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/.chef/credentials$}) }
    it { is_expected.to match(/^node_name:\s+three$/) }
  end

  context "with a credentials file and knife.rb" do
    before do
      file(".chef/knife.rb", "node_name 'one'\n")
      file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
    end

    it { is_expected.to match(%r{^Loading from configuration file .*/#{File.basename(path_to("."))}/.chef/knife.rb$}) }
    it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/.chef/credentials$}) }
    it { is_expected.to match(/^node_name:\s+one$/) }
  end

  context "with a config dot d files" do
    before { file(".chef/config.d/abc.rb", "node_name 'one'\n") }

    it { is_expected.to match(%r{^Loading from .d/ configuration file .*/#{File.basename(path_to("."))}/.chef/config.d/abc.rb$}) }
    it { is_expected.to match(/^node_name:\s+one$/) }
  end

  context "with a credentials file and CHEF_HOME" do
    before do
      file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
      file("foo/.chef/credentials", "[default]\nclient_name = \"four\"\n")
      ENV["CHEF_HOME"] = path_to("foo")
    end

    it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/foo/.chef/credentials$}) }
    it { is_expected.to match(/^node_name:\s+four$/) }
  end

  context "with a credentials file and KNIFE_HOME" do
    before do
      file(".chef/credentials", "[default]\nclient_name = \"three\"\n")
      file("bar/.chef/credentials", "[default]\nclient_name = \"four\"\n")
      ENV["KNIFE_HOME"] = path_to("bar")
    end

    it { is_expected.to match(%r{^Loading from credentials file .*/#{File.basename(path_to("."))}/bar/.chef/credentials$}) }
    it { is_expected.to match(/^node_name:\s+four$/) }
  end

  context "with single argument" do
    let(:cmd_args) { %w{node_name} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { is_expected.to match(/^node_name:\s+three\Z/) }
  end

  context "with two arguments" do
    let(:cmd_args) { %w{node_name client_key} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\nclient_key = \"three.pem\"") }

    it { is_expected.to match(%r{^client_key:\s+\S*/.chef/three.pem\nnode_name:\s+three\Z}) }
  end

  context "with a dotted argument" do
    let(:cmd_args) { %w{knife.ssh_user} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n[default.knife]\nssh_user = \"foo\"\n") }

    it { is_expected.to match(/^knife.ssh_user:\s+foo\Z/) }
  end

  context "with regex argument" do
    let(:cmd_args) { %w{/name/} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { is_expected.to match(/^node_name:\s+three\Z/) }
  end

  context "with --all" do
    let(:cmd_args) { %w{-a /key_contents/} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { is_expected.to match(/^client_key_contents:\s+\nvalidation_key_contents:\s+\Z/) }
  end

  context "with --raw" do
    let(:cmd_args) { %w{-r node_name} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { is_expected.to eq("three\n") }
  end

  context "with --format=json" do
    let(:cmd_args) { %w{--format=json node_name} }
    before { file(".chef/credentials", "[default]\nclient_name = \"three\"\n") }

    it { expect(JSON.parse(subject)).to eq({ "node_name" => "three" }) }
  end
end