knife-hitori 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,7 +1,7 @@
1
1
  class Chef
2
2
  class Knife
3
3
  class Hitori
4
- VERSION = '0.0.2'
4
+ VERSION = '0.0.3'
5
5
  end
6
6
  end
7
7
  end
@@ -6,6 +6,17 @@ require 'knife-hitori'
6
6
  class Chef
7
7
  class Knife
8
8
  module HitoriBase
9
+ def update_environment(env)
10
+ Chef::Config[:environment] = nil
11
+ Chef::Config[:solo_environment] = env
12
+ %w(data_bag_path settings_path encrypted_data_bag_secret).each do |name|
13
+ name = name.to_sym
14
+ tpl_name = "#{name}_tpl".to_sym
15
+ if Chef::Config[tpl_name]
16
+ Chef::Config[name] = sprintf(Chef::Config[tpl_name], env)
17
+ end
18
+ end
19
+ end
9
20
  end
10
21
  end
11
22
  end
@@ -20,6 +20,7 @@ class Chef
20
20
  end
21
21
 
22
22
  def run
23
+ update_environment(config[:environment]) if config[:environment]
23
24
  hitori_prepare = Chef::Knife::HitoriPrepare.new
24
25
  hitori_prepare.config = config.dup
25
26
  hitori_prepare.run
@@ -17,10 +17,6 @@ class Chef
17
17
  require 'fog'
18
18
  end
19
19
 
20
- option :local,
21
- :long => '--local',
22
- :description => 'run chef-solo locally'
23
-
24
20
  option :install_chef,
25
21
  :long => '--install-chef',
26
22
  :description => 'Install chef before run cookbook. This process usually have done by hitori-prepare.'
@@ -46,55 +42,32 @@ class Chef
46
42
  :description => 'specify a server by Public IP Address'
47
43
 
48
44
  def run
49
- if config[:local]
50
- run_local
51
- else
52
- run_remote
53
- end
54
- end
55
-
56
- def run_local
57
- Chef::Config[:environment] = nil
58
45
  update_environment(config[:environment]) if config[:environment]
59
- Chef::Config[:solo] = true
60
- @chef_solo = Chef::Client.new(json_attrs)
61
- @chef_solo.run
62
- end
63
-
64
- def update_environment(env)
65
- Chef::Config[:solo_environment] = env
66
- %w(data_bag_path settings_path encrypted_data_bag_secret).each do |name|
67
- name = name.to_sym
68
- tpl_name = "#{name}_tpl".to_sym
69
- if Chef::Config[tpl_name]
70
- Chef::Config[name] = sprintf(Chef::Config[tpl_name], env)
71
- end
72
- end
46
+ run_remote
73
47
  end
74
48
 
75
-
76
- # @return [Hash]
77
- def json_attrs
78
- attrs = load_settings || {}
79
- # Chef::Mixin::DeepMerge.merge(normal_attrs,normal_attrs_to_merge)
80
-
81
- # Update run_list
82
- run_list = new_run_list
83
- unless run_list.empty?
84
- attrs['run_list'] = run_list
85
- end
86
- #
87
- attrs
88
- end
89
-
90
- def load_settings
91
- path = Chef::Config[:settings_path]
92
- if ::File.exists?(path)
93
- return JSON.parse(::File.read(path))
94
- end
95
- ui.warn "#{path} is not found!!" if path
96
- {}
97
- end
49
+ ## @return [Hash]
50
+ #def json_attrs
51
+ # attrs = load_settings || {}
52
+ # # Chef::Mixin::DeepMerge.merge(normal_attrs,normal_attrs_to_merge)
53
+ #
54
+ # # Update run_list
55
+ # run_list = new_run_list
56
+ # unless run_list.empty?
57
+ # attrs['run_list'] = run_list
58
+ # end
59
+ # #
60
+ # attrs
61
+ #end
62
+ #
63
+ #def load_settings
64
+ # path = Chef::Config[:settings_path]
65
+ # if ::File.exists?(path)
66
+ # return JSON.parse(::File.read(path))
67
+ # end
68
+ # ui.warn "#{path} is not found!!" if path
69
+ # {}
70
+ #end
98
71
 
99
72
  def new_run_list
100
73
  run_list = []
@@ -103,7 +76,6 @@ class Chef
103
76
  run_list
104
77
  end
105
78
 
106
-
107
79
  #########################################################
