Support all API YAML Models by default

Service API Models are defined in gluon/models directory, where each
sub-directory is a model of NFV networking service. An exemplary structure
looks like:

    gluon/models/net-l3vpn/api.yaml

A more generic example looks like:

    gluon/models/<service>/<name>.yaml

Currently, in gluon/cmd/config.py, service model is net-l3vpn only by
default. When a new service model is added, we need to add the new
service model in "service_list" of proton.conf, and restart the service
by something like:

    proton-server --config-file proton.conf

If some user forgets to add it to proton.conf, even if new service model
is defined appropriately, Proton Server only loads net-l3vpn by default.

This patch changes the default model to be all models under gluon/models
directory. This means that if a user adds a service model definition, he
does not have to change proton.conf. By simply restarting proton-server,
all models will be loaded by default. The user needs to change proton.conf
ONLY IF he has specific needs of supporting specific service(s).

So this patch improves usability of adding / removing new service models
on-demand.

The original work is credited to Thomas Hambleton.

Change-Id: If2e5b7225105ca0dbbda4bb85090ce3c86e0e7f8
Signed-off-by: Bin Hu <bh526r@att.com>
This commit is contained in:
Bin Hu 2017-04-12 09:08:12 -07:00
parent b7b7bc331a
commit 4630cc62d1
9 changed files with 38 additions and 33 deletions

View File

@ -44,10 +44,7 @@ class ProtonController(rest.RestController):
"""Version 1 API controller root."""
def __init__(self):
services = str(cfg.CONF.api.service_list).split(',')
service_list = list()
for api_name in services:
service_list.append(api_name.strip())
service_list = particle_generator.get_service_list()
particle_generator.build_api(self, service_list)
@wsme_pecan.wsexpose(ProtonRoot)

View File

@ -44,10 +44,7 @@ def main():
service.prepare_service(sys.argv)
cfg.CONF.log_opt_values(LOG, logging.DEBUG)
# Set source of model files
services = str(cfg.CONF.api.service_list).split(',')
service_list = list()
for api_name in services:
service_list.append(api_name.strip())
service_list = particle_generator.get_service_list()
LOG.info("Service List: %s" % service_list)
LOG.info("Generating DB Classes")
particle_generator.build_sql_models(service_list)

View File

@ -17,7 +17,7 @@ import sys
import click
from gluon.particleGenerator.cli import get_model_list
from gluon.particleGenerator.generator import get_model_list
from gluon.particleGenerator.generator import load_model
from gluon.particleGenerator.generator import verify_model
@ -35,7 +35,7 @@ def cli():
@click.command()
def list():
model_list = get_model_list(package_name="gluon", model_dir="models")
model_list = get_model_list()
for api in model_list:
click.echo(api)
@ -43,7 +43,7 @@ def list():
@click.command()
@click.argument('api')
def check(api):
model_list = get_model_list(package_name="gluon", model_dir="models")
model_list = get_model_list()
if api not in model_list:
print("Invalid API name!\n")
sys.exit(-1)

View File

@ -19,8 +19,8 @@ import types
import click
from gluon.particleGenerator.cli import get_api_model
from gluon.particleGenerator.cli import get_model_list
from gluon.particleGenerator.cli import proc_model
from gluon.particleGenerator.generator import get_model_list
sys.tracebacklimit = 0
@ -33,8 +33,7 @@ def dummy():
def main():
cli = types.FunctionType(dummy.func_code, {})
cli = click.group()(cli)
model_list = get_model_list(package_name="gluon",
model_dir="models")
model_list = get_model_list()
model = get_api_model(sys.argv, model_list)
proc_model(cli,
package_name="gluon",

View File

@ -22,7 +22,7 @@ API_SERVICE_OPTS = [
default='127.0.0.1',
help='The listen IP for the proton API server'),
cfg.StrOpt('service_list',
default='net-l3vpn',
default='*',
help='Comma separated list of service models'),
cfg.StrOpt('etcd_host',
default='127.0.0.1',

View File

@ -66,15 +66,6 @@ def get_api_model(argv, model_list):
return api_name
def get_model_list(package_name, model_dir):
model_list = list()
for f in pkg_resources.resource_listdir(package_name, model_dir):
if f == 'base':
continue
model_list.append(f)
return model_list
def get_token():
auth_url = os.environ.get('OS_AUTH_URL')
tenant = os.environ.get('OS_TENANT_NAME')

View File

@ -17,6 +17,8 @@ import pkg_resources
import six
import yaml
from oslo_config import cfg
from gluon.common import exception as exc
from gluon.db.sqlalchemy import models as sql_models
@ -331,6 +333,26 @@ def load_model_for_service(service):
return GenData.models.get(service)
def get_model_list(package_name="gluon", model_dir="models"):
model_list = list()
for f in pkg_resources.resource_listdir(package_name, model_dir):
if f == 'base':
continue
model_list.append(f)
return model_list
def get_service_list():
service_list = list()
services = str(cfg.CONF.api.service_list).split(',')
if len(services) == 1 and services[0] == '*':
service_list = get_model_list()
else:
for api_name in services:
service_list.append(api_name.strip())
return service_list
def build_sql_models(service_list):
from gluon.particleGenerator.DataBaseModelGenerator \
import DataBaseModelProcessor

View File

@ -66,15 +66,6 @@ class CliTestCase(partgen_base.ParticleGeneratorTestCase):
observed = cli.get_api_model(argv, model_list)
self.assertEqual(expected, observed)
"""
test get_model_list
"""
def test_get_model_list(self):
observed = cli.get_model_list("gluon.tests.particleGenerator",
"models")
expected = ['test_model.yaml']
self.assertEqual(expected, observed)
"""
test json_get
"""

View File

@ -43,6 +43,14 @@ class GeneratorTestCase(partgen_base.ParticleGeneratorTestCase):
self.assertIn('Interface', service_models['api_objects'])
"""
test get_model_list
"""
def test_get_model_list(self):
observed = generator.get_model_list("gluon.tests.particleGenerator",
"models")
expected = ['test_model.yaml']
self.assertEqual(expected, observed)
"""
test build_sql_models(service_list)
"""
@mock.patch('gluon.particleGenerator.generator.load_model')