melange/bin/melange-manage
Aaron Lee 72ebf18512 Fixing initial migration
The last commit broke the initial migration(which is worse, because it was the
only substantial migration). This commit keeps from setting up the DB before
running migrations. If any future migrations need to read from the DB they
will need to do the same dance that's in 002.

Change-Id: Icedf99d95b538cb24cccccc4d47ef68bdf225b4c
2012-03-23 11:41:51 -07:00

142 lines
4.2 KiB
Python
Executable File

#!/usr/bin/env python
# vim: tabstop=4 shiftwidth=4 softtabstop=4
# Copyright 2011 OpenStack LLC.
# All Rights Reserved.
#
# 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.
#TODO(jkoelker) Convert this to an entry_point
import gettext
import optparse
import os
import sys
gettext.install('melange', unicode=1)
# If ../melange/__init__.py exists, add ../ to Python search path, so that
# it will override what happens to be installed in /usr/(local/)lib/python...
possible_topdir = os.path.normpath(os.path.join(os.path.abspath(sys.argv[0]),
os.pardir,
os.pardir))
if os.path.exists(os.path.join(possible_topdir, 'melange', '__init__.py')):
sys.path.insert(0, possible_topdir)
from melange import version
from melange.common import config
from melange.common import utils
from melange.db import db_api
from melange.ipam import service
def create_options(parser):
"""Sets up the CLI and config-file options.
:param parser: The option parser
:returns: None
"""
parser.add_option('-p', '--port', dest="port", metavar="PORT",
type=int, default=9898,
help="Port the Melange API host listens on. "
"Default: %default")
config.add_common_options(parser)
config.add_log_options(parser)
class Commands(object):
def __init__(self, conf):
self.conf = conf
def db_sync(self):
db_api.db_sync(self.conf)
def db_upgrade(self, version=None, repo_path=None):
db_api.db_upgrade(self.conf, version, repo_path=repo_path)
def db_downgrade(self, version, repo_path=None):
db_api.db_downgrade(self.conf, version, repo_path=repo_path)
def routes(self, version):
version = version.split('=')[-1].upper().replace('.', '')
if not version.startswith('V'):
version = 'V' + version
api = getattr(service, 'API' + version, None)
if not api:
print _('Could not import Router %s') % api
for route in api().map.matchlist:
print route.routepath, route.conditions['method']
def execute(self, command_name, *args):
if self.has(command_name):
return getattr(self, command_name)(*args)
_commands = ['db_sync', 'db_upgrade', 'db_downgrade', 'routes']
@classmethod
def has(cls, command_name):
return (command_name in cls._commands)
@classmethod
def all(cls):
return cls._commands
def params_of(self, command_name):
if Commands.has(command_name):
return utils.MethodInspector(getattr(self, command_name))
def usage():
usage = """
%prog action [args] [options]
Available actions:
"""
for action in Commands.all():
usage = usage + ("\t%s\n" % action)
return usage.strip()
if __name__ == '__main__':
oparser = optparse.OptionParser(version="%%prog %s"
% version.version_string(),
usage=usage())
create_options(oparser)
(options, args) = config.parse_options(oparser)
if len(args) < 1 or not Commands.has(args[0]):
oparser.print_usage()
sys.exit(2)
try:
conf = config.Config.load_paste_config('melange', options, args)
config.setup_logging(options, conf)
command_name = args.pop(0)
Commands(conf).execute(command_name, *args)
sys.exit(0)
except TypeError:
print _("Possible wrong number of arguments supplied")
command_params = Commands(conf).params_of(command_name)
print "Usage: melange-manage %s" % command_params
sys.exit(2)
except Exception:
print _("Command failed, please check log for more info")
raise