factor-connector-chef 0.0.5 → 0.0.6
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
CHANGED
@@ -1,7 +1,15 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
|
2
|
+
!binary "U0hBMQ==":
|
3
|
+
metadata.gz: !binary |-
|
4
|
+
N2YxNDgyYzg1YWE0NTYzODc0NjdkYjBjMjE0MDEwODViZGNhODgyOA==
|
5
|
+
data.tar.gz: !binary |-
|
6
|
+
YmFmNWVlZjExNzVlNjM1MjViYmQ5ZmNiNGEzZTIzNjQwODBiZmZkYw==
|
5
7
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
|
8
|
+
metadata.gz: !binary |-
|
9
|
+
MWM5MDlmNDJjNzYzM2FlYTczNjc5N2Y1ZTQzZGNlNTU4ZjUxYjRjZWExMGU1
|
10
|
+
MTdiOTQzNGVhN2ZlNmY2NjBlZGE3ZmI1ZjY0YWZlZTk4MzEyYTE5NTE1NmJm
|
11
|
+
YjY0YTE4YTIzMGRhM2VhNjA2MjViMTgwOTg0Y2ZiMDI2MjJiYzM=
|
12
|
+
data.tar.gz: !binary |-
|
13
|
+
MjAyODc1NDFiNjBmNGZjYWM3YzdjYWNjOWUxZmI2MzZhN2FiNjMxZTVmNzY4
|
14
|
+
NGFhOGFiM2FmODU2NjMxNWUxYzIyNmU5ZjFlYzM4ZTc3MmRhNTdiYjI4MTE3
|
15
|
+
NGY0YjE1ODliZTQ4M2Q3MDhiMDUzZjJiNTQ2OWI0ZThlOWY0MWU=
|
@@ -0,0 +1,171 @@
|
|
1
|
+
require 'factor-connector-api'
|
2
|
+
require 'chef-api'
|
3
|
+
|
4
|
+
Factor::Connector.service 'chef_clients' do
|
5
|
+
action 'all' do |params|
|
6
|
+
organization = params['organization']
|
7
|
+
chef_server = params['chef_server']
|
8
|
+
client_name = params['client_name']
|
9
|
+
client_key = params['client_key']
|
10
|
+
|
11
|
+
fail 'Client Name (client_name) is required' unless client_name
|
12
|
+
fail 'Client Private Key (client_key) is required' unless client_key
|
13
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
14
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
15
|
+
|
16
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
17
|
+
|
18
|
+
info 'Setting up private key'
|
19
|
+
begin
|
20
|
+
private_key_file = Tempfile.new('private')
|
21
|
+
private_key_file.write(client_key)
|
22
|
+
private_key_file.close
|
23
|
+
rescue
|
24
|
+
fail 'Failed to setup private key'
|
25
|
+
end
|
26
|
+
|
27
|
+
connection_settings = {
|
28
|
+
endpoint: chef_server,
|
29
|
+
client: client_name,
|
30
|
+
key: private_key_file.path,
|
31
|
+
}
|
32
|
+
|
33
|
+
begin
|
34
|
+
chef = ChefAPI::Connection.new connection_settings
|
35
|
+
clients = chef.clients.all
|
36
|
+
rescue => ex
|
37
|
+
fail ex.message
|
38
|
+
end
|
39
|
+
|
40
|
+
action_callback clients.map {|c| c.to_hash}
|
41
|
+
end
|
42
|
+
|
43
|
+
action 'get' do |params|
|
44
|
+
organization = params['organization']
|
45
|
+
chef_server = params['chef_server']
|
46
|
+
client_name = params['client_name']
|
47
|
+
key = params['client_key']
|
48
|
+
id = params['id']
|
49
|
+
|
50
|
+
fail 'Client Name (client_name) is required' unless client_name
|
51
|
+
fail 'Private Key (client_key) is required' unless key
|
52
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
53
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
54
|
+
fail 'Client ID (id) is required' unless id
|
55
|
+
|
56
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
57
|
+
|
58
|
+
info 'Setting up private key'
|
59
|
+
begin
|
60
|
+
private_key_file = Tempfile.new('private')
|
61
|
+
private_key_file.write(key)
|
62
|
+
private_key_file.close
|
63
|
+
rescue
|
64
|
+
fail 'Failed to setup private key'
|
65
|
+
end
|
66
|
+
|
67
|
+
connection_settings = {
|
68
|
+
endpoint: chef_server,
|
69
|
+
client: client_name,
|
70
|
+
key: private_key_file.path,
|
71
|
+
}
|
72
|
+
|
73
|
+
begin
|
74
|
+
chef = ChefAPI::Connection.new connection_settings
|
75
|
+
content = chef.clients.fetch(id)
|
76
|
+
rescue => ex
|
77
|
+
fail ex.message
|
78
|
+
end
|
79
|
+
|
80
|
+
fail "Client with id '#{id}' not found" unless content
|
81
|
+
|
82
|
+
action_callback content.to_hash
|
83
|
+
end
|
84
|
+
|
85
|
+
action 'create' do |params|
|
86
|
+
organization = params['organization']
|
87
|
+
chef_server = params['chef_server']
|
88
|
+
client_name = params['client_name']
|
89
|
+
key = params['client_key']
|
90
|
+
|
91
|
+
fail 'Client Name (client_name) is required' unless client_name
|
92
|
+
fail 'Private Key (client_key) is required' unless key
|
93
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
94
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
95
|
+
fail 'New Client Name (name) is required' unless params['name']
|
96
|
+
|
97
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
98
|
+
|
99
|
+
info 'Setting up private key'
|
100
|
+
begin
|
101
|
+
private_key_file = Tempfile.new('private')
|
102
|
+
private_key_file.write(key)
|
103
|
+
private_key_file.close
|
104
|
+
rescue
|
105
|
+
fail 'Failed to setup private key'
|
106
|
+
end
|
107
|
+
|
108
|
+
connection_settings = {
|
109
|
+
endpoint: chef_server,
|
110
|
+
client: client_name,
|
111
|
+
key: private_key_file.path,
|
112
|
+
}
|
113
|
+
|
114
|
+
available_params = %w(name admin public_key private_key validator)
|
115
|
+
client_params = {}
|
116
|
+
available_params.each do |param|
|
117
|
+
client_params[param.to_sym] = params[param] if params.include?(param)
|
118
|
+
end
|
119
|
+
|
120
|
+
begin
|
121
|
+
info "Creating new client '#{client_params['name']}'"
|
122
|
+
chef = ChefAPI::Connection.new connection_settings
|
123
|
+
content = chef.clients.create(client_params)
|
124
|
+
rescue => ex
|
125
|
+
fail ex.message
|
126
|
+
end
|
127
|
+
|
128
|
+
action_callback content.to_hash
|
129
|
+
end
|
130
|
+
|
131
|
+
action 'delete' do |params|
|
132
|
+
organization = params['organization']
|
133
|
+
chef_server = params['chef_server']
|
134
|
+
client_name = params['client_name']
|
135
|
+
key = params['client_key']
|
136
|
+
id = params['id']
|
137
|
+
|
138
|
+
fail 'Client Name (client_name) is required' unless client_name
|
139
|
+
fail 'Private Key (client_key) is required' unless key
|
140
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
141
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
142
|
+
fail 'Client ID (id) is required' unless id
|
143
|
+
|
144
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
145
|
+
|
146
|
+
info 'Setting up private key'
|
147
|
+
begin
|
148
|
+
private_key_file = Tempfile.new('private')
|
149
|
+
private_key_file.write(key)
|
150
|
+
private_key_file.close
|
151
|
+
rescue
|
152
|
+
fail 'Failed to setup private key'
|
153
|
+
end
|
154
|
+
|
155
|
+
connection_settings = {
|
156
|
+
endpoint: chef_server,
|
157
|
+
client: client_name,
|
158
|
+
key: private_key_file.path,
|
159
|
+
}
|
160
|
+
|
161
|
+
begin
|
162
|
+
chef = ChefAPI::Connection.new connection_settings
|
163
|
+
content = chef.clients.fetch(id)
|
164
|
+
content.destroy
|
165
|
+
rescue => ex
|
166
|
+
fail ex.message
|
167
|
+
end
|
168
|
+
|
169
|
+
action_callback
|
170
|
+
end
|
171
|
+
end
|
@@ -0,0 +1,441 @@
|
|
1
|
+
require 'factor-connector-api'
|
2
|
+
require 'chef-api'
|
3
|
+
require 'deep_merge'
|
4
|
+
|
5
|
+
Factor::Connector.service 'chef_databags' do
|
6
|
+
action 'all' do |params|
|
7
|
+
organization = params['organization']
|
8
|
+
chef_server = params['chef_server']
|
9
|
+
client_name = params['client_name']
|
10
|
+
client_key = params['client_key']
|
11
|
+
|
12
|
+
fail 'Client Name (client_name) is required' unless client_name
|
13
|
+
fail 'Client Private Key (client_key) is required' unless client_key
|
14
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
15
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
16
|
+
|
17
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
18
|
+
|
19
|
+
info 'Setting up private key'
|
20
|
+
begin
|
21
|
+
private_key_file = Tempfile.new('private')
|
22
|
+
private_key_file.write(client_key)
|
23
|
+
private_key_file.close
|
24
|
+
rescue
|
25
|
+
fail 'Failed to setup private key'
|
26
|
+
end
|
27
|
+
|
28
|
+
connection_settings = {
|
29
|
+
endpoint: chef_server,
|
30
|
+
client: client_name,
|
31
|
+
key: private_key_file.path,
|
32
|
+
}
|
33
|
+
|
34
|
+
begin
|
35
|
+
chef = ChefAPI::Connection.new connection_settings
|
36
|
+
contents = chef.data_bags.all
|
37
|
+
rescue => ex
|
38
|
+
fail ex.message
|
39
|
+
end
|
40
|
+
|
41
|
+
action_callback contents.map {|c| c.to_hash}
|
42
|
+
end
|
43
|
+
|
44
|
+
action 'get' do |params|
|
45
|
+
organization = params['organization']
|
46
|
+
chef_server = params['chef_server']
|
47
|
+
client_name = params['client_name']
|
48
|
+
key = params['client_key']
|
49
|
+
id = params['id']
|
50
|
+
|
51
|
+
fail 'Client Name (client_name) is required' unless client_name
|
52
|
+
fail 'Private Key (client_key) is required' unless key
|
53
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
54
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
55
|
+
fail 'Data Bag ID (id) is required' unless id
|
56
|
+
|
57
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
58
|
+
|
59
|
+
info 'Setting up private key'
|
60
|
+
begin
|
61
|
+
private_key_file = Tempfile.new('private')
|
62
|
+
private_key_file.write(key)
|
63
|
+
private_key_file.close
|
64
|
+
rescue
|
65
|
+
fail 'Failed to setup private key'
|
66
|
+
end
|
67
|
+
|
68
|
+
connection_settings = {
|
69
|
+
endpoint: chef_server,
|
70
|
+
client: client_name,
|
71
|
+
key: private_key_file.path,
|
72
|
+
}
|
73
|
+
|
74
|
+
begin
|
75
|
+
chef = ChefAPI::Connection.new connection_settings
|
76
|
+
data_bag = chef.data_bags.fetch(id)
|
77
|
+
content = data_bag.to_hash
|
78
|
+
rescue => ex
|
79
|
+
fail ex.message
|
80
|
+
end
|
81
|
+
|
82
|
+
fail "Data Bag with id '#{id}' not found" unless content
|
83
|
+
|
84
|
+
action_callback content
|
85
|
+
end
|
86
|
+
|
87
|
+
action 'create' do |params|
|
88
|
+
organization = params['organization']
|
89
|
+
chef_server = params['chef_server']
|
90
|
+
client_name = params['client_name']
|
91
|
+
key = params['client_key']
|
92
|
+
name = params['name']
|
93
|
+
|
94
|
+
fail 'Client Name (client_name) is required' unless client_name
|
95
|
+
fail 'Private Key (client_key) is required' unless key
|
96
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
97
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
98
|
+
fail 'New Data Bag Name (name) is required' unless params['name']
|
99
|
+
|
100
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
101
|
+
|
102
|
+
info 'Setting up private key'
|
103
|
+
begin
|
104
|
+
private_key_file = Tempfile.new('private')
|
105
|
+
private_key_file.write(key)
|
106
|
+
private_key_file.close
|
107
|
+
rescue
|
108
|
+
fail 'Failed to setup private key'
|
109
|
+
end
|
110
|
+
|
111
|
+
connection_settings = {
|
112
|
+
endpoint: chef_server,
|
113
|
+
client: client_name,
|
114
|
+
key: private_key_file.path,
|
115
|
+
}
|
116
|
+
|
117
|
+
begin
|
118
|
+
chef = ChefAPI::Connection.new connection_settings
|
119
|
+
data_bag = chef.data_bags.create(name: name)
|
120
|
+
content = chef.data_bags.fetch(name)
|
121
|
+
rescue => ex
|
122
|
+
fail ex.message
|
123
|
+
end
|
124
|
+
|
125
|
+
action_callback content.to_hash
|
126
|
+
end
|
127
|
+
|
128
|
+
action 'update' do |params|
|
129
|
+
organization = params['organization']
|
130
|
+
chef_server = params['chef_server']
|
131
|
+
client_name = params['client_name']
|
132
|
+
key = params['client_key']
|
133
|
+
id = params['id']
|
134
|
+
name = params['name']
|
135
|
+
|
136
|
+
fail 'Client Name (client_name) is required' unless client_name
|
137
|
+
fail 'Private Key (client_key) is required' unless key
|
138
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
139
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
140
|
+
fail 'Data Bag ID (id) is required' unless id
|
141
|
+
fail 'New Name (name) is required' unless name
|
142
|
+
|
143
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
144
|
+
|
145
|
+
info 'Setting up private key'
|
146
|
+
begin
|
147
|
+
private_key_file = Tempfile.new('private')
|
148
|
+
private_key_file.write(key)
|
149
|
+
private_key_file.close
|
150
|
+
rescue
|
151
|
+
fail 'Failed to setup private key'
|
152
|
+
end
|
153
|
+
|
154
|
+
connection_settings = {
|
155
|
+
endpoint: chef_server,
|
156
|
+
client: client_name,
|
157
|
+
key: private_key_file.path,
|
158
|
+
}
|
159
|
+
|
160
|
+
begin
|
161
|
+
chef = ChefAPI::Connection.new connection_settings
|
162
|
+
data_bag = chef.data_bags.update(id, name:name)
|
163
|
+
content = data_bag.to_hash
|
164
|
+
rescue => ex
|
165
|
+
fail ex.message
|
166
|
+
end
|
167
|
+
|
168
|
+
action_callback content
|
169
|
+
end
|
170
|
+
|
171
|
+
|
172
|
+
action 'delete' do |params|
|
173
|
+
organization = params['organization']
|
174
|
+
chef_server = params['chef_server']
|
175
|
+
client_name = params['client_name']
|
176
|
+
key = params['client_key']
|
177
|
+
id = params['id']
|
178
|
+
|
179
|
+
fail 'Client Name (client_name) is required' unless client_name
|
180
|
+
fail 'Private Key (client_key) is required' unless key
|
181
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
182
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
183
|
+
fail 'Data Bag ID (id) is required' unless id
|
184
|
+
|
185
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
186
|
+
|
187
|
+
info 'Setting up private key'
|
188
|
+
begin
|
189
|
+
private_key_file = Tempfile.new('private')
|
190
|
+
private_key_file.write(key)
|
191
|
+
private_key_file.close
|
192
|
+
rescue
|
193
|
+
fail 'Failed to setup private key'
|
194
|
+
end
|
195
|
+
|
196
|
+
connection_settings = {
|
197
|
+
endpoint: chef_server,
|
198
|
+
client: client_name,
|
199
|
+
key: private_key_file.path,
|
200
|
+
}
|
201
|
+
|
202
|
+
begin
|
203
|
+
chef = ChefAPI::Connection.new connection_settings
|
204
|
+
content = chef.data_bags.fetch(id)
|
205
|
+
content.destroy
|
206
|
+
rescue => ex
|
207
|
+
fail ex.message
|
208
|
+
end
|
209
|
+
|
210
|
+
action_callback
|
211
|
+
end
|
212
|
+
|
213
|
+
action 'items' do |params|
|
214
|
+
organization = params['organization']
|
215
|
+
chef_server = params['chef_server']
|
216
|
+
client_name = params['client_name']
|
217
|
+
key = params['client_key']
|
218
|
+
id = params['id']
|
219
|
+
|
220
|
+
fail 'Client Name (client_name) is required' unless client_name
|
221
|
+
fail 'Private Key (client_key) is required' unless key
|
222
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
223
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
224
|
+
fail 'Data Bag ID (id) is required' unless id
|
225
|
+
|
226
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
227
|
+
|
228
|
+
info 'Setting up private key'
|
229
|
+
begin
|
230
|
+
private_key_file = Tempfile.new('private')
|
231
|
+
private_key_file.write(key)
|
232
|
+
private_key_file.close
|
233
|
+
rescue
|
234
|
+
fail 'Failed to setup private key'
|
235
|
+
end
|
236
|
+
|
237
|
+
connection_settings = {
|
238
|
+
endpoint: chef_server,
|
239
|
+
client: client_name,
|
240
|
+
key: private_key_file.path,
|
241
|
+
}
|
242
|
+
|
243
|
+
begin
|
244
|
+
chef = ChefAPI::Connection.new connection_settings
|
245
|
+
data_bag = chef.data_bags.fetch(id)
|
246
|
+
data_bag_items =
|
247
|
+
contents = {}
|
248
|
+
data_bag.items.all.each do |item|
|
249
|
+
contents[item.id.to_s] = item.data
|
250
|
+
end
|
251
|
+
rescue => ex
|
252
|
+
fail ex.message
|
253
|
+
end
|
254
|
+
|
255
|
+
action_callback contents
|
256
|
+
end
|
257
|
+
|
258
|
+
action 'get_item' do |params|
|
259
|
+
organization = params['organization']
|
260
|
+
chef_server = params['chef_server']
|
261
|
+
client_name = params['client_name']
|
262
|
+
key = params['client_key']
|
263
|
+
databag_id = params['databag']
|
264
|
+
id = params['id']
|
265
|
+
|
266
|
+
fail 'Client Name (client_name) is required' unless client_name
|
267
|
+
fail 'Private Key (client_key) is required' unless key
|
268
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
269
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
270
|
+
fail 'Data Bag ID (databag) is required' unless databag_id
|
271
|
+
fail 'Item ID (id) is required' unless id
|
272
|
+
|
273
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
274
|
+
|
275
|
+
info 'Setting up private key'
|
276
|
+
begin
|
277
|
+
private_key_file = Tempfile.new('private')
|
278
|
+
private_key_file.write(key)
|
279
|
+
private_key_file.close
|
280
|
+
rescue
|
281
|
+
fail 'Failed to setup private key'
|
282
|
+
end
|
283
|
+
|
284
|
+
connection_settings = {
|
285
|
+
endpoint: chef_server,
|
286
|
+
client: client_name,
|
287
|
+
key: private_key_file.path,
|
288
|
+
}
|
289
|
+
|
290
|
+
begin
|
291
|
+
chef = ChefAPI::Connection.new connection_settings
|
292
|
+
data_bag = chef.data_bags.fetch(databag_id)
|
293
|
+
item = data_bag.items.fetch(id)
|
294
|
+
content = item.data
|
295
|
+
rescue => ex
|
296
|
+
fail ex.message
|
297
|
+
end
|
298
|
+
|
299
|
+
action_callback content
|
300
|
+
end
|
301
|
+
|
302
|
+
action 'update_item' do |params|
|
303
|
+
organization = params['organization']
|
304
|
+
chef_server = params['chef_server']
|
305
|
+
client_name = params['client_name']
|
306
|
+
key = params['client_key']
|
307
|
+
databag_id = params['databag']
|
308
|
+
id = params['id']
|
309
|
+
data = params['data']
|
310
|
+
|
311
|
+
fail 'Client Name (client_name) is required' unless client_name
|
312
|
+
fail 'Private Key (client_key) is required' unless key
|
313
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
314
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
315
|
+
fail 'Data Bag ID (databag) is required' unless databag_id
|
316
|
+
fail 'Item ID (id) is required' unless id
|
317
|
+
fail 'Data (data) is required' unless data
|
318
|
+
fail 'Data (data) must be a Hash' unless data.is_a?(Hash)
|
319
|
+
|
320
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
321
|
+
|
322
|
+
info 'Setting up private key'
|
323
|
+
begin
|
324
|
+
private_key_file = Tempfile.new('private')
|
325
|
+
private_key_file.write(key)
|
326
|
+
private_key_file.close
|
327
|
+
rescue
|
328
|
+
fail 'Failed to setup private key'
|
329
|
+
end
|
330
|
+
|
331
|
+
connection_settings = {
|
332
|
+
endpoint: chef_server,
|
333
|
+
client: client_name,
|
334
|
+
key: private_key_file.path,
|
335
|
+
}
|
336
|
+
|
337
|
+
begin
|
338
|
+
chef = ChefAPI::Connection.new connection_settings
|
339
|
+
data_bag = chef.data_bags.fetch(databag_id)
|
340
|
+
item = data_bag.items.fetch(id)
|
341
|
+
item.data.deep_merge! data
|
342
|
+
item.save
|
343
|
+
content = data_bag.items.fetch(id).data.to_hash
|
344
|
+
rescue => ex
|
345
|
+
fail ex.message
|
346
|
+
end
|
347
|
+
|
348
|
+
action_callback content
|
349
|
+
end
|
350
|
+
|
351
|
+
action 'delete_item' do |params|
|
352
|
+
organization = params['organization']
|
353
|
+
chef_server = params['chef_server']
|
354
|
+
client_name = params['client_name']
|
355
|
+
key = params['client_key']
|
356
|
+
databag_id = params['databag']
|
357
|
+
id = params['id']
|
358
|
+
|
359
|
+
fail 'Client Name (client_name) is required' unless client_name
|
360
|
+
fail 'Private Key (client_key) is required' unless key
|
361
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
362
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
363
|
+
fail 'Data Bag ID (databag) is required' unless databag_id
|
364
|
+
fail 'Item ID (id) is required' unless id
|
365
|
+
|
366
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
367
|
+
|
368
|
+
info 'Setting up private key'
|
369
|
+
begin
|
370
|
+
private_key_file = Tempfile.new('private')
|
371
|
+
private_key_file.write(key)
|
372
|
+
private_key_file.close
|
373
|
+
rescue
|
374
|
+
fail 'Failed to setup private key'
|
375
|
+
end
|
376
|
+
|
377
|
+
connection_settings = {
|
378
|
+
endpoint: chef_server,
|
379
|
+
client: client_name,
|
380
|
+
key: private_key_file.path,
|
381
|
+
}
|
382
|
+
|
383
|
+
begin
|
384
|
+
chef = ChefAPI::Connection.new connection_settings
|
385
|
+
data_bag = chef.data_bags.fetch(databag_id)
|
386
|
+
item = data_bag.items.fetch(id)
|
387
|
+
item.destroy
|
388
|
+
rescue => ex
|
389
|
+
fail ex.message
|
390
|
+
end
|
391
|
+
|
392
|
+
action_callback
|
393
|
+
end
|
394
|
+
|
395
|
+
action 'create_item' do |params|
|
396
|
+
organization = params['organization']
|
397
|
+
chef_server = params['chef_server']
|
398
|
+
client_name = params['client_name']
|
399
|
+
key = params['client_key']
|
400
|
+
databag_id = params['databag']
|
401
|
+
id = params['id']
|
402
|
+
data = params['data']
|
403
|
+
|
404
|
+
fail 'Client Name (client_name) is required' unless client_name
|
405
|
+
fail 'Private Key (client_key) is required' unless key
|
406
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
407
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
408
|
+
fail 'Data Bag ID (databag) is required' unless databag_id
|
409
|
+
fail 'Item ID (id) is required' unless id
|
410
|
+
fail 'Data (data) is required' unless data
|
411
|
+
fail 'Data (data) must be a Hash' unless data.is_a?(Hash)
|
412
|
+
|
413
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
414
|
+
|
415
|
+
info 'Setting up private key'
|
416
|
+
begin
|
417
|
+
private_key_file = Tempfile.new('private')
|
418
|
+
private_key_file.write(key)
|
419
|
+
private_key_file.close
|
420
|
+
rescue
|
421
|
+
fail 'Failed to setup private key'
|
422
|
+
end
|
423
|
+
|
424
|
+
connection_settings = {
|
425
|
+
endpoint: chef_server,
|
426
|
+
client: client_name,
|
427
|
+
key: private_key_file.path,
|
428
|
+
}
|
429
|
+
|
430
|
+
begin
|
431
|
+
chef = ChefAPI::Connection.new connection_settings
|
432
|
+
data_bag = chef.data_bags.fetch(databag_id)
|
433
|
+
item = data_bag.items.create({id:id}.merge(data))
|
434
|
+
content = item.to_hash
|
435
|
+
rescue => ex
|
436
|
+
fail ex.message
|
437
|
+
end
|
438
|
+
|
439
|
+
action_callback content
|
440
|
+
end
|
441
|
+
end
|
@@ -0,0 +1,232 @@
|
|
1
|
+
require 'factor-connector-api'
|
2
|
+
require 'chef-api'
|
3
|
+
require 'deep_merge'
|
4
|
+
|
5
|
+
Factor::Connector.service 'chef_environments' do
|
6
|
+
action 'all' do |params|
|
7
|
+
organization = params['organization']
|
8
|
+
chef_server = params['chef_server']
|
9
|
+
client_name = params['client_name']
|
10
|
+
client_key = params['client_key']
|
11
|
+
|
12
|
+
fail 'Client Name (client_name) is required' unless client_name
|
13
|
+
fail 'Client Private Key (client_key) is required' unless client_key
|
14
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
15
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
16
|
+
|
17
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
18
|
+
|
19
|
+
info 'Setting up private key'
|
20
|
+
begin
|
21
|
+
private_key_file = Tempfile.new('private')
|
22
|
+
private_key_file.write(client_key)
|
23
|
+
private_key_file.close
|
24
|
+
rescue
|
25
|
+
fail 'Failed to setup private key'
|
26
|
+
end
|
27
|
+
|
28
|
+
connection_settings = {
|
29
|
+
endpoint: chef_server,
|
30
|
+
client: client_name,
|
31
|
+
key: private_key_file.path,
|
32
|
+
}
|
33
|
+
|
34
|
+
begin
|
35
|
+
chef = ChefAPI::Connection.new connection_settings
|
36
|
+
contents = chef.environments.all
|
37
|
+
rescue => ex
|
38
|
+
fail ex.message
|
39
|
+
end
|
40
|
+
|
41
|
+
action_callback contents.map {|c| c.to_hash}
|
42
|
+
end
|
43
|
+
|
44
|
+
action 'get' do |params|
|
45
|
+
organization = params['organization']
|
46
|
+
chef_server = params['chef_server']
|
47
|
+
client_name = params['client_name']
|
48
|
+
key = params['client_key']
|
49
|
+
id = params['id']
|
50
|
+
|
51
|
+
fail 'Client Name (client_name) is required' unless client_name
|
52
|
+
fail 'Private Key (client_key) is required' unless key
|
53
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
54
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
55
|
+
fail 'Environment ID (id) is required' unless id
|
56
|
+
|
57
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
58
|
+
|
59
|
+
info 'Setting up private key'
|
60
|
+
begin
|
61
|
+
private_key_file = Tempfile.new('private')
|
62
|
+
private_key_file.write(key)
|
63
|
+
private_key_file.close
|
64
|
+
rescue
|
65
|
+
fail 'Failed to setup private key'
|
66
|
+
end
|
67
|
+
|
68
|
+
connection_settings = {
|
69
|
+
endpoint: chef_server,
|
70
|
+
client: client_name,
|
71
|
+
key: private_key_file.path,
|
72
|
+
}
|
73
|
+
|
74
|
+
begin
|
75
|
+
chef = ChefAPI::Connection.new connection_settings
|
76
|
+
content = chef.environments.fetch(id)
|
77
|
+
rescue => ex
|
78
|
+
fail ex.message
|
79
|
+
end
|
80
|
+
|
81
|
+
fail "Environment with id '#{id}' not found" unless content
|
82
|
+
|
83
|
+
action_callback content.to_hash
|
84
|
+
end
|
85
|
+
|
86
|
+
action 'create' do |params|
|
87
|
+
organization = params['organization']
|
88
|
+
chef_server = params['chef_server']
|
89
|
+
client_name = params['client_name']
|
90
|
+
key = params['client_key']
|
91
|
+
|
92
|
+
fail 'Client Name (client_name) is required' unless client_name
|
93
|
+
fail 'Private Key (client_key) is required' unless key
|
94
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
95
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
96
|
+
fail 'New Organization Name (name) is required' unless params['name']
|
97
|
+
|
98
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
99
|
+
|
100
|
+
info 'Setting up private key'
|
101
|
+
begin
|
102
|
+
private_key_file = Tempfile.new('private')
|
103
|
+
private_key_file.write(key)
|
104
|
+
private_key_file.close
|
105
|
+
rescue
|
106
|
+
fail 'Failed to setup private key'
|
107
|
+
end
|
108
|
+
|
109
|
+
connection_settings = {
|
110
|
+
endpoint: chef_server,
|
111
|
+
client: client_name,
|
112
|
+
key: private_key_file.path,
|
113
|
+
}
|
114
|
+
|
115
|
+
available_params = %w(name description default_attributes override_attributes cookbook_versions)
|
116
|
+
env_params = {}
|
117
|
+
available_params.each do |param|
|
118
|
+
env_params[param.to_sym] = params[param] if params.include?(param)
|
119
|
+
end
|
120
|
+
|
121
|
+
begin
|
122
|
+
info "Creating new environment '#{env_params['name']}'"
|
123
|
+
chef = ChefAPI::Connection.new connection_settings
|
124
|
+
content = chef.environments.create(env_params)
|
125
|
+
rescue => ex
|
126
|
+
fail ex.message
|
127
|
+
end
|
128
|
+
|
129
|
+
action_callback content.to_hash
|
130
|
+
end
|
131
|
+
|
132
|
+
action 'update' do |params|
|
133
|
+
organization = params['organization']
|
134
|
+
chef_server = params['chef_server']
|
135
|
+
client_name = params['client_name']
|
136
|
+
key = params['client_key']
|
137
|
+
id = params['id']
|
138
|
+
|
139
|
+
fail 'Client Name (client_name) is required' unless client_name
|
140
|
+
fail 'Private Key (client_key) is required' unless key
|
141
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
142
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
143
|
+
fail 'Environment ID (id) is required' unless id
|
144
|
+
|
145
|
+
fail 'Override Attributes (override_attributes) must be a Hash' if params['override_attributes'] && !params['override_attributes'].is_a?(Hash)
|
146
|
+
fail 'Default Attributes (default_attributes) must be a Hash' if params['default_attributes'] && !params['default_attributes'].is_a?(Hash)
|
147
|
+
fail 'Cookbok Versions (cookbook_versions) must be a Hash' if params['cookbook_versions'] && !params['cookbook_versions'].is_a?(Hash)
|
148
|
+
|
149
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
150
|
+
|
151
|
+
info 'Setting up private key'
|
152
|
+
begin
|
153
|
+
private_key_file = Tempfile.new('private')
|
154
|
+
private_key_file.write(key)
|
155
|
+
private_key_file.close
|
156
|
+
rescue
|
157
|
+
fail 'Failed to setup private key'
|
158
|
+
end
|
159
|
+
|
160
|
+
connection_settings = {
|
161
|
+
endpoint: chef_server,
|
162
|
+
client: client_name,
|
163
|
+
key: private_key_file.path,
|
164
|
+
}
|
165
|
+
|
166
|
+
available_params = %w(name description)
|
167
|
+
env_params = {}
|
168
|
+
available_params.each do |param|
|
169
|
+
env_params[param.to_sym] = params[param] if params.include?(param)
|
170
|
+
end
|
171
|
+
|
172
|
+
begin
|
173
|
+
info "Creating new environment '#{env_params['name']}'"
|
174
|
+
chef = ChefAPI::Connection.new connection_settings
|
175
|
+
environment = chef.environments.update(id, env_params) if env_params != {}
|
176
|
+
|
177
|
+
if params['default_attributes'] || params['override_attributes'] || params['cookbook_versions']
|
178
|
+
environment = chef.environments.fetch(id)
|
179
|
+
environment.default_attributes.deep_merge!(params['default_attributes']) if params['default_attributes']
|
180
|
+
environment.override_attributes.deep_merge!(params['override_attributes']) if params['override_attributes']
|
181
|
+
environment.cookbook_versions.deep_merge!(params['cookbook_versions']) if params['cookbook_versions']
|
182
|
+
environment.save
|
183
|
+
end
|
184
|
+
content = chef.environments.fetch(id)
|
185
|
+
rescue => ex
|
186
|
+
fail ex.message
|
187
|
+
end
|
188
|
+
|
189
|
+
action_callback content.to_hash
|
190
|
+
end
|
191
|
+
|
192
|
+
action 'delete' do |params|
|
193
|
+
organization = params['organization']
|
194
|
+
chef_server = params['chef_server']
|
195
|
+
client_name = params['client_name']
|
196
|
+
key = params['client_key']
|
197
|
+
id = params['id']
|
198
|
+
|
199
|
+
fail 'Client Name (client_name) is required' unless client_name
|
200
|
+
fail 'Private Key (client_key) is required' unless key
|
201
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
202
|
+
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
203
|
+
fail 'Environment ID (id) is required' unless id
|
204
|
+
|
205
|
+
chef_server ||= "https://api.opscode.com/organizations/#{organization}"
|
206
|
+
|
207
|
+
info 'Setting up private key'
|
208
|
+
begin
|
209
|
+
private_key_file = Tempfile.new('private')
|
210
|
+
private_key_file.write(key)
|
211
|
+
private_key_file.close
|
212
|
+
rescue
|
213
|
+
fail 'Failed to setup private key'
|
214
|
+
end
|
215
|
+
|
216
|
+
connection_settings = {
|
217
|
+
endpoint: chef_server,
|
218
|
+
client: client_name,
|
219
|
+
key: private_key_file.path,
|
220
|
+
}
|
221
|
+
|
222
|
+
begin
|
223
|
+
chef = ChefAPI::Connection.new connection_settings
|
224
|
+
content = chef.environments.fetch(id)
|
225
|
+
content.destroy
|
226
|
+
rescue => ex
|
227
|
+
fail ex.message
|
228
|
+
end
|
229
|
+
|
230
|
+
action_callback
|
231
|
+
end
|
232
|
+
end
|
@@ -48,10 +48,10 @@ class Net::SSH::Connection::Session
|
|
48
48
|
end
|
49
49
|
end
|
50
50
|
|
51
|
-
Factor::Connector.service '
|
51
|
+
Factor::Connector.service 'chef_knife' do
|
52
52
|
action 'bootstrap' do |params|
|
53
53
|
host_param = params['host']
|
54
|
-
|
54
|
+
client_key = params['client_key']
|
55
55
|
validation_key = params['validation_key']
|
56
56
|
runlist = params['runlist']
|
57
57
|
organization = params['organization']
|
@@ -61,7 +61,7 @@ Factor::Connector.service 'chef' do
|
|
61
61
|
output = {}
|
62
62
|
|
63
63
|
fail 'Host is required' unless host_param
|
64
|
-
fail 'Private Key (
|
64
|
+
fail 'Private Key (client_key) is required' unless client_key
|
65
65
|
fail 'Validation Key (validation_key) is required' unless validation_key
|
66
66
|
fail 'Organization (organization) or Chef Server URL (chef_server) is required' unless organization || chef_server
|
67
67
|
fail 'Organization (organization) or Chef Server URL (chef_server) is required, but not both' if organization && chef_server
|
@@ -83,7 +83,7 @@ Factor::Connector.service 'chef' do
|
|
83
83
|
info 'Setting up private key'
|
84
84
|
begin
|
85
85
|
private_key_file = Tempfile.new('private')
|
86
|
-
private_key_file.write(
|
86
|
+
private_key_file.write(client_key)
|
87
87
|
private_key_file.close
|
88
88
|
rescue
|
89
89
|
fail 'Failed to setup private key'
|
metadata
CHANGED
@@ -1,99 +1,127 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: factor-connector-chef
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.6
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Maciej Skierkowski
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date:
|
11
|
+
date: 2015-01-23 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: net-ssh
|
15
15
|
requirement: !ruby/object:Gem::Requirement
|
16
16
|
requirements:
|
17
|
-
- -
|
17
|
+
- - ~>
|
18
18
|
- !ruby/object:Gem::Version
|
19
19
|
version: 2.9.1
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
|
-
- -
|
24
|
+
- - ~>
|
25
25
|
- !ruby/object:Gem::Version
|
26
26
|
version: 2.9.1
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: net-scp
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
30
30
|
requirements:
|
31
|
-
- -
|
31
|
+
- - ~>
|
32
32
|
- !ruby/object:Gem::Version
|
33
33
|
version: 1.2.1
|
34
34
|
type: :runtime
|
35
35
|
prerelease: false
|
36
36
|
version_requirements: !ruby/object:Gem::Requirement
|
37
37
|
requirements:
|
38
|
-
- -
|
38
|
+
- - ~>
|
39
39
|
- !ruby/object:Gem::Version
|
40
40
|
version: 1.2.1
|
41
41
|
- !ruby/object:Gem::Dependency
|
42
42
|
name: factor-connector-api
|
43
43
|
requirement: !ruby/object:Gem::Requirement
|
44
44
|
requirements:
|
45
|
-
- -
|
45
|
+
- - ~>
|
46
46
|
- !ruby/object:Gem::Version
|
47
47
|
version: 0.0.13
|
48
48
|
type: :runtime
|
49
49
|
prerelease: false
|
50
50
|
version_requirements: !ruby/object:Gem::Requirement
|
51
51
|
requirements:
|
52
|
-
- -
|
52
|
+
- - ~>
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: 0.0.13
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: chef-api
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - ~>
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: 0.5.0
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - ~>
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: 0.5.0
|
69
|
+
- !ruby/object:Gem::Dependency
|
70
|
+
name: deep_merge
|
71
|
+
requirement: !ruby/object:Gem::Requirement
|
72
|
+
requirements:
|
73
|
+
- - ~>
|
74
|
+
- !ruby/object:Gem::Version
|
75
|
+
version: 1.0.1
|
76
|
+
type: :runtime
|
77
|
+
prerelease: false
|
78
|
+
version_requirements: !ruby/object:Gem::Requirement
|
79
|
+
requirements:
|
80
|
+
- - ~>
|
81
|
+
- !ruby/object:Gem::Version
|
82
|
+
version: 1.0.1
|
55
83
|
- !ruby/object:Gem::Dependency
|
56
84
|
name: codeclimate-test-reporter
|
57
85
|
requirement: !ruby/object:Gem::Requirement
|
58
86
|
requirements:
|
59
|
-
- -
|
87
|
+
- - ~>
|
60
88
|
- !ruby/object:Gem::Version
|
61
|
-
version: 0.
|
89
|
+
version: 0.4.5
|
62
90
|
type: :development
|
63
91
|
prerelease: false
|
64
92
|
version_requirements: !ruby/object:Gem::Requirement
|
65
93
|
requirements:
|
66
|
-
- -
|
94
|
+
- - ~>
|
67
95
|
- !ruby/object:Gem::Version
|
68
|
-
version: 0.
|
96
|
+
version: 0.4.5
|
69
97
|
- !ruby/object:Gem::Dependency
|
70
98
|
name: rspec
|
71
99
|
requirement: !ruby/object:Gem::Requirement
|
72
100
|
requirements:
|
73
|
-
- -
|
101
|
+
- - ~>
|
74
102
|
- !ruby/object:Gem::Version
|
75
103
|
version: 3.1.0
|
76
104
|
type: :development
|
77
105
|
prerelease: false
|
78
106
|
version_requirements: !ruby/object:Gem::Requirement
|
79
107
|
requirements:
|
80
|
-
- -
|
108
|
+
- - ~>
|
81
109
|
- !ruby/object:Gem::Version
|
82
110
|
version: 3.1.0
|
83
111
|
- !ruby/object:Gem::Dependency
|
84
112
|
name: rake
|
85
113
|
requirement: !ruby/object:Gem::Requirement
|
86
114
|
requirements:
|
87
|
-
- -
|
115
|
+
- - ~>
|
88
116
|
- !ruby/object:Gem::Version
|
89
|
-
version: 10.
|
117
|
+
version: 10.4.2
|
90
118
|
type: :development
|
91
119
|
prerelease: false
|
92
120
|
version_requirements: !ruby/object:Gem::Requirement
|
93
121
|
requirements:
|
94
|
-
- -
|
122
|
+
- - ~>
|
95
123
|
- !ruby/object:Gem::Version
|
96
|
-
version: 10.
|
124
|
+
version: 10.4.2
|
97
125
|
description:
|
98
126
|
email:
|
99
127
|
- maciej@factor.io
|
@@ -101,7 +129,10 @@ executables: []
|
|
101
129
|
extensions: []
|
102
130
|
extra_rdoc_files: []
|
103
131
|
files:
|
104
|
-
-
|
132
|
+
- ./lib/factor/connector/chef_clients.rb
|
133
|
+
- ./lib/factor/connector/chef_databags.rb
|
134
|
+
- ./lib/factor/connector/chef_environments.rb
|
135
|
+
- ./lib/factor/connector/chef_knife.rb
|
105
136
|
homepage: https://factor.io
|
106
137
|
licenses: []
|
107
138
|
metadata: {}
|
@@ -111,17 +142,17 @@ require_paths:
|
|
111
142
|
- lib
|
112
143
|
required_ruby_version: !ruby/object:Gem::Requirement
|
113
144
|
requirements:
|
114
|
-
- -
|
145
|
+
- - ! '>='
|
115
146
|
- !ruby/object:Gem::Version
|
116
147
|
version: '0'
|
117
148
|
required_rubygems_version: !ruby/object:Gem::Requirement
|
118
149
|
requirements:
|
119
|
-
- -
|
150
|
+
- - ! '>='
|
120
151
|
- !ruby/object:Gem::Version
|
121
152
|
version: '0'
|
122
153
|
requirements: []
|
123
154
|
rubyforge_project:
|
124
|
-
rubygems_version: 2.
|
155
|
+
rubygems_version: 2.4.5
|
125
156
|
signing_key:
|
126
157
|
specification_version: 4
|
127
158
|
summary: Factor.io Connector for Chef
|