map UUIDs of new objects to old

Maintain a CSV file mapping the UUIDs of old resources to the new
values.

Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann 2017-02-13 20:25:27 +00:00
parent f6eb3f2410
commit c4bbbc3ab9
2 changed files with 58 additions and 2 deletions

View File

@ -32,9 +32,12 @@ def export_data(cloud, config, args):
cloud, cloud,
use_progress_bar=(args.progress and (args.verbose_level >= 1)), use_progress_bar=(args.progress and (args.verbose_level >= 1)),
) )
res = resolver.Resolver(cloud, downloader) res = resolver.Resolver(cloud, downloader, output_path)
tasks = [] tasks = []
# Any tasks needed to initialize the output.
tasks.extend(res.init_tasks())
# Export independent resources. The resolver handles dependencies # Export independent resources. The resolver handles dependencies
# automatically. # automatically.
to_export = resources.load(args.resource_file) to_export = resources.load(args.resource_file)

View File

@ -12,13 +12,55 @@
# License for the specific language governing permissions and limitations # License for the specific language governing permissions and limitations
# under the License. # under the License.
import itertools
import os.path
class Resolver: class Resolver:
def __init__(self, cloud, downloader): def __init__(self, cloud, downloader, output_path):
self.cloud = cloud self.cloud = cloud
self._memo = set() self._memo = set()
self._downloader = downloader self._downloader = downloader
self._output_path = output_path
self._uuid_map_file = 'uuids.csv'
self._var_counter = itertools.count(1)
def _mk_var_name(self, slug):
name = '{}{:03d}'.format(slug, next(self._var_counter))
self._last_var = name
return name
def _map_uuids(self, resource_type, name, old_id, var_expr):
pat = '"{}","{}","{}"'.format(
resource_type, name, old_id,
)
line = '{},"{}"'.format(
pat, '{{' + self._last_var + '.' + var_expr + '}}',
)
return {
'name': 'Map UUID for {}'.format(name),
'lineinfile': {
'dest': self._uuid_map_file,
'state': 'present',
'regexp': pat,
'insertafter': 'EOF',
'line': line,
},
}
def init_tasks(self):
yield {
'name': 'Initializing UUID mapping file',
'lineinfile': {
'create': 'yes',
'dest': self._uuid_map_file,
'state': 'present',
'regexp': '"Resource Type","Resource Name","Old","New"',
'insertbefore': 'BOF',
'line': '"Resource Type","Resource Name","Old","New"',
},
}
def security_group(self, group): def security_group(self, group):
if ('security_group', group.id) in self._memo: if ('security_group', group.id) in self._memo:
@ -32,7 +74,12 @@ class Resolver:
'name': group.name, 'name': group.name,
'description': group.description, 'description': group.description,
}, },
'register': self._mk_var_name('sg'),
} }
yield self._map_uuids(
'security group', group.name, group.id,
'secgroup.id',
)
for rule in group.security_group_rules: for rule in group.security_group_rules:
rule_data = { rule_data = {
'direction': rule.direction, 'direction': rule.direction,
@ -70,7 +117,9 @@ class Resolver:
'size': volume.size, 'size': volume.size,
'state': 'present', 'state': 'present',
}, },
'register': self._mk_var_name('vol'),
} }
yield self._map_uuids('volume', volume.name, volume.id, 'volume.id')
def server(self, server, save_state): def server(self, server, save_state):
for sg in server.security_groups: for sg in server.security_groups:
@ -102,7 +151,9 @@ class Resolver:
yield { yield {
'name': 'Creating server {}'.format(server.name), 'name': 'Creating server {}'.format(server.name),
'os_server': server_data, 'os_server': server_data,
'register': self._mk_var_name('server'),
} }
yield self._map_uuids('server', server.name, server.id, 'server.id')
def image(self, image): def image(self, image):
filename = self._downloader.add_image(image) filename = self._downloader.add_image(image)
@ -119,4 +170,6 @@ class Resolver:
yield { yield {
'name': 'Creating image {}'.format(image.name), 'name': 'Creating image {}'.format(image.name),
'os_image': image_data, 'os_image': image_data,
'register': self._mk_var_name('img'),
} }
yield self._map_uuids('image', image.name, image.id, 'image.id')