Merge "Use NbApi where possible in df_db"

This commit is contained in:
Zuul 2018-01-15 14:33:30 +00:00 committed by Gerrit Code Review
commit 1949c80289
1 changed files with 121 additions and 105 deletions

View File

@ -15,136 +15,158 @@ from jsonmodels import errors
import socket
import sys
from oslo_serialization import jsonutils
from dragonflow.cli import utils as cli_utils
from dragonflow.common import exceptions as df_exceptions
from dragonflow.common import utils as df_utils
from dragonflow import conf as cfg
from dragonflow.db import api_nb
from dragonflow.db import db_common
from dragonflow.db import model_framework
from dragonflow.db import models
from dragonflow.db.models import all # noqa
from dragonflow.db.models import l2
db_tables = list(model_framework.iter_tables()) + [db_common.UNIQUE_KEY_TABLE]
nb_api = None
def _get_model_or_exit(table):
"""
Return the model by table name. If no such model is found, raise
SystemExit, which (in general should) exit the process.
"""
try:
return model_framework.get_model(table)
except KeyError:
print('Table not found: ' + table)
raise SystemExit(1)
def _print_list(columns, values, first_label=None):
"""
Print the given columns from the given values. You can override the label
of the first column with 'first_label'.
:param columns: The columns to print from values
:type columns: List of strings
:param values: The values to print
:type values: List of dict
:param first_label: The label of the first column
:type first_label: String
"""
labels, formatters = \
cli_utils.get_list_table_columns_and_formatters(columns, values)
if first_label:
labels[0] = first_label
cli_utils.print_list(values, columns, formatters=formatters,
field_labels=labels)
def print_tables():
columns = ['table']
tables = [{'table': table} for table in db_tables]
labels, formatters = \
cli_utils.get_list_table_columns_and_formatters(columns, tables)
labels[0] = 'DB Tables'
cli_utils.print_list(tables, columns, formatters=formatters,
field_labels=labels)
_print_list(columns, tables, 'DB Tables')
def print_table(db_driver, table):
try:
keys = db_driver.get_all_keys(table)
except df_exceptions.DBKeyNotFound:
keys = []
def print_table(table):
if table == db_common.UNIQUE_KEY_TABLE:
keys = nb_api.driver.get_all_keys(table)
values = [{'id': key} for key in keys]
_print_list(['id'], values)
return
model = _get_model_or_exit(table)
instances = nb_api.get_all(model)
if not keys:
if not instances:
print('Table is empty: ' + table)
return
for count, key in enumerate(keys):
keys[count] = {'key': key}
labels, formatters = \
cli_utils.get_list_table_columns_and_formatters(['key'], keys)
labels[0] = 'Keys for table'
cli_utils.print_list(keys, ['key'], formatters=formatters,
field_labels=labels)
keys = [{'key': instance.id} for instance in instances]
_print_list(['key'], keys, 'Keys for table')
def print_whole_table(db_driver, table):
try:
keys = db_driver.get_all_keys(table)
except df_exceptions.DBKeyNotFound:
print('Table not found: ' + table)
def print_whole_table(table):
if table == db_common.UNIQUE_KEY_TABLE:
keys = nb_api.driver.get_all_keys(table)
values = [{'id': key, table: int(nb_api.driver.get_key(table, key))}
for key in keys]
columns = ['id', table]
_print_list(columns, values)
return
if not keys:
model = _get_model_or_exit(table)
instances = nb_api.get_all(model)
values = [instance.to_struct() for instance in instances]
if not values:
print('Table is empty: ' + table)
return
raw_values = [db_driver.get_key(table, key) for key in keys]
values = [jsonutils.loads(value) for value in raw_values if value]
if isinstance(values[0], dict):
columns = values[0].keys()
labels, formatters = \
cli_utils.get_list_table_columns_and_formatters(columns, values)
cli_utils.print_list(values, columns, formatters=formatters,
field_labels=labels)
elif isinstance(values[0], int):
for l, value in enumerate(values):
values[l] = {table: value}
columns = [table]
labels, formatters = \
cli_utils.get_list_table_columns_and_formatters(columns, values)
cli_utils.print_list(values, columns, formatters=formatters,
field_labels=columns)
columns = values[0].keys()
_print_list(columns, values)
def print_key(db_driver, table, key):
def print_key(table, key):
if table == db_common.UNIQUE_KEY_TABLE:
value = nb_api.driver.get_key(table, key)
value_dict = {'id': key, table: int(value)}
cli_utils.print_dict(value_dict)
return
model = _get_model_or_exit(table)
try:
value = db_driver.get_key(table, key)
value = nb_api.get(model(id=key))
except df_exceptions.DBKeyNotFound:
print('Key not found: ' + table)
return
value = jsonutils.loads(value)
# It will be too difficult to print all type of data in table
# therefore using print dict for dictionary type otherwise
# using old approach for print.
if isinstance(value, dict):
cli_utils.print_dict(value)
else:
print(value)
cli_utils.print_dict(value.to_struct())
def bind_port_to_localhost(db_driver, port_id):
lport_str = db_driver.get_key(models.LogicalPort.table_name, port_id)
lport = jsonutils.loads(lport_str)
def bind_port_to_localhost(port_id):
lport = nb_api.get(l2.LogicalPort(id=port_id))
chassis_name = socket.gethostname()
lport['chassis'] = chassis_name
lport_json = jsonutils.dumps(lport)
db_driver.set_key(models.LogicalPort.table_name, port_id, lport_json)
lport.binding = l2.PortBinding(type=l2.BINDING_CHASSIS,
chassis=chassis_name)
nb_api.update(lport)
def clean_whole_table(db_driver, table):
try:
keys = db_driver.get_all_keys(table)
except df_exceptions.DBKeyNotFound:
print('Table not found: ' + table)
def clean_whole_table(table):
if table == db_common.UNIQUE_KEY_TABLE:
keys = nb_api.driver.get_all_keys(table)
for key in keys:
try:
nb_api.driver.delete_key(table, key)
except df_exceptions.DBKeyNotFound:
print('Unique key not found: ' + key)
return
model = _get_model_or_exit(table)
values = nb_api.get_all(model)
for key in keys:
for value in values:
try:
db_driver.delete_key(table, key)
nb_api.delete(value)
except df_exceptions.DBKeyNotFound:
print('Key not found: ' + key)
print('Instance not found: ' + value)
def drop_table(db_driver, table):
def drop_table(table):
try:
db_driver.delete_table(table)
nb_api.driver.delete_table(table)
except df_exceptions.DBKeyNotFound:
print('Table not found: ' + table)
def create_table(db_driver, table):
db_driver.create_table(table)
def create_table(table):
nb_api.driver.create_table(table)
print('Table %s is created.' % table)
def remove_record(db_driver, table, key):
def remove_record(table, key):
if table == db_common.UNIQUE_KEY_TABLE:
try:
nb_api.driver.delete_key(table, key)
except df_exceptions.DBKeyNotFound:
print('Key %s is not found in table %s.' % (key, table))
return
model = _get_model_or_exit(table)
try:
db_driver.delete_key(table, key)
nb_api.delete(model(id=key))
except df_exceptions.DBKeyNotFound:
print('Key %s is not found in table %s.' % (key, table))
@ -204,7 +226,7 @@ def _check_valid_table(parser, table_name):
def add_table_command(subparsers):
def handle(db_driver, args):
def handle(args):
print_tables()
sub_parser = subparsers.add_parser('tables', help="Print all the db "
@ -213,10 +235,9 @@ def add_table_command(subparsers):
def add_ls_command(subparsers):
def handle(db_driver, args):
def handle(args):
table = args.table
_check_valid_table(sub_parser, table)
print_table(db_driver, table)
print_table(table)
sub_parser = subparsers.add_parser('ls', help="Print all the keys for "
"specific table.")
@ -225,11 +246,10 @@ def add_ls_command(subparsers):
def add_get_command(subparsers):
def handle(db_driver, args):
def handle(args):
table = args.table
key = args.key
_check_valid_table(sub_parser, table)
print_key(db_driver, table, key)
print_key(table, key)
sub_parser = subparsers.add_parser('get', help="Print value for specific "
"key.")
@ -239,9 +259,9 @@ def add_get_command(subparsers):
def add_dump_command(subparsers):
def handle(db_driver, args):
def handle(args):
for table in db_tables:
print_whole_table(db_driver, table)
print_whole_table(table)
sub_parser = subparsers.add_parser('dump', help="Dump content of all "
"tables.")
@ -249,9 +269,9 @@ def add_dump_command(subparsers):
def add_bind_command(subparsers):
def handle(db_driver, args):
def handle(args):
port_id = args.port_id
bind_port_to_localhost(db_driver, port_id)
bind_port_to_localhost(port_id)
sub_parser = subparsers.add_parser('bind', help="Bind a port to "
"localhost.")
@ -260,20 +280,19 @@ def add_bind_command(subparsers):
def add_clean_command(subparsers):
def handle(db_driver, args):
def handle(args):
for table in db_tables:
clean_whole_table(db_driver, table)
clean_whole_table(table)
sub_parser = subparsers.add_parser('clean', help="Clean up all keys.")
sub_parser.set_defaults(handle=handle)
def add_rm_command(subparsers):
def handle(db_driver, args):
def handle(args):
table = args.table
key = args.key
_check_valid_table(sub_parser, table)
remove_record(db_driver, table, key)
remove_record(table, key)
sub_parser = subparsers.add_parser('rm', help="Remove the specified DB "
"record.")
@ -283,18 +302,18 @@ def add_rm_command(subparsers):
def add_init_command(subparsers):
def handle(db_driver, args):
def handle(args):
for table in db_tables:
create_table(db_driver, table)
create_table(table)
sub_parser = subparsers.add_parser('init', help="Initialize all tables.")
sub_parser.set_defaults(handle=handle)
def add_dropall_command(subparsers):
def handle(db_driver, args):
def handle(args):
for table in db_tables:
drop_table(db_driver, table)
drop_table(table)
sub_parser = subparsers.add_parser('dropall', help="Drop all tables.")
sub_parser.set_defaults(handle=handle)
@ -302,7 +321,7 @@ def add_dropall_command(subparsers):
def add_create_command(subparsers):
def handle(db_driver, args):
def handle(args):
table = args.table
if args.file:
@ -356,14 +375,11 @@ def main():
args = parser.parse_args()
df_utils.config_parse()
db_driver = df_utils.load_driver(
cfg.CONF.df.nb_db_class,
df_utils.DF_NB_DB_DRIVER_NAMESPACE)
db_driver.initialize(db_ip=cfg.CONF.df.remote_db_ip,
db_port=cfg.CONF.df.remote_db_port,
config=cfg.CONF.df)
args.handle(db_driver, args)
global nb_api
nb_api = api_nb.NbApi.get_instance(False)
args.handle(args)
if __name__ == "__main__":