108
80
  ########################################################
109
81
  def run_remote(server_list=nil)
@@ -13,6 +13,7 @@ class Chef
13
13
  :description => 'A file containing the secret key to use to encrypt data bag item values'
14
14
 
15
15
  def run
16
+ update_environment(config[:environment]) if config[:environment]
16
17
  config[:bag], config[:item] = @name_args
17
18
  exit 1 unless validate
18
19
 
@@ -20,7 +21,9 @@ class Chef
20
21
  end
21
22
 
22
23
  def decrypt_data_bag
24
+ ui.info ui.color("Use SECRET_FILE '#{secret_file_path}'", :green)
23
25
  secret = Chef::EncryptedDataBagItem.load_secret(secret_file_path)
26
+ ui.info ui.color("Decrypt DataBag #{Chef::Config[:data_bag_path]}/#{config[:bag]}/#{config[:item]}.json", :green)
24
27
  spr_creds = Chef::EncryptedDataBagItem.load(config[:bag], config[:item], secret)
25
28
  puts JSON.pretty_generate(spr_creds.to_hash)
26
29
  end
@@ -5,7 +5,7 @@ require 'chef/knife/hitori_base'
5
5
  class Chef
6
6
  class Knife
7
7
  class HitoriDataBagEnc < Knife
8
- banner 'knife hitori data bag enc BAG ITEM (options)'
8
+ banner 'knife hitori data bag enc BAG ITEM -j JSON_FILE (options)'
9
9
  include HitoriBase
10
10
 
11
11
  option :json_file,
@@ -17,6 +17,7 @@ class Chef
17
17
  :description => 'A file containing the secret key to use to encrypt data bag item values'
18
18
 
19
19
  def run
20
+ update_environment(config[:environment]) if config[:environment]
20
21
  config[:bag], config[:item] = @name_args
21
22
  exit 1 unless validate
22
23
 
@@ -27,6 +28,7 @@ class Chef
27
28
  data_bag_path = Chef::Config[:data_bag_path]
28
29
  secret = Chef::EncryptedDataBagItem.load_secret(secret_file_path)
29
30
  data = JSON.parse(File.read(config[:json_file]))
31
+ exit 1 unless check_data(data)
30
32
  encrypted_data = Chef::EncryptedDataBagItem.encrypt_data_bag_item(data, secret)
31
33
  bag_dir = "#{data_bag_path}/#{config[:bag]}"
32
34
  FileUtils.mkpath(bag_dir)
@@ -35,6 +37,14 @@ class Chef
35
37
  ui.info ui.color("Created encrypted data bag item at #{write_path}", :green)
36
38
  end
37
39
 
