diff options
author | Thom May <thom@may.lt> | 2017-03-06 11:32:29 +0000 |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-03-06 11:32:29 +0000 |
commit | 2fb7110c49fff5c3c1edc8362925b6ce172cb7f2 (patch) | |
tree | 141eb1b13fe995d0ebda9641dcbce33f4791d85d | |
parent | f1718d033e0d7e0cce1674de1d10eee3c8ac656c (diff) | |
parent | e55307170dbeb693933307c194a23a8a458e4571 (diff) | |
download | chef-2fb7110c49fff5c3c1edc8362925b6ce172cb7f2.tar.gz |
Merge pull request #5855 from chef/afiune/COOL-634/verify-if-data-bag-exists
Verify data bag exists before trying to create it
-rw-r--r-- | lib/chef/knife/data_bag_create.rb | 10 | ||||
-rw-r--r-- | spec/unit/knife/data_bag_create_spec.rb | 110 |
2 files changed, 71 insertions, 49 deletions
diff --git a/lib/chef/knife/data_bag_create.rb b/lib/chef/knife/data_bag_create.rb index 196278bb80..563e931dca 100644 --- a/lib/chef/knife/data_bag_create.rb +++ b/lib/chef/knife/data_bag_create.rb @@ -49,13 +49,15 @@ class Chef exit(1) end - # create the data bag + # Verify if the data bag exists begin + rest.get("data/#{@data_bag_name}") + ui.info("Data bag #{@data_bag_name} already exists") + rescue Net::HTTPServerException => e + raise unless e.to_s =~ /^404/ + # if it doesn't exists, try to create it rest.post("data", { "name" => @data_bag_name }) ui.info("Created data_bag[#{@data_bag_name}]") - rescue Net::HTTPServerException => e - raise unless e.to_s =~ /^409/ - ui.info("Data bag #{@data_bag_name} already exists") end # if an item is specified, create it, as well diff --git a/spec/unit/knife/data_bag_create_spec.rb b/spec/unit/knife/data_bag_create_spec.rb index b852c30401..b7d185a58c 100644 --- a/spec/unit/knife/data_bag_create_spec.rb +++ b/spec/unit/knife/data_bag_create_spec.rb @@ -46,64 +46,84 @@ describe Chef::Knife::DataBagCreate do allow(knife).to receive(:config).and_return(config) end - it "tries to create a data bag with an invalid name when given one argument" do - knife.name_args = ["invalid&char"] - expect(Chef::DataBag).to receive(:validate_name!).with(knife.name_args[0]).and_raise(Chef::Exceptions::InvalidDataBagName) - expect { knife.run }.to exit_with_code(1) - end - - context "when given one argument" do - before do - knife.name_args = [bag_name] - end - - it "creates a data bag" do - expect(rest).to receive(:post).with("data", { "name" => bag_name }) - expect(knife.ui).to receive(:info).with("Created data_bag[#{bag_name}]") + context "when data_bag already exist" do + it "doesn't creates a data bag" do + expect(knife).to receive(:create_object).and_yield(raw_hash) + expect(rest).to receive(:get).with("data/#{bag_name}") + expect(rest).to_not receive(:post).with("data", { "name" => bag_name }) + expect(knife.ui).to receive(:info).with("Data bag #{bag_name} already exists") knife.run end end - context "no secret is specified for encryption" do - let(:item) do - item = Chef::DataBagItem.from_hash(raw_hash) - item.data_bag(bag_name) - item + context "when data_bag doesn't exist" do + before do + # Data bag doesn't exist by default so we mock the GET request to return 404 + exception = double("404 error", :code => "404") + allow(rest).to receive(:get) + .with("data/#{bag_name}") + .and_raise(Net::HTTPServerException.new("404", exception)) end - it "creates a data bag item" do - expect(knife).to receive(:create_object).and_yield(raw_hash) - expect(knife).to receive(:encryption_secret_provided?).and_return(false) - expect(rest).to receive(:post).with("data", { "name" => bag_name }).ordered - expect(rest).to receive(:post).with("data/#{bag_name}", item).ordered - - knife.run + it "tries to create a data bag with an invalid name when given one argument" do + knife.name_args = ["invalid&char"] + expect(Chef::DataBag).to receive(:validate_name!).with(knife.name_args[0]).and_raise(Chef::Exceptions::InvalidDataBagName) + expect { knife.run }.to exit_with_code(1) end - end - context "a secret is specified for encryption" do - let(:encoded_data) { Chef::EncryptedDataBagItem.encrypt_data_bag_item(raw_hash, secret) } + context "when given one argument" do + before do + knife.name_args = [bag_name] + end + + it "creates a data bag" do + expect(rest).to receive(:post).with("data", { "name" => bag_name }) + expect(knife.ui).to receive(:info).with("Created data_bag[#{bag_name}]") - let(:item) do - item = Chef::DataBagItem.from_hash(encoded_data) - item.data_bag(bag_name) - item + knife.run + end end - it "creates an encrypted data bag item" do - expect(knife).to receive(:create_object).and_yield(raw_hash) - expect(knife).to receive(:encryption_secret_provided?).and_return(true) - expect(knife).to receive(:read_secret).and_return(secret) - expect(Chef::EncryptedDataBagItem) - .to receive(:encrypt_data_bag_item) - .with(raw_hash, secret) - .and_return(encoded_data) - expect(rest).to receive(:post).with("data", { "name" => bag_name }).ordered - expect(rest).to receive(:post).with("data/#{bag_name}", item).ordered + context "no secret is specified for encryption" do + let(:item) do + item = Chef::DataBagItem.from_hash(raw_hash) + item.data_bag(bag_name) + item + end + + it "creates a data bag item" do + expect(knife).to receive(:create_object).and_yield(raw_hash) + expect(knife).to receive(:encryption_secret_provided?).and_return(false) + expect(rest).to receive(:post).with("data", { "name" => bag_name }).ordered + expect(rest).to receive(:post).with("data/#{bag_name}", item).ordered + + knife.run + end + end - knife.run + context "a secret is specified for encryption" do + let(:encoded_data) { Chef::EncryptedDataBagItem.encrypt_data_bag_item(raw_hash, secret) } + + let(:item) do + item = Chef::DataBagItem.from_hash(encoded_data) + item.data_bag(bag_name) + item + end + + it "creates an encrypted data bag item" do + expect(knife).to receive(:create_object).and_yield(raw_hash) + expect(knife).to receive(:encryption_secret_provided?).and_return(true) + expect(knife).to receive(:read_secret).and_return(secret) + expect(Chef::EncryptedDataBagItem) + .to receive(:encrypt_data_bag_item) + .with(raw_hash, secret) + .and_return(encoded_data) + expect(rest).to receive(:post).with("data", { "name" => bag_name }).ordered + expect(rest).to receive(:post).with("data/#{bag_name}", item).ordered + + knife.run + end end end - end |