diff options
author | Thom May <thom@chef.io> | 2016-05-17 11:42:12 +0100 |
---|---|---|
committer | Thom May <thom@chef.io> | 2016-06-22 12:09:28 +0100 |
commit | 848545b6038d05ea370ea69be783db1a881e9280 (patch) | |
tree | ffb8702b8d098f5ffc2bd0c73f98cd103b98a63e | |
parent | 996301a9d073207fa37eed4d83dfae57d4501168 (diff) | |
download | chef-848545b6038d05ea370ea69be783db1a881e9280.tar.gz |
Add most common knife commands to integration teststm/knife_integration_tests
Signed-off-by: Thom May <thom@chef.io>
44 files changed, 2496 insertions, 52 deletions
diff --git a/spec/integration/knife/client_bulk_delete_spec.rb b/spec/integration/knife/client_bulk_delete_spec.rb new file mode 100644 index 0000000000..a422401af6 --- /dev/null +++ b/spec/integration/knife/client_bulk_delete_spec.rb @@ -0,0 +1,130 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife client bulk delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some clients" do + before do + client "concat", {} + client "cons", {} + client "car", {} + client "cdr", {} + client "cat", {} + end + + it "deletes all matching clients" do + knife("client bulk delete ^ca.*", input: "Y").should_succeed <<EOM +The following clients will be deleted: + +car cat + +Are you sure you want to delete these clients? (Y/N) Deleted client car +Deleted client cat +EOM + + knife("client list").should_succeed <<EOM +cdr +chef-validator +chef-webui +concat +cons +EOM + end + + it "deletes all matching clients when unanchored" do + knife("client bulk delete ca.*", input: "Y").should_succeed <<EOM +The following clients will be deleted: + +car cat concat + +Are you sure you want to delete these clients? (Y/N) Deleted client car +Deleted client cat +Deleted client concat +EOM + + knife("client list").should_succeed <<EOM +cdr +chef-validator +chef-webui +cons +EOM + end + end + + when_the_chef_server "has a validator client" do + before do + client "cons", {} + client "car", {} + client "car-validator", { validator: true } + client "cdr", {} + client "cat", {} + end + + it "refuses to delete a validator normally" do + knife("client bulk delete ^ca.*", input: "Y").should_succeed <<EOM +The following clients are validators and will not be deleted: + +car-validator + +You must specify --delete-validators to delete the validator clients +The following clients will be deleted: + +car cat + +Are you sure you want to delete these clients? (Y/N) Deleted client car +Deleted client cat +EOM + + knife("client list").should_succeed <<EOM +car-validator +cdr +chef-validator +chef-webui +cons +EOM + end + + it "deletes a validator when told to" do + knife("client bulk delete ^ca.* -D", input: "Y\nY").should_succeed <<EOM +The following validators will be deleted: + +car-validator + +Are you sure you want to delete these validators? (Y/N) Deleted client car-validator +The following clients will be deleted: + +car cat + +Are you sure you want to delete these clients? (Y/N) Deleted client car +Deleted client cat +EOM + + knife("client list").should_succeed <<EOM +cdr +chef-validator +chef-webui +cons +EOM + end + end +end diff --git a/spec/integration/knife/client_create_spec.rb b/spec/integration/knife/client_create_spec.rb new file mode 100644 index 0000000000..10172833c8 --- /dev/null +++ b/spec/integration/knife/client_create_spec.rb @@ -0,0 +1,69 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "openssl" + +describe "knife client create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:out) { "Created client[bah]\n" } + + when_the_chef_server "is empty" do + it "creates a new client" do + knife("client create -k bah").should_succeed stderr: out + end + + it "creates a new validator client" do + knife("client create -k --validator bah").should_succeed stderr: out + knife("client show bah").should_succeed <<EOM +admin: false +chef_type: client +name: bah +validator: true +EOM + end + + it "refuses to add an existing client" do + pending "Knife client create must not blindly overwrite an existing client" + knife("client create -k bah").should_succeed stderr: out + expect { knife("client create -k bah") }.to raise_error(Net::HTTPServerException) + end + + it "saves the private key to a file" do + Dir.mktmpdir do |tgt| + knife("client create -f #{tgt}/bah.pem bah").should_succeed stderr: out + expect(File).to exist("#{tgt}/bah.pem") + end + end + + it "reads the public key from a file" do + Dir.mktmpdir do |tgt| + key = OpenSSL::PKey::RSA.generate(1024) + File.open("#{tgt}/public.pem", "w") { |pub| pub.write(key.public_key.to_pem) } + knife("client create -p #{tgt}/public.pem bah").should_succeed stderr: out + end + end + + it "refuses to run if conflicting options are passed" do + knife("client create -p public.pem --prevent-keygen blah").should_fail stderr: "FATAL: You cannot pass --public-key and --prevent-keygen\n", stdout: /^USAGE.*/ + end + end +end diff --git a/spec/integration/knife/client_delete_spec.rb b/spec/integration/knife/client_delete_spec.rb new file mode 100644 index 0000000000..d135dd0a5b --- /dev/null +++ b/spec/integration/knife/client_delete_spec.rb @@ -0,0 +1,63 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife client delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some clients" do + before do + client "cons", {} + client "car", {} + client "car-validator", { validator: true } + client "cdr", {} + client "cat", {} + end + + it "deletes a client" do + knife("client delete car", input: "Y").should_succeed <<EOM +Do you really want to delete car? (Y/N) Deleted client[car] +EOM + + knife("client list").should_succeed <<EOM +car-validator +cat +cdr +chef-validator +chef-webui +cons +EOM + end + + it "refuses to delete a validator normally" do + knife("client delete car-validator", input: "Y").should_fail exit_code: 2, stdout: "Do you really want to delete car-validator? (Y/N) ", stderr: <<EOM +FATAL: You must specify --delete-validators to delete the validator client car-validator +EOM + end + + it "deletes a validator correctly" do + knife("client delete car-validator -D", input: "Y").should_succeed <<EOM +Do you really want to delete car-validator? (Y/N) Deleted client[car-validator] +EOM + end + + end +end diff --git a/spec/integration/knife/client_key_create_spec.rb b/spec/integration/knife/client_key_create_spec.rb new file mode 100644 index 0000000000..b588afbe50 --- /dev/null +++ b/spec/integration/knife/client_key_create_spec.rb @@ -0,0 +1,65 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "openssl" + +describe "knife client key create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:out) { "Created key: new" } + + when_the_chef_server "has a client" do + before do + client "bah", {} + end + + it "creates a new client key" do + knife("client key create -k new bah").should_succeed stderr: /^#{out}/, stdout: /.*BEGIN RSA PRIVATE KEY/ + end + + it "creates a new client key with an expiration date" do + date = "2017-12-31T23:59:59Z" + knife("client key create -k new -e #{date} bah").should_succeed stderr: /^#{out}/, stdout: /.*BEGIN RSA PRIVATE KEY/ + knife("client key show bah new").should_succeed /expiration_date:.*#{date}/ + end + + it "refuses to add an already existing key" do + knife("client key create -k new bah") + expect { knife("client key create -k new bah") }.to raise_error(Net::HTTPServerException) + end + + it "saves the private key to a file" do + Dir.mktmpdir do |tgt| + knife("client key create -f #{tgt}/bah.pem -k new bah").should_succeed stderr: /^#{out}/ + expect(File).to exist("#{tgt}/bah.pem") + end + end + + it "reads the public key from a file" do + Dir.mktmpdir do |tgt| + key = OpenSSL::PKey::RSA.generate(1024) + File.open("#{tgt}/public.pem", "w") { |pub| pub.write(key.public_key.to_pem) } + knife("client key create -p #{tgt}/public.pem -k new bah").should_succeed stderr: /^#{out}/ + end + end + + end +end diff --git a/spec/integration/knife/client_key_delete_spec.rb b/spec/integration/knife/client_key_delete_spec.rb new file mode 100644 index 0000000000..d5827aa545 --- /dev/null +++ b/spec/integration/knife/client_key_delete_spec.rb @@ -0,0 +1,42 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife client key delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a client" do + before do + client "car", {} + end + + it "deletes a client" do + out = "Do you really want to delete the key named new for the client named car? (Y/N) " + knife("client key create -k new car") + knife("client key delete car new", input: "Y").should_succeed stdout: out, stderr: <<EOM +Deleted key named new for the client named car +EOM + + knife("client key list car").should_succeed "" + end + + end +end diff --git a/spec/integration/knife/client_key_list_spec.rb b/spec/integration/knife/client_key_list_spec.rb new file mode 100644 index 0000000000..de9894622e --- /dev/null +++ b/spec/integration/knife/client_key_list_spec.rb @@ -0,0 +1,60 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "date" + +describe "knife client key list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:now) { DateTime.now } + let(:last_month) { (now << 1).strftime("%FT%TZ") } + let(:next_month) { (now >> 1).strftime("%FT%TZ") } + + when_the_chef_server "has a client" do + before do + client "cons", {} + knife("client key create cons -k new") + knife("client key create cons -k next_month -e #{next_month}") + knife("client key create cons -k expired -e #{last_month}") + end + + it "lists the keys for a client" do + knife("client key list cons").should_succeed "expired\nnew\nnext_month\n" + end + + it "shows detailed output" do + knife("client key list -w cons").should_succeed <<EOM +expired: http://127.0.0.1:8900/clients/cons/keys/expired (expired) +new: http://127.0.0.1:8900/clients/cons/keys/new +next_month: http://127.0.0.1:8900/clients/cons/keys/next_month +EOM + end + + it "lists the expired keys for a client" do + knife("client key list -e cons").should_succeed "expired\n" + end + + it "lists the unexpired keys for a client" do + knife("client key list -n cons").should_succeed "new\nnext_month\n" + end + + end +end diff --git a/spec/integration/knife/client_key_show_spec.rb b/spec/integration/knife/client_key_show_spec.rb new file mode 100644 index 0000000000..e96ff3b6fe --- /dev/null +++ b/spec/integration/knife/client_key_show_spec.rb @@ -0,0 +1,44 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "date" + +describe "knife client key show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:now) { DateTime.now } + let(:last_month) { (now << 1).strftime("%FT%TZ") } + let(:next_month) { (now >> 1).strftime("%FT%TZ") } + + when_the_chef_server "has a client" do + before do + client "cons", {} + knife("client key create cons -k new") + knife("client key create cons -k next_month -e #{next_month}") + knife("client key create cons -k expired -e #{last_month}") + end + + it "shows a key for a client" do + knife("client key show cons new").should_succeed stdout: /.*name:.*new/ + end + + end +end diff --git a/spec/integration/knife/client_list_spec.rb b/spec/integration/knife/client_list_spec.rb new file mode 100644 index 0000000000..4159df73f1 --- /dev/null +++ b/spec/integration/knife/client_list_spec.rb @@ -0,0 +1,48 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife client list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some clients" do + before do + client "cons", {} + client "car", {} + client "car-validator", { validator: true } + client "cdr", {} + client "cat", {} + end + + it "lists the clients" do + knife("client list").should_succeed <<EOM +car +car-validator +cat +cdr +chef-validator +chef-webui +cons +EOM + end + + end +end diff --git a/spec/integration/knife/client_show_spec.rb b/spec/integration/knife/client_show_spec.rb new file mode 100644 index 0000000000..23ac204d77 --- /dev/null +++ b/spec/integration/knife/client_show_spec.rb @@ -0,0 +1,36 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife client show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a client" do + before do + client "cons", {} + end + + it "shows a client" do + knife("client show cons").should_succeed stdout: /.*name:.*cons/ + end + + end +end diff --git a/spec/integration/knife/cookbook_bulk_delete_spec.rb b/spec/integration/knife/cookbook_bulk_delete_spec.rb new file mode 100644 index 0000000000..4740813ce1 --- /dev/null +++ b/spec/integration/knife/cookbook_bulk_delete_spec.rb @@ -0,0 +1,64 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/cookbook_bulk_delete" + +describe "knife cookbook bulk delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a cookbook" do + before do + cookbook "foo", "1.0.0" + cookbook "foo", "0.6.5" + cookbook "fox", "0.6.0" + cookbook "fox", "0.6.5" + cookbook "fax", "0.6.0" + cookbook "zfa", "0.6.5" + end + + # rubocop:disable Style/TrailingWhitespace + it "knife cookbook bulk delete deletes all matching cookbooks" do + stdout = <<EOM +All versions of the following cookbooks will be deleted: + +foo fox + +Do you really want to delete these cookbooks? (Y/N) +EOM + + stderr = <<EOM +Deleted cookbook foo [1.0.0] +Deleted cookbook foo [0.6.5] +Deleted cookbook fox [0.6.5] +Deleted cookbook fox [0.6.0] +EOM + + knife("cookbook bulk delete ^fo.*", input: "Y").should_succeed(stderr: stderr, stdout: stdout) + + knife("cookbook list -a").should_succeed <<EOM +fax 0.6.0 +zfa 0.6.5 +EOM + end + # rubocop:enable Style/TrailingWhitespace + + end +end diff --git a/spec/integration/knife/cookbook_download_spec.rb b/spec/integration/knife/cookbook_download_spec.rb new file mode 100644 index 0000000000..2fbffb9dea --- /dev/null +++ b/spec/integration/knife/cookbook_download_spec.rb @@ -0,0 +1,95 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/cookbook_download" +require "tmpdir" + +describe "knife cookbook download", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:tmpdir) { Dir.mktmpdir } + + when_the_chef_server "has only one cookbook" do + before do + cookbook "x", "1.0.1" + end + + it "knife cookbook download downloads the latest version" do + knife("cookbook download -d #{tmpdir} x").should_succeed stderr: <<EOM +Downloading x cookbook version 1.0.1 +Downloading resources +Downloading providers +Downloading recipes +Downloading definitions +Downloading libraries +Downloading attributes +Downloading files +Downloading templates +Downloading root_files +Cookbook downloaded to #{tmpdir}/x-1.0.1 +EOM + end + + it "knife cookbook download with a version downloads the specified version" do + knife("cookbook download -d #{tmpdir} x 1.0.1").should_succeed stderr: <<EOM +Downloading x cookbook version 1.0.1 +Downloading resources +Downloading providers +Downloading recipes +Downloading definitions +Downloading libraries +Downloading attributes +Downloading files +Downloading templates +Downloading root_files +Cookbook downloaded to #{tmpdir}/x-1.0.1 +EOM + end + + it "knife cookbook download with an unknown version raises an error" do + expect { knife("cookbook download -d #{tmpdir} x 1.0.0") }.to raise_error(Net::HTTPServerException) + end + end + + when_the_chef_server "has multiple cookbook versions" do + before do + cookbook "x", "1.0.1" + cookbook "x", "1.0.0" + end + + it "knife cookbook download with no version prompts" do + knife("cookbook download -d #{tmpdir} x", input: "2\n").should_succeed(stderr: <<EOM, stdout: "Which version do you want to download?\n1. x 1.0.0\n2. x 1.0.1\n\n" +Downloading x cookbook version 1.0.1 +Downloading resources +Downloading providers +Downloading recipes +Downloading definitions +Downloading libraries +Downloading attributes +Downloading files +Downloading templates +Downloading root_files +Cookbook downloaded to #{tmpdir}/x-1.0.1 +EOM +) + end + end +end diff --git a/spec/integration/knife/cookbook_list_spec.rb b/spec/integration/knife/cookbook_list_spec.rb new file mode 100644 index 0000000000..65578696f2 --- /dev/null +++ b/spec/integration/knife/cookbook_list_spec.rb @@ -0,0 +1,54 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/cookbook_list" + +describe "knife cookbook list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a cookbook" do + before do + cookbook "x", "1.0.0" + cookbook "x", "0.6.5" + cookbook "x", "0.6.0" + cookbook "y", "0.6.5" + cookbook "y", "0.6.0" + cookbook "z", "0.6.5" + end + + it "knife cookbook list shows all the cookbooks" do + knife("cookbook list").should_succeed <<EOM +x 1.0.0 +y 0.6.5 +z 0.6.5 +EOM + end + + it "knife cookbook list -a shows all the versions of all the cookbooks" do + knife("cookbook list -a").should_succeed <<EOM +x 1.0.0 0.6.5 0.6.0 +y 0.6.5 0.6.0 +z 0.6.5 +EOM + end + + end +end diff --git a/spec/integration/knife/cookbook_show_spec.rb b/spec/integration/knife/cookbook_show_spec.rb new file mode 100644 index 0000000000..c001d66b97 --- /dev/null +++ b/spec/integration/knife/cookbook_show_spec.rb @@ -0,0 +1,159 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/cookbook_show" + +describe "knife cookbook show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a cookbook" do + before do + cookbook "x", "1.0.0", { "recipes" => { "default.rb" => "file 'n'", "x.rb" => "" } } + cookbook "x", "0.6.5" + end + + it "knife cookbook show x shows all the versions" do + knife("cookbook show x").should_succeed "x 1.0.0 0.6.5\n" + end + + # rubocop:disable Style/TrailingWhitespace + it "knife cookbook show x 1.0.0 shows the correct version" do + knife("cookbook show x 1.0.0").should_succeed <<EOM +attributes: +chef_type: cookbook_version +cookbook_name: x +definitions: +files: +frozen?: false +json_class: Chef::CookbookVersion +libraries: +metadata: + attributes: + chef_versions: + conflicting: + dependencies: + description: + gems: + groupings: + issues_url: + license: All rights reserved + long_description: + maintainer: + maintainer_email: + name: x + ohai_versions: + platforms: + privacy: false + providing: + recipes: + recommendations: + replacing: + source_url: + suggestions: + version: 1.0.0 +name: x-1.0.0 +providers: +recipes: + checksum: 4631b34cf58de10c5ef1304889941b2e + name: default.rb + path: recipes/default.rb + specificity: default + url: http://127.0.0.1:8900/file_store/checksums/4631b34cf58de10c5ef1304889941b2e + + checksum: d41d8cd98f00b204e9800998ecf8427e + name: x.rb + path: recipes/x.rb + specificity: default + url: http://127.0.0.1:8900/file_store/checksums/d41d8cd98f00b204e9800998ecf8427e +resources: +root_files: + checksum: 8226671f751ba102dea6a6b6bd32fa8d + name: metadata.rb + path: metadata.rb + specificity: default + url: http://127.0.0.1:8900/file_store/checksums/8226671f751ba102dea6a6b6bd32fa8d +templates: +version: 1.0.0 +EOM + end + + it "knife cookbook show x 1.0.0 metadata shows the metadata" do + knife("cookbook show x 1.0.0 metadata").should_succeed <<EOM +attributes: +chef_versions: +conflicting: +dependencies: +description: +gems: +groupings: +issues_url: +license: All rights reserved +long_description: +maintainer: +maintainer_email: +name: x +ohai_versions: +platforms: +privacy: false +providing: +recipes: +recommendations: +replacing: +source_url: +suggestions: +version: 1.0.0 +EOM + end + + it "knife cookbook show x 1.0.0 recipes shows all the recipes" do + knife("cookbook show x 1.0.0 recipes").should_succeed <<EOM +checksum: 4631b34cf58de10c5ef1304889941b2e +name: default.rb +path: recipes/default.rb +specificity: default +url: http://127.0.0.1:8900/file_store/checksums/4631b34cf58de10c5ef1304889941b2e + +checksum: d41d8cd98f00b204e9800998ecf8427e +name: x.rb +path: recipes/x.rb +specificity: default +url: http://127.0.0.1:8900/file_store/checksums/d41d8cd98f00b204e9800998ecf8427e +EOM + end + # rubocop:enable Style/TrailingWhitespace + + it "knife cookbook show x 1.0.0 recipes default.rb shows the default recipe" do + knife("cookbook show x 1.0.0 recipes default.rb").should_succeed "file 'n'\n" + end + + it "knife cookbook show with a non-existent file displays an error" do + expect { knife("cookbook show x 1.0.0 recipes moose.rb") }.to raise_error(Chef::Exceptions::FileNotFound) + end + + it "knife cookbook show with a non-existent version displays an error" do + expect { knife("cookbook show x 1.0.1") }.to raise_error(Net::HTTPServerException) + end + + it "knife cookbook show with a non-existent cookbook displays an error" do + expect { knife("cookbook show y") }.to raise_error(Net::HTTPServerException) + end + end +end diff --git a/spec/integration/knife/cookbook_upload_spec.rb b/spec/integration/knife/cookbook_upload_spec.rb new file mode 100644 index 0000000000..a0de725603 --- /dev/null +++ b/spec/integration/knife/cookbook_upload_spec.rb @@ -0,0 +1,90 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/cookbook_upload" + +describe "knife cookbook upload", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let (:cb_dir) { "#{@repository_dir}/cookbooks" } + + when_the_chef_server "is empty" do + when_the_repository "has a cookbook" do + before do + file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0") + end + + it "knife cookbook upload uploads the cookbook" do + knife("cookbook upload x -o #{cb_dir}").should_succeed stderr: <<EOM +Uploading x [1.0.0] +Uploaded 1 cookbook. +EOM + end + + it "knife cookbook upload --freeze uploads and freezes the cookbook" do + knife("cookbook upload x -o #{cb_dir} --freeze").should_succeed stderr: <<EOM +Uploading x [1.0.0] +Uploaded 1 cookbook. +EOM + # Modify the file, attempt to reupload + file "cookbooks/x/metadata.rb", 'name "x"; version "1.0.0"#different' + knife("cookbook upload x -o #{cb_dir} --freeze").should_fail stderr: <<EOM +Uploading x [1.0.0] +ERROR: Version 1.0.0 of cookbook x is frozen. Use --force to override. +WARNING: Not updating version constraints for x in the environment as the cookbook is frozen. +ERROR: Failed to upload 1 cookbook. +EOM + end + end + + when_the_repository "has a cookbook that depends on another cookbook" do + before do + file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0", "\ndepends 'y'") + file "cookbooks/y/metadata.rb", cb_metadata("y", "1.0.0") + end + + it "knife cookbook upload --include-dependencies uploads both cookbooks" do + knife("cookbook upload --include-dependencies x -o #{cb_dir}").should_succeed stderr: <<EOM +Uploading x [1.0.0] +Uploading y [1.0.0] +Uploaded 2 cookbooks. +EOM + end + + it "knife cookbook upload fails due to missing dependencies" do + knife("cookbook upload x -o #{cb_dir}").should_fail stderr: <<EOM +Uploading x [1.0.0] +ERROR: Cookbook x depends on cookbooks which are not currently +ERROR: being uploaded and cannot be found on the server. +ERROR: The missing cookbook(s) are: 'y' version '>= 0.0.0' +EOM + end + + it "knife cookbook upload -a uploads both cookbooks" do + knife("cookbook upload -a -o #{cb_dir}").should_succeed stderr: <<EOM +Uploading x [1.0.0] +Uploading y [1.0.0] +Uploaded all cookbooks. +EOM + end + end + end +end diff --git a/spec/integration/knife/data_bag_create_spec.rb b/spec/integration/knife/data_bag_create_spec.rb new file mode 100644 index 0000000000..0a07792dbc --- /dev/null +++ b/spec/integration/knife/data_bag_create_spec.rb @@ -0,0 +1,58 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/data_bag_create" + +describe "knife data bag create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:err) { "Created data_bag[foo]\n" } + let(:out) { "Created data_bag_item[bar]\n" } + let(:exists) { "Data bag foo already exists\n" } + + when_the_chef_server "is empty" do + it "creates a new data bag" do + knife("data bag create foo").should_succeed stderr: err + end + + it "creates a new data bag and item" do + pending "Deprecation warning must get fixed" + knife("data bag create foo bar").should_succeed stdout: out, stderr: err + end + + it "adds a new item to an existing bag" do + pending "Deprecation warning must get fixed" + knife("data bag create foo").should_succeed stderr: err + knife("data bag create foo bar").should_succeed stdout: out, stderr: exists + end + + it "refuses to add an existing data bag" do + knife("data bag create foo").should_succeed stderr: err + knife("data bag create foo").should_succeed stderr: exists + end + + it "fails to add an existing item" do + pending "Deprecation warning must get fixed" + knife("data bag create foo bar").should_succeed stdout: out, stderr: err + expect { knife("data bag create foo bar") }.to raise_error(Net::HTTPServerException) + end + end +end diff --git a/spec/integration/knife/data_bag_delete_spec.rb b/spec/integration/knife/data_bag_delete_spec.rb new file mode 100644 index 0000000000..96345b0d2b --- /dev/null +++ b/spec/integration/knife/data_bag_delete_spec.rb @@ -0,0 +1,58 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/data_bag_delete" + +describe "knife data bag delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some data bags" do + before do + data_bag "x", {} + data_bag "canteloupe", {} + data_bag "rocket", { "falcon9" => { heavy: "true" }, "atlas" => {}, "ariane" => {} } + end + + it "with an empty data bag" do + knife("data bag delete canteloupe", input: "y").should_succeed <<EOM +Do you really want to delete canteloupe? (Y/N) Deleted data_bag[canteloupe] +EOM + end + + it "with a bag with some items" do + knife("data bag delete rocket", input: "y").should_succeed <<EOM +Do you really want to delete rocket? (Y/N) Deleted data_bag[rocket] +EOM + end + + it "with a single item" do + knife("data bag delete rocket falcon9", input: "y").should_succeed <<EOM +Do you really want to delete falcon9? (Y/N) Deleted data_bag_item[falcon9] +EOM + end + + it "choosing not to delete" do + knife("data bag delete rocket falcon9", input: "n").should_succeed <<EOM, exit_code: 3 +Do you really want to delete falcon9? (Y/N) You said no, so I'm done here. +EOM + end + end +end diff --git a/spec/integration/knife/data_bag_from_file_spec.rb b/spec/integration/knife/data_bag_from_file_spec.rb new file mode 100644 index 0000000000..ca8f743487 --- /dev/null +++ b/spec/integration/knife/data_bag_from_file_spec.rb @@ -0,0 +1,115 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife data bag from file", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let (:db_dir) { "#{@repository_dir}/data_bags" } + + when_the_chef_server "has an empty data bag" do + before do + data_bag "foo", {} + data_bag "bar", {} + end + + when_the_repository "has some data bag items" do + before do + file "data_bags/foo/bar.json", { "id" => "bar", "foo" => "bar " } + file "data_bags/foo/bzr.json", { "id" => "bzr", "foo" => "bar " } + file "data_bags/foo/cat.json", { "id" => "cat", "foo" => "bar " } + file "data_bags/foo/dog.json", { "id" => "dog", "foo" => "bar " } + file "data_bags/foo/encrypted.json", <<EOM +{ + "id": "encrypted", + "password": { + "encrypted_data": "H6ab5RY9a9JAkS8A0RCMspXtOJh0ai8cNeA4Q3gLO8s=\\n", + "iv": "uWKKKxrJgtELlGMCOLJdkA==\\n", + "version": 1, + "cipher": "aes-256-cbc" + } +} +EOM + file "data_bags/bar/round_trip.json", <<EOM +{ + "name": "data_bag_item_bar_round_trip", + "json_class": "Chef::DataBagItem", + "chef_type": "data_bag_item", + "data_bag": "bar", + "raw_data": { + "id": "round_trip", + "root_password": { + "encrypted_data": "noDOsTpsTAZlTU5sprhmYZzUDfr8du7hH/zRDOjRAmoTJHTZyfYoR221EOOW\\nXJ1D\\n", + "iv": "Bnqhfy6n0Hx1wCe9pxHLoA==\\n", + "version": 1, + "cipher": "aes-256-cbc" + }, + "admin_password": { + "encrypted_data": "TcC7dU1gx6OnE5Ab4i/k42UEf0Nnr7cAyuTHId/LNjNOwpNf7XZc27DQSjuy\\nHPlt\\n", + "iv": "+TAWJuPWCI2+WB8lGJAyvw==\\n", + "version": 1, + "cipher": "aes-256-cbc" + } + } +} +EOM + end + + it "uploads a single file" do + knife("data bag from file foo #{db_dir}/foo/bar.json").should_succeed stderr: <<EOM +Updated data_bag_item[foo::bar] +EOM + end + + it "uploads a single encrypted file" do + knife("data bag from file foo #{db_dir}/foo/encrypted.json").should_succeed stderr: <<EOM +Updated data_bag_item[foo::encrypted] +EOM + end + + it "uploads a file in chef's internal format" do + pending "chef/chef#4815" + knife("data bag from file bar #{db_dir}/bar/round_trip.json").should_succeed stderr: <<EOM +Updated data_bag_item[bar::round_trip] +EOM + end + + it "uploads many files" do + knife("data bag from file foo #{db_dir}/foo/bar.json #{db_dir}/foo/bzr.json").should_succeed stderr: <<EOM +Updated data_bag_item[foo::bar] +Updated data_bag_item[foo::bzr] +EOM + end + + it "uploads a whole directory" do + knife("data bag from file foo #{db_dir}/foo") + knife("data bag show foo").should_succeed <<EOM +bar +bzr +cat +dog +encrypted +EOM + end + + end + end +end diff --git a/spec/integration/knife/data_bag_list_spec.rb b/spec/integration/knife/data_bag_list_spec.rb new file mode 100644 index 0000000000..7db9638660 --- /dev/null +++ b/spec/integration/knife/data_bag_list_spec.rb @@ -0,0 +1,43 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/data_bag_list" + +describe "knife data bag list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some data bags" do + before do + data_bag "x", {} + data_bag "canteloupe", {} + data_bag "rocket", {} + end + + it "knife data bag list shows all the cookbooks" do + knife("data bag list").should_succeed <<EOM +canteloupe +rocket +x +EOM + end + + end +end diff --git a/spec/integration/knife/data_bag_show_spec.rb b/spec/integration/knife/data_bag_show_spec.rb new file mode 100644 index 0000000000..22381adb9e --- /dev/null +++ b/spec/integration/knife/data_bag_show_spec.rb @@ -0,0 +1,53 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "chef/knife/data_bag_show" + +describe "knife data bag show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some data bags" do + before do + data_bag "x", {} + data_bag "canteloupe", {} + data_bag "rocket", { "falcon9" => { heavy: "true" }, "atlas" => {}, "ariane" => {} } + end + + it "with an empty data bag" do + knife("data bag show canteloupe").should_succeed "\n" + end + + it "with a bag with some items" do + knife("data bag show rocket").should_succeed <<EOM +ariane +atlas +falcon9 +EOM + end + + it "with a single item" do + knife("data bag show rocket falcon9").should_succeed <<EOM, stderr: "WARNING: Unencrypted data bag detected, ignoring any provided secret options.\n" +heavy: true +id: falcon9 +EOM + end + end +end diff --git a/spec/integration/knife/environment_compare_spec.rb b/spec/integration/knife/environment_compare_spec.rb new file mode 100644 index 0000000000..3259b27d1b --- /dev/null +++ b/spec/integration/knife/environment_compare_spec.rb @@ -0,0 +1,74 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment compare", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some environments" do + before do + cookbook "blah", "1.0.1" + cookbook "blah", "1.1.1" + cookbook "krad", "1.1.1" + environment "x", { + "cookbook_versions" => { + "blah" => "= 1.0.0", + "krad" => ">= 1.0.0", + }, + } + environment "y", { + "cookbook_versions" => { + "blah" => "= 1.1.0", + "krad" => ">= 1.0.0", + }, + } + end + + # rubocop:disable Style/TrailingWhitespace + it "displays the cookbooks for a single environment" do + knife("environment compare x").should_succeed <<EOM + x +blah = 1.0.0 +krad >= 1.0.0 + +EOM + end + + it "compares the cookbooks for two environments" do + knife("environment compare x y").should_succeed <<EOM + x y +blah = 1.0.0 = 1.1.0 +krad >= 1.0.0 >= 1.0.0 + +EOM + end + + it "compares the cookbooks for all environments" do + knife("environment compare --all").should_succeed <<EOM + x y +blah = 1.0.0 = 1.1.0 +krad >= 1.0.0 >= 1.0.0 + +EOM + end + # rubocop:enable Style/TrailingWhitespace + end +end diff --git a/spec/integration/knife/environment_create_spec.rb b/spec/integration/knife/environment_create_spec.rb new file mode 100644 index 0000000000..03fd4e63f7 --- /dev/null +++ b/spec/integration/knife/environment_create_spec.rb @@ -0,0 +1,40 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:out) { "Created bah\n" } + + when_the_chef_server "is empty" do + it "creates a new environment" do + knife("environment create bah").should_succeed out + end + + it "refuses to add an existing environment" do + pending "Knife environment create must not blindly overwrite an existing environment" + knife("environment create bah").should_succeed out + expect { knife("environment create bah") }.to raise_error(Net::HTTPServerException) + end + + end +end diff --git a/spec/integration/knife/environment_delete_spec.rb b/spec/integration/knife/environment_delete_spec.rb new file mode 100644 index 0000000000..0f1fe5c4a8 --- /dev/null +++ b/spec/integration/knife/environment_delete_spec.rb @@ -0,0 +1,36 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has an environment" do + before do + environment "y", {} + end + + it "deletes an environment" do + knife("environment delete y", input: "y").should_succeed "Do you really want to delete y? (Y/N) Deleted y\n" + end + + end +end diff --git a/spec/integration/knife/environment_from_file_spec.rb b/spec/integration/knife/environment_from_file_spec.rb new file mode 100644 index 0000000000..67d4373939 --- /dev/null +++ b/spec/integration/knife/environment_from_file_spec.rb @@ -0,0 +1,115 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment from file", :workstation do + include IntegrationSupport + include KnifeSupport + + # include_context "default config options" + + let (:env_dir) { "#{@repository_dir}/environments" } + + when_the_chef_server "is empty" do + when_the_repository "has some environments" do + before do + + file "environments/cons.json", <<EOM +{ + "name": "cons", + "description": "An environment", + "cookbook_versions": { + + }, + "json_class": "Chef::Environment", + "chef_type": "environment", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + file "environments/car.json", <<EOM +{ + "name": "car", + "description": "An environment for list nodes", + "cookbook_versions": { + + }, + "json_class": "Chef::Environment", + "chef_type": "environment", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + file "environments/cdr.json", <<EOM +{ + "name": "cdr", + "description": "An environment for last nodes", + "cookbook_versions": { + + }, + "json_class": "Chef::Environment", + "chef_type": "environment", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + end + + it "uploads a single file" do + knife("environment from file #{env_dir}/cons.json").should_succeed stderr: <<EOM +Updated Environment cons +EOM + end + + it "uploads many files" do + knife("environment from file #{env_dir}/cons.json #{env_dir}/car.json #{env_dir}/cdr.json").should_succeed stderr: <<EOM +Updated Environment cons +Updated Environment car +Updated Environment cdr +EOM + end + + it "uploads all environments in the repository" do + cwd(".") + knife("environment from file --all") + knife("environment list").should_succeed <<EOM +_default +car +cdr +cons +EOM + end + + end + end +end diff --git a/spec/integration/knife/environment_list_spec.rb b/spec/integration/knife/environment_list_spec.rb new file mode 100644 index 0000000000..5e74453d1f --- /dev/null +++ b/spec/integration/knife/environment_list_spec.rb @@ -0,0 +1,41 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some environments" do + before do + environment "b", {} + environment "y", {} + end + + it "lists all the environments" do + knife("environment list").should_succeed <<EOM +_default +b +y +EOM + end + + end +end diff --git a/spec/integration/knife/environment_show_spec.rb b/spec/integration/knife/environment_show_spec.rb new file mode 100644 index 0000000000..e74bf6d05d --- /dev/null +++ b/spec/integration/knife/environment_show_spec.rb @@ -0,0 +1,56 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife environment show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some environments" do + before do + environment "b", { + "default_attributes" => { "foo" => "bar" }, + } + end + + # rubocop:disable Style/TrailingWhitespace + it "shows an environment" do + knife("environment show b").should_succeed <<EOM +chef_type: environment +cookbook_versions: +default_attributes: + foo: bar +description: +json_class: Chef::Environment +name: b +override_attributes: +EOM + end + # rubocop:enable Style/TrailingWhitespace + + it "shows the requested attribute of an environment" do + pending "KnifeSupport doesn't appear to pass this through correctly" + knife("environment show b -a foo").should_succeed <<EOM +b: + foo: bar +EOM + end + end +end diff --git a/spec/integration/knife/node_bulk_delete_spec.rb b/spec/integration/knife/node_bulk_delete_spec.rb new file mode 100644 index 0000000000..fa706cbd2b --- /dev/null +++ b/spec/integration/knife/node_bulk_delete_spec.rb @@ -0,0 +1,51 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node bulk delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some nodes" do + before do + node "cons", {} + node "car", {} + node "cdr", {} + node "cat", {} + end + + it "deletes all matching nodes" do + knife("node bulk delete ^ca.*", input: "Y").should_succeed <<EOM +The following nodes will be deleted: + +car cat + +Are you sure you want to delete these nodes? (Y/N) Deleted node car +Deleted node cat +EOM + + knife("node list").should_succeed <<EOM +cdr +cons +EOM + end + end + +end diff --git a/spec/integration/knife/node_create_spec.rb b/spec/integration/knife/node_create_spec.rb new file mode 100644 index 0000000000..93a2f9ce6f --- /dev/null +++ b/spec/integration/knife/node_create_spec.rb @@ -0,0 +1,46 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" +require "openssl" + +describe "knife node create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:out) { "Created node[bah]\n" } + + when_the_chef_server "is empty" do + it "creates a new node" do + knife("node create bah").should_succeed out + end + + it "creates a new validator node" do + knife("node create bah").should_succeed out + knife("node show bah").should_succeed /Node Name: bah/ + end + + it "refuses to add an existing node" do + pending "Knife node create must not blindly overwrite an existing node" + knife("node create bah").should_succeed out + expect { knife("node create bah") }.to raise_error(Net::HTTPServerException) + end + + end +end diff --git a/spec/integration/knife/node_delete_spec.rb b/spec/integration/knife/node_delete_spec.rb new file mode 100644 index 0000000000..5d88af6d4f --- /dev/null +++ b/spec/integration/knife/node_delete_spec.rb @@ -0,0 +1,47 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some nodes" do + before do + node "cons", {} + node "car", {} + node "cdr", {} + node "cat", {} + end + + it "deletes a node" do + knife("node delete car", input: "Y").should_succeed <<EOM +Do you really want to delete car? (Y/N) Deleted node[car] +EOM + + knife("node list").should_succeed <<EOM +cat +cdr +cons +EOM + end + + end +end diff --git a/spec/integration/knife/node_environment_set_spec.rb b/spec/integration/knife/node_environment_set_spec.rb new file mode 100644 index 0000000000..6dadecf76a --- /dev/null +++ b/spec/integration/knife/node_environment_set_spec.rb @@ -0,0 +1,42 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node environment set", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a node and an environment" do + before do + node "cons", {} + environment "lisp", {} + end + + it "sets an environment on a node" do + knife("node environment set cons lisp").should_succeed /chef_environment:.*lisp/ + knife("node show cons -a chef_environment").should_succeed /Environment:.*lisp/ + end + + it "with no environment" do + knife("node environment set adam").should_fail stderr: "FATAL: You must specify a node name and an environment.\n", + stdout: /^USAGE: knife node environment set NODE ENVIRONMENT\n/ + end + end +end diff --git a/spec/integration/knife/node_from_file_spec.rb b/spec/integration/knife/node_from_file_spec.rb new file mode 100644 index 0000000000..3430967a21 --- /dev/null +++ b/spec/integration/knife/node_from_file_spec.rb @@ -0,0 +1,58 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node from file", :workstation do + include IntegrationSupport + include KnifeSupport + + # include_context "default config options" + + let (:node_dir) { "#{@repository_dir}/nodes" } + + when_the_chef_server "is empty" do + when_the_repository "has some nodes" do + before do + + file "nodes/cons.json", <<EOM +{ + "name": "cons", + "chef_environment": "_default", + "run_list": [ + "recipe[cons]" +] +, + "normal": { + "tags": [ + + ] + } +} +EOM + + end + + it "uploads a single file" do + knife("node from file #{node_dir}/cons.json").should_succeed stderr: <<EOM +Updated Node cons +EOM + end + + end + end +end diff --git a/spec/integration/knife/node_list_spec.rb b/spec/integration/knife/node_list_spec.rb new file mode 100644 index 0000000000..76f5861e03 --- /dev/null +++ b/spec/integration/knife/node_list_spec.rb @@ -0,0 +1,44 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some nodes" do + before do + node "cons", {} + node "car", {} + node "cdr", {} + node "cat", {} + end + + it "lists all cookbooks" do + knife("node list").should_succeed <<EOM +car +cat +cdr +cons +EOM + end + + end +end diff --git a/spec/integration/knife/node_run_list_add_spec.rb b/spec/integration/knife/node_run_list_add_spec.rb new file mode 100644 index 0000000000..87d08e1975 --- /dev/null +++ b/spec/integration/knife/node_run_list_add_spec.rb @@ -0,0 +1,53 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node run list add", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a node with no run_list" do + before do + node "cons", {} + end + + it "sets the run list" do + knife("node run list add cons recipe[foo]").should_succeed /run_list:\s*recipe\[foo\]\n/ + end + end + + when_the_chef_server "has a node with a run_list" do + before do + node "cons", { run_list: ["recipe[bar]"] } + end + + it "appends to the run list" do + knife("node run list add cons recipe[foo]").should_succeed /run_list:\n\s*recipe\[bar\]\n\s*recipe\[foo\]\n/m + end + + it "adds to the run list before the specified item" do + knife("node run list add cons -b recipe[bar] recipe[foo]").should_succeed /run_list:\n\s*recipe\[foo\]\n\s*recipe\[bar\]\n/m + end + + it "adds to the run list after the specified item" do + knife("node run list add cons -a recipe[bar] recipe[foo]").should_succeed /run_list:\n\s*recipe\[bar\]\n\s*recipe\[foo\]\n/m + end + end +end diff --git a/spec/integration/knife/node_run_list_remove_spec.rb b/spec/integration/knife/node_run_list_remove_spec.rb new file mode 100644 index 0000000000..e85e3ed8e8 --- /dev/null +++ b/spec/integration/knife/node_run_list_remove_spec.rb @@ -0,0 +1,35 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node run list remove", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a node with a run_list" do + before do + node "cons", { run_list: ["recipe[bar]", "recipe[foo]"] } + end + + it "removes the item from the run list" do + knife("node run list remove cons recipe[bar]").should_succeed /run_list:\s*recipe\[foo\]\n/m + end + end +end diff --git a/spec/integration/knife/node_run_list_set_spec.rb b/spec/integration/knife/node_run_list_set_spec.rb new file mode 100644 index 0000000000..ec6b08fb97 --- /dev/null +++ b/spec/integration/knife/node_run_list_set_spec.rb @@ -0,0 +1,40 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node run list set", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a node with a run_list" do + before do + node "cons", { run_list: ["recipe[bar]", "recipe[foo]"] } + end + + it "sets the run list" do + knife("node run list set cons recipe[bar]").should_succeed /run_list:\s*recipe\[bar\]\n/m + end + + it "with no role or recipe" do + knife("node run list set cons").should_fail stderr: "FATAL: You must supply both a node name and a run list.\n", + stdout: /^USAGE: knife node run_list set NODE ENTRIES \(options\)/m + end + end +end diff --git a/spec/integration/knife/node_show_spec.rb b/spec/integration/knife/node_show_spec.rb new file mode 100644 index 0000000000..dd890aed59 --- /dev/null +++ b/spec/integration/knife/node_show_spec.rb @@ -0,0 +1,35 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife node show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has a node with a run_list" do + before do + node "cons", { run_list: ["recipe[bar]", "recipe[foo]"] } + end + + it "shows the node" do + knife("node show cons").should_succeed /Run List:\s*recipe\[bar\], recipe\[foo\]\n/m + end + end +end diff --git a/spec/integration/knife/role_bulk_delete_spec.rb b/spec/integration/knife/role_bulk_delete_spec.rb new file mode 100644 index 0000000000..0e7ff941e2 --- /dev/null +++ b/spec/integration/knife/role_bulk_delete_spec.rb @@ -0,0 +1,51 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role bulk delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some roles" do + before do + role "cons", {} + role "car", {} + role "cdr", {} + role "cat", {} + end + + it "deletes all matching roles" do + knife("role bulk delete ^ca.*", input: "Y").should_succeed <<EOM +The following roles will be deleted: + +car cat + +Are you sure you want to delete these roles? (Y/N) Deleted role car +Deleted role cat +EOM + + knife("role list").should_succeed <<EOM +cdr +cons +EOM + end + + end +end diff --git a/spec/integration/knife/role_create_spec.rb b/spec/integration/knife/role_create_spec.rb new file mode 100644 index 0000000000..941eaf5cb6 --- /dev/null +++ b/spec/integration/knife/role_create_spec.rb @@ -0,0 +1,40 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role create", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + let(:out) { "Created role[bah]\n" } + + when_the_chef_server "is empty" do + it "creates a new role" do + knife("role create bah").should_succeed out + end + + it "refuses to add an existing role" do + pending "Knife role create must not blindly overwrite an existing role" + knife("role create bah").should_succeed out + expect { knife("role create bah") }.to raise_error(Net::HTTPServerException) + end + + end +end diff --git a/spec/integration/knife/role_delete_spec.rb b/spec/integration/knife/role_delete_spec.rb new file mode 100644 index 0000000000..9fbd3758b9 --- /dev/null +++ b/spec/integration/knife/role_delete_spec.rb @@ -0,0 +1,47 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role delete", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some roles" do + before do + role "cons", {} + role "car", {} + role "cdr", {} + role "cat", {} + end + + it "deletes a role" do + knife("role delete car", input: "Y").should_succeed <<EOM +Do you really want to delete car? (Y/N) Deleted role[car] +EOM + + knife("role list").should_succeed <<EOM +cat +cdr +cons +EOM + end + + end +end diff --git a/spec/integration/knife/role_from_file_spec.rb b/spec/integration/knife/role_from_file_spec.rb new file mode 100644 index 0000000000..60caa3fa88 --- /dev/null +++ b/spec/integration/knife/role_from_file_spec.rb @@ -0,0 +1,95 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role from file", :workstation do + include IntegrationSupport + include KnifeSupport + + # include_context "default config options" + + let (:role_dir) { "#{@repository_dir}/roles" } + + when_the_chef_server "is empty" do + when_the_repository "has some roles" do + before do + + file "roles/cons.json", <<EOM +{ + "name": "cons", + "description": "An role", + "json_class": "Chef::role", + "chef_type": "role", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + file "roles/car.json", <<EOM +{ + "name": "car", + "description": "A role for list nodes", + "json_class": "Chef::Role", + "chef_type": "role", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + file "roles/cdr.json", <<EOM +{ + "name": "cdr", + "description": "A role for last nodes", + "json_class": "Chef::Role", + "chef_type": "role", + "default_attributes": { + "hola": "Amigos!" + }, + "override_attributes": { + + } +} +EOM + + end + + it "uploads a single file" do + knife("role from file #{role_dir}/cons.json").should_succeed stderr: <<EOM +Updated Role cons +EOM + end + + it "uploads many files" do + knife("role from file #{role_dir}/cons.json #{role_dir}/car.json #{role_dir}/cdr.json").should_succeed stderr: <<EOM +Updated Role cons +Updated Role car +Updated Role cdr +EOM + end + + end + end +end diff --git a/spec/integration/knife/role_list_spec.rb b/spec/integration/knife/role_list_spec.rb new file mode 100644 index 0000000000..36dc76be4c --- /dev/null +++ b/spec/integration/knife/role_list_spec.rb @@ -0,0 +1,44 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role list", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some roles" do + before do + role "cons", {} + role "car", {} + role "cdr", {} + role "cat", {} + end + + it "lists all cookbooks" do + knife("role list").should_succeed <<EOM +car +cat +cdr +cons +EOM + end + + end +end diff --git a/spec/integration/knife/role_show_spec.rb b/spec/integration/knife/role_show_spec.rb new file mode 100644 index 0000000000..df2572447c --- /dev/null +++ b/spec/integration/knife/role_show_spec.rb @@ -0,0 +1,50 @@ +# +# Copyright:: Copyright 2013-2016, 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 "support/shared/integration/integration_helper" +require "support/shared/context/config" + +describe "knife role show", :workstation do + include IntegrationSupport + include KnifeSupport + + include_context "default config options" + + when_the_chef_server "has some roles" do + before do + role "cons", {} + role "car", {} + role "cdr", {} + role "cat", {} + end + + # rubocop:disable Style/TrailingWhitespace + it "shows a cookbook" do + knife("role show cons").should_succeed <<EOM +chef_type: role +default_attributes: +description: +env_run_lists: +json_class: Chef::Role +name: cons +override_attributes: +run_list: +EOM + end + # rubocop:enable Style/TrailingWhitespace + + end +end diff --git a/spec/support/shared/integration/knife_support.rb b/spec/support/shared/integration/knife_support.rb index 1e81cd115c..398d90dff0 100644 --- a/spec/support/shared/integration/knife_support.rb +++ b/spec/support/shared/integration/knife_support.rb @@ -23,7 +23,7 @@ require "chef/log" module KnifeSupport DEBUG = ENV["DEBUG"] - def knife(*args) + def knife(*args, input: nil) # Allow knife('role from file roles/blah.json') rather than requiring the # arguments to be split like knife('role', 'from', 'file', 'roles/blah.json') # If any argument will have actual spaces in it, the long form is required. @@ -37,7 +37,7 @@ module KnifeSupport Chef::Config[:concurrency] = 1 # Work on machines where we can't access /var - checksums_cache_dir = Dir.mktmpdir("checksums") do |checksums_cache_dir| + Dir.mktmpdir("checksums") do |checksums_cache_dir| Chef::Config[:cache_options] = { :path => checksums_cache_dir, :skip_expires => true, @@ -47,6 +47,13 @@ module KnifeSupport # ourselves, thank you very much stdout = StringIO.new stderr = StringIO.new + + stdin = if input + StringIO.new(input) + else + STDIN + end + old_loggers = Chef::Log.loggers old_log_level = Chef::Log.level begin @@ -57,7 +64,7 @@ module KnifeSupport instance = subcommand_class.new(args) # Capture stdout/stderr - instance.ui = Chef::Knife::UI.new(stdout, stderr, STDIN, {}) + instance.ui = Chef::Knife::UI.new(stdout, stderr, stdin, disable_editing: true) # Don't print stuff Chef::Config[:verbosity] = ( DEBUG ? 2 : 0 ) diff --git a/spec/unit/knife/node_environment_set_spec.rb b/spec/unit/knife/node_environment_set_spec.rb index 03fc764fd8..7ceafdad78 100644 --- a/spec/unit/knife/node_environment_set_spec.rb +++ b/spec/unit/knife/node_environment_set_spec.rb @@ -52,29 +52,5 @@ describe Chef::Knife::NodeEnvironmentSet do @knife.run end - describe "with no environment" do - # Set up outputs for inspection later - before(:each) do - @stdout = StringIO.new - @stderr = StringIO.new - - allow(@knife.ui).to receive(:stdout).and_return(@stdout) - allow(@knife.ui).to receive(:stderr).and_return(@stderr) - end - - it "should exit" do - @knife.name_args = [ "adam" ] - expect { @knife.run }.to raise_error SystemExit - end - - it "should show the user the usage and an error" do - @knife.name_args = [ "adam" ] - - begin ; @knife.run ; rescue SystemExit ; end - - expect(@stdout.string).to eq "USAGE: knife node environment set NODE ENVIRONMENT\n" - expect(@stderr.string).to eq "FATAL: You must specify a node name and an environment.\n" - end - end end end diff --git a/spec/unit/knife/node_run_list_set_spec.rb b/spec/unit/knife/node_run_list_set_spec.rb index 1bbaa7d9a5..bd55edb997 100644 --- a/spec/unit/knife/node_run_list_set_spec.rb +++ b/spec/unit/knife/node_run_list_set_spec.rb @@ -111,30 +111,5 @@ describe Chef::Knife::NodeRunListSet do end end - describe "with no role or recipe" do - # Set up outputs for inspection later - before(:each) do - @stdout = StringIO.new - @stderr = StringIO.new - - allow(@knife.ui).to receive(:stdout).and_return(@stdout) - allow(@knife.ui).to receive(:stderr).and_return(@stderr) - end - - it "should exit" do - @knife.name_args = [ "adam" ] - expect { @knife.run }.to raise_error SystemExit - end - - it "should show the user" do - @knife.name_args = [ "adam" ] - - begin ; @knife.run ; rescue SystemExit ; end - - expect(@stdout.string).to eq "USAGE: knife node run_list set NODE ENTRIES (options)\n" - expect(@stderr.string).to eq "FATAL: You must supply both a node name and a run list.\n" - end - end - end end |