40
+ def check_data(data)
41
+ unless data['id'] == config[:item]
42
+ ui.error ui.color(%Q|ITEM=#{config[:item]} must have {"id": "#{config[:item]}"}, but #{config[:json_file]} does not.|)
43
+ return false
44
+ end
45
+ return true
46
+ end
47
+
38
48
  def secret_file_path
39
49
  config[:secret_file] || Chef::Config[:encrypted_data_bag_secret]
40
50
  end
@@ -0,0 +1,65 @@
1
+ # coding: utf-8
2
+
3
+ require 'chef/knife/hitori_base'
4
+ require 'knife-hitori/lib/crypt_util'
5
+
6
+ class Chef
7
+ class Knife
8
+ class HitoriFileDec < Knife
9
+ banner 'knife hitori file dec -i IN_FILE -o OUT_FILE (options)'
10
+ include HitoriBase
11
+ include KnifeHitori::CryptUtil
12
+
13
+ option :in_file,
14
+ :short => '-i IN_FILE',
15
+ :description => 'A file for decryption'
16
+
17
+ option :out_file,
18
+ :short => '-o OUT_FILE',
19
+ :description => 'A file for store decrypted file'
20
+
21
+ option :secret_file,
22
+ :long => '--secret-file SECRET_FILE',
23
+ :description => 'A file containing the secret key to use to encrypt data bag item values'
24
+
25
+ def run
26
+ update_environment(config[:environment]) if config[:environment]
27
+ exit 1 unless validate
28
+
29
+ secret = Chef::EncryptedDataBagItem.load_secret(secret_file_path)
30
+ data = File.read(config[:in_file])
31
+ File.write(config[:out_file], decrypt(JSON.parse(data), secret))
32
+ ui.info ui.color("Saved in #{config[:out_file]}", :green)
33
+ end
34
+
35
+ def secret_file_path
36
+ config[:secret_file] || Chef::Config[:encrypted_data_bag_secret]
37
+ end
38
+
39
+ def validate
40
+ unless config[:in_file]
41
+ ui.error '-i IN_FILE must be specified'
42
+ return false
43
+ end
44
+
45
+ unless ::File.exists?(config[:in_file])
46
+ ui.error "IN_FILE: #{config[:in_file]} not found"
47
+ return false
48
+ end
49
+
50
+ unless config[:out_file]
51
+ ui.error '-o OUT_FILE must be specified'
52
+ return false
53
+ end
54
+
55
+ unless ::File.exists?(secret_file_path)
56
+ ui.error 'No secret key file is found.'
57
+ return false
58
+ end
59
+
60
+ return true
61
+ end
62
+ end
63
+ end
64
+ end
65
+
@@ -0,0 +1,64 @@
1
+ # coding: utf-8
2
+
3
+ require 'chef/knife/hitori_base'
4
+ require 'knife-hitori/lib/crypt_util'
5
+
6
+ class Chef
7
+ class Knife
8
+ class HitoriFileEnc < Knife
9
+ banner 'knife hitori file enc -i IN_FILE -o OUT_FILE (options)'
10
+ include HitoriBase
11
+ include KnifeHitori::CryptUtil
12
+
13
+ option :in_file,
14
+ :short => '-i IN_FILE',
15
+ :description => 'A file for encryption'
16
+
17
+ option :out_file,
18
+ :short => '-o OUT_FILE',
19
+ :description => 'A file for store encrypted file'
20
+
21
+ option :secret_file,
22
+ :long => '--secret-file SECRET_FILE',
23
+ :description => 'A file containing the secret key to use to encrypt data bag item values'
24
+
25
+ def run
26
+ update_environment(config[:environment]) if config[:environment]
27
+ exit 1 unless validate
28
+
29
+ secret = Chef::EncryptedDataBagItem.load_secret(secret_file_path)
30
+ data = File.read(config[:in_file])
31
+ File.write(config[:out_file], JSON.dump(encrypt(data, secret)))
32
+ ui.info ui.color("Saved in #{config[:out_file]}", :green)
33
+ end
34
+
35
+ def secret_file_path
36
+ config[:secret_file] || Chef::Config[:encrypted_data_bag_secret]
37
+ end
38
+
39
+ def validate
40
+ unless config[:in_file]
41
+ ui.error '-i IN_FILE must be specified'
42
+ return false
43
+ end
44
+
45
+ unless ::File.exists?(config[:in_file])
46
+ ui.error "IN_FILE: #{config[:in_file]} not found"
47
+ return false
48
+ end
49
+
50
+ unless config[:out_file]
51
+ ui.error '-o OUT_FILE must be specified'
52
+ return false
53
+ end
54
+
55
+ unless ::File.exists?(secret_file_path)
56
+ ui.error 'No secret key file is found. Please "knife hitori key create" first.'
57
+ return false
58
+ end
59
+ return true
60
+ end
61
+ end
62
+ end
63
+ end
64
+
@@ -0,0 +1,36 @@
1
+ # coding: utf-8
2
+
3
+ require 'chef/knife/hitori_base'
4
+
5
+ class Chef
6
+ class Knife
7
+ class HitoriKeyCreate < Knife
8
+ banner 'knife hitori key create (options)'
9
+ include HitoriBase
10
+
11
+ def run
12
+ update_environment(config[:environment]) if config[:environment]
13
+ create_key
14
+ end
15
+
16
+ def create_key
17
+ secret_file_path = Chef::Config[:encrypted_data_bag_secret]
18
+ if ::File.exists?(secret_file_path)
19
+ yes = ui.confirm("#{secret_file_path} already exists.\nOVERWRITE this?")
20
+ return unless yes
21
+ end
22
+ do_create_key(secret_file_path)
23
+ end
24
+
25
+ def do_create_key(secret_file_path)
26
+ FileUtils.mkpath(::File.dirname(secret_file_path))
27
+ key = [OpenSSL::Random.random_bytes(512)].pack('m0')
28
+ data = (1..key.size/64).inject(key) {|x,i| x.insert(i*64+i-1, "\n")} + "\n"
29
+ ::File.write(secret_file_path, data)
30
+ ui.info ui.color("save secret key to #{secret_file_path}", :green)
31
+ end
32
+
33
+ end
34
+ end
35
+ end
36
+
@@ -19,6 +19,7 @@ class Chef
19
19
  end
20
20
 
21
21
  def run
22
+ update_environment(config[:environment]) if config[:environment]
22
23
  conf = ask_ec2_config_all(Chef::Config.knife, true)
23
24
  ec2 = setup_knife_ec2(conf)
24
25
  ec2.run
@@ -0,0 +1,22 @@
1
+ # coding: utf-8
2
+
3
+ module KnifeHitori
4
+ module CryptUtil
5
+ require 'chef/encrypted_data_bag_item'
6
+
7
+ # @param [Hash] data
8
+ # @param [String] secret
9
+ # @return [String]
10
+ def decrypt(data, secret)
11
+ Chef::EncryptedDataBagItem::Decryptor.for(data, secret.strip).for_decrypted_item
12
+ end
13
+
14
+ # @param [String] data
15
+ # @param [String] secret
16
+ # @return [Hash]
17
+ def encrypt(data, secret)
18
+ Chef::EncryptedDataBagItem::Encryptor.new(data, secret.strip).for_encrypted_item
19
+ end
20
+ end
21
+ end
22
+
@@ -33,5 +33,7 @@ if [ -e $RBENV_FILE ]; then
33
33
  . $RBENV_FILE
34
34
  fi
35
35
 
36
+ echo "CHEF_ENV=${CHEF_ENV}"
37
+ export CHEF_ENV
36
38
  echo chef-solo -c $SOLO -j $SERVER_JSON $OPTIONS
37
39
  chef-solo -c $SOLO -j $SERVER_JSON $OPTIONS
@@ -32,3 +32,8 @@ config_files.each do |name|
32
32
  Chef::Config.from_file(filename) if File.exists?(filename)
33
33
  end
34
34
 
35
+ if $DEBUG
36
+ puts '-' * 50
37
+ p Chef::Config
38
+ puts '-' * 50
39
+ end
@@ -0,0 +1,29 @@
1
+ # coding: utf-8
2
+
3
+ require 'fileutils'
4
+
5
+ require 'spec_helper'
6
+
7
+ require 'chef/knife/hitori_base'
8
+
9
+
10
+ describe 'hitori_base' do
11
+ before do
12
+ @obj = Object.new
13
+ @obj.extend Chef::Knife::HitoriBase
14
+ end
15
+
16
+ describe :update_environment do
17
+ before(:each) do
18
+ Chef::Config[:data_bag_path_tpl] = 'databag/%s'
19
+ Chef::Config[:settings_path_tpl] = 'settings/%s'
20
+ Chef::Config[:encrypted_data_bag_secret_tpl] = 'enc/%s'
21
+ @obj.update_environment('my_env')
22
+ end
23
+
24
+ subject {Chef::Config}
25
+ its(:data_bag_path) {should == 'databag/my_env'}
26
+ its(:settings_path) {should == 'settings/my_env'}
27
+ its(:encrypted_data_bag_secret) {should == 'enc/my_env'}
28
+ end
29
+ end
@@ -11,6 +11,7 @@ describe 'hitori_config' do
11
11
  before do
12
12
  Chef::Knife::HitoriConfig.load_deps
13
13
  @obj = Chef::Knife::HitoriConfig.new
14
+ @obj.ui.stub(:info, :msg)
14
15
  setup_interactive_response
15
16
  end
16
17
 
@@ -30,30 +30,12 @@ describe 'hitori_cook' do
30
30
  }
