split main app into export and query subcommands

Signed-off-by: Doug Hellmann <doug@doughellmann.com>
This commit is contained in:
Doug Hellmann 2017-01-31 17:15:40 -05:00
parent 7ddac309d5
commit 6b086aeeb7
3 changed files with 140 additions and 49 deletions

View File

@ -26,6 +26,8 @@ import shade
import yaml import yaml
from aerostat import download from aerostat import download
from aerostat import export
from aerostat import query
from aerostat import resolver from aerostat import resolver
from aerostat import resources from aerostat import resources
@ -34,64 +36,51 @@ def main():
parser = argparse.ArgumentParser() parser = argparse.ArgumentParser()
config = os_client_config.OpenStackConfig() config = os_client_config.OpenStackConfig()
verbose_group = parser.add_mutually_exclusive_group()
verbose_group.add_argument(
'--verbose', '-v',
action='count',
dest='verbose_level',
default=1,
help='Increase verbosity of output. Can be repeated.',
)
verbose_group.add_argument(
'-q', '--quiet',
action='store_const',
dest='verbose_level',
const=0,
help='Suppress output except warnings and errors.',
)
config.register_argparse_arguments(parser, sys.argv, None) config.register_argparse_arguments(parser, sys.argv, None)
parser.add_argument( subparsers = parser.add_subparsers(title='commands')
do_export = subparsers.add_parser(
'export',
help='export data',
)
do_export.add_argument(
'resource_file', 'resource_file',
help='the name of the file listing resources to be exported', help='the name of the file listing resources to be exported',
) )
parser.add_argument( do_export.add_argument(
'output_path', 'output_path',
default='.', default='.',
nargs='?', nargs='?',
help='the name of a directory to use for output file(s)', help='the name of a directory to use for output file(s)',
) )
do_export.set_defaults(func=export.export_data)
args, remaining = parser.parse_known_args(sys.argv[1:]) do_query = subparsers.add_parser(
output_path = args.output_path 'query',
help='query to build an export list',
)
do_query.add_argument(
'resource_file',
help='the name of the file listing resources to be updated',
)
do_query.set_defaults(func=query.query_data)
cloud_config = config.get_one_cloud(options=(args, remaining)) args = parser.parse_args(sys.argv[1:])
cloud = shade.OpenStackCloud(cloud_config=cloud_config)
downloader = download.Downloader(output_path, cloud)
res = resolver.Resolver(cloud, downloader)
tasks = []
# Export independent resources. The resolver handles dependencies return args.func(config, args)
# automatically.
to_export = resources.load(args.resource_file)
for image_info in to_export.images:
image = cloud.get_image(image_info.name)
tasks.extend(res.image(image))
for volume_info in to_export.volumes:
volume = cloud.get_volume(volume_info.name)
tasks.extend(res.volume(volume, save_state=volume_info.save_state))
for server_info in to_export.servers:
server = cloud.get_server(server_info.name)
tasks.extend(res.server(server, save_state=server_info.save_state))
playbook = [
# The default playbook is configured to run instructions
# locally to talk to the cloud API.
{'hosts': 'localhost',
'connection': 'local',
'tasks': tasks,
},
]
playbook_filename = os.path.join(output_path, 'playbook.yml')
with open(playbook_filename, 'w', encoding='utf-8') as fd:
yaml.dump(playbook, fd, default_flow_style=False, explicit_start=True)
print('wrote playbook to {}'.format(playbook_filename))
downloader.start()
# print('downloading volume snapshot')
# snapshot = cloud.get_volume_snapshot('testvol1-sn1')
# pprint.pprint(snapshot)
# # with download.ProgressBarDownloader('testvol1-sn1.dat', snapshot.size) as out:
# # cloud.download_image('dev1-sn1', output_file=out)
# for volume in dev1.volumes:
# vol = cloud.get_volume(volume.id)
# pprint.pprint(vol)

82
aerostat/export.py Normal file
View File

@ -0,0 +1,82 @@
# -*- coding: utf-8 -*-
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import argparse
import os.path
import pprint
import sys
import os_client_config
import progressbar
import shade
import yaml
from aerostat import download
from aerostat import export
from aerostat import resolver
from aerostat import resources
def export_data(config, args):
output_path = args.output_path
cloud_config = config.get_one_cloud(options=(args, []))
cloud = shade.OpenStackCloud(cloud_config=cloud_config)
downloader = download.Downloader(output_path, cloud)
res = resolver.Resolver(cloud, downloader)
tasks = []
# Export independent resources. The resolver handles dependencies
# automatically.
to_export = resources.load(args.resource_file)
for image_info in to_export.images:
image = cloud.get_image(image_info.name)
tasks.extend(res.image(image))
for volume_info in to_export.volumes:
volume = cloud.get_volume(volume_info.name)
tasks.extend(res.volume(volume, save_state=volume_info.save_state))
for server_info in to_export.servers:
server = cloud.get_server(server_info.name)
tasks.extend(res.server(server, save_state=server_info.save_state))
playbook = [
# The default playbook is configured to run instructions
# locally to talk to the cloud API.
{'hosts': 'localhost',
'connection': 'local',
'tasks': tasks,
},
]
playbook_filename = os.path.join(output_path, 'playbook.yml')
with open(playbook_filename, 'w', encoding='utf-8') as fd:
yaml.dump(playbook, fd, default_flow_style=False, explicit_start=True)
print('wrote playbook to {}'.format(playbook_filename))
downloader.start()
# print('downloading volume snapshot')
# snapshot = cloud.get_volume_snapshot('testvol1-sn1')
# pprint.pprint(snapshot)
# # with download.ProgressBarDownloader('testvol1-sn1.dat', snapshot.size) as out:
# # cloud.download_image('dev1-sn1', output_file=out)
# for volume in dev1.volumes:
# vol = cloud.get_volume(volume.id)
# pprint.pprint(vol)

20
aerostat/query.py Normal file
View File

@ -0,0 +1,20 @@
# -*- coding: utf-8 -*-
# Copyright 2010-2011 OpenStack Foundation
# Copyright (c) 2013 Hewlett-Packard Development Company, L.P.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
def query_data(config, args):
raise NotImplementedError('query not implemented')