cheffish 1.6.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 +4 -4
- data/cheffish.gemspec +1 -0
- data/lib/chef/resource/chef_acl.rb +440 -20
- data/lib/chef/resource/chef_client.rb +50 -25
- data/lib/chef/resource/chef_container.rb +44 -11
- data/lib/chef/resource/chef_data_bag.rb +43 -10
- data/lib/chef/resource/chef_data_bag_item.rb +292 -82
- data/lib/chef/resource/chef_environment.rb +79 -27
- data/lib/chef/resource/chef_group.rb +77 -40
- data/lib/chef/resource/chef_mirror.rb +170 -21
- data/lib/chef/resource/chef_node.rb +77 -11
- data/lib/chef/resource/chef_organization.rb +153 -43
- data/lib/chef/resource/chef_resolved_cookbooks.rb +40 -9
- data/lib/chef/resource/chef_role.rb +81 -29
- data/lib/chef/resource/chef_user.rb +64 -33
- data/lib/chef/resource/private_key.rb +230 -17
- data/lib/chef/resource/public_key.rb +88 -9
- data/lib/cheffish/array_property.rb +29 -0
- data/lib/cheffish/base_resource.rb +254 -0
- data/lib/cheffish/chef_actor_base.rb +135 -0
- data/lib/cheffish/node_properties.rb +107 -0
- data/lib/cheffish/recipe_dsl.rb +0 -14
- data/lib/cheffish/version.rb +1 -1
- data/lib/cheffish.rb +4 -108
- data/spec/integration/chef_acl_spec.rb +0 -2
- data/spec/integration/chef_client_spec.rb +0 -1
- data/spec/integration/chef_container_spec.rb +0 -2
- data/spec/integration/chef_group_spec.rb +0 -2
- data/spec/integration/chef_mirror_spec.rb +0 -2
- data/spec/integration/chef_node_spec.rb +0 -2
- data/spec/integration/chef_organization_spec.rb +1 -3
- data/spec/integration/chef_role_spec.rb +0 -2
- data/spec/integration/chef_user_spec.rb +0 -2
- data/spec/integration/private_key_spec.rb +0 -4
- data/spec/integration/recipe_dsl_spec.rb +0 -2
- data/spec/support/spec_support.rb +0 -1
- data/spec/unit/get_private_key_spec.rb +13 -0
- metadata +22 -20
- data/lib/chef/provider/chef_acl.rb +0 -446
- data/lib/chef/provider/chef_client.rb +0 -53
- data/lib/chef/provider/chef_container.rb +0 -55
- data/lib/chef/provider/chef_data_bag.rb +0 -55
- data/lib/chef/provider/chef_data_bag_item.rb +0 -278
- data/lib/chef/provider/chef_environment.rb +0 -83
- data/lib/chef/provider/chef_group.rb +0 -83
- data/lib/chef/provider/chef_mirror.rb +0 -169
- data/lib/chef/provider/chef_node.rb +0 -87
- data/lib/chef/provider/chef_organization.rb +0 -155
- data/lib/chef/provider/chef_resolved_cookbooks.rb +0 -46
- data/lib/chef/provider/chef_role.rb +0 -84
- data/lib/chef/provider/chef_user.rb +0 -59
- data/lib/chef/provider/private_key.rb +0 -225
- data/lib/chef/provider/public_key.rb +0 -88
- data/lib/cheffish/actor_provider_base.rb +0 -131
- data/lib/cheffish/chef_provider_base.rb +0 -246
data/lib/cheffish.rb
CHANGED
@@ -100,9 +100,9 @@ module Cheffish
|
|
100
100
|
next unless File.exist?(private_key_path)
|
101
101
|
Dir.entries(private_key_path).sort.each do |key|
|
102
102
|
ext = File.extname(key)
|
103
|
-
if ext == '' || ext == '.pem'
|
103
|
+
if key == name || ext == '' || ext == '.pem'
|
104
104
|
key_name = key[0..-(ext.length+1)]
|
105
|
-
if key_name == name
|
105
|
+
if key_name == name || key == name
|
106
106
|
Chef::Log.info("Reading key #{name} from file #{private_key_path}/#{key}")
|
107
107
|
return [ IO.read("#{private_key_path}/#{key}"), "#{private_key_path}/#{key}" ]
|
108
108
|
end
|
@@ -113,113 +113,8 @@ module Cheffish
|
|
113
113
|
nil
|
114
114
|
end
|
115
115
|
|
116
|
-
# `NOT_PASSED` is defined in chef-12.5.0, this guard will ensure we
|
117
|
-
# don't redefine it if it's already there
|
118
|
-
NOT_PASSED=Object.new unless defined?(NOT_PASSED)
|
119
|
-
|
120
116
|
def self.node_attributes(klass)
|
121
|
-
klass.
|
122
|
-
attribute :name, :kind_of => String, :regex => Cheffish::NAME_REGEX, :name_attribute => true
|
123
|
-
attribute :chef_environment, :kind_of => String, :regex => Cheffish::NAME_REGEX
|
124
|
-
attribute :run_list, :kind_of => Array # We should let them specify it as a series of parameters too
|
125
|
-
attribute :attributes, :kind_of => Hash
|
126
|
-
|
127
|
-
# Specifies that this is a complete specification for the environment (i.e. attributes you don't specify will be
|
128
|
-
# reset to their defaults)
|
129
|
-
attribute :complete, :kind_of => [TrueClass, FalseClass]
|
130
|
-
|
131
|
-
attribute :raw_json, :kind_of => Hash
|
132
|
-
attribute :chef_server, :kind_of => Hash
|
133
|
-
|
134
|
-
# attribute 'ip_address', '127.0.0.1'
|
135
|
-
# attribute [ 'pushy', 'port' ], '9000'
|
136
|
-
# attribute 'ip_addresses' do |existing_value|
|
137
|
-
# (existing_value || []) + [ '127.0.0.1' ]
|
138
|
-
# end
|
139
|
-
# attribute 'ip_address', :delete
|
140
|
-
attr_accessor :attribute_modifiers
|
141
|
-
def attribute(attribute_path, value=NOT_PASSED, &block)
|
142
|
-
@attribute_modifiers ||= []
|
143
|
-
if value != NOT_PASSED
|
144
|
-
@attribute_modifiers << [ attribute_path, value ]
|
145
|
-
elsif block
|
146
|
-
@attribute_modifiers << [ attribute_path, block ]
|
147
|
-
else
|
148
|
-
raise "attribute requires either a value or a block"
|
149
|
-
end
|
150
|
-
end
|
151
|
-
|
152
|
-
# Patchy tags
|
153
|
-
# tag 'webserver', 'apache', 'myenvironment'
|
154
|
-
def tag(*tags)
|
155
|
-
attribute 'tags' do |existing_tags|
|
156
|
-
existing_tags ||= []
|
157
|
-
tags.each do |tag|
|
158
|
-
if !existing_tags.include?(tag.to_s)
|
159
|
-
existing_tags << tag.to_s
|
160
|
-
end
|
161
|
-
end
|
162
|
-
existing_tags
|
163
|
-
end
|
164
|
-
end
|
165
|
-
def remove_tag(*tags)
|
166
|
-
attribute 'tags' do |existing_tags|
|
167
|
-
if existing_tags
|
168
|
-
tags.each do |tag|
|
169
|
-
existing_tags.delete(tag.to_s)
|
170
|
-
end
|
171
|
-
end
|
172
|
-
existing_tags
|
173
|
-
end
|
174
|
-
end
|
175
|
-
|
176
|
-
# NON-patchy tags
|
177
|
-
# tags :a, :b, :c # removes all other tags
|
178
|
-
def tags(*tags)
|
179
|
-
if tags.size == 0
|
180
|
-
attribute('tags')
|
181
|
-
else
|
182
|
-
tags = tags[0] if tags.size == 1 && tags[0].kind_of?(Array)
|
183
|
-
attribute 'tags', tags.map { |tag| tag.to_s }
|
184
|
-
end
|
185
|
-
end
|
186
|
-
|
187
|
-
# Order matters--if two things here are in the wrong order, they will be flipped in the run list
|
188
|
-
# recipe 'apache', 'mysql'
|
189
|
-
# recipe 'recipe@version'
|
190
|
-
# recipe 'recipe'
|
191
|
-
# role ''
|
192
|
-
attr_accessor :run_list_modifiers
|
193
|
-
attr_accessor :run_list_removers
|
194
|
-
def recipe(*recipes)
|
195
|
-
if recipes.size == 0
|
196
|
-
raise ArgumentError, "At least one recipe must be specified"
|
197
|
-
end
|
198
|
-
@run_list_modifiers ||= []
|
199
|
-
@run_list_modifiers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
|
200
|
-
end
|
201
|
-
def role(*roles)
|
202
|
-
if roles.size == 0
|
203
|
-
raise ArgumentError, "At least one role must be specified"
|
204
|
-
end
|
205
|
-
@run_list_modifiers ||= []
|
206
|
-
@run_list_modifiers += roles.map { |role| Chef::RunList::RunListItem.new("role[#{role}]") }
|
207
|
-
end
|
208
|
-
def remove_recipe(*recipes)
|
209
|
-
if recipes.size == 0
|
210
|
-
raise ArgumentError, "At least one recipe must be specified"
|
211
|
-
end
|
212
|
-
@run_list_removers ||= []
|
213
|
-
@run_list_removers += recipes.map { |recipe| Chef::RunList::RunListItem.new("recipe[#{recipe}]") }
|
214
|
-
end
|
215
|
-
def remove_role(*roles)
|
216
|
-
if roles.size == 0
|
217
|
-
raise ArgumentError, "At least one role must be specified"
|
218
|
-
end
|
219
|
-
@run_list_removers ||= []
|
220
|
-
@run_list_removers += roles.map { |role| Chef::RunList::RunListItem.new("role[#{role}]") }
|
221
|
-
end
|
222
|
-
end
|
117
|
+
klass.include Cheffish::NodeProperties
|
223
118
|
end
|
224
119
|
end
|
225
120
|
|
@@ -233,3 +128,4 @@ require 'chef/config_fetcher'
|
|
233
128
|
require 'chef/log'
|
234
129
|
require 'chef/application'
|
235
130
|
require 'cheffish/recipe_dsl'
|
131
|
+
require 'cheffish/node_properties'
|
@@ -1,7 +1,5 @@
|
|
1
1
|
require 'support/spec_support'
|
2
2
|
require 'cheffish/rspec/chef_run_support'
|
3
|
-
require 'chef/resource/chef_organization'
|
4
|
-
require 'chef/provider/chef_organization'
|
5
3
|
|
6
4
|
describe Chef::Resource::ChefOrganization do
|
7
5
|
extend Cheffish::RSpec::ChefRunSupport
|
@@ -195,7 +193,7 @@ describe Chef::Resource::ChefOrganization do
|
|
195
193
|
expect(get('/organizations/x/users').map { |u| u['user']['username'] }).to eq([])
|
196
194
|
end
|
197
195
|
|
198
|
-
it 'chef_organization "x" with
|
196
|
+
it 'chef_organization "x" with invites [] and "complete true" removes invites but not members' do
|
199
197
|
expect_recipe {
|
200
198
|
chef_organization 'x' do
|
201
199
|
invites []
|
@@ -1,9 +1,5 @@
|
|
1
1
|
require 'support/spec_support'
|
2
2
|
require 'cheffish/rspec/chef_run_support'
|
3
|
-
require 'chef/resource/private_key'
|
4
|
-
require 'chef/provider/private_key'
|
5
|
-
require 'chef/resource/public_key'
|
6
|
-
require 'chef/provider/public_key'
|
7
3
|
require 'support/key_support'
|
8
4
|
|
9
5
|
repo_path = Dir.mktmpdir('chef_repo')
|
@@ -26,6 +26,14 @@ describe Cheffish do
|
|
26
26
|
key_file
|
27
27
|
end
|
28
28
|
|
29
|
+
def setup_arbitrarily_named_key
|
30
|
+
key_file = File.expand_path("ned_stark.xxx", directory_that_exists)
|
31
|
+
File.open(key_file, "w+") do |f|
|
32
|
+
f.write private_key_contents
|
33
|
+
end
|
34
|
+
key_file
|
35
|
+
end
|
36
|
+
|
29
37
|
def setup_pem_key
|
30
38
|
key_file = File.expand_path("ned_stark.pem", directory_that_exists)
|
31
39
|
File.open(key_file, "w+") do |f|
|
@@ -57,6 +65,11 @@ describe Cheffish do
|
|
57
65
|
expect(Cheffish.get_private_key("ned_stark", config)).to eq(private_key_pem_contents)
|
58
66
|
end
|
59
67
|
|
68
|
+
it "returns the contents of arbitrarily named keys" do
|
69
|
+
setup_arbitrarily_named_key
|
70
|
+
expect(Cheffish.get_private_key("ned_stark.xxx", config)).to eq(private_key_contents)
|
71
|
+
end
|
72
|
+
|
60
73
|
# we arbitrarily prefer "ned_stark" over "ned_stark.pem" for deterministic behavior
|
61
74
|
it "returns the contents of the key that does not have an extension if both exist" do
|
62
75
|
setup_key
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: cheffish
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version:
|
4
|
+
version: 2.0.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- John Keiser
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2016-01-28 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: chef-zero
|
@@ -24,6 +24,20 @@ dependencies:
|
|
24
24
|
- - "~>"
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: '4.3'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: compat_resource
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - ">="
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - ">="
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
27
41
|
- !ruby/object:Gem::Dependency
|
28
42
|
name: chef
|
29
43
|
requirement: !ruby/object:Gem::Requirement
|
@@ -79,21 +93,6 @@ files:
|
|
79
93
|
- README.md
|
80
94
|
- Rakefile
|
81
95
|
- cheffish.gemspec
|
82
|
-
- lib/chef/provider/chef_acl.rb
|
83
|
-
- lib/chef/provider/chef_client.rb
|
84
|
-
- lib/chef/provider/chef_container.rb
|
85
|
-
- lib/chef/provider/chef_data_bag.rb
|
86
|
-
- lib/chef/provider/chef_data_bag_item.rb
|
87
|
-
- lib/chef/provider/chef_environment.rb
|
88
|
-
- lib/chef/provider/chef_group.rb
|
89
|
-
- lib/chef/provider/chef_mirror.rb
|
90
|
-
- lib/chef/provider/chef_node.rb
|
91
|
-
- lib/chef/provider/chef_organization.rb
|
92
|
-
- lib/chef/provider/chef_resolved_cookbooks.rb
|
93
|
-
- lib/chef/provider/chef_role.rb
|
94
|
-
- lib/chef/provider/chef_user.rb
|
95
|
-
- lib/chef/provider/private_key.rb
|
96
|
-
- lib/chef/provider/public_key.rb
|
97
96
|
- lib/chef/resource/chef_acl.rb
|
98
97
|
- lib/chef/resource/chef_client.rb
|
99
98
|
- lib/chef/resource/chef_container.rb
|
@@ -110,14 +109,16 @@ files:
|
|
110
109
|
- lib/chef/resource/private_key.rb
|
111
110
|
- lib/chef/resource/public_key.rb
|
112
111
|
- lib/cheffish.rb
|
113
|
-
- lib/cheffish/
|
112
|
+
- lib/cheffish/array_property.rb
|
113
|
+
- lib/cheffish/base_resource.rb
|
114
114
|
- lib/cheffish/basic_chef_client.rb
|
115
|
-
- lib/cheffish/
|
115
|
+
- lib/cheffish/chef_actor_base.rb
|
116
116
|
- lib/cheffish/chef_run.rb
|
117
117
|
- lib/cheffish/chef_run_data.rb
|
118
118
|
- lib/cheffish/chef_run_listener.rb
|
119
119
|
- lib/cheffish/key_formatter.rb
|
120
120
|
- lib/cheffish/merged_config.rb
|
121
|
+
- lib/cheffish/node_properties.rb
|
121
122
|
- lib/cheffish/recipe_dsl.rb
|
122
123
|
- lib/cheffish/rspec.rb
|
123
124
|
- lib/cheffish/rspec/chef_run_support.rb
|
@@ -169,8 +170,9 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
169
170
|
version: '0'
|
170
171
|
requirements: []
|
171
172
|
rubyforge_project:
|
172
|
-
rubygems_version: 2.4.
|
173
|
+
rubygems_version: 2.4.8
|
173
174
|
signing_key:
|
174
175
|
specification_version: 4
|
175
176
|
summary: A library to manipulate Chef in Chef.
|
176
177
|
test_files: []
|
178
|
+
has_rdoc:
|