31
31
  end
32
32
 
33
- it 'should call run_local if config[:local]' do
34
- @obj.should_receive(:run_local)
35
- @obj.config[:local] = true
36
- @obj.run
37
- end
38
-
39
- it 'should call run_remote if not config[:local]' do
33
+ it 'should call run_remote' do
40
34
  @obj.should_receive(:run_remote)
41
- @obj.config[:local] = nil
42
35
  @obj.run
43
36
  end
44
37
  end
45
38
 
46
- describe :run_local do
47
- it 'should call ChefClient.run' do
48
- @obj.config[:environment] = nil
49
- chef_client = double('chef_client')
50
- Chef::Client.should_receive(:new).with({json: 'attrs'}).and_return(chef_client)
51
- @obj.stub(:json_attrs => {json: 'attrs'})
52
- chef_client.should_receive(:run)
53
- @obj.run_local
54
- end
55
- end
56
-
57
39
  describe :update_environment do
58
40
  before(:each) do
59
41
  Chef::Config[:data_bag_path_tpl] = 'databag/%s'
@@ -68,26 +50,26 @@ describe 'hitori_cook' do
68
50
  its(:encrypted_data_bag_secret) {should == 'enc/my_env'}
69
51
  end
70
52
 
71
- describe :json_attrs do
72
- before() do
73
- @data = {'my' => 'data', 'run_list' => 'role[magic]'}
74
- temp = Tempfile.open('hitori-')
75
- Chef::Config[:settings_path] = temp.path
76
- temp.write JSON.dump(@data)
77
- temp.close
78
- end
79
-
80
- it 'should return json data of Config[:settings_path]' do
81
- @obj.json_attrs.should == @data
82
- end
83
-
84
- it 'should update run_list if options is specified' do
85
- @obj.config[:recipes] = 'cat'
86
- @obj.config[:roles] = 'dog'
87
- ret = @obj.json_attrs
88
- ret['run_list'].sort.should == %w(recipe[cat] role[dog]).sort
89
- end
90
- end
53
+ #describe :json_attrs do
54
+ # before() do
55
+ # @data = {'my' => 'data', 'run_list' => 'role[magic]'}
56
+ # temp = Tempfile.open('hitori-')
57
+ # Chef::Config[:settings_path] = temp.path
58
+ # temp.write JSON.dump(@data)
59
+ # temp.close
60
+ # end
61
+ #
62
+ # it 'should return json data of Config[:settings_path]' do
63
+ # @obj.json_attrs.should == @data
64
+ # end
65
+ #
66
+ # it 'should update run_list if options is specified' do
67
+ # @obj.config[:recipes] = 'cat'
68
+ # @obj.config[:roles] = 'dog'
69
+ # ret = @obj.json_attrs
70
+ # ret['run_list'].sort.should == %w(recipe[cat] role[dog]).sort
71
+ # end
72
+ #end
91
73
 
