knife-ec-backup 2.0.6 → 2.0.7
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/lib/chef/knife/ec_backup.rb +15 -8
- data/lib/chef/knife/ec_restore.rb +18 -8
- data/lib/knife_ec_backup/version.rb +1 -1
- data/spec/chef/knife/ec_restore_spec.rb +11 -0
- metadata +3 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: b97714005f59fe60b36667b628c58f9de216f1e2
|
4
|
+
data.tar.gz: 8ba4fc5291580630844c140dea952c78d4a69db2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 49ea3afa7fa7ed54a318c828b235703fda5b38d28a171124ee4837efc43867ffecb4ff46b157c82aee9c7d93da65d39041f6aeb2f50f5792903e22d536e82f2c
|
7
|
+
data.tar.gz: 3443451e72baa28454cf805cfc8c20a241cc21bcf14ff286beb3d80e5caab8bc33d6c658f3191562d2ee0a59c5b8f482835be1b3028d15b272d7e2d433048af7
|
data/lib/chef/knife/ec_backup.rb
CHANGED
@@ -144,21 +144,23 @@ class Chef
|
|
144
144
|
|
145
145
|
ensure_dir(Chef::Config.chef_repo_path)
|
146
146
|
|
147
|
-
# Download the billing-admins ACL and group as pivotal
|
147
|
+
# Download the billing-admins, public_key_read_access ACL and group as pivotal
|
148
148
|
chef_fs_config = Chef::ChefFS::Config.new
|
149
149
|
chef_fs_copy_pattern('/acls/groups/billing-admins.json', chef_fs_config)
|
150
150
|
chef_fs_copy_pattern('/groups/billing-admins.json', chef_fs_config)
|
151
|
+
chef_fs_copy_pattern('/acls/groups/public_key_read_access.json', chef_fs_config)
|
152
|
+
chef_fs_copy_pattern('/groups/public_key_read_access.json', chef_fs_config)
|
151
153
|
chef_fs_copy_pattern('/groups/admins.json', chef_fs_config)
|
152
154
|
|
153
155
|
# Set Chef::Config to use an organization administrator
|
154
156
|
Chef::Config.node_name = org_admin
|
155
157
|
|
156
|
-
# Download the entire org skipping the billing
|
158
|
+
# Download the entire org skipping the billing-admins, public_key_read_access group ACLs and the groups themselves
|
157
159
|
chef_fs_config = Chef::ChefFS::Config.new
|
158
160
|
top_level_paths = chef_fs_config.chef_fs.children.select { |entry| entry.name != 'acls' && entry.name != 'groups' }.map { |entry| entry.path }
|
159
|
-
acl_paths = chef_fs_paths('/acls/*', chef_fs_config, 'groups')
|
160
|
-
group_acl_paths = chef_fs_paths('/acls/groups/*', chef_fs_config, 'billing-admins
|
161
|
-
group_paths = chef_fs_paths('/groups/*', chef_fs_config, 'billing-admins
|
161
|
+
acl_paths = chef_fs_paths('/acls/*', chef_fs_config, ['groups'])
|
162
|
+
group_acl_paths = chef_fs_paths('/acls/groups/*', chef_fs_config, ['billing-admins','public_key_read_access'])
|
163
|
+
group_paths = chef_fs_paths('/groups/*', chef_fs_config, ['billing-admins','public_key_read_access'])
|
162
164
|
(top_level_paths + group_acl_paths + acl_paths + group_paths).each do |path|
|
163
165
|
chef_fs_copy_pattern(path, chef_fs_config)
|
164
166
|
end
|
@@ -167,14 +169,19 @@ class Chef
|
|
167
169
|
end
|
168
170
|
end
|
169
171
|
|
170
|
-
def
|
172
|
+
def normalize_path_name(path)
|
173
|
+
path=~/\.json\z/ ? path : path<<'.json'
|
174
|
+
end
|
175
|
+
|
176
|
+
def chef_fs_paths(pattern_str, chef_fs_config, exclude=[])
|
171
177
|
pattern = Chef::ChefFS::FilePattern.new(pattern_str)
|
172
178
|
list = Chef::ChefFS::FileSystem.list(chef_fs_config.chef_fs, pattern)
|
173
|
-
list = list.select { |entry| entry.name
|
174
|
-
list.map {|entry| entry.path }
|
179
|
+
list = list.select { |entry| ! exclude.include?(entry.name) } if ! exclude.empty?
|
180
|
+
list.map { |entry| normalize_path_name(entry.path) }
|
175
181
|
end
|
176
182
|
|
177
183
|
def chef_fs_copy_pattern(pattern_str, chef_fs_config)
|
184
|
+
ui.msg "Copying #{pattern_str}"
|
178
185
|
pattern = Chef::ChefFS::FilePattern.new(pattern_str)
|
179
186
|
Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.chef_fs,
|
180
187
|
chef_fs_config.local_fs, nil,
|
@@ -193,11 +193,11 @@ class Chef
|
|
193
193
|
Chef::Config.versioned_cookbooks = true
|
194
194
|
Chef::Config.chef_server_url = "#{server.root_url}/organizations/#{name}"
|
195
195
|
|
196
|
-
# Upload the admins
|
196
|
+
# Upload the admins, public_key_read_access and billing-admins groups and acls
|
197
197
|
ui.msg "Restoring org admin data"
|
198
198
|
chef_fs_config = Chef::ChefFS::Config.new
|
199
199
|
|
200
|
-
# Handle Admins
|
200
|
+
# Handle Admins, Billing Admins and Public Key Read Access seperately
|
201
201
|
#
|
202
202
|
# admins: We need to upload admins first so that we
|
203
203
|
# can upload all of the other objects as a user in the org
|
@@ -213,14 +213,21 @@ class Chef
|
|
213
213
|
# and then update it again once all of the clients and
|
214
214
|
# groups are uploaded.
|
215
215
|
#
|
216
|
-
|
216
|
+
# public_key_read_access: Similarly for public_key_read_access,
|
217
|
+
# the default permissions only give read/update to
|
218
|
+
# pivotal and members of the admins group. Use the same strategy
|
219
|
+
# above here.
|
220
|
+
#
|
221
|
+
['admins', 'billing-admins', 'public_key_read_access'].each do |group|
|
217
222
|
restore_group(chef_fs_config, group, :clients => false)
|
218
223
|
end
|
219
224
|
|
220
|
-
|
221
|
-
|
225
|
+
['/acls/groups/billing-admins.json', '/acls/groups/public_key_read_access.json'].each do |acl|
|
226
|
+
pattern = Chef::ChefFS::FilePattern.new(acl)
|
227
|
+
Chef::ChefFS::FileSystem.copy_to(pattern, chef_fs_config.local_fs,
|
222
228
|
chef_fs_config.chef_fs, nil, config, ui,
|
223
229
|
proc { |entry| chef_fs_config.format_path(entry)})
|
230
|
+
end
|
224
231
|
|
225
232
|
Chef::Config.node_name = org_admin
|
226
233
|
|
@@ -231,10 +238,10 @@ class Chef
|
|
231
238
|
top_level_paths = chef_fs_config.local_fs.children.select { |entry| entry.name != 'acls' && entry.name != 'groups' }.map { |entry| entry.path }
|
232
239
|
|
233
240
|
# Topologically sort groups for upload
|
234
|
-
unsorted_groups = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/groups/*')).select { |entry|
|
241
|
+
unsorted_groups = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/groups/*')).select { |entry| ! ['billing-admins.json', 'public_key_read_access.json'].include?(entry.name) }.map { |entry| JSON.parse(entry.read) }
|
235
242
|
group_paths = sort_groups_for_upload(unsorted_groups).map { |group_name| "/groups/#{group_name}.json" }
|
236
243
|
|
237
|
-
group_acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry|
|
244
|
+
group_acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/acls/groups/*')).select { |entry| ! ['billing-admins.json', 'public_key_read_access.json'].include?(entry.name) }.map { |entry| entry.path }
|
238
245
|
acl_paths = Chef::ChefFS::FileSystem.list(chef_fs_config.local_fs, Chef::ChefFS::FilePattern.new('/acls/*')).select { |entry| entry.name != 'groups' }.map { |entry| entry.path }
|
239
246
|
|
240
247
|
|
@@ -249,7 +256,7 @@ class Chef
|
|
249
256
|
|
250
257
|
# restore clients to groups, using the pivotal user again
|
251
258
|
Chef::Config[:node_name] = 'pivotal'
|
252
|
-
['admins', 'billing-admins'].each do |group|
|
259
|
+
['admins', 'billing-admins', 'public_key_read_access'].each do |group|
|
253
260
|
restore_group(Chef::ChefFS::Config.new, group)
|
254
261
|
end
|
255
262
|
ensure
|
@@ -285,6 +292,7 @@ class Chef
|
|
285
292
|
"/groups/#{group_name}.json"
|
286
293
|
)
|
287
294
|
|
295
|
+
# Will throw NotFoundError if JSON file does not exist on disk. See below.
|
288
296
|
members_json = Chef::ChefFS::FileSystem.resolve_path(
|
289
297
|
chef_fs_config.local_fs,
|
290
298
|
"/groups/#{group_name}.json"
|
@@ -301,6 +309,8 @@ class Chef
|
|
301
309
|
end
|
302
310
|
|
303
311
|
group.write(members.to_json)
|
312
|
+
rescue Chef::ChefFS::FileSystem::NotFoundError
|
313
|
+
Chef::Log.warn "Could not find #{group.display_path} on disk. Will not restore."
|
304
314
|
end
|
305
315
|
|
306
316
|
def put_acl(rest, url, acls)
|
@@ -135,4 +135,15 @@ describe Chef::Knife::EcRestore do
|
|
135
135
|
@knife.restore_users
|
136
136
|
end
|
137
137
|
end
|
138
|
+
|
139
|
+
describe "#restore_group" do
|
140
|
+
context "when group is not present in backup" do
|
141
|
+
let(:chef_fs_config) { Chef::ChefFS::Config.new }
|
142
|
+
let(:group_name) { "bad_group" }
|
143
|
+
|
144
|
+
it "does not raise error" do
|
145
|
+
expect { @knife.restore_group(chef_fs_config, group_name) }.not_to raise_error
|
146
|
+
end
|
147
|
+
end
|
148
|
+
end
|
138
149
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: knife-ec-backup
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 2.0.
|
4
|
+
version: 2.0.7
|
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: 2017-02-09 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: sequel
|
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
102
102
|
version: '0'
|
103
103
|
requirements: []
|
104
104
|
rubyforge_project:
|
105
|
-
rubygems_version: 2.
|
105
|
+
rubygems_version: 2.6.10
|
106
106
|
signing_key:
|
107
107
|
specification_version: 4
|
108
108
|
summary: Backup and Restore of Enterprise Chef
|