knife-solo_data_bag 1.1.0 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.gitignore +1 -0
- data/.travis.yml +7 -8
- data/CHANGELOG.md +7 -0
- data/README.md +11 -5
- data/Rakefile +1 -1
- data/gemfiles/{Gemfile.chef.11.10.0 → Gemfile.chef.11.18.12} +1 -1
- data/gemfiles/{Gemfile.chef.11.10.2 → Gemfile.chef.12.16.42} +1 -1
- data/knife-solo_data_bag.gemspec +2 -2
- data/lib/chef/knife/solo_data_bag_edit.rb +8 -2
- data/lib/knife-solo_data_bag/version.rb +1 -1
- data/spec/contexts/bag_name_not_provided.rb +4 -4
- data/spec/contexts/bag_path_is_not_valid.rb +9 -3
- data/spec/contexts/secret_string_and_secret_file_are_both_provided.rb +11 -5
- data/spec/contexts/stubbed_out_stdout_and_stderr.rb +2 -2
- data/spec/unit/solo_data_bag_create_spec.rb +33 -41
- data/spec/unit/solo_data_bag_edit_spec.rb +85 -57
- data/spec/unit/solo_data_bag_list_spec.rb +4 -4
- data/spec/unit/solo_data_bag_show_spec.rb +58 -52
- metadata +25 -51
- data/gemfiles/Gemfile.chef.11.10.4 +0 -5
- data/gemfiles/Gemfile.chef.11.4.4 +0 -5
- data/gemfiles/Gemfile.chef.11.6.2 +0 -5
- data/gemfiles/Gemfile.chef.11.8.0 +0 -5
- data/gemfiles/Gemfile.chef.11.8.2 +0 -5
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: cf49bac07e42c95338783f5538307c3041fb42c3
|
4
|
+
data.tar.gz: 93ad9e80f4d7b1f42a59a7f130a04beb022cc8dd
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 58029e99bc35b17c56d4b9d5e323f4a33108aaff0d39b085e9b6cc024402950bb8e27cfeccd476ebd6c2af9fa8278327999646d987a368604a4aba59aa40a997
|
7
|
+
data.tar.gz: 2c1f8b1273fb493d825b986ac5e658f2b18fc7eebe3310ce8f5070099aa7fab71b9e1174e66b0bfdf4e0dd44b85ea0c98a0548168f52ee45b372706c873f86d8
|
data/.gitignore
CHANGED
data/.travis.yml
CHANGED
@@ -1,12 +1,11 @@
|
|
1
1
|
language: ruby
|
2
2
|
rvm:
|
3
|
-
-
|
3
|
+
- 2.2.2
|
4
|
+
- 2.3.0
|
5
|
+
|
6
|
+
before_install:
|
7
|
+
- gem install bundler
|
4
8
|
|
5
9
|
gemfile:
|
6
|
-
- ./gemfiles/Gemfile.chef.11.
|
7
|
-
- ./gemfiles/Gemfile.chef.
|
8
|
-
- ./gemfiles/Gemfile.chef.11.8.0
|
9
|
-
- ./gemfiles/Gemfile.chef.11.8.2
|
10
|
-
- ./gemfiles/Gemfile.chef.11.10.0
|
11
|
-
- ./gemfiles/Gemfile.chef.11.10.2
|
12
|
-
- ./gemfiles/Gemfile.chef.11.10.4
|
10
|
+
- ./gemfiles/Gemfile.chef.11.18.12
|
11
|
+
- ./gemfiles/Gemfile.chef.12.16.42
|
data/CHANGELOG.md
CHANGED
@@ -1,5 +1,12 @@
|
|
1
1
|
## head
|
2
2
|
|
3
|
+
# 2.0.0 (10/12/2016)
|
4
|
+
|
5
|
+
* Deprecate unsupported Ruby versions,
|
6
|
+
* Support supported Ruby versions (2.2 and 2.3),
|
7
|
+
* Update RSpec to 3.x,
|
8
|
+
* Update other gems.
|
9
|
+
|
3
10
|
# 1.1.0 (04/10/2014)
|
4
11
|
|
5
12
|
* add ability to correct incorrect text when editing a data bag
|
data/README.md
CHANGED
@@ -4,8 +4,12 @@ A knife plugin to make working with data bags easier in a chef solo environment.
|
|
4
4
|
If you are looking for a full featured chef solo management solution, you may
|
5
5
|
want to check out [knife solo](https://github.com/matschaffer/knife-solo).
|
6
6
|
|
7
|
-
|
8
|
-
|
7
|
+
## Deprecation Notices
|
8
|
+
|
9
|
+
* Versions >= 2 only support Ruby versions 2.2 and above.
|
10
|
+
If you need o use an earlier Ruby version, use `knife-solo_data_bag` < 2.0.0.
|
11
|
+
* Starting with 1.0.0, knife solo data bag only supports Chef versions >= 11.4.0.
|
12
|
+
If you need support for an earlier version of chef, use a knife solo data bag version < 1.0.0.
|
9
13
|
|
10
14
|
## Build Status
|
11
15
|

|
@@ -88,11 +92,13 @@ setting in knife.rb.
|
|
88
92
|
This plugin has been tested on the following:
|
89
93
|
|
90
94
|
Chef:
|
91
|
-
*
|
95
|
+
* ~> 11.8
|
96
|
+
* ~> 12.16
|
92
97
|
|
93
98
|
Ruby:
|
94
|
-
* 1.
|
95
|
-
*
|
99
|
+
* 2.1.8
|
100
|
+
* 2.2.2
|
101
|
+
* 2.3.0
|
96
102
|
|
97
103
|
OS:
|
98
104
|
* OSX
|
data/Rakefile
CHANGED
data/knife-solo_data_bag.gemspec
CHANGED
@@ -15,6 +15,6 @@ Gem::Specification.new do |gem|
|
|
15
15
|
gem.require_paths = ["lib"]
|
16
16
|
gem.version = Knife::SoloDataBag::VERSION
|
17
17
|
gem.add_development_dependency 'rake'
|
18
|
-
gem.add_development_dependency 'rspec', '
|
19
|
-
gem.add_development_dependency 'fakefs'
|
18
|
+
gem.add_development_dependency 'rspec', '>= 3.0'
|
19
|
+
gem.add_development_dependency 'fakefs'
|
20
20
|
end
|
@@ -43,7 +43,8 @@ class Chef
|
|
43
43
|
begin
|
44
44
|
updated_content = Chef::JSONCompat.from_json(unparsed)
|
45
45
|
break
|
46
|
-
rescue
|
46
|
+
rescue => e
|
47
|
+
raise e if !is_invalid_json_error?(e)
|
47
48
|
loop do
|
48
49
|
ui.stdout.puts e.to_s
|
49
50
|
question = "Do you want to keep editing (Y/N)? If you choose 'N', all changes will be lost"
|
@@ -71,7 +72,8 @@ class Chef
|
|
71
72
|
tf.puts text
|
72
73
|
tf.close
|
73
74
|
|
74
|
-
|
75
|
+
exit_status = Kernel.system("#{config[:editor]} #{tf.path}")
|
76
|
+
raise "Please set EDITOR environment variable" if !exit_status
|
75
77
|
|
76
78
|
output = File.read(tf.path)
|
77
79
|
tf.unlink
|
@@ -105,6 +107,10 @@ class Chef
|
|
105
107
|
end
|
106
108
|
end
|
107
109
|
|
110
|
+
def is_invalid_json_error?(exception)
|
111
|
+
exception.class.to_s.end_with?("::ParseError")
|
112
|
+
end
|
113
|
+
|
108
114
|
end
|
109
115
|
|
110
116
|
end
|
@@ -1,11 +1,11 @@
|
|
1
1
|
shared_context 'bag_name_not_provided' do
|
2
2
|
context 'when a name is not supplied' do
|
3
3
|
it 'should exit with an error message' do
|
4
|
-
|
4
|
+
expect do
|
5
5
|
@knife.run
|
6
|
-
|
7
|
-
@stdout.string.
|
8
|
-
@stderr.string.
|
6
|
+
end.to raise_error(SystemExit)
|
7
|
+
expect(@stdout.string).to match(/usage/i)
|
8
|
+
expect(@stderr.string).to match(/name for the data bag/)
|
9
9
|
end
|
10
10
|
end
|
11
11
|
end
|
@@ -1,15 +1,21 @@
|
|
1
1
|
shared_context 'bag_path_is_not_valid' do |args|
|
2
2
|
context 'when the data bag path is not valid' do
|
3
3
|
before do
|
4
|
-
File
|
4
|
+
allow(File).
|
5
|
+
to receive(:directory?).
|
6
|
+
and_call_original
|
7
|
+
allow(File).
|
8
|
+
to receive(:directory?).
|
9
|
+
with(/data_bags/).
|
10
|
+
and_return(false)
|
5
11
|
@knife.name_args = ['foo']
|
6
12
|
@knife.name_args.concat Array(args)
|
7
13
|
end
|
8
14
|
|
9
15
|
it 'should raise an invalid data bag path exception' do
|
10
|
-
|
16
|
+
expect do
|
11
17
|
@knife.run
|
12
|
-
|
18
|
+
end.to raise_error(Chef::Exceptions::InvalidDataBagPath)
|
13
19
|
end
|
14
20
|
end
|
15
21
|
end
|
@@ -1,19 +1,25 @@
|
|
1
1
|
shared_context 'secret_string_and_secret_file_are_both_provided' do |args|
|
2
2
|
context 'when specifying -s and --secret-file' do
|
3
3
|
before do
|
4
|
+
allow(File).
|
5
|
+
to receive(:directory?).
|
6
|
+
with(/data_bags/).
|
7
|
+
and_return(true)
|
8
|
+
allow(File).
|
9
|
+
to receive(:directory?).
|
10
|
+
and_call_original
|
4
11
|
@knife.name_args = ['foo']
|
5
12
|
@knife.name_args.concat Array(args)
|
6
13
|
@knife.config[:secret] = 'foobar'
|
7
14
|
@knife.config[:secret_file] = 'secret.txt'
|
8
|
-
File.stub(:directory?).and_return(true)
|
9
15
|
end
|
10
16
|
|
11
17
|
it 'should exit with an error message' do
|
12
|
-
|
18
|
+
expect do
|
13
19
|
@knife.run
|
14
|
-
|
15
|
-
@stdout.string.
|
16
|
-
@stderr.string.
|
20
|
+
end.to raise_error(SystemExit)
|
21
|
+
expect(@stdout.string).to match(/usage/i)
|
22
|
+
expect(@stderr.string).to match(/either --secret or --secret-file/)
|
17
23
|
end
|
18
24
|
|
19
25
|
end
|
@@ -2,7 +2,7 @@ shared_context 'stubbed_out_stdout_and_stderr' do
|
|
2
2
|
before do
|
3
3
|
@stdout = StringIO.new
|
4
4
|
@stderr = StringIO.new
|
5
|
-
@knife.ui.
|
6
|
-
@knife.ui.
|
5
|
+
allow(@knife.ui).to receive(:stdout) { @stdout }
|
6
|
+
allow(@knife.ui).to receive(:stderr) { @stderr }
|
7
7
|
end
|
8
8
|
end
|
@@ -8,9 +8,10 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
8
8
|
include_context 'stubbed_out_stdout_and_stderr'
|
9
9
|
|
10
10
|
describe 'run' do
|
11
|
+
let(:secret_path) { '/var/chef/secret.txt' }
|
12
|
+
|
11
13
|
include_context 'bag_name_not_provided'
|
12
14
|
include_context 'bag_path_is_not_valid'
|
13
|
-
include_context 'secret_string_and_secret_file_are_both_provided'
|
14
15
|
|
15
16
|
context 'with valid arguments' do
|
16
17
|
before do
|
@@ -21,8 +22,13 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
21
22
|
|
22
23
|
FakeFS.activate!
|
23
24
|
FileUtils.mkdir_p @bags_path
|
25
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load_secret).
|
26
|
+
with(secret_path).
|
27
|
+
and_return('psst')
|
24
28
|
end
|
25
29
|
|
30
|
+
include_context 'secret_string_and_secret_file_are_both_provided'
|
31
|
+
|
26
32
|
after do
|
27
33
|
FakeFS.deactivate!
|
28
34
|
FakeFS::FileSystem.clear
|
@@ -31,8 +37,8 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
31
37
|
context 'if an item is not specified' do
|
32
38
|
it 'should create the data bag' do
|
33
39
|
@knife.run
|
34
|
-
File.directory?(@bags_path).
|
35
|
-
File.directory?(@bag_path).
|
40
|
+
expect(File.directory?(@bags_path)).to be_truthy
|
41
|
+
expect(File.directory?(@bag_path)).to be_truthy
|
36
42
|
end
|
37
43
|
end
|
38
44
|
|
@@ -41,17 +47,18 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
41
47
|
@knife.name_args << 'bar'
|
42
48
|
@input_data = {'id' => 'foo', 'key_1' => 'value_1', 'key_2' => 'value_2'}
|
43
49
|
@item_path = "#{@bag_path}/bar.json"
|
44
|
-
@knife.
|
50
|
+
allow(@knife).to receive(:create_object).
|
51
|
+
and_yield(@input_data).and_return(nil)
|
45
52
|
end
|
46
53
|
|
47
54
|
it 'should create the data bag item' do
|
48
55
|
@knife.run
|
49
|
-
JSON.parse(File.read(@item_path)).
|
56
|
+
expect(JSON.parse(File.read(@item_path))).to eq(@input_data)
|
50
57
|
end
|
51
58
|
|
52
59
|
it 'should write pretty json' do
|
53
60
|
@knife.run
|
54
|
-
File.read(@item_path).
|
61
|
+
expect(File.read(@item_path)).to eq(JSON.pretty_generate(@input_data))
|
55
62
|
end
|
56
63
|
|
57
64
|
context 'with --data-bag-path' do
|
@@ -64,7 +71,7 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
64
71
|
|
65
72
|
it 'uses the data bag path from the override' do
|
66
73
|
@knife.run
|
67
|
-
File.directory?(@override_bag_path).
|
74
|
+
expect(File.directory?(@override_bag_path)).to be_truthy
|
68
75
|
end
|
69
76
|
end
|
70
77
|
|
@@ -78,39 +85,32 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
78
85
|
@knife.run
|
79
86
|
content = JSON.parse(File.read(@item_path))
|
80
87
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
81
|
-
content.
|
82
|
-
content[k].
|
88
|
+
expect(content).to have_key(k)
|
89
|
+
expect(content[k]).not_to eq(@input_data[k])
|
83
90
|
end
|
84
91
|
end
|
85
92
|
end
|
86
93
|
|
87
94
|
context 'when encrypting with --secret-file' do
|
95
|
+
|
88
96
|
before do
|
89
97
|
@knife.name_args << 'bar'
|
90
|
-
@
|
91
|
-
@knife.config[:secret_file] = @secret_path
|
92
|
-
Chef::EncryptedDataBagItem.should_receive(:load_secret).
|
93
|
-
with(@secret_path).
|
94
|
-
and_return('psst')
|
98
|
+
@knife.config[:secret_file] = secret_path
|
95
99
|
end
|
96
100
|
|
97
101
|
it 'should create the encrypted data bag item' do
|
98
102
|
@knife.run
|
99
103
|
content = JSON.parse(File.read(@item_path))
|
100
104
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
101
|
-
content.
|
102
|
-
content[k].
|
105
|
+
expect(content).to have_key(k)
|
106
|
+
expect(content[k]).to_not eq(@input_data[k])
|
103
107
|
end
|
104
108
|
end
|
105
109
|
end
|
106
110
|
|
107
111
|
context 'when encrypting with secret set in knife config' do
|
108
112
|
before do
|
109
|
-
|
110
|
-
Chef::Config[:encrypted_data_bag_secret] = @secret_path
|
111
|
-
Chef::EncryptedDataBagItem.should_receive(:load_secret).
|
112
|
-
with(@secret_path).
|
113
|
-
and_return('psst')
|
113
|
+
Chef::Config[:encrypted_data_bag_secret] = secret_path
|
114
114
|
end
|
115
115
|
|
116
116
|
after { Chef::Config[:encrypted_data_bag_secret] = nil }
|
@@ -119,8 +119,8 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
119
119
|
@knife.run
|
120
120
|
content = JSON.parse(File.read(@item_path))
|
121
121
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
122
|
-
content.
|
123
|
-
content[k].
|
122
|
+
expect(content).to have_key(k)
|
123
|
+
expect(content[k]).to_not eq(@input_data[k])
|
124
124
|
end
|
125
125
|
end
|
126
126
|
|
@@ -138,7 +138,7 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
138
138
|
|
139
139
|
it 'should create the data bag item' do
|
140
140
|
@knife.run
|
141
|
-
JSON.parse(File.read(@item_path)).
|
141
|
+
expect(JSON.parse(File.read(@item_path))).to eq(@input_data)
|
142
142
|
end
|
143
143
|
|
144
144
|
context 'when encrypting with -s or --secret' do
|
@@ -151,8 +151,8 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
151
151
|
@knife.run
|
152
152
|
content = JSON.parse(File.read(@item_path))
|
153
153
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
154
|
-
content.
|
155
|
-
content[k].
|
154
|
+
expect(content).to have_key(k)
|
155
|
+
expect(content[k]).to_not eq(@input_data[k])
|
156
156
|
end
|
157
157
|
end
|
158
158
|
end
|
@@ -160,30 +160,22 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
160
160
|
context 'when encrypting with --secret-file' do
|
161
161
|
before do
|
162
162
|
@knife.name_args << 'bar'
|
163
|
-
@
|
164
|
-
@knife.config[:secret_file] = @secret_path
|
165
|
-
Chef::EncryptedDataBagItem.should_receive(:load_secret).
|
166
|
-
with(@secret_path).
|
167
|
-
and_return('psst')
|
163
|
+
@knife.config[:secret_file] = secret_path
|
168
164
|
end
|
169
165
|
|
170
166
|
it 'should create the encrypted data bag item' do
|
171
167
|
@knife.run
|
172
168
|
content = JSON.parse(File.read(@item_path))
|
173
169
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
174
|
-
content.
|
175
|
-
content[k].
|
170
|
+
expect(content).to have_key(k)
|
171
|
+
expect(content[k]).to_not eq(@input_data[k])
|
176
172
|
end
|
177
173
|
end
|
178
174
|
end
|
179
175
|
|
180
176
|
context 'when encrypting with secret set in knife config' do
|
181
177
|
before do
|
182
|
-
|
183
|
-
Chef::Config[:encrypted_data_bag_secret] = @secret_path
|
184
|
-
Chef::EncryptedDataBagItem.should_receive(:load_secret).
|
185
|
-
with(@secret_path).
|
186
|
-
and_return('psst')
|
178
|
+
Chef::Config[:encrypted_data_bag_secret] = secret_path
|
187
179
|
end
|
188
180
|
|
189
181
|
after { Chef::Config[:encrypted_data_bag_secret] = nil }
|
@@ -192,8 +184,8 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
192
184
|
@knife.run
|
193
185
|
content = JSON.parse(File.read(@item_path))
|
194
186
|
@input_data.keys.reject{|i| i == 'id'}.each do |k|
|
195
|
-
content.
|
196
|
-
content[k].
|
187
|
+
expect(content).to have_key(k)
|
188
|
+
expect(content[k]).to_not eq(@input_data[k])
|
197
189
|
end
|
198
190
|
end
|
199
191
|
|
@@ -212,7 +204,7 @@ describe Chef::Knife::SoloDataBagCreate do
|
|
212
204
|
|
213
205
|
it 'creates the data bag item' do
|
214
206
|
@knife.run
|
215
|
-
JSON.parse(File.read(@item_path)).
|
207
|
+
expect(JSON.parse(File.read(@item_path))).to eq(@input_data)
|
216
208
|
end
|
217
209
|
end
|
218
210
|
|
@@ -1,13 +1,26 @@
|
|
1
1
|
require 'spec_helper'
|
2
2
|
|
3
|
-
describe Chef::Knife::SoloDataBagEdit do
|
3
|
+
RSpec.describe Chef::Knife::SoloDataBagEdit do
|
4
4
|
before do
|
5
|
-
@knife
|
5
|
+
@knife = subject
|
6
6
|
end
|
7
7
|
|
8
8
|
include_context 'stubbed_out_stdout_and_stderr'
|
9
9
|
|
10
10
|
describe 'run' do
|
11
|
+
let(:bags_path) { '/var/chef/data_bags' }
|
12
|
+
let(:bag_path) { "#{bags_path}/bag_1" }
|
13
|
+
|
14
|
+
before do
|
15
|
+
FakeFS.activate!
|
16
|
+
FileUtils.mkdir_p bag_path
|
17
|
+
end
|
18
|
+
|
19
|
+
after do
|
20
|
+
FakeFS.deactivate!
|
21
|
+
FakeFS::FileSystem.clear
|
22
|
+
end
|
23
|
+
|
11
24
|
include_context 'bag_name_not_provided'
|
12
25
|
include_context 'bag_path_is_not_valid', ['foo']
|
13
26
|
include_context 'secret_string_and_secret_file_are_both_provided', ['bar']
|
@@ -18,11 +31,11 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
18
31
|
end
|
19
32
|
|
20
33
|
it 'should exit with an error message' do
|
21
|
-
|
34
|
+
expect do
|
22
35
|
@knife.run
|
23
|
-
|
24
|
-
@stdout.string.
|
25
|
-
@stderr.string.
|
36
|
+
end.to raise_error(SystemExit)
|
37
|
+
expect(@stdout.string).to match(/usage/i)
|
38
|
+
expect(@stderr.string).to match(/name for the item/)
|
26
39
|
end
|
27
40
|
end
|
28
41
|
|
@@ -38,11 +51,11 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
38
51
|
)
|
39
52
|
end
|
40
53
|
let(:tempfile_name) { '/tmp/foo' }
|
54
|
+
let(:editor) { 'vimacs' }
|
55
|
+
let(:edit_command) { "#{editor} #{tempfile_name}" }
|
41
56
|
|
42
57
|
before do
|
43
|
-
@
|
44
|
-
@bag_path = "#{@bags_path}/bag_1"
|
45
|
-
@item_path = "#{@bag_path}/foo.json"
|
58
|
+
@item_path = "#{bag_path}/foo.json"
|
46
59
|
@knife.name_args = ['bag_1', 'foo']
|
47
60
|
@orig_data = {'id' => 'foo', 'who' => 'bob'}
|
48
61
|
@updated_data = {'id' => 'foo', 'who' => 'sue'}
|
@@ -50,33 +63,32 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
50
63
|
@bag_item_foo.data_bag 'bag_1'
|
51
64
|
@updated_bag_item = Chef::DataBagItem.from_hash @updated_data
|
52
65
|
@updated_bag_item.data_bag 'bag_1'
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
FakeFS::FileSystem.clear
|
66
|
+
@knife.config[:editor] = 'vimacs'
|
67
|
+
|
68
|
+
allow(Chef::DataBagItem).to receive(:load).
|
69
|
+
with('bag_1', 'foo').
|
70
|
+
and_return(@bag_item_foo)
|
71
|
+
allow(Tempfile).to receive(:new).
|
72
|
+
with(['knife-edit', '.json']).
|
73
|
+
and_return(tf)
|
74
|
+
allow(Kernel).to receive(:system).and_call_original
|
75
|
+
allow(Kernel).to receive(:system).with(edit_command) { true }
|
76
|
+
allow(File).to receive(:read).and_call_original
|
77
|
+
allow(File).to receive(:read).
|
78
|
+
with(tempfile_name).
|
79
|
+
and_return(@updated_data.to_json)
|
80
|
+
Chef::Config[:data_bag_path] = bags_path
|
69
81
|
end
|
70
82
|
|
71
83
|
it 'should edit the data bag item' do
|
72
84
|
@knife.run
|
73
|
-
JSON.parse(File.read(@item_path)).
|
85
|
+
expect(JSON.parse(File.read(@item_path))).to eq(@updated_data)
|
74
86
|
end
|
75
87
|
|
76
88
|
it 'should write pretty json' do
|
77
89
|
@knife.run
|
78
90
|
data = JSON.pretty_generate(:id => 'foo', :who => 'sue')
|
79
|
-
File.read(@item_path).
|
91
|
+
expect(File.read(@item_path)).to eq(data)
|
80
92
|
end
|
81
93
|
|
82
94
|
context 'with --data-bag-path' do
|
@@ -91,23 +103,24 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
91
103
|
it 'uses the data bag path from the override' do
|
92
104
|
@knife.run
|
93
105
|
data = JSON.parse(File.read(@override_item_path))
|
94
|
-
data.
|
106
|
+
expect(data).to eq(@updated_data)
|
95
107
|
end
|
96
108
|
end
|
97
109
|
|
98
110
|
context 'when encrypting with -s or --secret' do
|
99
111
|
before do
|
100
112
|
@knife.config[:secret] = 'secret_key'
|
101
|
-
Chef::EncryptedDataBagItem
|
102
|
-
|
103
|
-
|
113
|
+
allow(Chef::EncryptedDataBagItem).
|
114
|
+
to receive(:new).
|
115
|
+
with(@bag_item_foo.raw_data, 'secret_key').
|
116
|
+
and_return(@updated_data)
|
104
117
|
end
|
105
118
|
|
106
119
|
it 'should edit the encrypted data bag item' do
|
107
120
|
@knife.run
|
108
121
|
content = JSON.parse(File.read(@item_path))
|
109
|
-
content['who'].
|
110
|
-
content['who'].
|
122
|
+
expect(content['who']).not_to eq(@orig_data['who'])
|
123
|
+
expect(content['who']).not_to be_nil
|
111
124
|
end
|
112
125
|
end
|
113
126
|
|
@@ -115,19 +128,20 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
115
128
|
before do
|
116
129
|
@secret_path = '/var/chef/secret.txt'
|
117
130
|
@knife.config[:secret_file] = @secret_path
|
118
|
-
Chef::EncryptedDataBagItem.
|
119
|
-
|
120
|
-
|
121
|
-
Chef::EncryptedDataBagItem
|
122
|
-
|
123
|
-
|
131
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load_secret).
|
132
|
+
with(@secret_path).
|
133
|
+
and_return('psst')
|
134
|
+
allow(Chef::EncryptedDataBagItem).
|
135
|
+
to receive(:new).
|
136
|
+
with(@bag_item_foo.raw_data, 'psst').
|
137
|
+
and_return(@updated_data)
|
124
138
|
end
|
125
139
|
|
126
140
|
it 'should edit the encrypted data bag item' do
|
127
141
|
@knife.run
|
128
142
|
content = JSON.parse(File.read(@item_path))
|
129
|
-
content['who'].
|
130
|
-
content['who'].
|
143
|
+
expect(content['who']).not_to eq(@orig_data['who'])
|
144
|
+
expect(content['who']).not_to be_nil
|
131
145
|
end
|
132
146
|
end
|
133
147
|
|
@@ -135,12 +149,14 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
135
149
|
before do
|
136
150
|
@secret_path = '/var/chef/secret.txt'
|
137
151
|
Chef::Config[:encrypted_data_bag_secret] = @secret_path
|
138
|
-
Chef::EncryptedDataBagItem
|
139
|
-
|
140
|
-
|
141
|
-
|
142
|
-
|
143
|
-
|
152
|
+
allow(Chef::EncryptedDataBagItem).
|
153
|
+
to receive(:load_secret).
|
154
|
+
with(@secret_path).
|
155
|
+
and_return('psst')
|
156
|
+
allow(Chef::EncryptedDataBagItem).
|
157
|
+
to receive(:new).
|
158
|
+
with(@bag_item_foo.raw_data, 'psst').
|
159
|
+
and_return(@updated_data)
|
144
160
|
end
|
145
161
|
|
146
162
|
after { Chef::Config[:encrypted_data_bag_secret] = nil }
|
@@ -148,19 +164,20 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
148
164
|
it 'should edit the encrypted data bag item' do
|
149
165
|
@knife.run
|
150
166
|
content = JSON.parse(File.read(@item_path))
|
151
|
-
content['who'].
|
152
|
-
content['who'].
|
167
|
+
expect(content['who']).not_to eq(@orig_data['who'])
|
168
|
+
expect(content['who']).not_to be_nil
|
153
169
|
end
|
154
170
|
end
|
155
171
|
|
156
172
|
context 'with malformed JSON' do
|
157
173
|
let(:user_wants_to_reedit) { 'Y' }
|
174
|
+
let(:bad_json) { '{,badjson}' }
|
158
175
|
|
159
176
|
before do
|
160
|
-
@knife.config[:editor] = 'vimacs'
|
161
177
|
@pass = 0
|
162
178
|
@asked_to_continue = 0
|
163
|
-
|
179
|
+
|
180
|
+
allow(File).to receive(:read).with(tempfile_name) do
|
164
181
|
@pass += 1
|
165
182
|
case @pass
|
166
183
|
when 1
|
@@ -169,25 +186,36 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
169
186
|
@updated_data.to_json
|
170
187
|
end
|
171
188
|
end
|
172
|
-
|
189
|
+
|
190
|
+
allow(@knife.ui).to receive(:ask) do
|
173
191
|
case @pass
|
174
192
|
when 1
|
175
193
|
@asked_to_continue += 1
|
176
194
|
user_wants_to_reedit
|
195
|
+
else
|
196
|
+
nil
|
177
197
|
end
|
178
198
|
end
|
179
199
|
end
|
180
200
|
|
181
201
|
it 'asks whether to re-edit' do
|
182
202
|
@knife.run
|
183
|
-
@asked_to_continue.
|
203
|
+
expect(@asked_to_continue).to eq(1)
|
184
204
|
end
|
185
205
|
|
186
206
|
context 'when the user wants to re-edit' do
|
207
|
+
before do
|
208
|
+
allow(Kernel).to receive(:system).
|
209
|
+
with(edit_command).
|
210
|
+
and_return(true)
|
211
|
+
end
|
212
|
+
|
187
213
|
it 'the editor is re-opened' do
|
188
|
-
Kernel.should_receive(:system).with("vimacs #{tempfile_name}").
|
189
|
-
exactly(2).times.and_return(true)
|
190
214
|
@knife.run
|
215
|
+
|
216
|
+
expect(Kernel).to have_received(:system).
|
217
|
+
with(edit_command).
|
218
|
+
exactly(2).times
|
191
219
|
end
|
192
220
|
end
|
193
221
|
|
@@ -195,9 +223,9 @@ describe Chef::Knife::SoloDataBagEdit do
|
|
195
223
|
let(:user_wants_to_reedit) { 'N' }
|
196
224
|
|
197
225
|
it 'an error is thrown' do
|
198
|
-
|
226
|
+
expect do
|
199
227
|
@knife.run
|
200
|
-
|
228
|
+
end.to raise_error(StandardError)
|
201
229
|
end
|
202
230
|
end
|
203
231
|
end
|
@@ -30,8 +30,8 @@ describe Chef::Knife::SoloDataBagList do
|
|
30
30
|
|
31
31
|
it 'should list all of the data bags' do
|
32
32
|
@knife.run
|
33
|
-
@stdout.string.
|
34
|
-
@stdout.string.
|
33
|
+
expect(@stdout.string).to match(/bag_1/)
|
34
|
+
expect(@stdout.string).to match(/bag_2/)
|
35
35
|
end
|
36
36
|
|
37
37
|
context 'with --data-bag-path' do
|
@@ -44,8 +44,8 @@ describe Chef::Knife::SoloDataBagList do
|
|
44
44
|
|
45
45
|
it 'should list all of the data bags' do
|
46
46
|
@knife.run
|
47
|
-
@stdout.string.
|
48
|
-
@stdout.string.
|
47
|
+
expect(@stdout.string).to match(/bag_1-opt/)
|
48
|
+
expect(@stdout.string).to match(/bag_2-opt/)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
|
@@ -8,54 +8,58 @@ describe Chef::Knife::SoloDataBagShow do
|
|
8
8
|
include_context 'stubbed_out_stdout_and_stderr'
|
9
9
|
|
10
10
|
describe 'run' do
|
11
|
+
let(:bags_path) { '/var/chef/data_bags' }
|
12
|
+
let(:bag_path) { "#{bags_path}/bag_1" }
|
13
|
+
|
14
|
+
before do
|
15
|
+
FakeFS.activate!
|
16
|
+
FileUtils.mkdir_p bag_path
|
17
|
+
Chef::Config[:data_bag_path] = bags_path
|
18
|
+
end
|
19
|
+
|
20
|
+
after do
|
21
|
+
FakeFS.deactivate!
|
22
|
+
FakeFS::FileSystem.clear
|
23
|
+
end
|
24
|
+
|
11
25
|
include_context 'bag_name_not_provided'
|
12
26
|
include_context 'bag_path_is_not_valid'
|
13
27
|
include_context 'secret_string_and_secret_file_are_both_provided'
|
14
28
|
|
15
29
|
context 'with valid arguments' do
|
16
30
|
before do
|
17
|
-
@bags_path = '/var/chef/data_bags'
|
18
|
-
@bag_path = "#{@bags_path}/bag_1"
|
19
31
|
@knife.name_args = ['bag_1']
|
20
32
|
|
21
|
-
FakeFS.activate!
|
22
|
-
FileUtils.mkdir_p @bag_path
|
23
|
-
|
24
33
|
@bag_item_foo = Chef::DataBagItem.from_hash 'id' => 'foo', 'who' => 'bob'
|
25
34
|
@bag_item_bar = Chef::DataBagItem.from_hash 'id' => 'bar', 'who' => 'sue'
|
26
|
-
Chef::Config[:data_bag_path] = @bags_path
|
27
|
-
end
|
28
|
-
|
29
|
-
after do
|
30
|
-
FakeFS.deactivate!
|
31
|
-
FakeFS::FileSystem.clear
|
32
35
|
end
|
33
36
|
|
34
37
|
context 'if an item is not specified' do
|
35
38
|
before do
|
36
39
|
bag_items = {'foo' => @bag_item_foo, 'bar' => @bag_item_bar}
|
37
|
-
Chef::DataBag.
|
38
|
-
|
40
|
+
allow(Chef::DataBag).to receive(:load).
|
41
|
+
with('bag_1').
|
42
|
+
and_return(bag_items)
|
39
43
|
end
|
40
44
|
|
41
45
|
it 'should show the list of items' do
|
42
46
|
@knife.run
|
43
|
-
@stdout.string.
|
44
|
-
@stdout.string.
|
47
|
+
expect(@stdout.string).to match(/foo/)
|
48
|
+
expect(@stdout.string).to match(/bar/)
|
45
49
|
end
|
46
50
|
|
47
51
|
context 'with --data-bag-path' do
|
52
|
+
let(:bags_path) { '/opt/bags' }
|
53
|
+
|
48
54
|
before do
|
49
|
-
|
50
|
-
@
|
51
|
-
FileUtils.mkdir_p @bag_path
|
52
|
-
@knife.config[:data_bag_path] = @bags_path
|
55
|
+
FileUtils.mkdir_p bag_path
|
56
|
+
@knife.config[:data_bag_path] = bags_path
|
53
57
|
end
|
54
58
|
|
55
59
|
it 'uses the data bag path from the override' do
|
56
60
|
@knife.run
|
57
|
-
@stdout.string.
|
58
|
-
@stdout.string.
|
61
|
+
expect(@stdout.string).to match(/foo/)
|
62
|
+
expect(@stdout.string).to match(/bar/)
|
59
63
|
end
|
60
64
|
end
|
61
65
|
|
@@ -67,37 +71,39 @@ describe Chef::Knife::SoloDataBagShow do
|
|
67
71
|
end
|
68
72
|
|
69
73
|
it 'should show the item' do
|
70
|
-
Chef::DataBagItem.
|
71
|
-
|
74
|
+
allow(Chef::DataBagItem).to receive(:load).
|
75
|
+
with('bag_1', 'foo').
|
76
|
+
and_return(@bag_item_foo)
|
72
77
|
@knife.run
|
73
|
-
@stdout.string.
|
78
|
+
expect(@stdout.string).to match(/id:\s+foo.+who:\s+bob/m)
|
74
79
|
end
|
75
80
|
|
76
81
|
context 'and with -F of json' do
|
77
82
|
before do
|
78
83
|
@knife.config[:format] = 'json'
|
79
|
-
Chef::DataBagItem.
|
80
|
-
|
84
|
+
allow(Chef::DataBagItem).to receive(:load).with('bag_1', 'foo').
|
85
|
+
and_return(@bag_item_foo)
|
81
86
|
end
|
82
87
|
|
83
88
|
it 'should show the item as json' do
|
84
89
|
@knife.run
|
85
|
-
@stdout.string.
|
86
|
-
@stdout.string.
|
90
|
+
expect(@stdout.string).to match(/"id":\s+"foo".+"who":\s+"bob"/m)
|
91
|
+
expect(@stdout.string).not_to match(/json_class/)
|
87
92
|
end
|
88
93
|
end
|
89
94
|
|
90
95
|
context 'when encrypting with -s or --secret' do
|
91
96
|
before do
|
92
97
|
@knife.config[:secret] = 'SECRET'
|
93
|
-
Chef::EncryptedDataBagItem
|
94
|
-
|
95
|
-
|
98
|
+
allow(Chef::EncryptedDataBagItem).
|
99
|
+
to receive(:load).
|
100
|
+
with('bag_1', 'foo', 'SECRET').
|
101
|
+
and_return(@bag_item_foo)
|
96
102
|
end
|
97
103
|
|
98
104
|
it 'should show the unencrypted item' do
|
99
105
|
@knife.run
|
100
|
-
@stdout.string.
|
106
|
+
expect(@stdout.string).to match(/id:\s+foo.+who:\s+bob/m)
|
101
107
|
end
|
102
108
|
|
103
109
|
context 'and with -F of json' do
|
@@ -107,8 +113,8 @@ describe Chef::Knife::SoloDataBagShow do
|
|
107
113
|
|
108
114
|
it 'should show the unencrypted item as json' do
|
109
115
|
@knife.run
|
110
|
-
@stdout.string.
|
111
|
-
@stdout.string.
|
116
|
+
expect(@stdout.string).to match(/"id":\s+"foo".+"who":\s+"bob"/m)
|
117
|
+
expect(@stdout.string).not_to match(/json_class/)
|
112
118
|
end
|
113
119
|
end
|
114
120
|
end
|
@@ -116,17 +122,17 @@ describe Chef::Knife::SoloDataBagShow do
|
|
116
122
|
context 'when encrypting with --secret-file' do
|
117
123
|
before do
|
118
124
|
@knife.config[:secret_file] = '/var/tmp/secret'
|
119
|
-
Chef::EncryptedDataBagItem.
|
120
|
-
|
121
|
-
|
122
|
-
Chef::EncryptedDataBagItem.
|
123
|
-
|
124
|
-
|
125
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load_secret).
|
126
|
+
with('/var/tmp/secret').
|
127
|
+
and_return('abcd')
|
128
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load).
|
129
|
+
with('bag_1', 'foo', 'abcd').
|
130
|
+
and_return(@bag_item_foo)
|
125
131
|
end
|
126
132
|
|
127
133
|
it 'should show the unencrypted item' do
|
128
134
|
@knife.run
|
129
|
-
@stdout.string.
|
135
|
+
expect(@stdout.string).to match(/id:\s+foo.+who:\s+bob/m)
|
130
136
|
end
|
131
137
|
|
132
138
|
context 'and with -F of json' do
|
@@ -136,8 +142,8 @@ describe Chef::Knife::SoloDataBagShow do
|
|
136
142
|
|
137
143
|
it 'should show the unencrypted item as json' do
|
138
144
|
@knife.run
|
139
|
-
@stdout.string.
|
140
|
-
@stdout.string.
|
145
|
+
expect(@stdout.string).to match(/"id":\s+"foo".+"who":\s+"bob"/m)
|
146
|
+
expect(@stdout.string).not_to match(/json_class/)
|
141
147
|
end
|
142
148
|
end
|
143
149
|
end
|
@@ -146,17 +152,17 @@ describe Chef::Knife::SoloDataBagShow do
|
|
146
152
|
before do
|
147
153
|
@secret_path = '/var/chef/secret.txt'
|
148
154
|
Chef::Config[:encrypted_data_bag_secret] = @secret_path
|
149
|
-
Chef::EncryptedDataBagItem.
|
150
|
-
|
151
|
-
|
152
|
-
Chef::EncryptedDataBagItem.
|
153
|
-
|
154
|
-
|
155
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load_secret).
|
156
|
+
with(@secret_path).
|
157
|
+
and_return('abcd')
|
158
|
+
allow(Chef::EncryptedDataBagItem).to receive(:load).
|
159
|
+
with('bag_1', 'foo', 'abcd').
|
160
|
+
and_return(@bag_item_foo)
|
155
161
|
end
|
156
162
|
|
157
163
|
it 'should show the unencrypted item' do
|
158
164
|
@knife.run
|
159
|
-
@stdout.string.
|
165
|
+
expect(@stdout.string).to match(/id:\s+foo.+who:\s+bob/m)
|
160
166
|
end
|
161
167
|
|
162
168
|
context 'and with -F of json' do
|
@@ -166,8 +172,8 @@ describe Chef::Knife::SoloDataBagShow do
|
|
166
172
|
|
167
173
|
it 'should show the unencrypted item as json' do
|
168
174
|
@knife.run
|
169
|
-
@stdout.string.
|
170
|
-
@stdout.string.
|
175
|
+
expect(@stdout.string).to match(/"id":\s+"foo".+"who":\s+"bob"/m)
|
176
|
+
expect(@stdout.string).not_to match(/json_class/)
|
171
177
|
end
|
172
178
|
end
|
173
179
|
end
|
metadata
CHANGED
@@ -1,64 +1,57 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-solo_data_bag
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
5
|
-
prerelease:
|
4
|
+
version: 2.0.0
|
6
5
|
platform: ruby
|
7
6
|
authors:
|
8
7
|
- Tommy Bishop
|
9
8
|
autorequire:
|
10
9
|
bindir: bin
|
11
10
|
cert_chain: []
|
12
|
-
date:
|
11
|
+
date: 2016-12-10 00:00:00.000000000 Z
|
13
12
|
dependencies:
|
14
13
|
- !ruby/object:Gem::Dependency
|
15
14
|
name: rake
|
16
15
|
requirement: !ruby/object:Gem::Requirement
|
17
|
-
none: false
|
18
16
|
requirements:
|
19
|
-
- -
|
17
|
+
- - ">="
|
20
18
|
- !ruby/object:Gem::Version
|
21
19
|
version: '0'
|
22
20
|
type: :development
|
23
21
|
prerelease: false
|
24
22
|
version_requirements: !ruby/object:Gem::Requirement
|
25
|
-
none: false
|
26
23
|
requirements:
|
27
|
-
- -
|
24
|
+
- - ">="
|
28
25
|
- !ruby/object:Gem::Version
|
29
26
|
version: '0'
|
30
27
|
- !ruby/object:Gem::Dependency
|
31
28
|
name: rspec
|
32
29
|
requirement: !ruby/object:Gem::Requirement
|
33
|
-
none: false
|
34
30
|
requirements:
|
35
|
-
- -
|
31
|
+
- - ">="
|
36
32
|
- !ruby/object:Gem::Version
|
37
|
-
version:
|
33
|
+
version: '3.0'
|
38
34
|
type: :development
|
39
35
|
prerelease: false
|
40
36
|
version_requirements: !ruby/object:Gem::Requirement
|
41
|
-
none: false
|
42
37
|
requirements:
|
43
|
-
- -
|
38
|
+
- - ">="
|
44
39
|
- !ruby/object:Gem::Version
|
45
|
-
version:
|
40
|
+
version: '3.0'
|
46
41
|
- !ruby/object:Gem::Dependency
|
47
42
|
name: fakefs
|
48
43
|
requirement: !ruby/object:Gem::Requirement
|
49
|
-
none: false
|
50
44
|
requirements:
|
51
|
-
- -
|
45
|
+
- - ">="
|
52
46
|
- !ruby/object:Gem::Version
|
53
|
-
version: 0
|
47
|
+
version: '0'
|
54
48
|
type: :development
|
55
49
|
prerelease: false
|
56
50
|
version_requirements: !ruby/object:Gem::Requirement
|
57
|
-
none: false
|
58
51
|
requirements:
|
59
|
-
- -
|
52
|
+
- - ">="
|
60
53
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0
|
54
|
+
version: '0'
|
62
55
|
description: A knife plugin for working with data bags and chef solo
|
63
56
|
email:
|
64
57
|
- bishop.thomas@gmail.com
|
@@ -66,23 +59,18 @@ executables: []
|
|
66
59
|
extensions: []
|
67
60
|
extra_rdoc_files: []
|
68
61
|
files:
|
69
|
-
- .gitignore
|
70
|
-
- .kitchen.yml
|
71
|
-
- .rspec
|
72
|
-
- .ruby-gemset
|
73
|
-
- .travis.yml
|
62
|
+
- ".gitignore"
|
63
|
+
- ".kitchen.yml"
|
64
|
+
- ".rspec"
|
65
|
+
- ".ruby-gemset"
|
66
|
+
- ".travis.yml"
|
74
67
|
- CHANGELOG.md
|
75
68
|
- Gemfile
|
76
69
|
- LICENSE
|
77
70
|
- README.md
|
78
71
|
- Rakefile
|
79
|
-
- gemfiles/Gemfile.chef.11.
|
80
|
-
- gemfiles/Gemfile.chef.
|
81
|
-
- gemfiles/Gemfile.chef.11.10.4
|
82
|
-
- gemfiles/Gemfile.chef.11.4.4
|
83
|
-
- gemfiles/Gemfile.chef.11.6.2
|
84
|
-
- gemfiles/Gemfile.chef.11.8.0
|
85
|
-
- gemfiles/Gemfile.chef.11.8.2
|
72
|
+
- gemfiles/Gemfile.chef.11.18.12
|
73
|
+
- gemfiles/Gemfile.chef.12.16.42
|
86
74
|
- knife-solo_data_bag.gemspec
|
87
75
|
- lib/chef/knife/solo_data_bag_create.rb
|
88
76
|
- lib/chef/knife/solo_data_bag_edit.rb
|
@@ -105,39 +93,25 @@ files:
|
|
105
93
|
- test/integration/data/solo.rb
|
106
94
|
homepage: https://github.com/thbishop/knife-solo_data_bag
|
107
95
|
licenses: []
|
96
|
+
metadata: {}
|
108
97
|
post_install_message:
|
109
98
|
rdoc_options: []
|
110
99
|
require_paths:
|
111
100
|
- lib
|
112
101
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
|
-
none: false
|
114
102
|
requirements:
|
115
|
-
- -
|
103
|
+
- - ">="
|
116
104
|
- !ruby/object:Gem::Version
|
117
105
|
version: '0'
|
118
106
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
119
|
-
none: false
|
120
107
|
requirements:
|
121
|
-
- -
|
108
|
+
- - ">="
|
122
109
|
- !ruby/object:Gem::Version
|
123
110
|
version: '0'
|
124
111
|
requirements: []
|
125
112
|
rubyforge_project:
|
126
|
-
rubygems_version:
|
113
|
+
rubygems_version: 2.5.1
|
127
114
|
signing_key:
|
128
|
-
specification_version:
|
115
|
+
specification_version: 4
|
129
116
|
summary: A knife plugin for working with data bags and chef solo
|
130
|
-
test_files:
|
131
|
-
- spec/contexts/bag_name_not_provided.rb
|
132
|
-
- spec/contexts/bag_path_is_not_valid.rb
|
133
|
-
- spec/contexts/secret_string_and_secret_file_are_both_provided.rb
|
134
|
-
- spec/contexts/stubbed_out_stdout_and_stderr.rb
|
135
|
-
- spec/spec_helper.rb
|
136
|
-
- spec/unit/solo_data_bag_create_spec.rb
|
137
|
-
- spec/unit/solo_data_bag_edit_spec.rb
|
138
|
-
- spec/unit/solo_data_bag_list_spec.rb
|
139
|
-
- spec/unit/solo_data_bag_show_spec.rb
|
140
|
-
- test/integration/bootstrap.sh
|
141
|
-
- test/integration/data/cookbooks/foo/metadata.rb
|
142
|
-
- test/integration/data/cookbooks/foo/recipes/default.rb
|
143
|
-
- test/integration/data/solo.rb
|
117
|
+
test_files: []
|