diff options
Diffstat (limited to 'spec/integration/knife/download_spec.rb')
-rw-r--r-- | spec/integration/knife/download_spec.rb | 1336 |
1 files changed, 0 insertions, 1336 deletions
diff --git a/spec/integration/knife/download_spec.rb b/spec/integration/knife/download_spec.rb deleted file mode 100644 index 29200d66f2..0000000000 --- a/spec/integration/knife/download_spec.rb +++ /dev/null @@ -1,1336 +0,0 @@ -# -# Author:: John Keiser (<jkeiser@chef.io>) -# Copyright:: Copyright (c) Chef Software Inc. -# License:: Apache License, Version 2.0 -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -require "knife_spec_helper" -require "support/shared/integration/integration_helper" -require "chef/knife/download" -require "chef/knife/diff" - -describe "knife download", :workstation do - include IntegrationSupport - include KnifeSupport - - context "without versioned cookbooks" do - when_the_chef_server "has one of each thing" do - - before do - client "x", {} - cookbook "x", "1.0.0" - data_bag "x", { "y" => {} } - environment "x", {} - node "x", {} - role "x", {} - user "x", {} - end - - when_the_repository "has only top-level directories" do - before do - directory "clients" - directory "cookbooks" - directory "data_bags" - directory "environments" - directory "nodes" - directory "roles" - directory "users" - end - - it "knife download downloads everything" do - knife("download /").should_succeed <<~EOM - Created /clients/chef-validator.json - Created /clients/chef-webui.json - Created /clients/x.json - Created /cookbooks/x - Created /cookbooks/x/metadata.rb - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments/_default.json - Created /environments/x.json - Created /nodes/x.json - Created /roles/x.json - Created /users/admin.json - Created /users/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - end - - when_the_repository "has an identical copy of each thing" do - before do - file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY } - file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0") - file "data_bags/x/y.json", {} - file "environments/_default.json", { "description" => "The default Chef environment" } - file "environments/x.json", {} - file "nodes/x.json", { "normal" => { "tags" => [] } } - file "roles/x.json", {} - file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY } - end - - it "knife download makes no changes" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - - it "knife download --purge makes no changes" do - knife("download --purge /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - - context "except the role file" do - before do - file "roles/x.json", <<~EOM - { - "chef_type": "role", - "default_attributes": { - }, - "description": "blarghle", - "env_run_lists": { - }, - "json_class": "Chef::Role", - "name": "x", - "override_attributes": { - }, - "run_list": [ - - ] - } - EOM - end - - it "knife download changes the role" do - knife("download /").should_succeed "Updated /roles/x.json\n" - knife("diff --name-status /").should_succeed "" - end - - it "knife download --no-diff does not change the role" do - knife("download --no-diff /").should_succeed "" - knife("diff --name-status /").should_succeed "M\t/roles/x.json\n" - end - end - - context "except the role file is textually different, but not ACTUALLY different" do - before do - file "roles/x.json", <<~EOM - { - "chef_type": "role", - "default_attributes": { - }, - "env_run_lists": { - }, - "json_class": "Chef::Role", - "name": "x", - "description": "", - "override_attributes": { - }, - "run_list": [ - - ] - } - EOM - end - - it "knife download / does not change anything" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - end - - context "as well as one extra copy of each thing" do - before do - file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY } - file "cookbooks/x/blah.rb", "" - file "cookbooks/y/metadata.rb", cb_metadata("x", "1.0.0") - file "data_bags/x/z.json", {} - file "data_bags/y/zz.json", {} - file "environments/y.json", {} - file "nodes/y.json", {} - file "roles/y.json", {} - file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY } - end - - it "knife download does nothing" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed <<~EOM - A\t/clients/y.json - A\t/cookbooks/x/blah.rb - A\t/cookbooks/y - A\t/data_bags/x/z.json - A\t/data_bags/y - A\t/environments/y.json - A\t/nodes/y.json - A\t/roles/y.json - A\t/users/y.json - EOM - end - - it "knife download --purge deletes the extra files" do - knife("download --purge /").should_succeed <<~EOM - Deleted extra entry /clients/y.json (purge is on) - Deleted extra entry /cookbooks/x/blah.rb (purge is on) - Deleted extra entry /cookbooks/y (purge is on) - Deleted extra entry /data_bags/x/z.json (purge is on) - Deleted extra entry /data_bags/y (purge is on) - Deleted extra entry /environments/y.json (purge is on) - Deleted extra entry /nodes/y.json (purge is on) - Deleted extra entry /roles/y.json (purge is on) - Deleted extra entry /users/y.json (purge is on) - EOM - knife("diff --name-status /").should_succeed "" - end - end - end - - when_the_repository "is empty" do - it "knife download creates the extra files" do - knife("download /").should_succeed <<~EOM - Created /clients - Created /clients/chef-validator.json - Created /clients/chef-webui.json - Created /clients/x.json - Created /cookbooks - Created /cookbooks/x - Created /cookbooks/x/metadata.rb - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments - Created /environments/_default.json - Created /environments/x.json - Created /nodes - Created /nodes/x.json - Created /roles - Created /roles/x.json - Created /users - Created /users/admin.json - Created /users/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - - it "knife download --no-diff creates the extra files" do - knife("download --no-diff /").should_succeed <<~EOM - Created /clients - Created /clients/chef-validator.json - Created /clients/chef-webui.json - Created /clients/x.json - Created /cookbooks - Created /cookbooks/x - Created /cookbooks/x/metadata.rb - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments - Created /environments/_default.json - Created /environments/x.json - Created /nodes - Created /nodes/x.json - Created /roles - Created /roles/x.json - Created /users - Created /users/admin.json - Created /users/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - - context "when current directory is top level" do - before do - cwd "." - end - - it "knife download with no parameters reports an error" do - knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/ - end - end - end - end - - # Test download of an item when the other end doesn't even have the container - when_the_repository "is empty" do - when_the_chef_server "has two data bag items" do - before do - data_bag "x", { "y" => {}, "z" => {} } - end - - it "knife download of one data bag item itself succeeds" do - knife("download /data_bags/x/y.json").should_succeed <<~EOM - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/z.json - EOM - end - - it "knife download /data_bags/x /data_bags/x/y.json downloads x once" do - knife("download /data_bags/x /data_bags/x/y.json").should_succeed <<~EOM - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - Created /data_bags/x/z.json - EOM - end - end - end - - when_the_repository "has three data bag items" do - before do - file "data_bags/x/deleted.json", <<~EOM - { - "id": "deleted" - } - EOM - file "data_bags/x/modified.json", <<~EOM - { - "id": "modified" - } - EOM - file "data_bags/x/unmodified.json", <<~EOM - { - "id": "unmodified" - } - EOM - end - - when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do - before do - data_bag "x", { - "added" => {}, - "modified" => { "foo" => "bar" }, - "unmodified" => {}, - } - end - - it "knife download of the modified file succeeds" do - knife("download /data_bags/x/modified.json").should_succeed <<~EOM - Updated /data_bags/x/modified.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the unmodified file does nothing" do - knife("download /data_bags/x/unmodified.json").should_succeed "" - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the added file succeeds" do - knife("download /data_bags/x/added.json").should_succeed <<~EOM - Created /data_bags/x/added.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the deleted file does nothing" do - knife("download /data_bags/x/deleted.json").should_succeed "" - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download --purge of the deleted file deletes it" do - knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM - Deleted extra entry /data_bags/x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - EOM - end - it "knife download of the entire data bag downloads everything" do - knife("download /data_bags/x").should_succeed <<~EOM - Created /data_bags/x/added.json - Updated /data_bags/x/modified.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - A\t/data_bags/x/deleted.json - EOM - end - it "knife download --purge of the entire data bag downloads everything" do - knife("download --purge /data_bags/x").should_succeed <<~EOM - Created /data_bags/x/added.json - Updated /data_bags/x/modified.json - Deleted extra entry /data_bags/x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - context "when cwd is the /data_bags directory" do - before do - cwd "data_bags" - end - it "knife download fails" do - knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/ - end - it "knife download --purge . downloads everything" do - knife("download --purge .").should_succeed <<~EOM - Created x/added.json - Updated x/modified.json - Deleted extra entry x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - it "knife download --purge * downloads everything" do - knife("download --purge *").should_succeed <<~EOM - Created x/added.json - Updated x/modified.json - Deleted extra entry x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - end - end - end - - when_the_repository "has a cookbook" do - before do - file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0") - file "cookbooks/x/z.rb", "" - end - - when_the_chef_server "has a modified, added and deleted file for the cookbook" do - before do - cookbook "x", "1.0.0", { "metadata.rb" => cb_metadata("x", "1.0.0", "#extra content"), "y.rb" => "hi" } - end - - it "knife download of a modified file succeeds" do - knife("download /cookbooks/x/metadata.rb").should_succeed "Updated /cookbooks/x/metadata.rb\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - D\t/cookbooks/x/y.rb - A\t/cookbooks/x/z.rb - EOM - end - it "knife download of a deleted file does nothing" do - knife("download /cookbooks/x/z.rb").should_succeed "" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x/metadata.rb - D\t/cookbooks/x/y.rb - A\t/cookbooks/x/z.rb - EOM - end - it "knife download --purge of a deleted file succeeds" do - knife("download --purge /cookbooks/x/z.rb").should_succeed "Deleted extra entry /cookbooks/x/z.rb (purge is on)\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x/metadata.rb - D\t/cookbooks/x/y.rb - EOM - end - it "knife download of an added file succeeds" do - knife("download /cookbooks/x/y.rb").should_succeed "Created /cookbooks/x/y.rb\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x/metadata.rb - A\t/cookbooks/x/z.rb - EOM - end - it "knife download of the cookbook itself succeeds" do - knife("download /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/metadata.rb - Created /cookbooks/x/y.rb - EOM - knife("diff --name-status /cookbooks").should_succeed <<~EOM - A\t/cookbooks/x/z.rb - EOM - end - it "knife download --purge of the cookbook itself succeeds" do - knife("download --purge /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/metadata.rb - Created /cookbooks/x/y.rb - Deleted extra entry /cookbooks/x/z.rb (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - end - - when_the_repository "has a cookbook" do - before do - file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0") - file "cookbooks/x/onlyin1.0.0.rb", "old_text" - end - - when_the_chef_server "has a later version for the cookbook" do - before do - cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" } - cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the latest version" do - knife("download --purge /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/metadata.rb - Created /cookbooks/x/onlyin1.0.1.rb - Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has an earlier version for the cookbook" do - before do - cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" } - cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the updated file" do - knife("download --purge /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/onlyin1.0.0.rb - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has a later version for the cookbook, and no current version" do - before do - cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the latest version" do - knife("download --purge /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/metadata.rb - Created /cookbooks/x/onlyin1.0.1.rb - Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has an earlier version for the cookbook, and no current version" do - before do - cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the old version" do - knife("download --purge /cookbooks/x").should_succeed <<~EOM - Updated /cookbooks/x/metadata.rb - Created /cookbooks/x/onlyin0.9.9.rb - Deleted extra entry /cookbooks/x/onlyin1.0.0.rb (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - end - - when_the_chef_server "has a role" do - before do - role "x", {} - end - when_the_repository "has the role in ruby" do - before do - file "roles/x.rb", <<~EOM - name "x" - description "x" - EOM - end - - it "knife download refuses to change the role" do - knife("download /roles/x.json").should_succeed "", stderr: "WARNING: /roles/x.rb cannot be updated (can't safely update ruby files).\n" - knife("diff --name-status /roles/x.json").should_succeed "M\t/roles/x.rb\n" - end - end - end - - when_the_chef_server "has an environment" do - before do - environment "x", {} - end - when_the_repository "has an environment with bad JSON" do - before do - file "environments/x.json", "{" - end - it "knife download succeeds" do - warning = <<~EOH - WARN: Parse error reading #{path_to("environments/x.json")} as JSON: parse error: premature EOF - { - (right here) ------^ - - EOH - knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n", stderr: warning - knife("diff --name-status /environments/x.json").should_succeed "" - end - end - - when_the_repository "has the same environment with the wrong name in the file" do - before do - file "environments/x.json", { "name" => "y" } - end - it "knife download succeeds" do - knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n" - knife("diff --name-status /environments/x.json").should_succeed "" - end - end - - when_the_repository "has the same environment with no name in the file" do - before do - file "environments/x.json", { "description" => "hi" } - end - it "knife download succeeds" do - knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n" - knife("diff --name-status /environments/x.json").should_succeed "" - end - end - end - end # without versioned cookbooks - - context "with versioned cookbooks" do - before { Chef::Config[:versioned_cookbooks] = true } - - when_the_chef_server "has one of each thing" do - before do - client "x", {} - cookbook "x", "1.0.0" - data_bag "x", { "y" => {} } - environment "x", {} - node "x", {} - role "x", {} - user "x", {} - end - - when_the_repository "has only top-level directories" do - before do - directory "clients" - directory "cookbooks" - directory "data_bags" - directory "environments" - directory "nodes" - directory "roles" - directory "users" - end - - it "knife download downloads everything" do - knife("download /").should_succeed <<~EOM - Created /clients/chef-validator.json - Created /clients/chef-webui.json - Created /clients/x.json - Created /cookbooks/x-1.0.0 - Created /cookbooks/x-1.0.0/metadata.rb - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments/_default.json - Created /environments/x.json - Created /nodes/x.json - Created /roles/x.json - Created /users/admin.json - Created /users/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - end - - when_the_repository "has an identical copy of each thing" do - before do - file "clients/chef-validator.json", { "validator" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "clients/chef-webui.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY } - file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0") - file "data_bags/x/y.json", {} - file "environments/_default.json", { "description" => "The default Chef environment" } - file "environments/x.json", {} - file "nodes/x.json", { "normal" => { "tags" => [] } } - file "roles/x.json", {} - file "users/admin.json", { "admin" => true, "public_key" => ChefZero::PUBLIC_KEY } - file "users/x.json", { "public_key" => ChefZero::PUBLIC_KEY } - end - - it "knife download makes no changes" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - - it "knife download --purge makes no changes" do - knife("download --purge /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - - context "except the role file" do - before do - file "roles/x.json", { "description" => "blarghle" } - end - - it "knife download changes the role" do - knife("download /").should_succeed "Updated /roles/x.json\n" - knife("diff --name-status /").should_succeed "" - end - end - - context "except the role file is textually different, but not ACTUALLY different" do - before do - file "roles/x.json", <<~EOM - { - "chef_type": "role" , - "default_attributes": { - }, - "env_run_lists": { - }, - "json_class": "Chef::Role", - "name": "x", - "description": "", - "override_attributes": { - }, - "run_list": [ - - ] - } - EOM - end - - it "knife download / does not change anything" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed "" - end - end - - context "as well as one extra copy of each thing" do - before do - file "clients/y.json", { "public_key" => ChefZero::PUBLIC_KEY } - file "cookbooks/x-1.0.0/blah.rb", "" - file "cookbooks/x-2.0.0/metadata.rb", 'version "2.0.0"' - file "cookbooks/y-1.0.0/metadata.rb", 'version "1.0.0"' - file "data_bags/x/z.json", {} - file "data_bags/y/zz.json", {} - file "environments/y.json", {} - file "nodes/y.json", {} - file "roles/y.json", {} - file "users/y.json", { "public_key" => ChefZero::PUBLIC_KEY } - end - - it "knife download does nothing" do - knife("download /").should_succeed "" - knife("diff --name-status /").should_succeed <<~EOM - A\t/clients/y.json - A\t/cookbooks/x-1.0.0/blah.rb - A\t/cookbooks/x-2.0.0 - A\t/cookbooks/y-1.0.0 - A\t/data_bags/x/z.json - A\t/data_bags/y - A\t/environments/y.json - A\t/nodes/y.json - A\t/roles/y.json - A\t/users/y.json - EOM - end - - it "knife download --purge deletes the extra files" do - knife("download --purge /").should_succeed <<~EOM - Deleted extra entry /clients/y.json (purge is on) - Deleted extra entry /cookbooks/x-1.0.0/blah.rb (purge is on) - Deleted extra entry /cookbooks/x-2.0.0 (purge is on) - Deleted extra entry /cookbooks/y-1.0.0 (purge is on) - Deleted extra entry /data_bags/x/z.json (purge is on) - Deleted extra entry /data_bags/y (purge is on) - Deleted extra entry /environments/y.json (purge is on) - Deleted extra entry /nodes/y.json (purge is on) - Deleted extra entry /roles/y.json (purge is on) - Deleted extra entry /users/y.json (purge is on) - EOM - knife("diff --name-status /").should_succeed "" - end - end - end - - when_the_repository "is empty" do - it "knife download creates the extra files" do - knife("download /").should_succeed <<~EOM - Created /clients - Created /clients/chef-validator.json - Created /clients/chef-webui.json - Created /clients/x.json - Created /cookbooks - Created /cookbooks/x-1.0.0 - Created /cookbooks/x-1.0.0/metadata.rb - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments - Created /environments/_default.json - Created /environments/x.json - Created /nodes - Created /nodes/x.json - Created /roles - Created /roles/x.json - Created /users - Created /users/admin.json - Created /users/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - - context "when current directory is top level" do - before do - cwd "." - end - it "knife download with no parameters reports an error" do - knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/ - end - end - end - end - - # Test download of an item when the other end doesn't even have the container - when_the_repository "is empty" do - when_the_chef_server "has two data bag items" do - before do - data_bag "x", { "y" => {}, "z" => {} } - end - - it "knife download of one data bag item itself succeeds" do - knife("download /data_bags/x/y.json").should_succeed <<~EOM - Created /data_bags - Created /data_bags/x - Created /data_bags/x/y.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/z.json - EOM - end - end - end - - when_the_repository "has three data bag items" do - before do - file "data_bags/x/deleted.json", <<~EOM - { - "id": "deleted" - } - EOM - file "data_bags/x/modified.json", <<~EOM - { - "id": "modified" - } - EOM - file "data_bags/x/unmodified.json", <<~EOM - { - "id": "unmodified" - } - EOM - end - - when_the_chef_server "has a modified, unmodified, added and deleted data bag item" do - before do - data_bag "x", { - "added" => {}, - "modified" => { "foo" => "bar" }, - "unmodified" => {}, - } - end - - it "knife download of the modified file succeeds" do - knife("download /data_bags/x/modified.json").should_succeed <<~EOM - Updated /data_bags/x/modified.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the unmodified file does nothing" do - knife("download /data_bags/x/unmodified.json").should_succeed "" - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the added file succeeds" do - knife("download /data_bags/x/added.json").should_succeed <<~EOM - Created /data_bags/x/added.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download of the deleted file does nothing" do - knife("download /data_bags/x/deleted.json").should_succeed "" - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - A\t/data_bags/x/deleted.json - EOM - end - it "knife download --purge of the deleted file deletes it" do - knife("download --purge /data_bags/x/deleted.json").should_succeed <<~EOM - Deleted extra entry /data_bags/x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - D\t/data_bags/x/added.json - M\t/data_bags/x/modified.json - EOM - end - it "knife download of the entire data bag downloads everything" do - knife("download /data_bags/x").should_succeed <<~EOM - Created /data_bags/x/added.json - Updated /data_bags/x/modified.json - EOM - knife("diff --name-status /data_bags").should_succeed <<~EOM - A\t/data_bags/x/deleted.json - EOM - end - it "knife download --purge of the entire data bag downloads everything" do - knife("download --purge /data_bags/x").should_succeed <<~EOM - Created /data_bags/x/added.json - Updated /data_bags/x/modified.json - Deleted extra entry /data_bags/x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - context "when cwd is the /data_bags directory" do - before do - cwd "data_bags" - end - it "knife download fails" do - knife("download").should_fail "FATAL: You must specify at least one argument. If you want to download everything in this directory, run \"knife download .\"\n", stdout: /USAGE/ - end - it "knife download --purge . downloads everything" do - knife("download --purge .").should_succeed <<~EOM - Created x/added.json - Updated x/modified.json - Deleted extra entry x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - it "knife download --purge * downloads everything" do - knife("download --purge *").should_succeed <<~EOM - Created x/added.json - Updated x/modified.json - Deleted extra entry x/deleted.json (purge is on) - EOM - knife("diff --name-status /data_bags").should_succeed "" - end - end - end - end - - when_the_repository "has a cookbook" do - before do - file "cookbooks/x-1.0.0/metadata.rb", 'name "x"; version "1.0.0"#unmodified' - file "cookbooks/x-1.0.0/z.rb", "" - end - - when_the_chef_server "has a modified, added and deleted file for the cookbook" do - before do - cookbook "x", "1.0.0", { "y.rb" => "hi" } - end - - it "knife download of a modified file succeeds" do - knife("download /cookbooks/x-1.0.0/metadata.rb").should_succeed "Updated /cookbooks/x-1.0.0/metadata.rb\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - D\t/cookbooks/x-1.0.0/y.rb - A\t/cookbooks/x-1.0.0/z.rb - EOM - end - it "knife download of a deleted file does nothing" do - knife("download /cookbooks/x-1.0.0/z.rb").should_succeed "" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x-1.0.0/metadata.rb - D\t/cookbooks/x-1.0.0/y.rb - A\t/cookbooks/x-1.0.0/z.rb - EOM - end - it "knife download --purge of a deleted file succeeds" do - knife("download --purge /cookbooks/x-1.0.0/z.rb").should_succeed "Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on)\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x-1.0.0/metadata.rb - D\t/cookbooks/x-1.0.0/y.rb - EOM - end - it "knife download of an added file succeeds" do - knife("download /cookbooks/x-1.0.0/y.rb").should_succeed "Created /cookbooks/x-1.0.0/y.rb\n" - knife("diff --name-status /cookbooks").should_succeed <<~EOM - M\t/cookbooks/x-1.0.0/metadata.rb - A\t/cookbooks/x-1.0.0/z.rb - EOM - end - it "knife download of the cookbook itself succeeds" do - knife("download /cookbooks/x-1.0.0").should_succeed <<~EOM - Updated /cookbooks/x-1.0.0/metadata.rb - Created /cookbooks/x-1.0.0/y.rb - EOM - knife("diff --name-status /cookbooks").should_succeed <<~EOM - A\t/cookbooks/x-1.0.0/z.rb - EOM - end - it "knife download --purge of the cookbook itself succeeds" do - knife("download --purge /cookbooks/x-1.0.0").should_succeed <<~EOM - Updated /cookbooks/x-1.0.0/metadata.rb - Created /cookbooks/x-1.0.0/y.rb - Deleted extra entry /cookbooks/x-1.0.0/z.rb (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - end - - when_the_repository "has a cookbook" do - before do - file "cookbooks/x-1.0.0/metadata.rb", cb_metadata("x", "1.0.0") - file "cookbooks/x-1.0.0/onlyin1.0.0.rb", "old_text" - end - - when_the_chef_server "has a later version for the cookbook" do - before do - cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" } - cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the latest version" do - knife("download --purge /cookbooks").should_succeed <<~EOM - Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb - Created /cookbooks/x-1.0.1 - Created /cookbooks/x-1.0.1/metadata.rb - Created /cookbooks/x-1.0.1/onlyin1.0.1.rb - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has an earlier version for the cookbook" do - before do - cookbook "x", "1.0.0", { "onlyin1.0.0.rb" => "" } - cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" } - end - - it "knife download /cookbooks downloads the updated file" do - knife("download --purge /cookbooks").should_succeed <<~EOM - Created /cookbooks/x-0.9.9 - Created /cookbooks/x-0.9.9/metadata.rb - Created /cookbooks/x-0.9.9/onlyin0.9.9.rb - Updated /cookbooks/x-1.0.0/onlyin1.0.0.rb - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has a later version for the cookbook, and no current version" do - before do - cookbook "x", "1.0.1", { "onlyin1.0.1.rb" => "hi" } - end - - it "knife download /cookbooks/x downloads the latest version" do - knife("download --purge /cookbooks").should_succeed <<~EOM - Created /cookbooks/x-1.0.1 - Created /cookbooks/x-1.0.1/metadata.rb - Created /cookbooks/x-1.0.1/onlyin1.0.1.rb - Deleted extra entry /cookbooks/x-1.0.0 (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - - when_the_chef_server "has an earlier version for the cookbook, and no current version" do - before do - cookbook "x", "0.9.9", { "onlyin0.9.9.rb" => "hi" } - end - - it "knife download --purge /cookbooks downloads the old version and deletes the new version" do - knife("download --purge /cookbooks").should_succeed <<~EOM - Created /cookbooks/x-0.9.9 - Created /cookbooks/x-0.9.9/metadata.rb - Created /cookbooks/x-0.9.9/onlyin0.9.9.rb - Deleted extra entry /cookbooks/x-1.0.0 (purge is on) - EOM - knife("diff --name-status /cookbooks").should_succeed "" - end - end - end - - when_the_chef_server "has an environment" do - before do - environment "x", {} - end - - when_the_repository "has the same environment with the wrong name in the file" do - before do - file "environments/x.json", { "name" => "y" } - end - - it "knife download succeeds" do - knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n" - knife("diff --name-status /environments/x.json").should_succeed "" - end - end - - when_the_repository "has the same environment with no name in the file" do - before do - file "environments/x.json", { "description" => "hi" } - end - - it "knife download succeeds" do - knife("download /environments/x.json").should_succeed "Updated /environments/x.json\n" - knife("diff --name-status /environments/x.json").should_succeed "" - end - end - end - end # with versioned cookbooks - - when_the_chef_server "has a cookbook" do - before do - cookbook "x", "1.0.0" - end - - when_the_repository "is empty" do - it "knife download /cookbooks/x signs all requests" do - - # Check that BasicClient.request() always gets called with X-OPS-USERID - original_new = Chef::HTTP::BasicClient.method(:new) - expect(Chef::HTTP::BasicClient).to receive(:new) { |args| - new_result = original_new.call(*args) - original_request = new_result.method(:request) - expect(new_result).to receive(:request) { |method, url, body, headers, &response_handler| - expect(headers["X-OPS-USERID"]).not_to be_nil - original_request.call(method, url, body, headers, &response_handler) - }.at_least(:once) - new_result - }.at_least(:once) - - knife("download /cookbooks/x").should_succeed <<~EOM - Created /cookbooks - Created /cookbooks/x - Created /cookbooks/x/metadata.rb - EOM - end - end - end - - when_the_chef_server "is in Enterprise mode", osc_compat: false, single_org: false do - before do - user "foo", {} - user "bar", {} - user "foobar", {} - organization "foo", { "full_name" => "Something" } - end - - before :each do - Chef::Config.chef_server_url = URI.join(Chef::Config.chef_server_url, "/organizations/foo") - end - - when_the_repository "has all the default stuff" do - before do - knife("download /").should_succeed <<~EOM - Created /acls - Created /acls/clients - Created /acls/clients/foo-validator.json - Created /acls/containers - Created /acls/containers/clients.json - Created /acls/containers/containers.json - Created /acls/containers/cookbook_artifacts.json - Created /acls/containers/cookbooks.json - Created /acls/containers/data.json - Created /acls/containers/environments.json - Created /acls/containers/groups.json - Created /acls/containers/nodes.json - Created /acls/containers/policies.json - Created /acls/containers/policy_groups.json - Created /acls/containers/roles.json - Created /acls/containers/sandboxes.json - Created /acls/cookbook_artifacts - Created /acls/cookbooks - Created /acls/data_bags - Created /acls/environments - Created /acls/environments/_default.json - Created /acls/groups - Created /acls/groups/admins.json - Created /acls/groups/billing-admins.json - Created /acls/groups/clients.json - Created /acls/groups/users.json - Created /acls/nodes - Created /acls/policies - Created /acls/policy_groups - Created /acls/roles - Created /acls/organization.json - Created /clients - Created /clients/foo-validator.json - Created /containers - Created /containers/clients.json - Created /containers/containers.json - Created /containers/cookbook_artifacts.json - Created /containers/cookbooks.json - Created /containers/data.json - Created /containers/environments.json - Created /containers/groups.json - Created /containers/nodes.json - Created /containers/policies.json - Created /containers/policy_groups.json - Created /containers/roles.json - Created /containers/sandboxes.json - Created /cookbook_artifacts - Created /cookbooks - Created /data_bags - Created /environments - Created /environments/_default.json - Created /groups - Created /groups/admins.json - Created /groups/billing-admins.json - Created /groups/clients.json - Created /groups/users.json - Created /invitations.json - Created /members.json - Created /nodes - Created /org.json - Created /policies - Created /policy_groups - Created /roles - EOM - end - - context "and the server has one of each thing" do - before do - # acl_for %w(organizations foo groups blah) - client "x", {} - cookbook "x", "1.0.0" - cookbook_artifact "x", "1x1", { "metadata.rb" => cb_metadata("x", "1.0.0") } - container "x", {} - data_bag "x", { "y" => {} } - environment "x", {} - group "x", {} - org_invite "foo" - org_member "bar" - node "x", {} - policy "x", "1.0.0", {} - policy "blah", "1.0.0", {} - policy_group "x", { - "policies" => { - "x" => { "revision_id" => "1.0.0" }, - "blah" => { "revision_id" => "1.0.0" }, - }, - } - role "x", {} - end - - before do - knife("download /acls /groups/clients.json /groups/users.json").should_succeed <<~EOM - Created /acls/clients/x.json - Created /acls/containers/x.json - Created /acls/cookbook_artifacts/x.json - Created /acls/cookbooks/x.json - Created /acls/data_bags/x.json - Created /acls/environments/x.json - Created /acls/groups/x.json - Created /acls/nodes/x.json - Created /acls/policies/blah.json - Created /acls/policies/x.json - Created /acls/policy_groups/x.json - Created /acls/roles/x.json - Updated /groups/clients.json - Updated /groups/users.json - EOM - end - - it "knife download / downloads everything" do - knife("download /").should_succeed <<~EOM - Created /clients/x.json - Created /containers/x.json - Created /cookbook_artifacts/x-1x1 - Created /cookbook_artifacts/x-1x1/metadata.rb - Created /cookbooks/x - Created /cookbooks/x/metadata.rb - Created /data_bags/x - Created /data_bags/x/y.json - Created /environments/x.json - Created /groups/x.json - Updated /invitations.json - Updated /members.json - Created /nodes/x.json - Created /policies/blah-1.0.0.json - Created /policies/x-1.0.0.json - Created /policy_groups/x.json - Created /roles/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - - context "and the repository has an identical copy of each thing" do - before do - # TODO We have to upload acls for an existing group due to a lack of - # dependency detection during upload. Fix that! - file "clients/x.json", { "public_key" => ChefZero::PUBLIC_KEY } - file "containers/x.json", {} - file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.0") - file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.0") - file "data_bags/x/y.json", {} - file "environments/x.json", {} - file "groups/x.json", {} - file "invitations.json", [ "foo" ] - file "members.json", [ "bar" ] - file "nodes/x.json", { "normal" => { "tags" => [] } } - file "org.json", { "full_name" => "Something" } - file "policies/x-1.0.0.json", {} - file "policies/blah-1.0.0.json", {} - file "policy_groups/x.json", { "policies" => { "x" => { "revision_id" => "1.0.0" }, "blah" => { "revision_id" => "1.0.0" } } } - file "roles/x.json", {} - end - - it "knife download makes no changes" do - knife("download /").should_succeed "" - end - end - - context "and the repository has a slightly different copy of each thing" do - before do - # acl_for %w(organizations foo groups blah) - file "clients/x.json", { "validator" => true } - file "containers/x.json", {} - file "cookbooks/x/metadata.rb", cb_metadata("x", "1.0.1") - file "cookbook_artifacts/x-1x1/metadata.rb", cb_metadata("x", "1.0.1") - file "data_bags/x/y.json", { "a" => "b" } - file "environments/x.json", { "description" => "foo" } - file "groups/x.json", { "description" => "foo" } - file "groups/x.json", { "groups" => [ "admin" ] } - file "nodes/x.json", { "normal" => { "tags" => [] }, "run_list" => [ "blah" ] } - file "org.json", { "full_name" => "Something Else " } - file "policies/x-1.0.0.json", { "run_list" => [ "blah" ] } - file "policy_groups/x.json", { - "policies" => { - "x" => { "revision_id" => "1.0.1" }, - "y" => { "revision_id" => "1.0.0" }, - }, - } - file "roles/x.json", { "run_list" => [ "blah" ] } - end - - it "knife download updates everything" do - knife("download /").should_succeed <<~EOM - Updated /clients/x.json - Updated /cookbook_artifacts/x-1x1/metadata.rb - Updated /cookbooks/x/metadata.rb - Updated /data_bags/x/y.json - Updated /environments/x.json - Updated /groups/x.json - Updated /invitations.json - Updated /members.json - Updated /nodes/x.json - Updated /org.json - Created /policies/blah-1.0.0.json - Updated /policies/x-1.0.0.json - Updated /policy_groups/x.json - Updated /roles/x.json - EOM - knife("diff --name-status /").should_succeed "" - end - end - end - end - end -end |