knife-hitori 0.0.2 → 0.0.3

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.
@@ -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