188 lines
6.4 KiB
Python
188 lines
6.4 KiB
Python
# Copyright 2015 VMware.
|
|
#
|
|
# 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 logging
|
|
|
|
from congress_dashboard.api import congress
|
|
|
|
|
|
LOG = logging.getLogger(__name__)
|
|
|
|
|
|
def _get_policy_tables(request):
|
|
# Return all policy tables.
|
|
all_tables = []
|
|
try:
|
|
# Get all the policies.
|
|
policies = congress.policies_list(request)
|
|
except Exception as e:
|
|
LOG.error('Unable to get list of policies: %s' % e.message)
|
|
else:
|
|
try:
|
|
for policy in policies:
|
|
# Get all the tables in this policy.
|
|
policy_name = policy['name']
|
|
policy_tables = congress.policy_tables_list(request,
|
|
policy_name)
|
|
# Get the names of the tables.
|
|
datasource_tables = []
|
|
for table in policy_tables:
|
|
table.set_id_as_name_if_empty()
|
|
table_name = table['name']
|
|
# Exclude service-derived tables.
|
|
if congress.TABLE_SEPARATOR not in table_name:
|
|
datasource_tables.append(table['name'])
|
|
|
|
all_tables.append({'datasource': policy_name,
|
|
'tables': datasource_tables})
|
|
except Exception as e:
|
|
LOG.error('Unable to get tables for policy "%s": %s' %
|
|
(policy_name, e.message))
|
|
return all_tables
|
|
|
|
|
|
def _get_service_tables(request):
|
|
# Return all service tables.
|
|
all_tables = []
|
|
try:
|
|
# Get all the services.
|
|
services = congress.datasources_list(request)
|
|
except Exception as e:
|
|
LOG.error('Unable to get list of data sources: %s' % e.message)
|
|
else:
|
|
try:
|
|
for service in services:
|
|
# Get all the tables in this service.
|
|
service_id = service['id']
|
|
service_tables = congress.datasource_tables_list(request,
|
|
service_id)
|
|
# Get the names of the tables.
|
|
datasource_tables = []
|
|
for table in service_tables:
|
|
table.set_id_as_name_if_empty()
|
|
datasource_tables.append(table['name'])
|
|
|
|
all_tables.append({'datasource': service['name'],
|
|
'tables': datasource_tables})
|
|
except Exception as e:
|
|
LOG.error('Unable to get tables for data source "%s": %s' %
|
|
(service_id, e.message))
|
|
return all_tables
|
|
|
|
|
|
def get_datasource_tables(request):
|
|
"""Get names of all data source tables.
|
|
|
|
Example:
|
|
[
|
|
{
|
|
'datasource': 'classification',
|
|
'tables': ['error']
|
|
},
|
|
{
|
|
'datasource': 'neutronv2'
|
|
'tables': ['networks', 'ports', ...]
|
|
},
|
|
...
|
|
]
|
|
"""
|
|
tables = _get_policy_tables(request)
|
|
tables.extend(_get_service_tables(request))
|
|
return tables
|
|
|
|
|
|
def get_datasource_columns(request):
|
|
"""Get of names of columns from all data sources.
|
|
|
|
Example:
|
|
[
|
|
{
|
|
'datasource': 'classification',
|
|
'tables': [
|
|
{
|
|
'table': 'error',
|
|
'columns': ['name']
|
|
}
|
|
]
|
|
},
|
|
{
|
|
'datasource': 'neutronv2',
|
|
'tables': [
|
|
{
|
|
'table': 'networks',
|
|
'columns': ['id', 'tenant_id', ...],
|
|
},
|
|
...
|
|
],
|
|
...
|
|
},
|
|
...
|
|
]
|
|
"""
|
|
all_columns = []
|
|
|
|
# Get all the policy tables.
|
|
policy_tables = _get_policy_tables(request)
|
|
try:
|
|
for policy in policy_tables:
|
|
# Get all the columns in this policy. Unlike for the services,
|
|
# there's currently no congress client API to get the schema for
|
|
# all tables in a policy in a single call.
|
|
policy_name = policy['datasource']
|
|
tables = policy['tables']
|
|
|
|
datasource_tables = []
|
|
for table_name in tables:
|
|
# Get all the columns in this policy table.
|
|
schema = congress.policy_table_schema_get(request, policy_name,
|
|
table_name)
|
|
columns = [c['name'] for c in schema['columns']]
|
|
datasource_tables.append({'table': table_name,
|
|
'columns': columns})
|
|
|
|
all_columns.append({'datasource': policy_name,
|
|
'tables': datasource_tables})
|
|
except Exception as e:
|
|
LOG.error('Unable to get schema for policy "%s" table "%s": %s' %
|
|
(policy_name, table_name, e.message))
|
|
|
|
try:
|
|
# Get all the services.
|
|
services = congress.datasources_list(request)
|
|
except Exception as e:
|
|
LOG.error('Unable to get list of data sources: %s' % e.message)
|
|
else:
|
|
try:
|
|
for service in services:
|
|
# Get the schema for this service.
|
|
service_id = service['id']
|
|
service_name = service['name']
|
|
schema = congress.datasource_schema_get(request, service_id)
|
|
|
|
datasource_tables = []
|
|
for table in schema['tables']:
|
|
# Get the columns for this table.
|
|
columns = [c['name'] for c in table['columns']]
|
|
datasource_table = {'table': table['table_id'],
|
|
'columns': columns}
|
|
datasource_tables.append(datasource_table)
|
|
|
|
all_columns.append({'datasource': service_name,
|
|
'tables': datasource_tables})
|
|
except Exception as e:
|
|
LOG.error('Unable to get schema for data source "%s": %s' %
|
|
(service_id, e.message))
|
|
|
|
return all_columns
|