Add .gitreview file, zuul jobs, and refactoring code
Change-Id: I005b7f84f63af0bde23b224e792b1f39f6ddb065
This commit is contained in:
parent
cd07ba2e87
commit
a78db48e89
7
.coveragerc
Normal file
7
.coveragerc
Normal file
@ -0,0 +1,7 @@
|
||||
[run]
|
||||
branch = True
|
||||
source = apmec
|
||||
omit = apmec/tests/*
|
||||
|
||||
[report]
|
||||
ignore_errors = True
|
34
.gitignore
vendored
Normal file
34
.gitignore
vendored
Normal file
@ -0,0 +1,34 @@
|
||||
AUTHORS
|
||||
api-ref/build/
|
||||
build/*
|
||||
build-stamp
|
||||
ChangeLog
|
||||
cover/
|
||||
.coverage
|
||||
covhtml/
|
||||
dist/
|
||||
doc/build
|
||||
*.DS_Store
|
||||
*.pyc
|
||||
apmec.egg-info/
|
||||
apmec/vcsversion.py
|
||||
apmec/versioninfo
|
||||
pbr*.egg/
|
||||
run_tests.err.log
|
||||
run_tests.log
|
||||
setuptools*.egg/
|
||||
subunit.log
|
||||
.testrepository
|
||||
.idea/
|
||||
.tox/
|
||||
.venv/
|
||||
*.mo
|
||||
*.sw?
|
||||
*~
|
||||
.eggs/
|
||||
.stestr/
|
||||
SP1_res.yaml
|
||||
|
||||
releasenotes/build
|
||||
etc/apmec/apmec.conf.sample
|
||||
doc/source/contributor/api
|
4
.gitreview
Normal file
4
.gitreview
Normal file
@ -0,0 +1,4 @@
|
||||
[gerrit]
|
||||
host=review.openstack.org
|
||||
port=29418
|
||||
project=openstack/apmec.git
|
4
.testr.conf
Normal file
4
.testr.conf
Normal file
@ -0,0 +1,4 @@
|
||||
[DEFAULT]
|
||||
test_command=OS_STDOUT_CAPTURE=1 OS_STDERR_CAPTURE=1 OS_LOG_CAPTURE=1 ${PYTHON:-python} -m subunit.run discover -t ./ ${OS_TEST_PATH:-./apmec/tests/unit} $LISTOPT $IDOPTION
|
||||
test_id_option=--load-list $IDFILE
|
||||
test_list_option=--list
|
@ -11,12 +11,15 @@
|
||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from apmec.mem.monitor_drivers.token import Token
|
||||
from apmec import wsgi
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_serialization import jsonutils
|
||||
from six.moves.urllib import parse
|
||||
from apmec.mem.monitor_drivers.token import Token
|
||||
from apmec import wsgi
|
||||
|
||||
# check alarm url with db --> move to plugin
|
||||
|
||||
|
||||
|
@ -17,14 +17,14 @@ import re
|
||||
import sys
|
||||
import yaml
|
||||
|
||||
from oslo_log import log as logging
|
||||
from toscaparser import properties
|
||||
from toscaparser.utils import yamlparser
|
||||
|
||||
from apmec.common import log
|
||||
from apmec.common import utils
|
||||
from apmec.extensions import mem
|
||||
|
||||
from oslo_log import log as logging
|
||||
from toscaparser import properties
|
||||
from toscaparser.utils import yamlparser
|
||||
|
||||
from collections import OrderedDict
|
||||
|
||||
FAILURE = 'tosca.policies.apmec.Failure'
|
||||
@ -66,17 +66,17 @@ FLAVOR_EXTRA_SPECS_LIST = ('cpu_allocation',
|
||||
'numa_nodes')
|
||||
|
||||
delpropmap = {APMECVDU: ('mgmt_driver', 'config', 'service_type',
|
||||
'placement_policy', 'monitoring_policy',
|
||||
'metadata', 'failure_policy'),
|
||||
'placement_policy', 'monitoring_policy',
|
||||
'metadata', 'failure_policy'),
|
||||
APMECCP: ('management',)}
|
||||
|
||||
convert_prop = {APMECCP: {'anti_spoofing_protection':
|
||||
'port_security_enabled',
|
||||
'type':
|
||||
'binding:vnic_type'}}
|
||||
'port_security_enabled',
|
||||
'type':
|
||||
'binding:vnic_type'}}
|
||||
|
||||
convert_prop_values = {APMECCP: {'type': {'sriov': 'direct',
|
||||
'vnic': 'normal'}}}
|
||||
'vnic': 'normal'}}}
|
||||
|
||||
deletenodes = (MONITORING, FAILURE, PLACEMENT)
|
||||
|
||||
|
@ -16,7 +16,8 @@
|
||||
# under the License.
|
||||
|
||||
# If ../apmec/__init__.py exists, add ../ to Python search path, so that
|
||||
# it will override what happens to be installed in /usr/(local/)tosca_lib/python...
|
||||
# it will override what happens to be installed in
|
||||
# /usr/(local/)tosca_lib/python...
|
||||
|
||||
import sys
|
||||
|
||||
|
@ -10,8 +10,8 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from heatclient import client as heatclient
|
||||
from apmec.mem import keystone
|
||||
from heatclient import client as heatclient
|
||||
|
||||
|
||||
class OpenstackClients(object):
|
||||
|
@ -10,6 +10,15 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from apmec.common import exceptions
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.db import db_base
|
||||
from apmec.db.mem import mem_db
|
||||
from apmec.db.meo import meo_db
|
||||
from apmec.extensions import meo
|
||||
from apmec import manager
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from datetime import datetime
|
||||
|
||||
from oslo_db.exception import DBDuplicateEntry
|
||||
@ -19,15 +28,6 @@ from oslo_utils import uuidutils
|
||||
from sqlalchemy.orm import exc as orm_exc
|
||||
from sqlalchemy import sql
|
||||
|
||||
from apmec.common import exceptions
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.db import db_base
|
||||
from apmec.db.meo import meo_db
|
||||
from apmec.db.mem import mem_db
|
||||
from apmec.extensions import meo
|
||||
from apmec import manager
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
|
||||
VIM_ATTRIBUTES = ('id', 'type', 'tenant_id', 'name', 'description',
|
||||
'placement_attr', 'shared', 'is_default',
|
||||
|
@ -26,8 +26,8 @@ revision = '12a57080b278'
|
||||
down_revision = '12a57080b277'
|
||||
|
||||
from alembic import op
|
||||
from sqlalchemy.dialects import mysql
|
||||
from apmec.db import migration
|
||||
from sqlalchemy.dialects import mysql
|
||||
|
||||
|
||||
def upgrade(active_plugins=None, options=None):
|
||||
|
@ -26,8 +26,8 @@ revision = 'e8918cda6433'
|
||||
down_revision = '000632983ada'
|
||||
|
||||
from alembic import op
|
||||
import sqlalchemy as sa
|
||||
from apmec.db.types import Json
|
||||
import sqlalchemy as sa
|
||||
|
||||
|
||||
def upgrade(active_plugins=None, options=None):
|
||||
|
@ -342,7 +342,7 @@ class OpenStack(abstract_driver.DeviceAbstractDriver,
|
||||
'error': str(e)}
|
||||
LOG.warning(error_reason)
|
||||
raise mem.MEAScaleWaitFailed(mea_id=policy['mea']['id'],
|
||||
reason=error_reason)
|
||||
reason=error_reason)
|
||||
|
||||
if stack_retries == 0:
|
||||
metadata = heatclient.resource_metadata(stack_id, policy_name)
|
||||
@ -360,7 +360,7 @@ class OpenStack(abstract_driver.DeviceAbstractDriver,
|
||||
self.STACK_RETRY_WAIT}
|
||||
LOG.warning(error_reason)
|
||||
raise mem.MEAScaleWaitFailed(mea_id=policy['mea']['id'],
|
||||
reason=error_reason)
|
||||
reason=error_reason)
|
||||
stack_retries -= 1
|
||||
|
||||
def _fill_scaling_group_name():
|
||||
|
@ -10,6 +10,11 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
from apmec.common import log
|
||||
from apmec.extensions import common_services as cs
|
||||
from apmec.extensions import mem
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_serialization import jsonutils
|
||||
@ -18,11 +23,6 @@ from toscaparser.utils import yamlparser
|
||||
from translator.hot import tosca_translator
|
||||
import yaml
|
||||
|
||||
from apmec.common import log
|
||||
from apmec.extensions import common_services as cs
|
||||
from apmec.extensions import mem
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
|
@ -12,12 +12,13 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from apmec.common import utils
|
||||
from apmec.mem.monitor_drivers import abstract_driver
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
import random
|
||||
import string
|
||||
from apmec.common import utils
|
||||
from apmec.mem.monitor_drivers import abstract_driver
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
@ -19,11 +19,6 @@ import six
|
||||
import yaml
|
||||
|
||||
import eventlet
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import excutils
|
||||
from oslo_utils import uuidutils
|
||||
from toscaparser.tosca_template import ToscaTemplate
|
||||
|
||||
from apmec.api.v1 import attributes
|
||||
from apmec.common import driver_manager
|
||||
@ -31,12 +26,18 @@ from apmec.common import exceptions
|
||||
from apmec.common import utils
|
||||
from apmec.db.mem import mem_db
|
||||
from apmec.extensions import mem
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
from apmec.mem.mgmt_drivers import constants as mgmt_constants
|
||||
from apmec.mem import monitor
|
||||
from apmec.mem import vim_client
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import excutils
|
||||
from oslo_utils import uuidutils
|
||||
from toscaparser.tosca_template import ToscaTemplate
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
@ -865,4 +866,4 @@ class MEMPlugin(mem_db.MEMPluginDb, MEMMgmtMixin):
|
||||
# Raise exception when MEA.status != ACTIVE
|
||||
else:
|
||||
raise mem.MEAInactive(mea_id=mea_id,
|
||||
message=_(' Cannot fetch details'))
|
||||
message=_(' Cannot fetch details'))
|
||||
|
@ -12,13 +12,13 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.mem.policy_actions import abstract_action
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.plugins.common import constants
|
||||
from apmec.mem.policy_actions import abstract_action
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
|
@ -12,13 +12,13 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.mem.policy_actions import abstract_action
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.plugins.common import constants
|
||||
from apmec.mem.policy_actions import abstract_action
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
|
@ -12,14 +12,14 @@
|
||||
# under the License.
|
||||
#
|
||||
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
|
||||
from apmec.db.common_services import common_services_db_plugin
|
||||
from apmec.plugins.common import constants
|
||||
from apmec.mem.infra_drivers.openstack import heat_client as hc
|
||||
from apmec.mem.policy_actions import abstract_action
|
||||
from apmec.mem import vim_client
|
||||
from apmec.plugins.common import constants
|
||||
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import timeutils
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@ -49,7 +49,7 @@ class VimClient(object):
|
||||
else:
|
||||
try:
|
||||
vim_info = meo_plugin.get_vim(context, vim_id,
|
||||
mask_password=False)
|
||||
mask_password=False)
|
||||
except Exception:
|
||||
raise meo.VimNotFoundException(vim_id=vim_id)
|
||||
LOG.debug('VIM info found for vim id %s', vim_id)
|
||||
|
@ -18,26 +18,25 @@ import os
|
||||
import six
|
||||
import yaml
|
||||
|
||||
from apmec._i18n import _
|
||||
from apmec.common import log
|
||||
from apmec.extensions import meo
|
||||
from apmec.keymgr import API as KEYMGR_API
|
||||
from apmec.mem import keystone
|
||||
from apmec.meo.drivers.vim import abstract_vim_driver
|
||||
from apmec.meo.drivers.workflow import workflow_generator
|
||||
from apmec.mistral import mistral_client
|
||||
|
||||
|
||||
from keystoneauth1 import exceptions
|
||||
from keystoneauth1 import identity
|
||||
from keystoneauth1.identity import v2
|
||||
from keystoneauth1.identity import v3
|
||||
from keystoneauth1 import session
|
||||
from neutronclient.common import exceptions as nc_exceptions
|
||||
from neutronclient.v2_0 import client as neutron_client
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
|
||||
from apmec._i18n import _
|
||||
from apmec.common import log
|
||||
from apmec.extensions import meo
|
||||
from apmec.keymgr import API as KEYMGR_API
|
||||
from apmec.mistral import mistral_client
|
||||
from apmec.meo.drivers.vim import abstract_vim_driver
|
||||
from apmec.meo.drivers.workflow import workflow_generator
|
||||
from apmec.mem import keystone
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
CONF = cfg.CONF
|
||||
|
||||
@ -382,4 +381,4 @@ class NeutronClient(object):
|
||||
def __init__(self, auth_attr):
|
||||
auth = identity.Password(**auth_attr)
|
||||
sess = session.Session(auth=auth)
|
||||
self.client = neutron_client.Client(session=sess)
|
||||
self.client = neutron_client.Client(session=sess)
|
||||
|
@ -19,16 +19,6 @@ import os
|
||||
import time
|
||||
import yaml
|
||||
|
||||
from cryptography import fernet
|
||||
import eventlet
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import excutils
|
||||
from oslo_utils import strutils
|
||||
from oslo_utils import uuidutils
|
||||
from tempfile import mkstemp
|
||||
from toscaparser.tosca_template import ToscaTemplate
|
||||
|
||||
from apmec._i18n import _
|
||||
from apmec.common import driver_manager
|
||||
from apmec.common import log
|
||||
@ -39,12 +29,22 @@ from apmec.extensions import common_services as cs
|
||||
from apmec.extensions import meo
|
||||
from apmec.keymgr import API as KEYMGR_API
|
||||
from apmec import manager
|
||||
from apmec.meo.workflows.vim_monitor import vim_monitor_utils
|
||||
from apmec.plugins.common import constants
|
||||
from apmec.mem import vim_client
|
||||
from apmec.nfv.tacker_client import TackerClient as tackerclient
|
||||
from apmec.meo.workflows.vim_monitor import vim_monitor_utils
|
||||
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
from cryptography import fernet
|
||||
import eventlet
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
from oslo_utils import excutils
|
||||
from oslo_utils import strutils
|
||||
from oslo_utils import uuidutils
|
||||
from tempfile import mkstemp
|
||||
from toscaparser.tosca_template import ToscaTemplate
|
||||
|
||||
|
||||
from toscaparser import tosca_template
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
@ -325,14 +325,6 @@ class MeoPlugin(meo_db_plugin.MeoPluginDb, mes_db.MESPluginDb):
|
||||
inner_mesd_dict = yaml.safe_load(mesd_yaml)
|
||||
mesd['meads'] = dict()
|
||||
LOG.debug('mesd_dict: %s', inner_mesd_dict)
|
||||
# From import we can deploy both NS and MEC Application
|
||||
nsd_imports = inner_mesd_dict['imports'].get('nsds')
|
||||
vnffg_imports = inner_mesd_dict['imports'].get('vnffgds')
|
||||
if nsd_imports:
|
||||
mesd_dict['attributes']['nsds'] = nsd_imports
|
||||
if vnffg_imports:
|
||||
mesd_dict['attributes']['vnffgds'] = vnffg_imports
|
||||
|
||||
# Deploy MEC applications
|
||||
mem_plugin = manager.ApmecManager.get_service_plugins()['MEM']
|
||||
mead_imports = inner_mesd_dict['imports']['meads']
|
||||
@ -422,29 +414,6 @@ class MeoPlugin(meo_db_plugin.MeoPluginDb, mes_db.MESPluginDb):
|
||||
if not mes['mes']['vim_id']:
|
||||
mes['mes']['vim_id'] = vim_res['vim_id']
|
||||
|
||||
nsds = mesd['attributes'].get('nsds')
|
||||
if nsds:
|
||||
for nsd in nsds:
|
||||
vim_obj = self.get_vim(context, mes['mes']['vim_id'], mask_password=False)
|
||||
self._build_vim_auth(context, vim_obj)
|
||||
client = tackerclient(vim_obj['auth_cred'])
|
||||
ns_name = nsd + name
|
||||
nsd_instance = client.nsd_get(nsd)
|
||||
ns_arg = {'ns': {'nsd_id': nsd_instance, 'name': ns_name}}
|
||||
ns_instance = client.ns_create(ns_arg)
|
||||
|
||||
vnffgds = mesd['attributes'].get('vnffgds')
|
||||
if vnffgds:
|
||||
for vnffgd in vnffgds:
|
||||
vim_obj = self.get_vim(context, mes['mes']['vim_id'], mask_password=False)
|
||||
self._build_vim_auth(context, vim_obj)
|
||||
client = tackerclient(vim_obj['auth_cred'])
|
||||
vnffgd_name = vnffgd + name
|
||||
vnffgd_instance = client.vnffgd_get(vnffgd)
|
||||
vnffg_arg = {'vnffg': {'vnffgd_id': vnffgd_instance, 'name': vnffgd_name}}
|
||||
time.sleep(300)
|
||||
vnffg_instance = client.vnffg_create(vnffg_arg)
|
||||
|
||||
# Step-1
|
||||
param_values = mes['mes']['attributes'].get('param_values', {})
|
||||
if 'get_input' in str(mesd_dict):
|
||||
|
@ -12,15 +12,14 @@
|
||||
|
||||
import yaml
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
|
||||
from apmec.common import rpc
|
||||
from apmec.mem import keystone
|
||||
from apmec.meo.workflows.vim_monitor import workflow_generator
|
||||
from apmec.mistral.actionrpc import kill_action as killaction
|
||||
from apmec.mistral import mistral_client
|
||||
from apmec.meo.workflows.vim_monitor import workflow_generator
|
||||
from apmec.mem import keystone
|
||||
|
||||
from oslo_config import cfg
|
||||
from oslo_log import log as logging
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@ -10,10 +10,9 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from oslo_log import log as logging
|
||||
|
||||
from apmec.mistral import workflow_generator
|
||||
from apmec.meo.workflows import vim_monitor
|
||||
from apmec.mistral import workflow_generator
|
||||
from oslo_log import log as logging
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
@ -1,104 +0,0 @@
|
||||
# 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.
|
||||
from keystoneauth1 import identity
|
||||
from keystoneauth1 import session
|
||||
from tackerclient.v1_0 import client as tacker_client
|
||||
|
||||
|
||||
class TackerClient(object):
|
||||
"""Tacker Client class for VNFM and NFVO negotiation"""
|
||||
|
||||
def __init__(self, auth_attr):
|
||||
auth = identity.Password(**auth_attr)
|
||||
sess = session.Session(auth=auth)
|
||||
self.client = tacker_client.Client(session=sess)
|
||||
|
||||
def nsd_create(self, nsd_dict):
|
||||
nsd_instance = self.client.create_nsd(body=nsd_dict)
|
||||
if nsd_instance:
|
||||
return nsd_instance['nsd']['id']
|
||||
else:
|
||||
return None
|
||||
|
||||
def nsd_get(self, nsd_name):
|
||||
nsd_dict = self.client.list_nsds()
|
||||
nsd_list = nsd_dict['nsds']
|
||||
nsd_id = None
|
||||
for nsd in nsd_list:
|
||||
if nsd['name'] == nsd_name:
|
||||
nsd_id = nsd['id']
|
||||
return nsd_id
|
||||
|
||||
def ns_create(self, ns_dict):
|
||||
ns_instance = self.client.create_ns(body=ns_dict)
|
||||
if ns_instance:
|
||||
return ns_instance['ns']['id']
|
||||
else:
|
||||
return None
|
||||
|
||||
def ns_get(self, ns_name):
|
||||
ns_dict = self.client.list_nsds()
|
||||
ns_list = ns_dict['nss']
|
||||
ns_id = None
|
||||
for ns in ns_list:
|
||||
if ns['name'] == ns_name:
|
||||
ns_id = ns['id']
|
||||
return ns_id
|
||||
|
||||
def ns_delete(self, ns_name):
|
||||
nsd_id = self.ns_get(ns_name)
|
||||
if nsd_id:
|
||||
self.client.delete_ns(nsd_id)
|
||||
|
||||
def vnfd_create(self, vnfd_dict):
|
||||
vnfd_instance = self.client.create_vnfd(body=vnfd_dict)
|
||||
if vnfd_instance:
|
||||
return vnfd_instance['vnf']['id']
|
||||
else:
|
||||
return None
|
||||
|
||||
def vnf_create(self, vnf_dict):
|
||||
vnf_instance = self.client.create_vnf(body=vnf_dict)
|
||||
if vnf_instance:
|
||||
return vnf_instance['vnf']['id']
|
||||
else:
|
||||
return None
|
||||
|
||||
def vnffgd_get(self, vnffgd_name):
|
||||
vnffgd_dict = self.client.list_vnffgds()
|
||||
vnffgd_list = vnffgd_dict['vnffgds']
|
||||
vnffgd_id = None
|
||||
for vnffgd in vnffgd_list:
|
||||
if vnffgd['name'] == vnffgd_name:
|
||||
vnffgd_id = vnffgd['id']
|
||||
return vnffgd_id
|
||||
|
||||
def vnffg_create(self, vnffgd_dict):
|
||||
vnffg_instance = self.client.create_vnffg(body=vnffgd_dict)
|
||||
if vnffg_instance:
|
||||
return vnffg_instance['vnffg']['id']
|
||||
else:
|
||||
return None
|
||||
|
||||
def vnffg_get(self, vnffg_name):
|
||||
vnffg_dict = self.client.list_vnffgs()
|
||||
vnffg_list = vnffg_dict['vnffgs']
|
||||
vnffg_id = None
|
||||
for vnffg in vnffg_list:
|
||||
if vnffg['name'] == vnffg_name:
|
||||
vnffg_id = vnffg['id']
|
||||
return vnffg_id
|
||||
|
||||
def vnffg_delete(self, vnffg_name):
|
||||
vnffg_id = self.vnffg_get(vnffg_name)
|
||||
if vnffg_id:
|
||||
self.client.delete_vnffg(vnffg_id)
|
@ -19,6 +19,6 @@ MEA_CIRROS_DEAD_TIMEOUT = 500
|
||||
ACTIVE_SLEEP_TIME = 3
|
||||
DEAD_SLEEP_TIME = 1
|
||||
SCALE_WINDOW_SLEEP_TIME = 120
|
||||
NS_CREATE_TIMEOUT = 400
|
||||
NS_DELETE_TIMEOUT = 300
|
||||
MES_CREATE_TIMEOUT = 400
|
||||
MES_DELETE_TIMEOUT = 300
|
||||
NOVA_CLIENT_VERSION = 2
|
||||
|
@ -1,2 +0,0 @@
|
||||
#!/bin/sh
|
||||
echo "Successfully installed MEAC" > /apmec
|
@ -1,57 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
disk_size: 1 GB
|
||||
mem_size: 512 MB
|
||||
num_cpus: 2
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
mgmt_driver: noop
|
||||
availability_zone: nova
|
||||
metadata: {metering.mea: VDU1}
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
policies:
|
||||
- vdu1_cpu_usage_monitoring_policy:
|
||||
type: tosca.policies.apmec.Alarming
|
||||
triggers:
|
||||
vdu_hcpu_usage_respawning:
|
||||
event_type:
|
||||
type: tosca.events.resource.utilization
|
||||
implementation: ceilometer
|
||||
meter_name: cpu_util
|
||||
condition:
|
||||
threshold: 50
|
||||
constraint: utilization greater_than 50%
|
||||
period: 600
|
||||
evaluations: 1
|
||||
method: average
|
||||
comparison_operator: gt
|
||||
metadata: VDU1
|
||||
action: [respawn]
|
@ -1,82 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
disk_size: 1 GB
|
||||
mem_size: 512 MB
|
||||
num_cpus: 2
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
mgmt_driver: noop
|
||||
availability_zone: nova
|
||||
metadata: {metering.mea: SG1}
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
policies:
|
||||
- SP1:
|
||||
type: tosca.policies.apmec.Scaling
|
||||
targets: [VDU1]
|
||||
properties:
|
||||
increment: 1
|
||||
cooldown: 60
|
||||
min_instances: 1
|
||||
max_instances: 3
|
||||
default_instances: 2
|
||||
|
||||
- vdu_cpu_usage_monitoring_policy:
|
||||
type: tosca.policies.apmec.Alarming
|
||||
triggers:
|
||||
vdu_hcpu_usage_scaling_out:
|
||||
event_type:
|
||||
type: tosca.events.resource.utilization
|
||||
implementation: ceilometer
|
||||
meter_name: cpu_util
|
||||
condition:
|
||||
threshold: 50
|
||||
constraint: utilization greater_than 50%
|
||||
period: 600
|
||||
evaluations: 1
|
||||
method: average
|
||||
comparison_operator: gt
|
||||
metadata: SG1
|
||||
action: [SP1]
|
||||
|
||||
vdu_hcpu_usage_scaling_in:
|
||||
event_type:
|
||||
type: tosca.events.resource.utilization
|
||||
implementation: ceilometer
|
||||
meter_name: cpu_util
|
||||
condition:
|
||||
threshold: 10
|
||||
constraint: utilization less_than 10%
|
||||
period: 600
|
||||
evaluations: 1
|
||||
method: average
|
||||
comparison_operator: lt
|
||||
metadata: SG1
|
||||
action: [SP1]
|
@ -1,10 +0,0 @@
|
||||
{
|
||||
image_name: 'cirros-0.3.5-x86_64-disk',
|
||||
flavor: 'm1.tiny',
|
||||
zone: 'nova',
|
||||
network: 'net_mgmt',
|
||||
management: 'true',
|
||||
pkt_in_network: 'net0',
|
||||
pkt_out_network: 'net1',
|
||||
vendor: 'apmec'
|
||||
}
|
@ -1,59 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
num_cpus: 1
|
||||
mem_size: 512 MB
|
||||
disk_size: 1 GB
|
||||
properties:
|
||||
name: test-vdu-block-storage
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
name: test-cp
|
||||
management: true
|
||||
order: 0
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VB1:
|
||||
type: tosca.nodes.BlockStorage.Apmec
|
||||
properties:
|
||||
size: 1 GB
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
|
||||
CB1:
|
||||
type: tosca.nodes.BlockStorageAttachment
|
||||
properties:
|
||||
location: /dev/vdb
|
||||
requirements:
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
- virtualAttachment:
|
||||
node: VB1
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
@ -1,68 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1_flavor_func:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
num_cpus: 1
|
||||
disk_size: 1 GB
|
||||
mem_size: 512 MB
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1_flavor_func
|
||||
|
||||
CP2:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1_flavor_func
|
||||
|
||||
CP3:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1_flavor_func
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,71 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example with auto image creation
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-image
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1_image_func:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
artifacts:
|
||||
MEAImage_image_func:
|
||||
type: tosca.artifacts.Deployment.Image.VM
|
||||
file: http://download.cirros-cloud.net/0.3.5/cirros-0.3.5-x86_64-disk.img
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1_image_func
|
||||
|
||||
CP2:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1_image_func
|
||||
|
||||
CP3:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1_image_func
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,137 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-large-template
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
user_data_format: RAW
|
||||
user_data: |
|
||||
#!/bin/sh
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
|
||||
CP11:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP12:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
user_data_format: RAW
|
||||
user_data: |
|
||||
#!/bin/sh
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
|
||||
CP21:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP22:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
@ -1,52 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: MEAD With Ping Monitor
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-monitor
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
monitoring_policy:
|
||||
name: ping
|
||||
actions:
|
||||
failure: respawn
|
||||
parameters:
|
||||
count: 3
|
||||
interval: 10
|
||||
monitoring_delay: 45
|
||||
timeout: 2
|
||||
config_drive: true
|
||||
user_data_format: RAW
|
||||
user_data: |
|
||||
#!/bin/sh
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
df -h > /tmp/test.txt
|
||||
sleep 90
|
||||
sudo ifdown eth0
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: ACME
|
@ -1,175 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Multi VDU monitoring example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-multi-vdu-monitoring
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
mgmt_driver: noop
|
||||
monitoring_policy:
|
||||
name: ping
|
||||
actions:
|
||||
failure: respawn
|
||||
parameters:
|
||||
count: 3
|
||||
interval: 10
|
||||
monitoring_delay: 45
|
||||
timeout: 2
|
||||
|
||||
CP11:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: True
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP12:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP13:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
monitoring_policy:
|
||||
name: ping
|
||||
actions:
|
||||
failure: respawn
|
||||
parameters:
|
||||
count: 3
|
||||
interval: 10
|
||||
monitoring_delay: 45
|
||||
timeout: 2
|
||||
|
||||
CP21:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP22:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP23:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VDU3:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
monitoring_policy:
|
||||
name: ping
|
||||
actions:
|
||||
failure: respawn
|
||||
parameters:
|
||||
count: 3
|
||||
interval: 10
|
||||
monitoring_delay: 45
|
||||
timeout: 2
|
||||
config_drive: true
|
||||
user_data_format: RAW
|
||||
user_data: |
|
||||
#!/bin/sh
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
df -h > /home/cirros/diskinfo
|
||||
sleep 90
|
||||
sudo ifdown eth0
|
||||
|
||||
CP31:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
CP32:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
CP33:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,152 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP11:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP12:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP13:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP21:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP22:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP23:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VDU3:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP31:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
CP32:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
CP33:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU3
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,101 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: MEA TOSCA template with input parameters
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
inputs:
|
||||
image_name:
|
||||
type: string
|
||||
description: Image Name
|
||||
|
||||
flavor:
|
||||
type: string
|
||||
description: Flavor Information
|
||||
|
||||
zone:
|
||||
type: string
|
||||
description: Zone Information
|
||||
|
||||
network:
|
||||
type: string
|
||||
description: mgmt network
|
||||
|
||||
management:
|
||||
type: string
|
||||
description: management network
|
||||
|
||||
pkt_in_network:
|
||||
type: string
|
||||
description: In network
|
||||
|
||||
pkt_out_network:
|
||||
type: string
|
||||
description: Out network
|
||||
|
||||
vendor:
|
||||
type: string
|
||||
description: Vendor information
|
||||
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: { get_input: image_name}
|
||||
flavor: {get_input: flavor}
|
||||
availability_zone: { get_input: zone }
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: { get_input: management }
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP2:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP3:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: { get_input: network }
|
||||
vendor: {get_input: vendor}
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: { get_input: pkt_in_network }
|
||||
vendor: {get_input: vendor}
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: { get_input: pkt_out_network }
|
||||
vendor: {get_input: vendor}
|
@ -1,72 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: MEAD with predefined properties.
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
num_cpus: 1
|
||||
mem_size: 512 MB
|
||||
disk_size: 1 GB
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
ip_address: 192.168.120.225
|
||||
anti_spoofing_protection: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP2:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP3:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
vendor: ACME
|
||||
network_name: net_mgmt
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,82 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead
|
||||
|
||||
topology_template:
|
||||
inputs:
|
||||
vdu-name:
|
||||
type: string
|
||||
description: Vdu name
|
||||
default: test-vdu
|
||||
cp-name:
|
||||
type: string
|
||||
description: Cp name
|
||||
default: test-cp
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
name: {get_input : vdu-name}
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
key_name: userKey
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
name: {get_input : cp-name}
|
||||
management: true
|
||||
anti_spoofing_protection: true
|
||||
security_groups:
|
||||
- test_secgrp
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP2:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP3:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL3
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
||||
VL3:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net1
|
||||
vendor: Apmec
|
@ -1,50 +0,0 @@
|
||||
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: sample-tosca-mead-scaling
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-scaling
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
num_cpus: 1
|
||||
mem_size: 512 MB
|
||||
disk_size: 1 GB
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
mgmt_driver: noop
|
||||
availability_zone: nova
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
policies:
|
||||
- SP1:
|
||||
type: tosca.policies.apmec.Scaling
|
||||
targets: [VDU1]
|
||||
properties:
|
||||
increment: 1
|
||||
cooldown: 60
|
||||
min_instances: 1
|
||||
max_instances: 3
|
||||
default_instances: 2
|
@ -1,44 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Example Floating IP - Allocate one IP from floating network and attach to CP.
|
||||
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-test-fip-with-floating-network
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
capabilities:
|
||||
mec_compute:
|
||||
properties:
|
||||
disk_size: 1 GB
|
||||
mem_size: 512 MB
|
||||
num_cpus: 1
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
mgmt_driver: noop
|
||||
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
FIP1:
|
||||
type: tosca.nodes.network.FloatingIP
|
||||
properties:
|
||||
floating_network: public
|
||||
requirements:
|
||||
- link:
|
||||
node: CP1
|
@ -1,42 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
metadata:
|
||||
template_name: sample-tosca-mead-for-meac
|
||||
|
||||
topology_template:
|
||||
node_templates:
|
||||
firewall_meac:
|
||||
type: tosca.nodes.mec.MEAC.Apmec
|
||||
requirements:
|
||||
- host: VDU1
|
||||
interfaces:
|
||||
Standard:
|
||||
create: install_meac.sh
|
||||
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
flavor: m1.small
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
artifacts:
|
||||
fedora:
|
||||
type: tosca.artifacts.Deployment.Image.VM
|
||||
file: https://github.com/bharaththiruveedula/dotfiles/raw/master/fedora-sw.qcow2
|
||||
CP1:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: private
|
||||
vendor: Apmec
|
@ -1,37 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
imports:
|
||||
- test-mes-mead1
|
||||
- test-mes-mead2
|
||||
|
||||
topology_template:
|
||||
inputs:
|
||||
vl1_name:
|
||||
type: string
|
||||
description: name of VL1 virtuallink
|
||||
default: net_mgmt
|
||||
vl2_name:
|
||||
type: string
|
||||
description: name of VL2 virtuallink
|
||||
default: net0
|
||||
node_templates:
|
||||
MEA1:
|
||||
type: tosca.nodes.mec.MEA1
|
||||
requirements:
|
||||
- virtualLink1: VL1
|
||||
- virtualLink2: VL2
|
||||
|
||||
MEA2:
|
||||
type: tosca.nodes.mec.MEA2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: {get_input: vl1_name}
|
||||
vendor: apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: {get_input: vl2_name}
|
||||
vendor: apmec
|
||||
|
@ -1,98 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
node_types:
|
||||
tosca.nodes.mec.MEA1:
|
||||
requirements:
|
||||
- virtualLink1:
|
||||
type: tosca.nodes.mec.VL
|
||||
required: true
|
||||
- virtualLink2:
|
||||
type: tosca.nodes.mec.VL
|
||||
required: true
|
||||
capabilities:
|
||||
forwader1:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
forwader2:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
|
||||
topology_template:
|
||||
substitution_mappings:
|
||||
node_type: tosca.nodes.mec.MEA1
|
||||
requirements:
|
||||
virtualLink1: [CP11, virtualLink]
|
||||
virtualLink2: [CP14, virtualLink]
|
||||
capabilities:
|
||||
forwarder1: [CP11, forwarder]
|
||||
forwarder2: [CP14, forwarder]
|
||||
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP11:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP12:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP13:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP14:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
@ -1,68 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
node_types:
|
||||
tosca.nodes.mec.MEA2:
|
||||
capabilities:
|
||||
forwarder1:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
topology_template:
|
||||
substitution_mappings:
|
||||
node_type: tosca.nodes.mec.MEA2
|
||||
capabilities:
|
||||
forwarder1: [CP21, forwarder]
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP21:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP22:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
@ -1,98 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
node_types:
|
||||
tosca.nodes.mec.MEA1:
|
||||
requirements:
|
||||
- virtualLink1:
|
||||
type: tosca.nodes.mec.VL
|
||||
required: true
|
||||
- virtualLink2:
|
||||
type: tosca.nodes.mec.VL
|
||||
required: true
|
||||
capabilities:
|
||||
forwader1:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
forwader2:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
|
||||
topology_template:
|
||||
substitution_mappings:
|
||||
node_type: tosca.nodes.mec.MEA1
|
||||
requirements:
|
||||
virtualLink1: [CP11, virtualLink]
|
||||
virtualLink2: [CP14, virtualLink]
|
||||
capabilities:
|
||||
forwarder1: [CP11, forwarder]
|
||||
forwarder2: [CP14, forwarder]
|
||||
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP11:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
CP12:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP13:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
CP14:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
@ -1,68 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
|
||||
description: Demo example
|
||||
|
||||
node_types:
|
||||
tosca.nodes.mec.MEA2:
|
||||
capabilities:
|
||||
forwarder1:
|
||||
type: tosca.capabilities.mec.Forwarder
|
||||
topology_template:
|
||||
substitution_mappings:
|
||||
node_type: tosca.nodes.mec.MEA2
|
||||
capabilities:
|
||||
forwarder1: [CP21, forwarder]
|
||||
node_templates:
|
||||
VDU1:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP21:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
properties:
|
||||
management: true
|
||||
anti_spoofing_protection: false
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL1
|
||||
- virtualBinding:
|
||||
node: VDU1
|
||||
|
||||
VDU2:
|
||||
type: tosca.nodes.mec.VDU.Apmec
|
||||
properties:
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.medium
|
||||
availability_zone: nova
|
||||
mgmt_driver: noop
|
||||
config: |
|
||||
param0: key1
|
||||
param1: key2
|
||||
|
||||
CP22:
|
||||
type: tosca.nodes.mec.CP.Apmec
|
||||
requirements:
|
||||
- virtualLink:
|
||||
node: VL2
|
||||
- virtualBinding:
|
||||
node: VDU2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net_mgmt
|
||||
vendor: Apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: net0
|
||||
vendor: Apmec
|
||||
|
@ -1,37 +0,0 @@
|
||||
tosca_definitions_version: tosca_simple_profile_for_mec_1_0_0
|
||||
imports:
|
||||
- test-mesd-mead1
|
||||
- test-mesd-mead2
|
||||
|
||||
topology_template:
|
||||
inputs:
|
||||
vl1_name:
|
||||
type: string
|
||||
description: name of VL1 virtuallink
|
||||
default: net_mgmt
|
||||
vl2_name:
|
||||
type: string
|
||||
description: name of VL2 virtuallink
|
||||
default: net0
|
||||
node_templates:
|
||||
MEA1:
|
||||
type: tosca.nodes.mec.MEA1
|
||||
requirements:
|
||||
- virtualLink1: VL1
|
||||
- virtualLink2: VL2
|
||||
|
||||
MEA2:
|
||||
type: tosca.nodes.mec.MEA2
|
||||
|
||||
VL1:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: {get_input: vl1_name}
|
||||
vendor: apmec
|
||||
|
||||
VL2:
|
||||
type: tosca.nodes.mec.VL
|
||||
properties:
|
||||
network_name: {get_input: vl2_name}
|
||||
vendor: apmec
|
||||
|
@ -10,8 +10,8 @@
|
||||
# License for the specific language governing permissions and limitations
|
||||
# under the License.
|
||||
|
||||
from heatclient import client as heatclient
|
||||
from apmec.tests.functional import keystone
|
||||
from heatclient import client as heatclient
|
||||
|
||||
|
||||
class OpenstackClients(object):
|
||||
|
@ -1,106 +0,0 @@
|
||||
# Copyright 2015 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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.
|
||||
|
||||
from oslo_config import cfg
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
CONF = cfg.CONF
|
||||
MEA_CIRROS_CREATE_TIMEOUT = 120
|
||||
|
||||
|
||||
class MeaTestCreate(base.BaseApmecTest):
|
||||
def _test_create_delete_mea(self, mea_name, mead_name, vim_id=None):
|
||||
data = dict()
|
||||
data['tosca'] = read_file('sample-tosca-mead-no-monitor.yaml')
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
if vim_id:
|
||||
mea_arg['mea']['vim_id'] = vim_id
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertIsNotNone(self.client.show_mea(mea_id)['mea']['mgmt_url'])
|
||||
if vim_id:
|
||||
self.assertEqual(vim_id, mea_instance['mea']['vim_id'])
|
||||
|
||||
# Get mea details when mea is in active state
|
||||
mea_details = self.client.list_mea_resources(mea_id)['resources'][0]
|
||||
self.assertIn('name', mea_details)
|
||||
self.assertIn('id', mea_details)
|
||||
self.assertIn('type', mea_details)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
# update VIM name when MEAs are active.
|
||||
# check for exception.
|
||||
vim0_id = mea_instance['mea']['vim_id']
|
||||
msg = "VIM %s is still in use by MEA" % vim0_id
|
||||
try:
|
||||
update_arg = {'vim': {'name': "mea_vim"}}
|
||||
self.client.update_vim(vim0_id, update_arg)
|
||||
except Exception as err:
|
||||
self.assertEqual(err.message, msg)
|
||||
else:
|
||||
self.assertTrue(
|
||||
False,
|
||||
"Name of vim(s) with active mea(s) should not be changed!")
|
||||
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
|
||||
def test_create_delete_mea_with_default_vim(self):
|
||||
self._test_create_delete_mea(
|
||||
mea_name='test_mea_with_cirros_no_monitoring_default_vim',
|
||||
mead_name='sample_cirros_mea_no_monitoring_default_vim')
|
||||
|
||||
def test_create_delete_mea_with_vim_id(self):
|
||||
vim_list = self.client.list_vims()
|
||||
vim0_id = self.get_vim(vim_list, 'VIM0')['id']
|
||||
self._test_create_delete_mea(
|
||||
vim_id=vim0_id,
|
||||
mea_name='test_mea_with_cirros_vim_id',
|
||||
mead_name='sample_cirros_mea_no_monitoring_vim_id')
|
@ -1,67 +0,0 @@
|
||||
# Copyright 2015 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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.
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
class MeaTestPingMonitor(base.BaseApmecTest):
|
||||
|
||||
def _test_mea_with_monitoring(self, mead_file, mea_name):
|
||||
data = dict()
|
||||
data['tosca'] = read_file(mead_file)
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mea_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
# Verify mea goes from ACTIVE->DEAD->ACTIVE states
|
||||
self.verify_mea_restart(mead_instance, mea_instance)
|
||||
|
||||
# Delete mea_instance with mea_id
|
||||
mea_id = mea_instance['mea']['id']
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, ("Failed to delete mea %s after the monitor test" %
|
||||
mea_id)
|
||||
|
||||
# Verify MEA monitor events captured for states, ACTIVE and DEAD
|
||||
mea_state_list = [evt_constants.ACTIVE, evt_constants.DEAD]
|
||||
self.verify_mea_monitor_events(mea_id, mea_state_list)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
|
||||
def test_create_delete_mea_monitoring_tosca_template(self):
|
||||
self._test_mea_with_monitoring(
|
||||
'sample-tosca-mead-monitor.yaml',
|
||||
'ping monitor mea with tosca template')
|
||||
|
||||
def test_create_delete_mea_multi_vdu_monitoring_tosca_template(self):
|
||||
self._test_mea_with_monitoring(
|
||||
'sample-tosca-mead-multi-vdu-monitoring.yaml',
|
||||
'ping monitor multi vdu mea with tosca template')
|
@ -1,129 +0,0 @@
|
||||
# Copyright 2015 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 yaml
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
class MemTestParam(base.BaseApmecTest):
|
||||
def _test_mead_create(self, mead_file, mead_name):
|
||||
yaml_input = read_file(mead_file)
|
||||
req_dict = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': yaml_input}}}
|
||||
|
||||
# Create mead
|
||||
mead_instance = self.client.create_mead(body=req_dict)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
mead_id = mead_instance['mead']['id']
|
||||
self.assertIsNotNone(mead_id)
|
||||
self.verify_mead_events(
|
||||
mead_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.RES_EVT_ONBOARDED)
|
||||
return mead_instance
|
||||
|
||||
def _test_mead_delete(self, mead_instance):
|
||||
# Delete mead
|
||||
mead_id = mead_instance['mead']['id']
|
||||
self.assertIsNotNone(mead_id)
|
||||
try:
|
||||
self.client.delete_mead(mead_id)
|
||||
except Exception:
|
||||
assert False, "mead Delete failed"
|
||||
self.verify_mead_events(mead_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.RES_EVT_NA_STATE)
|
||||
try:
|
||||
mead_d = self.client.show_mead(mead_id)
|
||||
except Exception:
|
||||
assert True, "Mead Delete success" + str(mead_d) + str(Exception)
|
||||
|
||||
def _test_mea_create(self, mead_instance, mea_name, param_values):
|
||||
# Create the mea with values
|
||||
mead_id = mead_instance['mead']['id']
|
||||
# Create mea with values file
|
||||
mea_dict = dict()
|
||||
mea_dict = {'mea': {'mead_id': mead_id, 'name': mea_name,
|
||||
'attributes': {'param_values': param_values}}}
|
||||
mea_instance = self.client.create_mea(body=mea_dict)
|
||||
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertIsNotNone(self.client.show_mea(mea_id)['mea']['mgmt_url'])
|
||||
mea_instance = self.client.show_mea(mea_id)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
# Verify values dictionary is same as param values from mea_show
|
||||
|
||||
param_values = mea_instance['mea']['attributes']['param_values']
|
||||
param_values_dict = yaml.safe_load(param_values)
|
||||
|
||||
return mea_instance, param_values_dict
|
||||
|
||||
def _test_mea_delete(self, mea_instance):
|
||||
# Delete Mea
|
||||
mea_id = mea_instance['mea']['id']
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
try:
|
||||
mea_d = self.client.show_mea(mea_id)
|
||||
except Exception:
|
||||
assert True, "Mea Delete success" + str(mea_d) + str(Exception)
|
||||
|
||||
def test_mead_param_tosca_template(self):
|
||||
mead_name = 'sample_cirros_mead_tosca'
|
||||
mead_instance = self._test_mead_create(
|
||||
'sample-tosca-mead-param.yaml', mead_name)
|
||||
self._test_mead_delete(mead_instance)
|
||||
|
||||
def test_mea_param_tosca_template(self):
|
||||
mead_name = 'cirros_mead_tosca_param'
|
||||
mead_instance = self._test_mead_create(
|
||||
'sample-tosca-mead-param.yaml', mead_name)
|
||||
values_str = read_file('sample-tosca-mea-values.yaml')
|
||||
values_dict = yaml.safe_load(values_str)
|
||||
mea_instance, param_values_dict = self._test_mea_create(mead_instance,
|
||||
'test_mea_with_parameters_tosca_template',
|
||||
values_dict)
|
||||
self.assertEqual(values_dict, param_values_dict)
|
||||
self._test_mea_delete(mea_instance)
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
self.addCleanup(self.client.delete_mead, mead_instance['mead']['id'])
|
@ -1,282 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 time
|
||||
import unittest
|
||||
import yaml
|
||||
|
||||
from novaclient import exceptions
|
||||
from oslo_config import cfg
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
MEA_CIRROS_CREATE_TIMEOUT = 120
|
||||
|
||||
|
||||
class MeaTestToscaCreate(base.BaseApmecTest):
|
||||
def _test_create_mea(self, mead_file, mea_name,
|
||||
template_source="onboarded"):
|
||||
data = dict()
|
||||
values_str = read_file(mead_file)
|
||||
data['tosca'] = values_str
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mea_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
if template_source == "onboarded":
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
if template_source == 'inline':
|
||||
# create mea directly from template
|
||||
template = yaml.safe_load(values_str)
|
||||
mea_arg = {'mea': {'mead_template': template, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
mead_id = mea_instance['mea']['mead_id']
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mea_show_out = self.client.show_mea(mea_id)['mea']
|
||||
self.assertIsNotNone(mea_show_out['mgmt_url'])
|
||||
|
||||
input_dict = yaml.safe_load(values_str)
|
||||
prop_dict = input_dict['topology_template']['node_templates'][
|
||||
'CP1']['properties']
|
||||
|
||||
# Verify if ip_address is static, it is same as in show_mea
|
||||
if prop_dict.get('ip_address'):
|
||||
mgmt_url_input = prop_dict.get('ip_address')
|
||||
mgmt_info = yaml.safe_load(
|
||||
mea_show_out['mgmt_url'])
|
||||
self.assertEqual(mgmt_url_input, mgmt_info['VDU1'])
|
||||
|
||||
# Verify anti spoofing settings
|
||||
stack_id = mea_show_out['instance_id']
|
||||
template_dict = input_dict['topology_template']['node_templates']
|
||||
for field in template_dict.keys():
|
||||
prop_dict = template_dict[field]['properties']
|
||||
if prop_dict.get('anti_spoofing_protection'):
|
||||
self.verify_antispoofing_in_stack(stack_id=stack_id,
|
||||
resource_name=field)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
return mead_id, mea_id
|
||||
|
||||
def _test_delete_mea(self, mea_id):
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
def _test_cleanup_mead(self, mead_id, mea_id):
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
|
||||
def _test_create_delete_mea_tosca(self, mead_file, mea_name,
|
||||
template_source):
|
||||
mead_id, mea_id = self._test_create_mea(mead_file, mea_name,
|
||||
template_source)
|
||||
servers = self.novaclient().servers.list()
|
||||
vdus = []
|
||||
for server in servers:
|
||||
vdus.append(server.name)
|
||||
self.assertIn('test-vdu', vdus)
|
||||
|
||||
port_list = self.neutronclient().list_ports()['ports']
|
||||
vdu_ports = []
|
||||
for port in port_list:
|
||||
vdu_ports.append(port['name'])
|
||||
self.assertIn('test-cp', vdu_ports)
|
||||
self._test_delete_mea(mea_id)
|
||||
if template_source == "onboarded":
|
||||
self._test_cleanup_mead(mead_id, mea_id)
|
||||
|
||||
def test_create_delete_mea_tosca_from_mead(self):
|
||||
self._test_create_delete_mea_tosca('sample-tosca-mead.yaml',
|
||||
'test_tosca_mea_with_cirros',
|
||||
'onboarded')
|
||||
|
||||
def test_create_delete_mea_from_template(self):
|
||||
self._test_create_delete_mea_tosca('sample-tosca-mead.yaml',
|
||||
'test_tosca_mea_with_cirros_inline',
|
||||
'inline')
|
||||
|
||||
def test_re_create_delete_mea(self):
|
||||
self._test_create_delete_mea_tosca('sample-tosca-mead.yaml',
|
||||
'test_mea',
|
||||
'inline')
|
||||
time.sleep(1)
|
||||
self._test_create_delete_mea_tosca('sample-tosca-mead.yaml',
|
||||
'test_mea',
|
||||
'inline')
|
||||
|
||||
def test_create_delete_mea_static_ip(self):
|
||||
mead_id, mea_id = self._test_create_mea(
|
||||
'sample-tosca-mead-static-ip.yaml',
|
||||
'test_tosca_mea_with_cirros_no_monitoring')
|
||||
self._test_delete_mea(mea_id)
|
||||
self._test_cleanup_mead(mead_id, mea_id)
|
||||
|
||||
|
||||
class MeaTestToscaCreateFlavorCreation(base.BaseApmecTest):
|
||||
def test_create_delete_mea_tosca_no_monitoring(self):
|
||||
mead_name = 'tosca_mead_with_auto_flavor'
|
||||
input_yaml = read_file('sample-tosca-mead-flavor.yaml')
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
tosca_arg = {'mead': {'name': mead_name, 'attributes': {'mead':
|
||||
tosca_dict}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mea_name = 'tosca_mea_with_auto_flavor'
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertIsNotNone(self.client.show_mea(mea_id)['mea']['mgmt_url'])
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
servers = self.novaclient().servers.list()
|
||||
vdu_server = None
|
||||
for server in servers:
|
||||
if 'VDU1_flavor_func' in server.name:
|
||||
vdu_server = server
|
||||
break
|
||||
self.assertIsNotNone(vdu_server)
|
||||
flavor_id = server.flavor["id"]
|
||||
nova_flavors = self.novaclient().flavors
|
||||
flavor = nova_flavors.get(flavor_id)
|
||||
self.assertIsNotNone(flavor)
|
||||
self.assertEqual(True, "VDU1_flavor_func_flavor" in flavor.name)
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.assertRaises(exceptions.NotFound, nova_flavors.delete,
|
||||
[flavor_id])
|
||||
|
||||
|
||||
class MeaTestToscaCreateImageCreation(base.BaseApmecTest):
|
||||
|
||||
@unittest.skip("Until BUG 1673099")
|
||||
def test_create_delete_mea_tosca_no_monitoring(self):
|
||||
mead_name = 'tosca_mead_with_auto_image'
|
||||
input_yaml = read_file('sample-tosca-mead-image.yaml')
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
tosca_arg = {'mead': {'name': mead_name, 'attributes': {'mead':
|
||||
tosca_dict}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_name = 'tosca_mea_with_auto_image'
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertIsNotNone(self.client.show_mea(mea_id)['mea']['mgmt_url'])
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
servers = self.novaclient().servers.list()
|
||||
vdu_server = None
|
||||
for server in servers:
|
||||
if 'VDU1_image_func' in server.name:
|
||||
vdu_server = server
|
||||
break
|
||||
self.assertIsNotNone(vdu_server)
|
||||
image_id = vdu_server.image["id"]
|
||||
nova_images = self.novaclient().images
|
||||
image = nova_images.get(image_id)
|
||||
self.assertIsNotNone(image)
|
||||
self.assertEqual(True, "MEAImage_image_func" in image.name)
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.assertRaises(exceptions.NotFound, nova_images.delete,
|
||||
[image_id])
|
@ -1,151 +0,0 @@
|
||||
#
|
||||
#
|
||||
# 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 json
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
import yaml
|
||||
|
||||
|
||||
class MeaTestAlarmMonitor(base.BaseApmecTest):
|
||||
|
||||
def _test_mea_tosca_alarm(self, mead_file, mea_name):
|
||||
mea_trigger_path = '/meas/%s/triggers'
|
||||
data = dict()
|
||||
data['tosca'] = read_file(mead_file)
|
||||
tosca_dict = yaml.safe_load(data['tosca'])
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mea_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
|
||||
def _waiting_time(count):
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mea = self.client.show_mea(mea_id)['mea']
|
||||
# {"VDU1": ["10.0.0.14", "10.0.0.5"]}
|
||||
self.assertEqual(count, len(json.loads(mea['mgmt_url'])['VDU1']))
|
||||
|
||||
def trigger_mea(mea, policy_name, policy_action):
|
||||
credential = 'g0jtsxu9'
|
||||
body = {"trigger": {'policy_name': policy_name,
|
||||
'action_name': policy_action,
|
||||
'params': {
|
||||
'data': {'alarm_id': '35a80852-e24f-46ed-bd34-e2f831d00172', 'current': 'alarm'}, # noqa
|
||||
'credential': credential}
|
||||
}
|
||||
}
|
||||
self.client.post(mea_trigger_path % mea, body)
|
||||
|
||||
def _inject_monitoring_policy(mead_dict):
|
||||
polices = mead_dict['topology_template'].get('policies', [])
|
||||
mon_policy = dict()
|
||||
for policy_dict in polices:
|
||||
for name, policy in policy_dict.items():
|
||||
if policy['type'] == constants.POLICY_ALARMING:
|
||||
triggers = policy['triggers']
|
||||
for trigger_name, trigger_dict in triggers.items():
|
||||
policy_action_list = trigger_dict['action']
|
||||
for policy_action_name in policy_action_list:
|
||||
mon_policy[trigger_name] = policy_action_name
|
||||
return mon_policy
|
||||
|
||||
def verify_policy(policy_dict, kw_policy):
|
||||
for name, action in policy_dict.items():
|
||||
if kw_policy in name:
|
||||
return name
|
||||
|
||||
# trigger alarm
|
||||
monitoring_policy = _inject_monitoring_policy(tosca_dict)
|
||||
for mon_policy_name, mon_policy_action in monitoring_policy.items():
|
||||
if mon_policy_action in constants.DEFAULT_ALARM_ACTIONS:
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
trigger_mea(mea_id, mon_policy_name, mon_policy_action)
|
||||
else:
|
||||
if 'scaling_out' in mon_policy_name:
|
||||
_waiting_time(2)
|
||||
time.sleep(constants.SCALE_WINDOW_SLEEP_TIME)
|
||||
# scaling-out backend action
|
||||
scaling_out_action = mon_policy_action + '-out'
|
||||
trigger_mea(mea_id, mon_policy_name, scaling_out_action)
|
||||
|
||||
_waiting_time(3)
|
||||
|
||||
scaling_in_name = verify_policy(monitoring_policy,
|
||||
kw_policy='scaling_in')
|
||||
if scaling_in_name:
|
||||
time.sleep(constants.SCALE_WINDOW_SLEEP_TIME)
|
||||
# scaling-in backend action
|
||||
scaling_in_action = mon_policy_action + '-in'
|
||||
trigger_mea(mea_id, scaling_in_name, scaling_in_action)
|
||||
|
||||
_waiting_time(2)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.ACTIVE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.PENDING_SCALE_OUT, cnt=1)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.PENDING_SCALE_IN, cnt=1)
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, ("Failed to delete mea %s after the monitor test" %
|
||||
mea_id)
|
||||
|
||||
# Verify MEA monitor events captured for states, ACTIVE and DEAD
|
||||
mea_state_list = [evt_constants.ACTIVE, evt_constants.DEAD]
|
||||
self.verify_mea_monitor_events(mea_id, mea_state_list)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
|
||||
def test_mea_alarm_respawn(self):
|
||||
self._test_mea_tosca_alarm(
|
||||
'sample-tosca-alarm-respawn.yaml',
|
||||
'alarm and respawn mea')
|
||||
|
||||
@unittest.skip("Skip and wait for releasing Heat Translator")
|
||||
def test_mea_alarm_scale(self):
|
||||
self._test_mea_tosca_alarm(
|
||||
'sample-tosca-alarm-scale.yaml',
|
||||
'alarm and scale mea')
|
@ -1,134 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 yaml
|
||||
|
||||
from oslo_config import cfg
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
MEA_CIRROS_CREATE_TIMEOUT = 120
|
||||
|
||||
|
||||
class MeaBlockStorageTestToscaCreate(base.BaseApmecTest):
|
||||
def _test_create_mea(self, mead_file, mea_name,
|
||||
template_source="onboarded"):
|
||||
data = dict()
|
||||
values_str = read_file(mead_file)
|
||||
data['tosca'] = values_str
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mea_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
if template_source == "onboarded":
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
if template_source == 'inline':
|
||||
# create mea directly from template
|
||||
template = yaml.safe_load(values_str)
|
||||
mea_arg = {'mea': {'mead_template': template, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
mead_id = mea_instance['mea']['mead_id']
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mea_show_out = self.client.show_mea(mea_id)['mea']
|
||||
self.assertIsNotNone(mea_show_out['mgmt_url'])
|
||||
|
||||
input_dict = yaml.safe_load(values_str)
|
||||
prop_dict = input_dict['topology_template']['node_templates'][
|
||||
'CP1']['properties']
|
||||
|
||||
# Verify if ip_address is static, it is same as in show_mea
|
||||
if prop_dict.get('ip_address'):
|
||||
mgmt_url_input = prop_dict.get('ip_address')
|
||||
mgmt_info = yaml.safe_load(
|
||||
mea_show_out['mgmt_url'])
|
||||
self.assertEqual(mgmt_url_input, mgmt_info['VDU1'])
|
||||
|
||||
# Verify anti spoofing settings
|
||||
stack_id = mea_show_out['instance_id']
|
||||
template_dict = input_dict['topology_template']['node_templates']
|
||||
for field in template_dict.keys():
|
||||
prop_dict = template_dict[field]['properties']
|
||||
if prop_dict.get('anti_spoofing_protection'):
|
||||
self.verify_antispoofing_in_stack(stack_id=stack_id,
|
||||
resource_name=field)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
return mead_id, mea_id
|
||||
|
||||
def _test_delete_mea(self, mea_id):
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
def _test_cleanup_mead(self, mead_id, mea_id):
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
|
||||
def _test_create_delete_mea_tosca(self, mead_file, mea_name,
|
||||
template_source):
|
||||
mead_id, mea_id = self._test_create_mea(mead_file, mea_name,
|
||||
template_source)
|
||||
servers = self.novaclient().servers.list()
|
||||
vdus = []
|
||||
for server in servers:
|
||||
vdus.append(server.name)
|
||||
self.assertIn('test-vdu-block-storage', vdus)
|
||||
|
||||
for server in servers:
|
||||
if server.name == 'test-vdu-block-storage':
|
||||
server_id = server.id
|
||||
server_volumes = self.novaclient().volumes\
|
||||
.get_server_volumes(server_id)
|
||||
self.assertTrue(len(server_volumes) > 0)
|
||||
self._test_delete_mea(mea_id)
|
||||
if template_source == "onboarded":
|
||||
self._test_cleanup_mead(mead_id, mea_id)
|
||||
|
||||
def test_create_delete_mea_tosca_from_mead(self):
|
||||
self._test_create_delete_mea_tosca(
|
||||
'sample-tosca-mead-block-storage.yaml',
|
||||
'test_tosca_mea_with_cirros',
|
||||
'onboarded')
|
@ -1,98 +0,0 @@
|
||||
# Copyright 2017 OpenStack Foundation
|
||||
#
|
||||
# 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 yaml
|
||||
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
class MeaTestToscaFloatingIp(base.BaseApmecTest):
|
||||
|
||||
def get_heat_stack_resource(self, stack_id, resource_name):
|
||||
resource_types = self.h_client.resources
|
||||
resource_details = resource_types.get(stack_id=stack_id,
|
||||
resource_name=resource_name)
|
||||
resource_dict = resource_details.to_dict()
|
||||
return resource_dict
|
||||
|
||||
def connect_public_and_private_nw_with_router(self):
|
||||
public_nw = 'public'
|
||||
private_nw = 'net_mgmt'
|
||||
private_nw_subnet = 'subnet_mgmt'
|
||||
public_nw_id = None
|
||||
private_nw_id = None
|
||||
private_nw_subnet_id = None
|
||||
neutronclient = self.neutronclient()
|
||||
networks = neutronclient.list_networks()['networks']
|
||||
for nw in networks:
|
||||
if nw['name'] == public_nw:
|
||||
public_nw_id = nw['id']
|
||||
if nw['name'] == private_nw:
|
||||
private_nw_id = nw['id']
|
||||
if public_nw_id and private_nw_id:
|
||||
break
|
||||
self.assertIsNotNone(public_nw_id)
|
||||
self.assertIsNotNone(private_nw_id)
|
||||
subnets = neutronclient.list_subnets()['subnets']
|
||||
for subnet in subnets:
|
||||
if subnet['network_id'] == private_nw_id\
|
||||
and subnet['name'] == private_nw_subnet:
|
||||
private_nw_subnet_id = subnet['id']
|
||||
break
|
||||
self.assertIsNotNone(private_nw_subnet_id)
|
||||
router_id = neutronclient.create_router(
|
||||
{'router': {'name': 'fip_test_router'}})['router']['id']
|
||||
self.assertIsNotNone(router_id)
|
||||
self.addCleanup(self.neutronclient().delete_router, router_id)
|
||||
rt_gw_id = neutronclient.add_gateway_router(
|
||||
router_id, {'network_id': public_nw_id})['router']['id']
|
||||
self.assertIsNotNone(rt_gw_id)
|
||||
self.addCleanup(self.neutronclient().remove_gateway_router,
|
||||
router_id)
|
||||
rt_int = neutronclient.add_interface_router(
|
||||
router_id, {'subnet_id': private_nw_subnet_id})['id']
|
||||
self.assertIsNotNone(rt_int)
|
||||
self.addCleanup(self.neutronclient().remove_interface_router,
|
||||
router_id, {'subnet_id': private_nw_subnet_id})
|
||||
|
||||
def test_assign_floatingip_to_vdu(self):
|
||||
mead_file = 'sample_tosca_assign_floatingip_to_vdu.yaml'
|
||||
mea_name = 'Assign Floating IP to VDU'
|
||||
values_str = read_file(mead_file)
|
||||
template = yaml.safe_load(values_str)
|
||||
mea_arg = {'mea': {'mead_template': template, 'name': mea_name}}
|
||||
self.connect_public_and_private_nw_with_router()
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.addCleanup(self.client.delete_mea, mea_id)
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mea_show_out = self.client.show_mea(mea_id)['mea']
|
||||
self.assertIsNotNone(mea_show_out['mgmt_url'])
|
||||
|
||||
stack_id = mea_show_out['instance_id']
|
||||
fip_res = self.get_heat_stack_resource(stack_id, 'FIP1')
|
||||
floating_ip_address = fip_res['attributes']['floating_ip_address']
|
||||
self.assertIsNotNone(floating_ip_address)
|
||||
fip_port_id = fip_res['attributes']['port_id']
|
||||
port_res = self.get_heat_stack_resource(stack_id, 'CP1')
|
||||
port_id = port_res['attributes']['id']
|
||||
self.assertEqual(fip_port_id, port_id)
|
@ -1,90 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
# 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.
|
||||
|
||||
from oslo_config import cfg
|
||||
from toscaparser import tosca_template
|
||||
import yaml
|
||||
|
||||
from apmec.common import utils
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class MeaTestToscaMultipleVDU(base.BaseApmecTest):
|
||||
def test_create_delete_tosca_mea_with_multiple_vdus(self):
|
||||
input_yaml = read_file('sample-tosca-mead-multi-vdu.yaml')
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
mead_name = 'sample-tosca-mead-multi-vdu'
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': tosca_dict}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name':
|
||||
"test_tosca_mea_with_multiple_vdus"}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertEqual('ACTIVE',
|
||||
self.client.show_mea(mea_id)['mea']['status'])
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.PENDING_CREATE, cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
# Validate mgmt_url with input yaml file
|
||||
mgmt_url = self.client.show_mea(mea_id)['mea']['mgmt_url']
|
||||
self.assertIsNotNone(mgmt_url)
|
||||
mgmt_dict = yaml.safe_load(str(mgmt_url))
|
||||
|
||||
input_dict = yaml.safe_load(input_yaml)
|
||||
toscautils.updateimports(input_dict)
|
||||
|
||||
tosca = tosca_template.ToscaTemplate(parsed_params={}, a_file=False,
|
||||
yaml_dict_tpl=input_dict)
|
||||
|
||||
vdus = toscautils.findvdus(tosca)
|
||||
|
||||
self.assertEqual(len(vdus), len(mgmt_dict.keys()))
|
||||
for vdu in vdus:
|
||||
self.assertIsNotNone(mgmt_dict[vdu.name])
|
||||
self.assertEqual(True, utils.is_valid_ipv4(mgmt_dict[vdu.name]))
|
||||
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete of test_mea_with_multiple_vdus failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
@ -1,107 +0,0 @@
|
||||
#
|
||||
# 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 json
|
||||
import time
|
||||
import unittest
|
||||
|
||||
from oslo_config import cfg
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class MeaTestToscaScale(base.BaseApmecTest):
|
||||
@unittest.skip("Skip and wait for releasing Heat Translator")
|
||||
def test_mea_tosca_scale(self):
|
||||
data = dict()
|
||||
data['tosca'] = read_file('sample-tosca-scale-all.yaml')
|
||||
mead_name = 'test_tosca_mea_scale_all'
|
||||
toscal = data['tosca']
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': toscal}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_name = 'test_tosca_mea_scale_all'
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name': mea_name}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
|
||||
# TODO(kanagaraj-manickam) once load-balancer support is enabled,
|
||||
# update this logic to validate the scaling
|
||||
def _wait(count):
|
||||
self.wait_until_mea_active(
|
||||
mea_id,
|
||||
constants.MEA_CIRROS_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mea = self.client.show_mea(mea_id)['mea']
|
||||
|
||||
# {"VDU1": ["10.0.0.14", "10.0.0.5"]}
|
||||
self.assertEqual(count, len(json.loads(mea['mgmt_url'])['VDU1']))
|
||||
|
||||
_wait(2)
|
||||
# Get nested resources when mea is in active state
|
||||
mea_details = self.client.list_mea_resources(mea_id)['resources']
|
||||
resources_list = list()
|
||||
for mea_detail in mea_details:
|
||||
resources_list.append(mea_detail['name'])
|
||||
self.assertIn('VDU1', resources_list)
|
||||
|
||||
self.assertIn('CP1', resources_list)
|
||||
self.assertIn('SP1_group', resources_list)
|
||||
|
||||
def _scale(type, count):
|
||||
body = {"scale": {'type': type, 'policy': 'SP1'}}
|
||||
self.client.scale_mea(mea_id, body)
|
||||
_wait(count)
|
||||
|
||||
# scale out
|
||||
time.sleep(constants.SCALE_WINDOW_SLEEP_TIME)
|
||||
_scale('out', 3)
|
||||
|
||||
# scale in
|
||||
time.sleep(constants.SCALE_WINDOW_SLEEP_TIME)
|
||||
_scale('in', 2)
|
||||
|
||||
# Verifying that as part of SCALE OUT, MEA states PENDING_SCALE_OUT
|
||||
# and ACTIVE occurs and as part of SCALE IN, MEA states
|
||||
# PENDING_SCALE_IN and ACTIVE occur.
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.ACTIVE, cnt=2)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.PENDING_SCALE_OUT, cnt=1)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_SCALE,
|
||||
evt_constants.PENDING_SCALE_IN, cnt=1)
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete failed"
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
||||
self.addCleanup(self.wait_until_mea_delete, mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
@ -1,115 +0,0 @@
|
||||
# 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 oslo_config import cfg
|
||||
from toscaparser import tosca_template
|
||||
import unittest
|
||||
import yaml
|
||||
|
||||
|
||||
from apmec.common import utils
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
from apmec.catalogs.tosca import utils as toscautils
|
||||
|
||||
CONF = cfg.CONF
|
||||
SOFTWARE_DEPLOYMENT = 'OS::Heat::SoftwareDeployment'
|
||||
|
||||
|
||||
class MeaTestToscaMEAC(base.BaseApmecTest):
|
||||
|
||||
@unittest.skip("Until BUG 1673012")
|
||||
def test_create_delete_tosca_meac(self):
|
||||
input_yaml = read_file('sample_tosca_meac.yaml')
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
path = os.path.abspath(os.path.join(
|
||||
os.path.dirname(__file__), "../../etc/samples"))
|
||||
mead_name = 'sample-tosca-meac'
|
||||
tosca_dict['topology_template']['node_templates'
|
||||
]['firewall_meac'
|
||||
]['interfaces'
|
||||
]['Standard']['create'] = path \
|
||||
+ '/install_meac.sh'
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': tosca_dict}}}
|
||||
|
||||
# Create mead with tosca template
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
# Create mea with mead_id
|
||||
mead_id = mead_instance['mead']['id']
|
||||
mea_arg = {'mea': {'mead_id': mead_id, 'name':
|
||||
"test_tosca_meac"}}
|
||||
mea_instance = self.client.create_mea(body=mea_arg)
|
||||
|
||||
mea_id = mea_instance['mea']['id']
|
||||
self.wait_until_mea_active(mea_id,
|
||||
constants.MEAC_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
self.assertEqual('ACTIVE',
|
||||
self.client.show_mea(mea_id)['mea']['status'])
|
||||
self.validate_mea_instance(mead_instance, mea_instance)
|
||||
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.PENDING_CREATE,
|
||||
cnt=2)
|
||||
self.verify_mea_crud_events(
|
||||
mea_id, evt_constants.RES_EVT_CREATE, evt_constants.ACTIVE)
|
||||
|
||||
# Validate mgmt_url with input yaml file
|
||||
mgmt_url = self.client.show_mea(mea_id)['mea']['mgmt_url']
|
||||
self.assertIsNotNone(mgmt_url)
|
||||
mgmt_dict = yaml.safe_load(str(mgmt_url))
|
||||
|
||||
input_dict = yaml.safe_load(input_yaml)
|
||||
toscautils.updateimports(input_dict)
|
||||
|
||||
tosca = tosca_template.ToscaTemplate(parsed_params={}, a_file=False,
|
||||
yaml_dict_tpl=input_dict)
|
||||
|
||||
vdus = toscautils.findvdus(tosca)
|
||||
|
||||
self.assertEqual(len(vdus), len(mgmt_dict.keys()))
|
||||
for vdu in vdus:
|
||||
self.assertIsNotNone(mgmt_dict[vdu.name])
|
||||
self.assertEqual(True, utils.is_valid_ipv4(mgmt_dict[vdu.name]))
|
||||
|
||||
# Check the status of SoftwareDeployment
|
||||
heat_stack_id = self.client.show_mea(mea_id)['mea']['instance_id']
|
||||
resource_types = self.h_client.resources
|
||||
resources = resource_types.list(stack_id=heat_stack_id)
|
||||
for resource in resources:
|
||||
resource = resource.to_dict()
|
||||
if resource['resource_type'] == \
|
||||
SOFTWARE_DEPLOYMENT:
|
||||
self.assertEqual('CREATE_COMPLETE',
|
||||
resource['resource_status'])
|
||||
break
|
||||
|
||||
# Delete mea_instance with mea_id
|
||||
try:
|
||||
self.client.delete_mea(mea_id)
|
||||
except Exception:
|
||||
assert False, "mea Delete of test_mea_with_multiple_vdus failed"
|
||||
|
||||
self.wait_until_mea_delete(mea_id,
|
||||
constants.MEA_CIRROS_DELETE_TIMEOUT)
|
||||
self.verify_mea_crud_events(mea_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.PENDING_DELETE, cnt=2)
|
||||
|
||||
# Delete mead_instance
|
||||
self.addCleanup(self.client.delete_mead, mead_id)
|
@ -1,65 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 time
|
||||
|
||||
from oslo_config import cfg
|
||||
import yaml
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class MeadTestCreate(base.BaseApmecTest):
|
||||
def _test_create_list_delete_tosca_mead(self, tosca_mead_file, mead_name):
|
||||
input_yaml = read_file(tosca_mead_file)
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': tosca_dict}}}
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
meads = self.client.list_meads().get('meads')
|
||||
self.assertIsNotNone(meads, "List of meads are Empty after Creation")
|
||||
|
||||
mead_id = mead_instance['mead']['id']
|
||||
self.verify_mead_events(
|
||||
mead_id, evt_constants.RES_EVT_CREATE,
|
||||
evt_constants.RES_EVT_ONBOARDED)
|
||||
|
||||
try:
|
||||
self.client.delete_mead(mead_id)
|
||||
except Exception:
|
||||
assert False, "mead Delete failed"
|
||||
self.verify_mead_events(mead_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.RES_EVT_NA_STATE)
|
||||
|
||||
def test_tosca_mead(self):
|
||||
self._test_create_list_delete_tosca_mead('sample-tosca-mead.yaml',
|
||||
'sample-tosca-mead-template')
|
||||
|
||||
def test_tosca_large_mead(self):
|
||||
self._test_create_list_delete_tosca_mead(
|
||||
'sample-tosca-mead-large-template.yaml',
|
||||
'sample-tosca-mead-large-template')
|
||||
|
||||
def test_tosca_re_create_delete_mead(self):
|
||||
self._test_create_list_delete_tosca_mead('sample-tosca-mead.yaml',
|
||||
'test_mead')
|
||||
time.sleep(1)
|
||||
self._test_create_list_delete_tosca_mead('sample-tosca-mead.yaml',
|
||||
'test_mead')
|
@ -1,178 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 yaml
|
||||
|
||||
from oslo_config import cfg
|
||||
from apmecclient.common import exceptions
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests import constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
import time
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class MesdTestCreate(base.BaseApmecTest):
|
||||
def _test_create_tosca_mead(self, tosca_mead_file, mead_name):
|
||||
input_yaml = read_file(tosca_mead_file)
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
tosca_arg = {'mead': {'name': mead_name,
|
||||
'attributes': {'mead': tosca_dict}}}
|
||||
mead_instance = self.client.create_mead(body=tosca_arg)
|
||||
self.assertEqual(mead_instance['mead']['name'], mead_name)
|
||||
self.assertIsNotNone(mead_instance)
|
||||
|
||||
meads = self.client.list_meads().get('meads')
|
||||
self.assertIsNotNone(meads, "List of meads are Empty after Creation")
|
||||
return mead_instance['mead']['id']
|
||||
|
||||
def _test_create_mesd(self, tosca_mesd_file, mesd_name):
|
||||
input_yaml = read_file(tosca_mesd_file)
|
||||
tosca_dict = yaml.safe_load(input_yaml)
|
||||
tosca_arg = {'mesd': {'name': mesd_name,
|
||||
'attributes': {'mesd': tosca_dict}}}
|
||||
mesd_instance = self.client.create_mesd(body=tosca_arg)
|
||||
self.assertIsNotNone(mesd_instance)
|
||||
return mesd_instance['mesd']['id']
|
||||
|
||||
def _test_delete_mesd(self, mesd_id):
|
||||
try:
|
||||
self.client.delete_mesd(mesd_id)
|
||||
except Exception:
|
||||
assert False, "mesd Delete failed"
|
||||
|
||||
def _test_delete_mead(self, mead_id, timeout=constants.MES_DELETE_TIMEOUT):
|
||||
start_time = int(time.time())
|
||||
while True:
|
||||
try:
|
||||
self.client.delete_mead(mead_id)
|
||||
except exceptions.Conflict:
|
||||
time.sleep(2)
|
||||
except Exception:
|
||||
assert False, "mead Delete failed"
|
||||
else:
|
||||
break
|
||||
if (int(time.time()) - start_time) > timeout:
|
||||
assert False, "mead still in use"
|
||||
self.verify_mead_events(mead_id, evt_constants.RES_EVT_DELETE,
|
||||
evt_constants.RES_EVT_NA_STATE)
|
||||
|
||||
def _wait_until_mes_status(self, mes_id, target_status, timeout,
|
||||
sleep_interval):
|
||||
start_time = int(time.time())
|
||||
while True:
|
||||
mes_result = self.client.show_mes(mes_id)
|
||||
status = mes_result['mes']['status']
|
||||
if (status == target_status) or (
|
||||
(int(time.time()) - start_time) > timeout):
|
||||
break
|
||||
time.sleep(sleep_interval)
|
||||
|
||||
self.assertEqual(status, target_status,
|
||||
"mes %(mes_id)s with status %(status)s is"
|
||||
" expected to be %(target)s" %
|
||||
{"mes_id": mes_id, "status": status,
|
||||
"target": target_status})
|
||||
|
||||
def _wait_until_mes_delete(self, mes_id, timeout):
|
||||
start_time = int(time.time())
|
||||
while True:
|
||||
try:
|
||||
mes_result = self.client.show_mes(mes_id)
|
||||
time.sleep(2)
|
||||
except Exception:
|
||||
return
|
||||
status = mes_result['mes']['status']
|
||||
if (status != 'PENDING_DELETE') or ((
|
||||
int(time.time()) - start_time) > timeout):
|
||||
raise Exception("Failed with status: %s" % status)
|
||||
|
||||
def _test_create_delete_mes(self, mesd_file, mes_name,
|
||||
template_source='onboarded'):
|
||||
mead1_id = self._test_create_tosca_mead(
|
||||
'test-mes-mead1.yaml',
|
||||
'test-mes-mead1')
|
||||
mead2_id = self._test_create_tosca_mead(
|
||||
'test-mes-mead2.yaml',
|
||||
'test-mes-mead2')
|
||||
|
||||
if template_source == 'onboarded':
|
||||
mesd_id = self._test_create_mesd(
|
||||
mesd_file,
|
||||
'test-mes-mesd')
|
||||
mes_arg = {'mes': {
|
||||
'mesd_id': mesd_id,
|
||||
'name': mes_name,
|
||||
'attributes': {"param_values": {
|
||||
"mesd": {
|
||||
"vl2_name": "net0",
|
||||
"vl1_name": "net_mgmt"}}}}}
|
||||
mes_instance = self.client.create_mes(body=mes_arg)
|
||||
mes_id = mes_instance['mes']['id']
|
||||
|
||||
if template_source == 'inline':
|
||||
input_yaml = read_file(mesd_file)
|
||||
template = yaml.safe_load(input_yaml)
|
||||
mes_arg = {'mes': {
|
||||
'name': mes_name,
|
||||
'attributes': {"param_values": {
|
||||
"mesd": {
|
||||
"vl2_name": "net0",
|
||||
"vl1_name": "net_mgmt"}}},
|
||||
'mesd_template': template}}
|
||||
mes_instance = self.client.create_mes(body=mes_arg)
|
||||
mes_id = mes_instance['mes']['id']
|
||||
|
||||
self._wait_until_mes_status(mes_id, 'ACTIVE',
|
||||
constants.MES_CREATE_TIMEOUT,
|
||||
constants.ACTIVE_SLEEP_TIME)
|
||||
mes_show_out = self.client.show_mes(mes_id)['mes']
|
||||
self.assertIsNotNone(mes_show_out['mgmt_urls'])
|
||||
|
||||
try:
|
||||
self.client.delete_mes(mes_id)
|
||||
except Exception as e:
|
||||
print("Exception:", e)
|
||||
assert False, "mes Delete failed"
|
||||
if template_source == 'onboarded':
|
||||
self._wait_until_mes_delete(mes_id, constants.NS_DELETE_TIMEOUT)
|
||||
self._test_delete_mesd(mesd_id)
|
||||
self._test_delete_mead(mead1_id)
|
||||
self._test_delete_mead(mead2_id)
|
||||
|
||||
def test_create_delete_mesd(self):
|
||||
mead1_id = self._test_create_tosca_mead(
|
||||
'test-mesd-mead1.yaml',
|
||||
'test-mesd-mead1')
|
||||
mead2_id = self._test_create_tosca_mead(
|
||||
'test-mesd-mead2.yaml',
|
||||
'test-mesd-mead2')
|
||||
mesd_id = self._test_create_mesd(
|
||||
'test-mesd.yaml',
|
||||
'test-mesd')
|
||||
self._test_delete_mesd(mesd_id)
|
||||
self._test_delete_mead(mead1_id)
|
||||
self._test_delete_mead(mead2_id)
|
||||
|
||||
def test_create_delete_network_service(self):
|
||||
self._test_create_delete_mes('test-mes-mesd.yaml',
|
||||
'test-mes-onboarded',
|
||||
template_source='onboarded')
|
||||
time.sleep(1)
|
||||
self._test_create_delete_mes('test-mes-mesd.yaml',
|
||||
'test-mes-inline',
|
||||
template_source='inline')
|
@ -1,191 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
#
|
||||
# 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 time
|
||||
import yaml
|
||||
|
||||
from apmec.plugins.common import constants as evt_constants
|
||||
from apmec.tests.functional import base
|
||||
from apmec.tests.utils import read_file
|
||||
|
||||
from apmecclient.common import exceptions
|
||||
|
||||
SECRET_PASSWORD = '***'
|
||||
|
||||
|
||||
class VimTestCreate(base.BaseApmecTest):
|
||||
|
||||
def _test_create_delete_vim(self, vim_file, name, description, vim_type,
|
||||
version=None):
|
||||
|
||||
data, vim_arg = self._generate_vim_data(
|
||||
'local-vim.yaml', name, description, vim_type, version)
|
||||
# updated args
|
||||
new_name = "fake %s" % name
|
||||
new_desc = "fake %s" % description
|
||||
update_vim_arg = {'vim': {'name': new_name,
|
||||
'description': new_desc}}
|
||||
|
||||
# Register vim
|
||||
vim_res = self.client.create_vim(vim_arg)
|
||||
vim_obj = vim_res['vim']
|
||||
vim_id = vim_obj['id']
|
||||
self.verify_vim(vim_obj, data, name, description, version)
|
||||
self.verify_vim_events(vim_id, evt_constants.RES_EVT_CREATE)
|
||||
|
||||
# Read vim
|
||||
vim_show_res = self.client.show_vim(vim_id)
|
||||
self.verify_vim(vim_show_res['vim'], data, name, description, version)
|
||||
|
||||
# Update vim
|
||||
vim_update = self.client.update_vim(vim_id, update_vim_arg)
|
||||
vim_obj = vim_update['vim']
|
||||
self.verify_vim(vim_obj, data, new_name, new_desc, version)
|
||||
self.verify_vim_events(vim_id, evt_constants.RES_EVT_UPDATE)
|
||||
|
||||
# With the updated name above, create another VIM with the
|
||||
# same name and check for Duplicate name exception.
|
||||
vim_arg['vim']['name'] = update_vim_arg['vim']['name']
|
||||
msg = "vim already exist with given ['tenant_id', 'name', "\
|
||||
"'deleted_at']"
|
||||
try:
|
||||
self.client.create_vim(vim_arg)
|
||||
except Exception as err:
|
||||
self.assertEqual(err.message, msg)
|
||||
|
||||
# Since there already exists a DEFAULT VM, Verify that a update
|
||||
# to is_default to TRUE for another VIM raises an exception.
|
||||
update_arg = {'vim': {'is_default': True}}
|
||||
msg = "Default VIM already exists."
|
||||
self.assertRaisesRegex(exceptions.InternalServerError, msg,
|
||||
self.client.update_vim,
|
||||
vim_id, update_arg)
|
||||
|
||||
# Delete vim
|
||||
try:
|
||||
self.client.delete_vim(vim_id)
|
||||
except Exception:
|
||||
self.assertFalse(True, "Failed to delete vim %s" % vim_id)
|
||||
self.verify_vim_events(vim_id, evt_constants.RES_EVT_DELETE)
|
||||
|
||||
def verify_vim(self, vim_instance, config_data, name, description,
|
||||
version):
|
||||
expected_regions = ['RegionOne']
|
||||
self.assertIsNotNone(vim_instance)
|
||||
self.assertEqual(description, vim_instance['description'])
|
||||
self.assertEqual(name, vim_instance['name'])
|
||||
self.assertIsNotNone(vim_instance['tenant_id'])
|
||||
self.assertIsNotNone(vim_instance['id'])
|
||||
self.assertEqual(config_data['username'],
|
||||
vim_instance['auth_cred']['username'])
|
||||
self.assertEqual(SECRET_PASSWORD,
|
||||
vim_instance['auth_cred']['password'])
|
||||
self.assertEqual(expected_regions,
|
||||
vim_instance['placement_attr']['regions'])
|
||||
if version:
|
||||
method_name = 'verify_vim_' + version
|
||||
getattr(self, method_name)(vim_instance, config_data)
|
||||
|
||||
def verify_vim_events(self, vim_id, evt_type, tstamp=None, cnt=1):
|
||||
params = {'resource_id': vim_id,
|
||||
'resource_type': evt_constants.RES_TYPE_VIM,
|
||||
'event_type': evt_type}
|
||||
if tstamp:
|
||||
params['timestamp'] = tstamp
|
||||
|
||||
vim_evt_list = self.client.list_vim_events(**params)
|
||||
|
||||
self.assertIsNotNone(vim_evt_list['vim_events'],
|
||||
"List of VIM events are Empty")
|
||||
self.assertEqual(cnt, len(vim_evt_list['vim_events']))
|
||||
|
||||
def verify_vim_v2(self, vim_instance, config_data):
|
||||
self.assertEqual(config_data['project_name'],
|
||||
vim_instance['auth_cred']['tenant_name'])
|
||||
|
||||
def verify_vim_v3(self, vim_instance, config_data):
|
||||
self.assertEqual(config_data['project_name'],
|
||||
vim_instance['auth_cred']['project_name'])
|
||||
|
||||
def test_create_delete_local_vim(self):
|
||||
name = 'Default vim'
|
||||
description = 'Local vim description'
|
||||
vim_type = 'openstack'
|
||||
ks_version = 'v3'
|
||||
self._test_create_delete_vim('local-vim.yaml', name, description,
|
||||
vim_type, ks_version)
|
||||
|
||||
def _generate_vim_data(self, vim_file, name, description, vim_type,
|
||||
version=None):
|
||||
|
||||
data = yaml.safe_load(read_file(vim_file))
|
||||
password = data['password']
|
||||
username = data['username']
|
||||
project_name = data['project_name']
|
||||
auth_url = data['auth_url']
|
||||
if version:
|
||||
if ('v2' == version and (not auth_url.endswith("/v2.0") or
|
||||
not auth_url.endswith("/v2.0/"))):
|
||||
auth_url += "/v2.0"
|
||||
elif (not auth_url.endswith("/v3") or
|
||||
not auth_url.endswith("/v3/")):
|
||||
auth_url += "/v3"
|
||||
domain_name = data.get('domain_name', None)
|
||||
vim_arg = {'vim': {'name': name, 'description': description,
|
||||
'type': vim_type,
|
||||
'auth_url': auth_url,
|
||||
'auth_cred': {'username': username,
|
||||
'password': password,
|
||||
'user_domain_name': domain_name},
|
||||
'vim_project': {'name': project_name,
|
||||
'project_domain_name':
|
||||
domain_name},
|
||||
'is_default': False}}
|
||||
return data, vim_arg
|
||||
|
||||
def test_re_create_delete_local_vim(self):
|
||||
name = 'test_vim'
|
||||
description = 'Test vim description'
|
||||
vim_type = 'openstack'
|
||||
ks_version = 'v3'
|
||||
self._test_create_delete_vim('local-vim.yaml', name, description,
|
||||
vim_type, ks_version)
|
||||
time.sleep(1)
|
||||
self._test_create_delete_vim('local-vim.yaml', name, description,
|
||||
vim_type, ks_version)
|
||||
|
||||
def test_duplicate_vim(self):
|
||||
name = 'test_duplicate_vim'
|
||||
description = 'Test duplicate vim description'
|
||||
vim_type = 'openstack'
|
||||
version = 'v3'
|
||||
data, vim_arg = self._generate_vim_data(
|
||||
'local-vim.yaml', name, description, vim_type, version)
|
||||
|
||||
# Register vim
|
||||
vim_res = self.client.create_vim(vim_arg)
|
||||
vim_obj = vim_res['vim']
|
||||
vim_id = vim_obj['id']
|
||||
|
||||
# Read vim
|
||||
vim_show_res = self.client.show_vim(vim_id)
|
||||
self.verify_vim(vim_show_res['vim'], data, name, description, version)
|
||||
msg = "vim already exist with given ['tenant_id', 'name', "\
|
||||
"'deleted_at']"
|
||||
err_msg = None
|
||||
try:
|
||||
self.client.create_vim(vim_arg)
|
||||
except Exception as err:
|
||||
err_msg = err.message
|
||||
self.assertEqual(err_msg, msg)
|
@ -1,82 +0,0 @@
|
||||
# Copyright (c) 2012 OpenStack Foundation
|
||||
# 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.
|
||||
|
||||
import os
|
||||
|
||||
import fixtures
|
||||
from oslo_log import log as logging
|
||||
|
||||
from apmec.agent.linux import utils
|
||||
from apmec.tests import base
|
||||
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class RootwrapTestExec(base.BaseTestCase):
|
||||
"""Simple unit test to test the basic rootwrap mechanism
|
||||
|
||||
Essentially hello-world. Just run a command as root and check that
|
||||
it actually *did* run as root, and generated the right output.
|
||||
|
||||
NB that this is named _test_rootwrap so as not to get run by default
|
||||
from scripts like tox. That's because it actually executes a sudo'ed
|
||||
command, and that won't work in the automated test environment, at
|
||||
least as it stands today. To run this, rename it to
|
||||
test_rootwrap.py, or run it by hand.
|
||||
"""
|
||||
|
||||
def setUp(self):
|
||||
super(RootwrapTestExec, self).setUp()
|
||||
self.cwd = os.getcwd() + "/../../.."
|
||||
# stuff a stupid bash script into /tmp, so that the next
|
||||
# method can execute it.
|
||||
self.test_file = self.useFixture(
|
||||
fixtures.TempDir()).join("rootwrap-test.sh")
|
||||
with open(self.test_file, 'w') as f:
|
||||
f.write('#!/bin/bash\n')
|
||||
f.write('ID=`id | sed \'s/uid=//\' | sed \'s/(.*//\' `\n')
|
||||
f.write("echo $ID $1\
|
||||
\" Now is the time for all good men to come \
|
||||
to the aid of their party.\"\n")
|
||||
# we need a temporary conf file, pointing into pwd for the filter
|
||||
# specs. there's probably a better way to do this, but I couldn't
|
||||
# figure it out. 08/15/12 -- jrd
|
||||
self.conf_file = self.useFixture(
|
||||
fixtures.TempDir()).join("rootwrap.conf")
|
||||
with open(self.conf_file, 'w') as f:
|
||||
f.write("# temporary conf file for rootwrap-test, " +
|
||||
"generated by test_rootwrap.py\n")
|
||||
f.write("[DEFAULT]\n")
|
||||
f.write("filters_path=" + self.cwd +
|
||||
"/apmec/tests/etc/rootwrap.d/")
|
||||
# now set the root helper to sudo our rootwrap script,
|
||||
# with the new conf
|
||||
self.root_helper = "sudo " + self.cwd + "/bin/apmec-rootwrap "
|
||||
self.root_helper += self.conf_file
|
||||
|
||||
def runTest(self):
|
||||
try:
|
||||
result = utils.execute(["bash", self.test_file, 'arg'],
|
||||
self.root_helper)
|
||||
self.assertEqual("0 arg Now is the time for all good men to \
|
||||
come to the aid of their party.", result)
|
||||
except Exception:
|
||||
LOG.exception("Losing in rootwrap test")
|
||||
|
||||
def tearDown(self):
|
||||
os.remove(self.test_file)
|
||||
os.remove(self.conf_file)
|
||||
super(RootwrapTestExec, self).tearDown()
|
@ -1,33 +0,0 @@
|
||||
# Copyright 2016 Brocade Communications System, Inc.
|
||||
# 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.
|
||||
|
||||
|
||||
import mock
|
||||
from oslo_config import cfg
|
||||
from oslo_config import fixture as config_fixture
|
||||
from oslotest import base
|
||||
|
||||
CONF = cfg.CONF
|
||||
|
||||
|
||||
class TestCase(base.BaseTestCase):
|
||||
|
||||
def setUp(self):
|
||||
super(TestCase, self).setUp()
|
||||
self.config_fixture = self.useFixture(config_fixture.Config(CONF))
|
||||
|
||||
def _mock(self, target, new=mock.DEFAULT):
|
||||
patcher = mock.patch(target, new)
|
||||
return patcher.start()
|
@ -1,184 +0,0 @@
|
||||
# Copyright 2011, Cisco Systems, Inc.
|
||||
# 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.
|
||||
|
||||
"""stubs.py provides interface methods for the database test cases"""
|
||||
|
||||
from oslo_log import log as logging
|
||||
|
||||
from apmec.db import api as db
|
||||
|
||||
LOG = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class ApmecDB(object):
|
||||
"""Class conisting of methods to call Apmec db methods."""
|
||||
def get_all_networks(self, tenant_id):
|
||||
"""Get all networks."""
|
||||
nets = []
|
||||
try:
|
||||
for net in db.network_list(tenant_id):
|
||||
LOG.debug("Getting network: %s", net.uuid)
|
||||
net_dict = {}
|
||||
net_dict["tenant_id"] = net.tenant_id
|
||||
net_dict["id"] = str(net.uuid)
|
||||
net_dict["name"] = net.name
|
||||
nets.append(net_dict)
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to get all networks: %s", str(exc))
|
||||
return nets
|
||||
|
||||
def get_network(self, network_id):
|
||||
"""Get a network."""
|
||||
net = []
|
||||
try:
|
||||
for net in db.network_get(network_id):
|
||||
LOG.debug("Getting network: %s", net.uuid)
|
||||
net_dict = {}
|
||||
net_dict["tenant_id"] = net.tenant_id
|
||||
net_dict["id"] = str(net.uuid)
|
||||
net_dict["name"] = net.name
|
||||
net.append(net_dict)
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to get network: %s", str(exc))
|
||||
return net
|
||||
|
||||
def create_network(self, tenant_id, net_name):
|
||||
"""Create a network."""
|
||||
net_dict = {}
|
||||
try:
|
||||
res = db.network_create(tenant_id, net_name)
|
||||
LOG.debug("Created network: %s", res.uuid)
|
||||
net_dict["tenant_id"] = res.tenant_id
|
||||
net_dict["id"] = str(res.uuid)
|
||||
net_dict["name"] = res.name
|
||||
return net_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to create network: %s", str(exc))
|
||||
|
||||
def delete_network(self, net_id):
|
||||
"""Delete a network."""
|
||||
try:
|
||||
net = db.network_destroy(net_id)
|
||||
LOG.debug("Deleted network: %s", net.uuid)
|
||||
net_dict = {}
|
||||
net_dict["id"] = str(net.uuid)
|
||||
return net_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to delete network: %s", str(exc))
|
||||
|
||||
def update_network(self, tenant_id, net_id, param_data):
|
||||
"""Rename a network."""
|
||||
try:
|
||||
net = db.network_update(net_id, tenant_id, **param_data)
|
||||
LOG.debug("Updated network: %s", net.uuid)
|
||||
net_dict = {}
|
||||
net_dict["id"] = str(net.uuid)
|
||||
net_dict["name"] = net.name
|
||||
return net_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to update network: %s", str(exc))
|
||||
|
||||
def get_all_ports(self, net_id):
|
||||
"""Get all ports."""
|
||||
ports = []
|
||||
try:
|
||||
for port in db.port_list(net_id):
|
||||
LOG.debug("Getting port: %s", port.uuid)
|
||||
port_dict = {}
|
||||
port_dict["id"] = str(port.uuid)
|
||||
port_dict["net-id"] = str(port.network_id)
|
||||
port_dict["attachment"] = port.interface_id
|
||||
port_dict["state"] = port.state
|
||||
ports.append(port_dict)
|
||||
return ports
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to get all ports: %s", str(exc))
|
||||
|
||||
def get_port(self, net_id, port_id):
|
||||
"""Get a port."""
|
||||
port_list = []
|
||||
port = db.port_get(port_id, net_id)
|
||||
try:
|
||||
LOG.debug("Getting port: %s", port.uuid)
|
||||
port_dict = {}
|
||||
port_dict["id"] = str(port.uuid)
|
||||
port_dict["net-id"] = str(port.network_id)
|
||||
port_dict["attachment"] = port.interface_id
|
||||
port_dict["state"] = port.state
|
||||
port_list.append(port_dict)
|
||||
return port_list
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to get port: %s", str(exc))
|
||||
|
||||
def create_port(self, net_id):
|
||||
"""Add a port."""
|
||||
port_dict = {}
|
||||
try:
|
||||
port = db.port_create(net_id)
|
||||
LOG.debug("Creating port %s", port.uuid)
|
||||
port_dict["id"] = str(port.uuid)
|
||||
port_dict["net-id"] = str(port.network_id)
|
||||
port_dict["attachment"] = port.interface_id
|
||||
port_dict["state"] = port.state
|
||||
return port_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to create port: %s", str(exc))
|
||||
|
||||
def delete_port(self, net_id, port_id):
|
||||
"""Delete a port."""
|
||||
try:
|
||||
port = db.port_destroy(port_id, net_id)
|
||||
LOG.debug("Deleted port %s", port.uuid)
|
||||
port_dict = {}
|
||||
port_dict["id"] = str(port.uuid)
|
||||
return port_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to delete port: %s", str(exc))
|
||||
|
||||
def update_port(self, net_id, port_id, **kwargs):
|
||||
"""Update a port."""
|
||||
try:
|
||||
port = db.port_update(port_id, net_id, **kwargs)
|
||||
LOG.debug("Updated port %s", port.uuid)
|
||||
port_dict = {}
|
||||
port_dict["id"] = str(port.uuid)
|
||||
port_dict["net-id"] = str(port.network_id)
|
||||
port_dict["attachment"] = port.interface_id
|
||||
port_dict["state"] = port.state
|
||||
return port_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to update port state: %s", str(exc))
|
||||
|
||||
def plug_interface(self, net_id, port_id, int_id):
|
||||
"""Plug interface to a port."""
|
||||
try:
|
||||
port = db.port_set_attachment(port_id, net_id, int_id)
|
||||
LOG.debug("Attached interface to port %s", port.uuid)
|
||||
port_dict = {}
|
||||
port_dict["id"] = str(port.uuid)
|
||||
port_dict["net-id"] = str(port.network_id)
|
||||
port_dict["attachment"] = port.interface_id
|
||||
port_dict["state"] = port.state
|
||||
return port_dict
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to plug interface: %s", str(exc))
|
||||
|
||||
def unplug_interface(self, net_id, port_id):
|
||||
"""Unplug interface to a port."""
|
||||
try:
|
||||
db.port_unset_attachment(port_id, net_id)
|
||||
LOG.debug("Detached interface from port %s", port_id)
|
||||
except Exception as exc:
|
||||
LOG.error("Failed to unplug interface: %s", str(exc))
|
@ -1,51 +0,0 @@
|
||||
# Copyright 2015 Brocade Communications System, Inc.
|
||||
# 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.
|
||||
|
||||
import fixtures
|
||||
|
||||
from apmec.common import config
|
||||
from apmec.db import api as db_api
|
||||
from apmec.db import model_base
|
||||
from apmec.tests.unit import base
|
||||
|
||||
|
||||
class SqlFixture(fixtures.Fixture):
|
||||
|
||||
# flag to indicate that the models have been loaded
|
||||
_TABLES_ESTABLISHED = False
|
||||
|
||||
def setUp(self):
|
||||
super(SqlFixture, self).setUp()
|
||||
# Register all data models
|
||||
engine = db_api.get_engine()
|
||||
if not SqlFixture._TABLES_ESTABLISHED:
|
||||
model_base.BASE.metadata.create_all(engine)
|
||||
SqlFixture._TABLES_ESTABLISHED = True
|
||||
|
||||
def clear_tables():
|
||||
with engine.begin() as conn:
|
||||
for table in reversed(
|
||||
model_base.BASE.metadata.sorted_tables):
|
||||
conn.execute(table.delete())
|
||||
|
||||
self.addCleanup(clear_tables)
|
||||
|
||||
|
||||
class SqlTestCase(base.TestCase):
|
||||
|
||||
def setUp(self):
|
||||
config.set_db_defaults()
|
||||
super(SqlTestCase, self).setUp()
|
||||
self.useFixture(SqlFixture())
|
@ -1,202 +0,0 @@
|
||||
# Copyright 2015 Brocade Communications System, Inc.
|
||||
# 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.
|
||||
|
||||
import codecs
|
||||
from datetime import datetime
|
||||
import os
|
||||
import yaml
|
||||
|
||||
|
||||
DUMMY_mes_2_NAME = 'dummy_mes_2'
|
||||
|
||||
|
||||
def _get_template(name):
|
||||
filename = os.path.join(
|
||||
os.path.dirname(os.path.abspath(__file__)),
|
||||
"../mem/infra_drivers/openstack/data/", name)
|
||||
f = codecs.open(filename, encoding='utf-8', errors='strict')
|
||||
return f.read()
|
||||
|
||||
tosca_mead_openwrt = _get_template('test_tosca_openwrt.yaml')
|
||||
config_data = _get_template('config_data.yaml')
|
||||
update_config_data = _get_template('update_config_data.yaml')
|
||||
mead_scale_tosca_template = _get_template('tosca_scale.yaml')
|
||||
mead_alarm_respawn_tosca_template = _get_template(
|
||||
'test_tosca_mead_alarm_respawn.yaml')
|
||||
mead_alarm_scale_tosca_template = _get_template(
|
||||
'test_tosca_mead_alarm_scale.yaml')
|
||||
mead_alarm_multi_actions_tosca_template = _get_template(
|
||||
'test_tosca_mead_alarm_multi_actions.yaml')
|
||||
mesd_tosca_template = yaml.safe_load(_get_template('tosca_mesd_template.yaml'))
|
||||
|
||||
|
||||
def get_dummy_mead_obj():
|
||||
return {u'mead': {u'service_types': [{u'service_type': u'mead'}],
|
||||
'name': 'dummy_mead',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
u'attributes': {u'mead': yaml.safe_load(
|
||||
tosca_mead_openwrt)},
|
||||
'description': 'dummy_mead_description',
|
||||
'template_source': 'onboarded',
|
||||
u'auth': {u'tenantName': u'admin', u'passwordCredentials': {
|
||||
u'username': u'admin', u'password': u'devstack'}}}}
|
||||
|
||||
|
||||
def get_dummy_mead_obj_inline():
|
||||
return {u'mead': {u'service_types': [{u'service_type': u'mead'}],
|
||||
'name': 'tmpl-koeak4tqgoqo8cr4-dummy_inline_mea',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
u'attributes': {u'mead': yaml.safe_load(
|
||||
tosca_mead_openwrt)},
|
||||
'template_source': 'inline',
|
||||
u'auth': {u'tenantName': u'admin', u'passwordCredentials': {
|
||||
u'username': u'admin', u'password': u'devstack'}}}}
|
||||
|
||||
|
||||
def get_dummy_inline_mea_obj():
|
||||
return {'mea': {'description': 'dummy_inline_mea_description',
|
||||
'mead_template': yaml.safe_load(tosca_mead_openwrt),
|
||||
'vim_id': u'6261579e-d6f3-49ad-8bc3-a9cb974778ff',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'name': 'dummy_inline_mea',
|
||||
'attributes': {},
|
||||
'mead_id': None}}
|
||||
|
||||
|
||||
def get_dummy_mea_obj():
|
||||
return {'mea': {'description': 'dummy_mea_description',
|
||||
'mead_id': u'eb094833-995e-49f0-a047-dfb56aaf7c4e',
|
||||
'vim_id': u'6261579e-d6f3-49ad-8bc3-a9cb974778ff',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'name': 'dummy_mea',
|
||||
'deleted_at': datetime.min,
|
||||
'attributes': {},
|
||||
'mead_template': None}}
|
||||
|
||||
|
||||
def get_dummy_mea_config_obj():
|
||||
return {'mea': {u'attributes': {u'config': {'vdus': {'vdu1': {
|
||||
'config': {'firewall': 'dummy_firewall_values'}}}}}}}
|
||||
|
||||
|
||||
def get_dummy_device_obj():
|
||||
return {'status': 'PENDING_CREATE', 'instance_id': None, 'name':
|
||||
u'test_openwrt', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'mead_id': u'eb094833-995e-49f0-a047-dfb56aaf7c4e',
|
||||
'mead': {
|
||||
'service_types': [{'service_type': u'mead',
|
||||
'id': u'4a4c2d44-8a52-4895-9a75-9d1c76c3e738'}],
|
||||
'description': u'OpenWRT with services',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'mgmt_driver': u'openwrt',
|
||||
'attributes': {u'mead': tosca_mead_openwrt},
|
||||
'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec',
|
||||
'name': u'openwrt_services'},
|
||||
'mgmt_url': None, 'service_context': [],
|
||||
'attributes': {u'param_values': u''},
|
||||
'id': 'eb84260e-5ff7-4332-b032-50a14d6c1123',
|
||||
'description': u'OpenWRT with services'}
|
||||
|
||||
|
||||
def get_dummy_mea_config_attr():
|
||||
return {'status': 'PENDING_CREATE', 'instance_id': None, 'name':
|
||||
u'test_openwrt', 'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'mead_id': u'eb094833-995e-49f0-a047-dfb56aaf7c4e',
|
||||
'mead': {'service_types': [{'service_type': u'mead',
|
||||
'id': u'4a4c2d44-8a52-4895-9a75-9d1c76c3e738'}],
|
||||
'description': u'OpenWRT with services',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'mgmt_driver': u'openwrt',
|
||||
'attributes': {u'mead': tosca_mead_openwrt},
|
||||
'id': u'fb048660-dc1b-4f0f-bd89-b023666650ec', 'name':
|
||||
u'openwrt_services'}, 'mgmt_url': None, 'service_context': [],
|
||||
'attributes': {u'config': config_data},
|
||||
'id': 'eb84260e-5ff7-4332-b032-50a14d6c1123',
|
||||
'description': u'OpenWRT with services'}
|
||||
|
||||
|
||||
def get_dummy_mea_update_config():
|
||||
return {'mea': {'attributes': {'config': update_config_data}}}
|
||||
|
||||
|
||||
def get_vim_obj():
|
||||
return {'vim': {'type': 'openstack', 'auth_url':
|
||||
'http://localhost:5000', 'vim_project': {'name':
|
||||
'test_project'}, 'auth_cred': {'username': 'test_user',
|
||||
'password':
|
||||
'test_password'},
|
||||
'name': 'VIM0',
|
||||
'tenant_id': 'test-project'}}
|
||||
|
||||
|
||||
def get_vim_auth_obj():
|
||||
return {'username': 'test_user',
|
||||
'password': 'test_password',
|
||||
'project_id': None,
|
||||
'project_name': 'test_project',
|
||||
'auth_url': 'http://localhost:5000/v3',
|
||||
'user_domain_name': 'default',
|
||||
'project_domain_name': 'default'}
|
||||
|
||||
def get_dummy_mesd_obj():
|
||||
return {'mesd': {'description': 'dummy_mesd_description',
|
||||
'name': 'dummy_MESD',
|
||||
'tenant_id': u'8819a1542a5948b68f94d4be0fd50496',
|
||||
'attributes': {u'mesd': mesd_tosca_template},
|
||||
'template_source': 'onboarded'}}
|
||||
|
||||
|
||||
def get_dummy_mesd_obj_inline():
|
||||
return {'mesd': {'description': 'dummy_mesd_description_inline',
|
||||
'name': 'dummy_MESD_inline',
|
||||
'tenant_id': u'8819a1542a5948b68f94d4be0fd50496',
|
||||
'attributes': {u'mesd': mesd_tosca_template},
|
||||
'template_source': 'inline'}}
|
||||
|
||||
|
||||
def get_dummy_mes_obj():
|
||||
return {'mes': {'description': 'dummy_mes_description',
|
||||
'id': u'ba6bf017-f6f7-45f1-a280-57b073bf78ea',
|
||||
'mesd_id': u'eb094833-995e-49f0-a047-dfb56aaf7c4e',
|
||||
'vim_id': u'6261579e-d6f3-49ad-8bc3-a9cb974778ff',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'name': 'dummy_mes',
|
||||
'attributes': {
|
||||
'param_values': {'mesd': {'vl1_name': 'net_mgmt',
|
||||
'vl2_name': 'net0'}}}}}
|
||||
|
||||
|
||||
def get_dummy_mes_obj_inline():
|
||||
return {'mes': {'description': 'dummy_mes_description_inline',
|
||||
'id': u'ff35e3f0-0a11-4071-bce6-279fdf1c8bf9',
|
||||
'vim_id': u'6261579e-d6f3-49ad-8bc3-a9cb974778ff',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'name': 'dummy_mes_inline',
|
||||
'attributes': {
|
||||
'param_values': {'mesd': {'vl1_name': 'net_mgmt',
|
||||
'vl2_name': 'net0'}}},
|
||||
'mesd_template': mesd_tosca_template}}
|
||||
|
||||
|
||||
def get_dummy_mes_obj_2():
|
||||
return {'mes': {'description': 'dummy_mes_description',
|
||||
'id': u'ba6bf017-f6f7-45f1-a280-57b073bf78ea',
|
||||
'mesd_id': u'eb094833-995e-49f0-a047-dfb56aaf7c4e',
|
||||
'vim_id': u'6261579e-d6f3-49ad-8bc3-a9cb974778ff',
|
||||
'tenant_id': u'ad7ebc56538745a08ef7c5e97f8bd437',
|
||||
'name': DUMMY_mes_2_NAME,
|
||||
'attributes': {
|
||||
'param_values': {'mesd': {'vl1_name': 'net_mgmt',
|
||||
'vl2_name': 'net0'}}}}}
|
@ -1,77 +0,0 @@
|
||||
# Copyright 2011 OpenStack Foundation.
|
||||
# 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.
|
||||
|
||||
import abc
|
||||
|
||||
from apmec.api import extensions
|
||||
from apmec import wsgi
|
||||
|
||||
|
||||
class StubExtension(object):
|
||||
|
||||
def __init__(self, alias="stub_extension"):
|
||||
self.alias = alias
|
||||
|
||||
def get_name(self):
|
||||
return "Stub Extension"
|
||||
|
||||
def get_alias(self):
|
||||
return self.alias
|
||||
|
||||
def get_description(self):
|
||||
return ""
|
||||
|
||||
def get_namespace(self):
|
||||
return ""
|
||||
|
||||
def get_updated(self):
|
||||
return ""
|
||||
|
||||
|
||||
class StubPlugin(object):
|
||||
|
||||
def __init__(self, supported_extensions=None):
|
||||
self.supported_extension_aliases = supported_extensions \
|
||||
if supported_extensions else []
|
||||
|
||||
|
||||
class ExtensionExpectingPluginInterface(StubExtension):
|
||||
"""Expect plugin to implement all methods in StubPluginInterface.
|
||||
|
||||
This extension expects plugin to implement all the methods defined
|
||||
in StubPluginInterface.
|
||||
"""
|
||||
|
||||
def get_plugin_interface(self):
|
||||
return StubPluginInterface
|
||||
|
||||
|
||||
class StubPluginInterface(extensions.PluginInterface):
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_foo(self, bar=None):
|
||||
pass
|
||||
|
||||
|
||||
class StubBaseAppController(wsgi.Controller):
|
||||
|
||||
def index(self, request):
|
||||
return "base app index"
|
||||
|
||||
def show(self, request, id):
|
||||
return {'fort': 'knox'}
|
||||
|
||||
def update(self, request, id):
|
||||
return {'uneditable': 'original_value'}
|
@ -1,54 +0,0 @@
|
||||
# Copyright 2013 VMware, Inc. 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.
|
||||
|
||||
from apmec.api import extensions
|
||||
|
||||
EXTENDED_ATTRIBUTE = 'extended_attribute'
|
||||
EXTENDED_ATTRIBUTES_2_0 = {
|
||||
'ext_test_resources': {
|
||||
EXTENDED_ATTRIBUTE: {'allow_post': True, 'allow_put': False,
|
||||
'validate': {'type:uuid_or_none': None},
|
||||
'default': None, 'is_visible': True},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Extendedattribute(extensions.ExtensionDescriptor):
|
||||
"""Extension class supporting extended attribute for router."""
|
||||
|
||||
@classmethod
|
||||
def get_name(cls):
|
||||
return "Extended Extension Attributes"
|
||||
|
||||
@classmethod
|
||||
def get_alias(cls):
|
||||
return "extended-ext-attr"
|
||||
|
||||
@classmethod
|
||||
def get_description(cls):
|
||||
return "Provides extended_attr attribute to router"
|
||||
|
||||
@classmethod
|
||||
def get_namespace(cls):
|
||||
return ""
|
||||
|
||||
@classmethod
|
||||
def get_updated(cls):
|
||||
return "2013-02-05T00:00:00-00:00"
|
||||
|
||||
def get_extended_resources(self, version):
|
||||
if version == "2.0":
|
||||
return EXTENDED_ATTRIBUTES_2_0
|
||||
else:
|
||||
return {}
|
@ -1,102 +0,0 @@
|
||||
# Copyright 2013 VMware, Inc.
|
||||
# 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.
|
||||
|
||||
import abc
|
||||
|
||||
from apmec.api import extensions
|
||||
from apmec.api.v1 import base
|
||||
from apmec import manager
|
||||
|
||||
|
||||
# Attribute Map
|
||||
RESOURCE_ATTRIBUTE_MAP = {
|
||||
'ext_test_resources': {
|
||||
'id': {'allow_post': False, 'allow_put': False,
|
||||
'validate': {'type:uuid': None},
|
||||
'is_visible': True},
|
||||
'name': {'allow_post': True, 'allow_put': True,
|
||||
'validate': {'type:string': None},
|
||||
'is_visible': True, 'default': ''},
|
||||
'tenant_id': {'allow_post': True, 'allow_put': False,
|
||||
'required_by_policy': True,
|
||||
'validate': {'type:string': None},
|
||||
'is_visible': True},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class Extensionattribute(extensions.ExtensionDescriptor):
|
||||
|
||||
@classmethod
|
||||
def get_name(cls):
|
||||
return "Extension Test Resource"
|
||||
|
||||
@classmethod
|
||||
def get_alias(cls):
|
||||
return "ext-obj-test"
|
||||
|
||||
@classmethod
|
||||
def get_description(cls):
|
||||
return "Extension Test Resource"
|
||||
|
||||
@classmethod
|
||||
def get_namespace(cls):
|
||||
return ""
|
||||
|
||||
@classmethod
|
||||
def get_updated(cls):
|
||||
return "2013-02-05T10:00:00-00:00"
|
||||
|
||||
def update_attributes_map(self, attributes):
|
||||
super(Extensionattribute, self).update_attributes_map(
|
||||
attributes, extension_attrs_map=RESOURCE_ATTRIBUTE_MAP)
|
||||
|
||||
@classmethod
|
||||
def get_resources(cls):
|
||||
"""Returns Ext Resources."""
|
||||
exts = []
|
||||
plugin = manager.ApmecManager.get_plugin()
|
||||
resource_name = 'ext_test_resource'
|
||||
collection_name = resource_name + "s"
|
||||
params = RESOURCE_ATTRIBUTE_MAP.get(collection_name, dict())
|
||||
|
||||
controller = base.create_resource(collection_name,
|
||||
resource_name,
|
||||
plugin, params,
|
||||
member_actions={})
|
||||
|
||||
ex = extensions.ResourceExtension(collection_name,
|
||||
controller,
|
||||
member_actions={})
|
||||
exts.append(ex)
|
||||
|
||||
return exts
|
||||
|
||||
def get_extended_resources(self, version):
|
||||
if version == "2.0":
|
||||
return RESOURCE_ATTRIBUTE_MAP
|
||||
else:
|
||||
return {}
|
||||
|
||||
|
||||
class ExtensionObjectTestPluginBase(object):
|
||||
|
||||
@abc.abstractmethod
|
||||
def create_ext_test_resource(self, context, router):
|
||||
pass
|
||||
|
||||
@abc.abstractmethod
|
||||
def get_ext_test_resource(self, context, id, fields=None):
|
||||
pass
|
@ -1,109 +0,0 @@
|
||||
# Copyright 2011 OpenStack Foundation.
|
||||
# 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.
|
||||
|
||||
import abc
|
||||
|
||||
from oslo_serialization import jsonutils
|
||||
|
||||
from apmec.api import extensions
|
||||
from apmec import wsgi
|
||||
|
||||
|
||||
class FoxInSocksController(wsgi.Controller):
|
||||
|
||||
def index(self, request):
|
||||
return "Try to say this Mr. Knox, sir..."
|
||||
|
||||
|
||||
class FoxInSocksPluginInterface(extensions.PluginInterface):
|
||||
|
||||
@abc.abstractmethod
|
||||
def method_to_support_foxnsox_extension(self):
|
||||
pass
|
||||
|
||||
|
||||
class Foxinsocks(object):
|
||||
|
||||
def __init__(self):
|
||||
pass
|
||||
|
||||
def get_plugin_interface(self):
|
||||
return FoxInSocksPluginInterface
|
||||
|
||||
def get_name(self):
|
||||
return "Fox In Socks"
|
||||
|
||||
def get_alias(self):
|
||||
return "FOXNSOX"
|
||||
|
||||
def get_description(self):
|
||||
return "The Fox In Socks Extension"
|
||||
|
||||
def get_namespace(self):
|
||||
return "http://www.fox.in.socks/api/ext/pie/v1.0"
|
||||
|
||||
def get_updated(self):
|
||||
return "2011-01-22T13:25:27-06:00"
|
||||
|
||||
def get_resources(self):
|
||||
resources = []
|
||||
resource = extensions.ResourceExtension('foxnsocks',
|
||||
FoxInSocksController())
|
||||
resources.append(resource)
|
||||
return resources
|
||||
|
||||
def get_actions(self):
|
||||
return [extensions.ActionExtension('dummy_resources',
|
||||
'FOXNSOX:add_tweedle',
|
||||
self._add_tweedle_handler),
|
||||
extensions.ActionExtension('dummy_resources',
|
||||
'FOXNSOX:delete_tweedle',
|
||||
self._delete_tweedle_handler)]
|
||||
|
||||
def get_request_extensions(self):
|
||||
request_exts = []
|
||||
|
||||
def _goose_handler(req, res):
|
||||
# NOTE: This only handles JSON responses.
|
||||
# You can use content type header to test for XML.
|
||||
data = jsonutils.loads(res.body)
|
||||
data['FOXNSOX:googoose'] = req.GET.get('chewing')
|
||||
res.body = jsonutils.dumps(data)
|
||||
return res
|
||||
|
||||
req_ext1 = extensions.RequestExtension('GET', '/dummy_resources/:(id)',
|
||||
_goose_handler)
|
||||
request_exts.append(req_ext1)
|
||||
|
||||
def _bands_handler(req, res):
|
||||
# NOTE: This only handles JSON responses.
|
||||
# You can use content type header to test for XML.
|
||||
data = jsonutils.loads(res.body)
|
||||
data['FOXNSOX:big_bands'] = 'Pig Bands!'
|
||||
res.body = jsonutils.dumps(data)
|
||||
return res
|
||||
|
||||
req_ext2 = extensions.RequestExtension('GET', '/dummy_resources/:(id)',
|
||||
_bands_handler)
|
||||
request_exts.append(req_ext2)
|
||||
return request_exts
|
||||
|
||||
def _add_tweedle_handler(self, input_dict, req, id):
|
||||
return "Tweedle {0} Added.".format(
|
||||
input_dict['FOXNSOX:add_tweedle']['name'])
|
||||
|
||||
def _delete_tweedle_handler(self, input_dict, req, id):
|
||||
return "Tweedle {0} Deleted.".format(
|
||||
input_dict['FOXNSOX:delete_tweedle']['name'])
|
@ -1,48 +0,0 @@
|
||||
# Copyright (c) 2012 OpenStack Foundation.
|
||||
#
|
||||
# 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.
|
||||
|
||||
EXTENDED_ATTRIBUTES_2_0 = {
|
||||
'networks': {
|
||||
'v2attrs:something': {'allow_post': False,
|
||||
'allow_put': False,
|
||||
'is_visible': True},
|
||||
'v2attrs:something_else': {'allow_post': True,
|
||||
'allow_put': False,
|
||||
'is_visible': False},
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
class V2attributes(object):
|
||||
def get_name(self):
|
||||
return "V2 Extended Attributes Example"
|
||||
|
||||
def get_alias(self):
|
||||
return "v2attrs"
|
||||
|
||||
def get_description(self):
|
||||
return "Demonstrates extended attributes on V2 core resources"
|
||||
|
||||
def get_namespace(self):
|
||||
return "http://docs.openstack.org/ext/examples/v2attributes/api/v1.0"
|
||||
|
||||
def get_updated(self):
|
||||
return "2012-07-18T10:00:00-00:00"
|
||||
|
||||
def get_extended_resources(self, version):
|
||||
if version == "2.0":
|
||||
return EXTENDED_ATTRIBUTES_2_0
|
||||
else:
|
||||
return {}
|
@ -1,12 +0,0 @@
|
||||
vdus:
|
||||
vdu1:
|
||||
config:
|
||||
firewall: |
|
||||
package firewall
|
||||
|
||||
config defaults
|
||||
option syn_flood '1'
|
||||
option input 'ACCEPT'
|
||||
option output 'ACCEPT'
|
||||
option forward 'REJECT'
|
||||
|
@ -1,26 +0,0 @@
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
availability_zone: nova
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
config_drive: false
|
||||
networks:
|
||||
- port: { get_resource: CP1 }
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
metadata: {metering.mea: SG1}
|
||||
VL1:
|
||||
type: OS::Neutron::Net
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: net_mgmt
|
||||
port_security_enabled: false
|
||||
heat_template_version: 2013-05-23
|
||||
description: Apmec Scaling template
|
@ -1,32 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
networks:
|
||||
- port:
|
||||
get_resource: CP1
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: existing_network_1
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 10
|
||||
ram: 512
|
||||
vcpus: 2
|
@ -1,26 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: m1.nano
|
||||
image: OpenWRT
|
||||
networks:
|
||||
- port:
|
||||
get_resource: CP1
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: existing_network_1
|
@ -1,32 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
networks:
|
||||
- port:
|
||||
get_resource: CP1
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: existing_network_1
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 10
|
||||
ram: 512
|
||||
vcpus: 1
|
@ -1,33 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
networks:
|
||||
- port:
|
||||
get_resource: CP1
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: existing_network_1
|
||||
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 2
|
||||
ram: 512
|
||||
vcpus: 2
|
@ -1,16 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: OpenWRT with services
|
||||
outputs: {}
|
||||
resources:
|
||||
VDU1:
|
||||
properties:
|
||||
config_drive: true
|
||||
flavor: m1.tiny
|
||||
image: {get_resource: VDU1_image}
|
||||
VDU1_image:
|
||||
type: OS::Glance::Image
|
||||
properties:
|
||||
location: http://URL/v1/openwrt.qcow2
|
||||
container_format: bare
|
||||
disk_format: raw
|
||||
|
@ -1,9 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: OpenWRT with services
|
||||
outputs: {}
|
||||
resources:
|
||||
VDU1:
|
||||
properties:
|
||||
config_drive: true
|
||||
flavor: m1.tiny
|
||||
image: cirros-0.3.5-x86_64-disk
|
@ -1,26 +0,0 @@
|
||||
description: OpenWRT with services
|
||||
heat_template_version: 2013-05-23
|
||||
outputs:
|
||||
mgmt_ip-vdu1:
|
||||
description: management ip address
|
||||
value:
|
||||
get_attr: [vdu1-net_mgmt-port, fixed_ips, 0, ip_address]
|
||||
resources:
|
||||
vdu1:
|
||||
properties:
|
||||
availability_zone: nova
|
||||
config_drive: true
|
||||
flavor: m1.tiny
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
metadata: {param0: key0, param1: key1}
|
||||
networks:
|
||||
- port: {get_resource: vdu1-net_mgmt-port}
|
||||
- {network: net0}
|
||||
- {network: net1}
|
||||
type: OS::Nova::Server
|
||||
vdu1-net_mgmt-port:
|
||||
properties:
|
||||
fixed_ips: []
|
||||
network: net_mgmt
|
||||
port_security_enabled: false
|
||||
type: OS::Neutron::Port
|
@ -1,41 +0,0 @@
|
||||
description: Parameterized MEA descriptor for IP addresses
|
||||
heat_template_version: 2013-05-23
|
||||
outputs:
|
||||
mgmt_ip-vdu1:
|
||||
description: management ip address
|
||||
value:
|
||||
get_attr: [vdu1-net_mgmt-port, fixed_ips, 0, ip_address]
|
||||
resources:
|
||||
vdu1:
|
||||
properties:
|
||||
availability_zone: nova
|
||||
config_drive: true
|
||||
flavor: m1.tiny
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
metadata: {param0: key0, param1: key1}
|
||||
networks:
|
||||
- port: {get_resource: vdu1-net_mgmt-port}
|
||||
- port: {get_resource: vdu1-net0-port}
|
||||
- port: {get_resource: vdu1-net1-port}
|
||||
type: OS::Nova::Server
|
||||
vdu1-net0-port:
|
||||
properties:
|
||||
fixed_ips:
|
||||
- {ip_address: 10.10.0.98}
|
||||
network: net0
|
||||
port_security_enabled: false
|
||||
type: OS::Neutron::Port
|
||||
vdu1-net1-port:
|
||||
properties:
|
||||
fixed_ips:
|
||||
- {ip_address: 10.10.1.98}
|
||||
network: net1
|
||||
port_security_enabled: false
|
||||
type: OS::Neutron::Port
|
||||
vdu1-net_mgmt-port:
|
||||
properties:
|
||||
fixed_ips:
|
||||
- {ip_address: 192.168.120.98}
|
||||
network: net_mgmt
|
||||
port_security_enabled: false
|
||||
type: OS::Neutron::Port
|
@ -1,35 +0,0 @@
|
||||
description: Parameterized MEA descriptor
|
||||
heat_template_version: 2013-05-23
|
||||
outputs:
|
||||
mgmt_ip-vdu1:
|
||||
description: management ip address
|
||||
value:
|
||||
get_attr: [vdu1-net_mgmt-port, fixed_ips, 0, ip_address]
|
||||
resources:
|
||||
vdu1:
|
||||
properties:
|
||||
availability_zone: nova
|
||||
config_drive: true
|
||||
flavor: m1.tiny
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
key_name: keyName
|
||||
metadata: {param0: key0, param1: key1}
|
||||
networks:
|
||||
- port: {get_resource: vdu1-net_mgmt-port}
|
||||
- {network: net0}
|
||||
- {network: net1}
|
||||
user_data: '#!/bin/sh
|
||||
|
||||
echo "my hostname is `hostname`" > /tmp/hostname
|
||||
|
||||
df -h > /home/cirros/diskinfo
|
||||
|
||||
'
|
||||
user_data_format: RAW
|
||||
type: OS::Nova::Server
|
||||
vdu1-net_mgmt-port:
|
||||
properties:
|
||||
fixed_ips: []
|
||||
network: net_mgmt
|
||||
port_security_enabled: false
|
||||
type: OS::Neutron::Port
|
@ -1,25 +0,0 @@
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
availability_zone: nova
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
config_drive: false
|
||||
networks:
|
||||
- port: { get_resource: CP1 }
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
flavor: m1.tiny
|
||||
VL1:
|
||||
type: OS::Neutron::Net
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
network: net_mgmt
|
||||
port_security_enabled: false
|
||||
heat_template_version: 2013-05-23
|
||||
description: Apmec Scaling template
|
@ -1,30 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: 'sample-tosca-mead-scaling
|
||||
|
||||
'
|
||||
|
||||
parameters: {}
|
||||
outputs: {}
|
||||
resources:
|
||||
SP1_group:
|
||||
properties:
|
||||
desired_capacity: 2
|
||||
max_size: 3
|
||||
min_size: 1
|
||||
cooldown: 60
|
||||
resource: {type: SP1_res.yaml}
|
||||
type: OS::Heat::AutoScalingGroup
|
||||
SP1_scale_in:
|
||||
properties:
|
||||
adjustment_type: change_in_capacity
|
||||
auto_scaling_group_id: {get_resource: SP1_group}
|
||||
cooldown: 60
|
||||
scaling_adjustment: -1
|
||||
type: OS::Heat::ScalingPolicy
|
||||
SP1_scale_out:
|
||||
properties:
|
||||
adjustment_type: change_in_capacity
|
||||
auto_scaling_group_id: {get_resource: SP1_group}
|
||||
cooldown: 60
|
||||
scaling_adjustment: 1
|
||||
type: OS::Heat::ScalingPolicy
|
@ -1,41 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: 'An exception will be raised when having the mismatched metadata
|
||||
(metadata is described in monitoring policy but unavailable in VDU properties).
|
||||
'
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
properties:
|
||||
availability_zone: nova
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
networks:
|
||||
- port: {get_resource: CP1}
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
type: OS::Nova::Server
|
||||
CP1:
|
||||
properties: {network: net_mgmt, port_security_enabled: false}
|
||||
type: OS::Neutron::Port
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 1
|
||||
ram: 512
|
||||
vcpus: 2
|
||||
vdu_hcpu_usage_respawning:
|
||||
type: OS::Aodh::Alarm
|
||||
properties:
|
||||
description: utilization greater_than 50%
|
||||
meter_name: cpu_util
|
||||
threshold: 50
|
||||
period: 60
|
||||
statistic: avg
|
||||
evaluation_periods: 1
|
||||
comparison_operator: gt
|
||||
'matching_metadata': {'metadata.user_metadata.mea': 'VDU1'}
|
@ -1,42 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: 'Demo example
|
||||
|
||||
'
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP1, fixed_ips, 0, ip_address]
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
properties:
|
||||
availability_zone: nova
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: cirros-0.3.5-x86_64-disk
|
||||
networks:
|
||||
- port: {get_resource: CP1}
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
metadata: {'metering.mea': 'VDU1'}
|
||||
type: OS::Nova::Server
|
||||
CP1:
|
||||
properties: {network: net_mgmt, port_security_enabled: false}
|
||||
type: OS::Neutron::Port
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 1
|
||||
ram: 512
|
||||
vcpus: 2
|
||||
vdu_hcpu_usage_respawning:
|
||||
type: OS::Aodh::Alarm
|
||||
properties:
|
||||
description: utilization greater_than 50%
|
||||
meter_name: cpu_util
|
||||
threshold: 50
|
||||
period: 60
|
||||
statistic: avg
|
||||
evaluation_periods: 1
|
||||
comparison_operator: gt
|
||||
'matching_metadata': {'metadata.user_metadata.mea': 'VDU1'}
|
@ -1,53 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
description: 'sample-tosca-mead-scaling
|
||||
|
||||
'
|
||||
|
||||
parameters: {}
|
||||
outputs: {}
|
||||
resources:
|
||||
SP1_group:
|
||||
properties:
|
||||
cooldown: 60
|
||||
desired_capacity: 2
|
||||
max_size: 3
|
||||
min_size: 1
|
||||
resource: {type: SP1_res.yaml}
|
||||
type: OS::Heat::AutoScalingGroup
|
||||
SP1_scale_in:
|
||||
properties:
|
||||
adjustment_type: change_in_capacity
|
||||
auto_scaling_group_id: {get_resource: SP1_group}
|
||||
cooldown: 60
|
||||
scaling_adjustment: -1
|
||||
type: OS::Heat::ScalingPolicy
|
||||
SP1_scale_out:
|
||||
properties:
|
||||
adjustment_type: change_in_capacity
|
||||
auto_scaling_group_id: {get_resource: SP1_group}
|
||||
cooldown: 60
|
||||
scaling_adjustment: 1
|
||||
type: OS::Heat::ScalingPolicy
|
||||
|
||||
vdu_hcpu_usage_scaling_out:
|
||||
type: OS::Aodh::Alarm
|
||||
properties:
|
||||
description: utilization greater_than 50%
|
||||
meter_name: cpu_util
|
||||
statistic: avg
|
||||
period: 600
|
||||
evaluation_periods: 1
|
||||
threshold: 50
|
||||
matching_metadata: {'metadata.user_metadata.mea': SG1}
|
||||
comparison_operator: gt
|
||||
vdu_lcpu_usage_scaling_in:
|
||||
type: OS::Aodh::Alarm
|
||||
properties:
|
||||
description: utilization less_than 10%
|
||||
meter_name: cpu_util
|
||||
statistic: avg
|
||||
period: 600
|
||||
evaluation_periods: 1
|
||||
threshold: 10
|
||||
matching_metadata: {'metadata.user_metadata.mea': SG1}
|
||||
comparison_operator: lt
|
@ -1,88 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
VIP Template
|
||||
|
||||
outputs:
|
||||
mgmt_ip-VDU1:
|
||||
value:
|
||||
get_attr: [CP2, fixed_ips, 0, ip_address]
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: m1.nano
|
||||
image: {get_resource: VDU1_image}
|
||||
networks:
|
||||
- port:
|
||||
get_resource: CP1
|
||||
- port:
|
||||
get_resource: CP2
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
CP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
fixed_ips:
|
||||
- ip_address: 10.10.1.11
|
||||
allowed_address_pairs:
|
||||
- ip_address: 10.10.1.12
|
||||
network: existing_network_1
|
||||
port_security_enabled: true
|
||||
security_groups:
|
||||
- default
|
||||
|
||||
VCP1:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
fixed_ips:
|
||||
- ip_address: 10.10.1.12
|
||||
network: existing_network_1
|
||||
port_security_enabled: true
|
||||
security_groups:
|
||||
- default
|
||||
|
||||
CP2:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
fixed_ips:
|
||||
- ip_address: 10.10.2.21
|
||||
allowed_address_pairs:
|
||||
- ip_address: 10.10.2.22
|
||||
- ip_address: 10.10.2.23
|
||||
mac_address: fe:1a:29:d9:36:45
|
||||
mac_address: fe:1a:29:d9:36:45
|
||||
network: existing_network_2
|
||||
port_security_enabled: true
|
||||
security_groups:
|
||||
- default
|
||||
|
||||
VCP2:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
fixed_ips:
|
||||
- ip_address: 10.10.2.22
|
||||
network: existing_network_2
|
||||
port_security_enabled: true
|
||||
security_groups:
|
||||
- default
|
||||
|
||||
VCP3:
|
||||
type: OS::Neutron::Port
|
||||
properties:
|
||||
fixed_ips:
|
||||
- ip_address: 10.10.2.23
|
||||
network: existing_network_2
|
||||
port_security_enabled: true
|
||||
security_groups:
|
||||
- default
|
||||
|
||||
VDU1_image:
|
||||
type: OS::Glance::Image
|
||||
properties:
|
||||
container_format: bare
|
||||
disk_format: raw
|
||||
location: http://URL/vRouterMEA.qcow2
|
||||
name: vm_image
|
@ -1,22 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 10
|
||||
ram: 4096
|
||||
vcpus: 8
|
||||
extra_specs: {'hw:cpu_policy': 'dedicated', 'hw:mem_page_size': 'any', 'hw:cpu_sockets': 2, 'hw:cpu_threads': 2, 'hw:numa_nodes': 2, 'hw:cpu_cores': 2, 'hw:cpu_threads_policy': 'avoid'}
|
||||
outputs: {}
|
@ -1,22 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 40
|
||||
ram: 4096
|
||||
vcpus: 6
|
||||
extra_specs: {'hw:cpu_policy': 'dedicated', 'hw:mem_page_size': 'any', 'hw:cpu_sockets': 2, 'hw:cpu_threads': 2, 'hw:numa_mem.1': 3072, 'hw:numa_mem.0': 1024, 'hw:numa_cpus.0': '0,1', 'hw:numa_cpus.1': '2,3,4,5', 'hw:cpu_cores': 2, 'hw:cpu_threads_policy': 'avoid', 'hw:numa_nodes': 2}
|
||||
outputs: {}
|
@ -1,22 +0,0 @@
|
||||
heat_template_version: 2013-05-23
|
||||
|
||||
description: >
|
||||
OpenWRT with services
|
||||
|
||||
parameters: {}
|
||||
resources:
|
||||
VDU1:
|
||||
type: OS::Nova::Server
|
||||
properties:
|
||||
config_drive: false
|
||||
flavor: {get_resource: VDU1_flavor}
|
||||
image: OpenWRT
|
||||
user_data_format: SOFTWARE_CONFIG
|
||||
VDU1_flavor:
|
||||
type: OS::Nova::Flavor
|
||||
properties:
|
||||
disk: 40
|
||||
ram: 4096
|
||||
vcpus: 6
|
||||
extra_specs: {'hw:cpu_policy': 'dedicated', 'hw:cpu_sockets': 2, 'hw:cpu_threads': 2, 'hw:cpu_cores': 2, 'hw:cpu_threads_policy': 'avoid'}
|
||||
outputs: {}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user