deb-networking-midonet/midonet/neutron/db/migration/cli.py

209 lines
7.1 KiB
Python

# Copyright 2014 Midokura SARL
#
# 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 os
from alembic import config as alembic_config
from oslo_config import cfg
from oslo_serialization import jsonutils
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from neutron.db.migration import cli as n_cli
from midonet.neutron._i18n import _
import midonet.neutron.db.data_state_db as ds_db
import midonet.neutron.db.data_version_db as dv_db
from midonet.neutron.db import task_db
CONF = n_cli.CONF
def get_session(config):
connection = config.neutron_config.database.connection
engine = create_engine(connection)
Session = sessionmaker(bind=engine)
return Session()
def task_list(config, cmd):
"""Lists all of the tasks in the task table.
Optionally filters tasks to show unprocessed tasks.
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
printer = config.print_stdout
line = "%-7s%-11s%-20s%-40s%-20s"
printer(line, "id", "type", "data type", "resource id", "time")
printer(line, "--", "----", "---------", "-----------", "----")
def print_task(task):
printer(line, task.id, task.type, task.data_type, task.resource_id,
task.created_at)
show_unprocessed = config.neutron_config.command.u
tasks = task_db.get_task_list(session, show_unprocessed)
[print_task(task) for task in tasks]
def task_clean(config, cmd):
"""Removes all of the tasks that have been processed by the cluster.
Remove those tasks from the task table.
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
task_db.task_clean(session)
def task_resource(config, cmd):
"""Lists all of the resources represented in the task table.
This will only show the most updated information, and it will not
consider resources that have been removed from the task table.
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
printer = config.print_stdout
data = task_db.get_current_task_data(session)
for data_type in data:
printer(data_type + "S: \n")
for res in data[data_type]:
data_json = jsonutils.loads(data[data_type][res])
printer(jsonutils.dumps(data_json, indent=4, sort_keys=True))
def data_show(config, cmd):
"""Dumps the contents of the data state table.
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
printer = config.print_stdout
data_state = ds_db.get_data_state(session)
line = "%-25s : %s"
printer(line, "last processed task id", data_state.last_processed_task_id)
printer(line, "last updated", data_state.updated_at)
printer(line, "active version", data_state.active_version)
readonly = "True" if data_state.readonly else "False"
printer(line, "read only", readonly)
def data_readonly(config, cmd):
"""Sets the task table access state to "read only"
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
ds_db.set_readonly(session)
def data_readwrite(config, cmd):
"""Sets the task table access state to "read and write"
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
ds_db.set_readwrite(session)
def data_version_list(config, cmd):
"""Lists the statuses of the versions in the midonet data version table.
:param config: contains neutron configuration, like database connection.
:param cmd: unused, but needed in the function signature by the command
parser.
"""
session = get_session(config)
data_versions = dv_db.get_data_versions(session)
printer = config.print_stdout
line = "%-7s%-20s%-20s%-10s"
printer(line, "id", "sync_status", "sync_tasks_status", "stale")
printer(line, "--", "-----------", "-----------------", "-----")
for dv in data_versions:
printer(line, dv.id, dv.sync_status, dv.sync_tasks_status, dv.stale)
def data_version_sync(config, cmd):
pass
def data_version_activate(config, cmd):
pass
def add_command_parsers(subparsers):
parser = subparsers.add_parser('task-list')
parser.add_argument('-u', action='store_true')
parser.set_defaults(func=task_list)
parser = subparsers.add_parser('task-clean')
parser.set_defaults(func=task_clean)
parser = subparsers.add_parser('task-resource')
parser.set_defaults(func=task_resource)
parser = subparsers.add_parser('data-show')
parser.set_defaults(func=data_show)
parser = subparsers.add_parser('data-readonly')
parser.set_defaults(func=data_readonly)
parser = subparsers.add_parser('data-readwrite')
parser.set_defaults(func=data_readwrite)
parser = subparsers.add_parser('data-version-list')
parser.set_defaults(func=data_version_list)
parser = subparsers.add_parser('data-version-sync')
parser.set_defaults(func=data_version_sync)
parser = subparsers.add_parser('data-version-activate')
parser.set_defaults(func=data_version_activate)
command_opt = cfg.SubCommandOpt('command',
title='Command',
help=_('Available commands'),
handler=add_command_parsers)
# Override the db management options with our own version
CONF.unregister_opt(n_cli.command_opt)
CONF.register_cli_opt(command_opt)
def get_alembic_config():
config = alembic_config.Config(os.path.join(os.path.dirname(__file__),
'alembic.ini'))
config.set_main_option('script_location',
'midonet.neutron.db.migration:alembic_migration')
return config
def main():
CONF(project='neutron')
config = get_alembic_config()
# attach the Neutron conf to the Alembic conf
config.neutron_config = CONF
CONF.command.func(config, CONF.command.name)