92
74
  describe :new_run_list do
93
75
  before(:each) do
@@ -167,8 +149,4 @@ describe 'hitori_cook' do
167
149
  ret.should == nil
168
150
  end
169
151
  end
170
-
171
-
172
-
173
-
174
152
  end
@@ -0,0 +1,31 @@
1
+ require 'spec_helper'
2
+
3
+ require 'chef/knife/hitori_data_bag_dec'
4
+
5
+ describe 'HitoriDataBagDec' do
6
+ before do
7
+ Chef::Knife::HitoriDataBagDec.load_deps
8
+ @obj = Chef::Knife::HitoriDataBagDec.new
9
+ @obj.name_args = %w(MY_BAG MY_ITEM)
10
+ Chef::Config[:encrypted_data_bag_secret] = '/tmp/enc.key'
11
+ end
12
+
13
+ describe :run do
14
+ it 'should call update_environment' do
15
+ @obj.config[:environment] = 'apple'
16
+ @obj.should_receive(:update_environment).with('apple')
17
+ common_run
18
+ end
19
+
20
+ it 'should not call update_environment' do
21
+ @obj.config[:environment] = nil
22
+ @obj.should_not_receive(:update_environment)
23
+ common_run
24
+ end
25
+
26
+ def common_run
27
+ @obj.should_receive(:decrypt_data_bag)
28
+ @obj.run
29
+ end
30
+ end
31
+ end
@@ -0,0 +1,50 @@
1
+ require 'spec_helper'
2
+
3
+ require 'chef/knife/hitori_data_bag_enc'
4
+
5
+ describe 'HitoriDataBagEnc' do
6
+ before do
7
+ Chef::Knife::HitoriDataBagEnc.load_deps
8
+ @obj = Chef::Knife::HitoriDataBagEnc.new
9
+ @obj.name_args = %w(MY_BAG MY_ITEM)
10
+ @obj.config[:json_file] = 'my.json'
11
+ Chef::Config[:encrypted_data_bag_secret] = '/tmp/enc.key'
12
+ end
13
+
14
+ describe :run do
15
+ it 'should call update_environment if config[:environment]' do
16
+ @obj.config[:environment] = 'apple'
17
+ @obj.should_receive(:update_environment).with('apple')
18
+ common_run
19
+ end
20
+
21
+ it 'should not call update_environment if not config[:environment]' do
22
+ @obj.config[:environment] = nil
23
+ @obj.should_not_receive(:update_environment)
24
+ common_run
25
+ end
26
+
27
+ def common_run
28
+ @obj.should_receive(:create_data_bag)
29
+ @obj.run
30
+ end
31
+ end
32
+
33
+ describe :create_data_bag do
34
+ it 'should write encrypted data to specific path' do
35
+ @obj.config[:bag], @obj.config[:item] = @obj.name_args
36
+ Chef::Config[:data_bag_path] = '/tmp/data_bag'
37
+ Chef::EncryptedDataBagItem.should_receive(:load_secret) {'sec'}
38
+ File.should_receive(:read).with(@obj.config[:json_file]) {'{"a": 9}'}
39
+ @obj.should_receive(:check_data).and_return(true)
40
+ Chef::EncryptedDataBagItem.should_receive(:encrypt_data_bag_item) {
41
+ enc_data = double('enc_data')
42
+ enc_data.should_receive(:to_json) {'enc_to_json'}
43
+ enc_data
44
+ }
45
+ File.should_receive(:write).with('/tmp/data_bag/MY_BAG/MY_ITEM.json', 'enc_to_json')
46
+ @obj.create_data_bag
47
+ end
48
+
49
+ end
50
+ end
@@ -11,6 +11,7 @@ describe 'hitori_prepare' do
11
11
  before do
12
12
  Chef::Knife::HitoriPrepare.load_deps
13
13
  @obj = Chef::Knife::HitoriPrepare.new
14
+ @obj.ui.stub(:info, :msg)
14
15
  end
15
16
 
16
17
  describe :run do
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: knife-hitori
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-06-07 00:00:00.000000000 Z
12
+ date: 2013-06-12 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: chef
@@ -128,9 +128,13 @@ files:
128
128
  - lib/chef/knife/hitori_cook.rb
129
129
  - lib/chef/knife/hitori_data_bag_dec.rb
130
130
  - lib/chef/knife/hitori_data_bag_enc.rb
131
+ - lib/chef/knife/hitori_file_dec.rb
132
+ - lib/chef/knife/hitori_file_enc.rb
131
133
  - lib/chef/knife/hitori_hello.rb
134
+ - lib/chef/knife/hitori_key_create.rb
132
135
  - lib/chef/knife/hitori_prepare.rb
133
136
  - lib/knife-hitori.rb
137
+ - lib/knife-hitori/lib/crypt_util.rb
134
138
  - lib/knife-hitori/lib/interactive_configure.rb
135
139
  - lib/knife-hitori/lib/run_remote_cook.rb
136
140
  - lib/knife-hitori/resources/centos_bootstrap.erb
@@ -142,9 +146,12 @@ files:
142
146
  - refs/run_chef_solo.sh
143
147
  - refs/util/create_encrypt_databag.rb
144
148
  - refs/util/crypt_file.rb
149
+ - spec/knife/hitori_base_spec.rb
145
150
  - spec/knife/hitori_bootstrap_spec.rb
146
151
  - spec/knife/hitori_config_spec.rb
147
152
  - spec/knife/hitori_cook_spec.rb
153
+ - spec/knife/hitori_data_bag_dec_spec.rb
154
+ - spec/knife/hitori_data_bag_enc_spec.rb
148
155
  - spec/knife/hitori_hello_spec.rb
149
156
  - spec/knife/hitori_prepare_spec.rb
150
157
  - spec/spec_helper.rb
@@ -174,9 +181,12 @@ signing_key:
174
181
  specification_version: 3
175
182
  summary: knife subcommand
176
183
  test_files:
184
+ - spec/knife/hitori_base_spec.rb
177
185
  - spec/knife/hitori_bootstrap_spec.rb
178
186
  - spec/knife/hitori_config_spec.rb
179
187
  - spec/knife/hitori_cook_spec.rb
188
+ - spec/knife/hitori_data_bag_dec_spec.rb
189
+ - spec/knife/hitori_data_bag_enc_spec.rb
180
190
  - spec/knife/hitori_hello_spec.rb
181
191
  - spec/knife/hitori_prepare_spec.rb
182
192
  - spec/spec_helper.rb