Merge "Remove VIM monitoring depending on Mistral"
This commit is contained in:
commit
5d1b463ac5
|
@ -212,8 +212,7 @@ class KubernetesMgmtDriver(vnflcm_abstract_driver.VnflcmMgmtAbstractDriver):
|
||||||
if created_vim_info:
|
if created_vim_info:
|
||||||
vim_info = self.nfvo_plugin.get_vim(
|
vim_info = self.nfvo_plugin.get_vim(
|
||||||
context, created_vim_info.id)
|
context, created_vim_info.id)
|
||||||
if (vim_info['auth_url'] == server and
|
if vim_info['auth_url'] == server:
|
||||||
vim_info['status'] == 'REACHABLE'):
|
|
||||||
return vim_info
|
return vim_info
|
||||||
try:
|
try:
|
||||||
return self.nfvo_plugin.create_vim(context, create_vim_info)
|
return self.nfvo_plugin.create_vim(context, create_vim_info)
|
||||||
|
|
|
@ -11,5 +11,4 @@
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
|
||||||
TOPIC_ACTION_KILL = 'KILL_ACTION'
|
|
||||||
TOPIC_CONDUCTOR = 'TACKER_CONDUCTOR'
|
TOPIC_CONDUCTOR = 'TACKER_CONDUCTOR'
|
||||||
|
|
|
@ -39,7 +39,6 @@ from oslo_utils import excutils
|
||||||
from oslo_utils import timeutils
|
from oslo_utils import timeutils
|
||||||
from oslo_utils import uuidutils
|
from oslo_utils import uuidutils
|
||||||
from sqlalchemy import exc as sqlexc
|
from sqlalchemy import exc as sqlexc
|
||||||
from sqlalchemy.orm import exc as orm_exc
|
|
||||||
|
|
||||||
from tacker import auth
|
from tacker import auth
|
||||||
from tacker.common import coordination
|
from tacker.common import coordination
|
||||||
|
@ -52,11 +51,8 @@ from tacker.common import topics
|
||||||
from tacker.common import utils
|
from tacker.common import utils
|
||||||
import tacker.conf
|
import tacker.conf
|
||||||
from tacker import context as t_context
|
from tacker import context as t_context
|
||||||
from tacker.db.common_services import common_services_db
|
|
||||||
from tacker.db.db_sqlalchemy import models
|
from tacker.db.db_sqlalchemy import models
|
||||||
from tacker.db.nfvo import nfvo_db
|
|
||||||
from tacker.db.vnfm import vnfm_db
|
from tacker.db.vnfm import vnfm_db
|
||||||
from tacker.extensions import nfvo
|
|
||||||
from tacker.glance_store import store as glance_store
|
from tacker.glance_store import store as glance_store
|
||||||
from tacker import manager
|
from tacker import manager
|
||||||
from tacker import objects
|
from tacker import objects
|
||||||
|
@ -356,28 +352,6 @@ class Conductor(manager.Manager, v2_hook.ConductorV2Hook):
|
||||||
CONF.vnf_package.vnf_package_csar_path)
|
CONF.vnf_package.vnf_package_csar_path)
|
||||||
sys.exit(1)
|
sys.exit(1)
|
||||||
|
|
||||||
def update_vim(self, context, vim_id, status):
|
|
||||||
t_admin_context = t_context.get_admin_context()
|
|
||||||
update_time = timeutils.utcnow()
|
|
||||||
with t_admin_context.session.begin(subtransactions=True):
|
|
||||||
try:
|
|
||||||
query = t_admin_context.session.query(nfvo_db.Vim)
|
|
||||||
query.filter(
|
|
||||||
nfvo_db.Vim.id == vim_id).update(
|
|
||||||
{'status': status,
|
|
||||||
'updated_at': update_time})
|
|
||||||
except orm_exc.NoResultFound:
|
|
||||||
raise nfvo.VimNotFoundException(vim_id=vim_id)
|
|
||||||
event_db = common_services_db.Event(
|
|
||||||
resource_id=vim_id,
|
|
||||||
resource_type=constants.RES_TYPE_VIM,
|
|
||||||
resource_state=status,
|
|
||||||
event_details="",
|
|
||||||
event_type=constants.RES_EVT_MONITOR,
|
|
||||||
timestamp=update_time)
|
|
||||||
t_admin_context.session.add(event_db)
|
|
||||||
return status
|
|
||||||
|
|
||||||
def _create_software_images(self, context, sw_image, flavour_uuid):
|
def _create_software_images(self, context, sw_image, flavour_uuid):
|
||||||
vnf_sw_image = objects.VnfSoftwareImage(context=context)
|
vnf_sw_image = objects.VnfSoftwareImage(context=context)
|
||||||
vnf_sw_image.flavour_uuid = flavour_uuid
|
vnf_sw_image.flavour_uuid = flavour_uuid
|
||||||
|
|
|
@ -1 +1 @@
|
||||||
de8d835ae776
|
de6bfa5bea46
|
|
@ -1,5 +1,4 @@
|
||||||
# Copyright 2017 OpenStack Foundation
|
# Copyright 2023 OpenStack Foundation
|
||||||
# All Rights Reserved.
|
|
||||||
#
|
#
|
||||||
# Licensed under the Apache License, Version 2.0 (the "License"); you may
|
# 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
|
# not use this file except in compliance with the License. You may obtain
|
||||||
|
@ -12,19 +11,24 @@
|
||||||
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
#
|
||||||
|
|
||||||
import oslo_messaging
|
"""remove status from Vim
|
||||||
|
|
||||||
from tacker.common import topics
|
Revision ID: de6bfa5bea46
|
||||||
|
Revises: de8d835ae776
|
||||||
|
Create Date: 2023-01-09 11:08:53.597828
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
# flake8: noqa: E402
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision = 'de6bfa5bea46'
|
||||||
|
down_revision = 'de8d835ae776'
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
|
||||||
|
|
||||||
class VIMUpdateRPC(object):
|
def upgrade(active_plugins=None, options=None):
|
||||||
|
op.drop_column('vims', 'status')
|
||||||
target = oslo_messaging.Target(
|
|
||||||
exchange='tacker',
|
|
||||||
topic=topics.TOPIC_CONDUCTOR,
|
|
||||||
fanout=False,
|
|
||||||
version='1.0')
|
|
||||||
|
|
||||||
def update_vim(self, context, **kwargs):
|
|
||||||
pass
|
|
|
@ -37,7 +37,6 @@ class Vim(model_base.BASE,
|
||||||
is_default = sa.Column(sa.Boolean, default=False, server_default=sql.false(
|
is_default = sa.Column(sa.Boolean, default=False, server_default=sql.false(
|
||||||
), nullable=False)
|
), nullable=False)
|
||||||
vim_auth = orm.relationship('VimAuth')
|
vim_auth = orm.relationship('VimAuth')
|
||||||
status = sa.Column(sa.String(255), nullable=False)
|
|
||||||
extra = sa.Column(types.Json, nullable=True)
|
extra = sa.Column(types.Json, nullable=True)
|
||||||
|
|
||||||
__table_args__ = (
|
__table_args__ = (
|
||||||
|
|
|
@ -31,7 +31,7 @@ from tacker.plugins.common import constants
|
||||||
|
|
||||||
VIM_ATTRIBUTES = ('id', 'type', 'tenant_id', 'name', 'description',
|
VIM_ATTRIBUTES = ('id', 'type', 'tenant_id', 'name', 'description',
|
||||||
'placement_attr', 'shared', 'is_default',
|
'placement_attr', 'shared', 'is_default',
|
||||||
'created_at', 'updated_at', 'status', 'extra')
|
'created_at', 'updated_at', 'extra')
|
||||||
|
|
||||||
VIM_AUTH_ATTRIBUTES = ('auth_url', 'vim_project', 'password', 'auth_cred')
|
VIM_AUTH_ATTRIBUTES = ('auth_url', 'vim_project', 'password', 'auth_cred')
|
||||||
|
|
||||||
|
@ -52,6 +52,9 @@ class NfvoPluginDb(nfvo.NFVOPluginBase, db_base.CommonDbMixin):
|
||||||
res['auth_url'] = vim_auth_db[0].auth_url
|
res['auth_url'] = vim_auth_db[0].auth_url
|
||||||
res['vim_project'] = vim_auth_db[0].vim_project
|
res['vim_project'] = vim_auth_db[0].vim_project
|
||||||
res['auth_cred'] = vim_auth_db[0].auth_cred
|
res['auth_cred'] = vim_auth_db[0].auth_cred
|
||||||
|
# TODO(hiromu): Remove 'status' after removing status field from
|
||||||
|
# tacker-pythonclient
|
||||||
|
res['status'] = 'ACTIVE'
|
||||||
if vim_auth_db[0].password:
|
if vim_auth_db[0].password:
|
||||||
res['auth_cred']['password'] = vim_auth_db[0].password
|
res['auth_cred']['password'] = vim_auth_db[0].password
|
||||||
# NOTE(Yao Qibin): Since oidc_token_url contains keyword `token`,
|
# NOTE(Yao Qibin): Since oidc_token_url contains keyword `token`,
|
||||||
|
@ -97,7 +100,6 @@ class NfvoPluginDb(nfvo.NFVOPluginBase, db_base.CommonDbMixin):
|
||||||
description=vim.get('description'),
|
description=vim.get('description'),
|
||||||
placement_attr=vim.get('placement_attr'),
|
placement_attr=vim.get('placement_attr'),
|
||||||
is_default=vim.get('is_default'),
|
is_default=vim.get('is_default'),
|
||||||
status=vim.get('status'),
|
|
||||||
extra=vim.get('extra'),
|
extra=vim.get('extra'),
|
||||||
deleted_at=datetime.min)
|
deleted_at=datetime.min)
|
||||||
context.session.add(vim_db)
|
context.session.add(vim_db)
|
||||||
|
@ -114,10 +116,14 @@ class NfvoPluginDb(nfvo.NFVOPluginBase, db_base.CommonDbMixin):
|
||||||
_type="vim",
|
_type="vim",
|
||||||
entry=e.columns)
|
entry=e.columns)
|
||||||
vim_dict = self._make_vim_dict(vim_db)
|
vim_dict = self._make_vim_dict(vim_db)
|
||||||
|
|
||||||
|
# TODO(hiromu): Remove Event table
|
||||||
|
# NOTE(hiromu): "REGISTERED" in res_state is a workaround to delete
|
||||||
|
# the status field from the Vim table.
|
||||||
self._cos_db_plg.create_event(
|
self._cos_db_plg.create_event(
|
||||||
context, res_id=vim_dict['id'],
|
context, res_id=vim_dict['id'],
|
||||||
res_type=constants.RES_TYPE_VIM,
|
res_type=constants.RES_TYPE_VIM,
|
||||||
res_state=vim_dict['status'],
|
res_state='REGISTERED',
|
||||||
evt_type=constants.RES_EVT_CREATE,
|
evt_type=constants.RES_EVT_CREATE,
|
||||||
tstamp=vim_dict['created_at'])
|
tstamp=vim_dict['created_at'])
|
||||||
return vim_dict
|
return vim_dict
|
||||||
|
@ -127,10 +133,14 @@ class NfvoPluginDb(nfvo.NFVOPluginBase, db_base.CommonDbMixin):
|
||||||
vim_db = self._get_resource(context, nfvo_db.Vim, vim_id)
|
vim_db = self._get_resource(context, nfvo_db.Vim, vim_id)
|
||||||
if soft_delete:
|
if soft_delete:
|
||||||
vim_db.update({'deleted_at': timeutils.utcnow()})
|
vim_db.update({'deleted_at': timeutils.utcnow()})
|
||||||
|
|
||||||
|
# TODO(hiromu): Remove Event table
|
||||||
|
# NOTE(hiromu): "REGISTERED" in res_state is a workaround to
|
||||||
|
# delete the status field from the Vim table.
|
||||||
self._cos_db_plg.create_event(
|
self._cos_db_plg.create_event(
|
||||||
context, res_id=vim_db['id'],
|
context, res_id=vim_db['id'],
|
||||||
res_type=constants.RES_TYPE_VIM,
|
res_type=constants.RES_TYPE_VIM,
|
||||||
res_state=vim_db['status'],
|
res_state='REGISTERED',
|
||||||
evt_type=constants.RES_EVT_DELETE,
|
evt_type=constants.RES_EVT_DELETE,
|
||||||
tstamp=vim_db[constants.RES_EVT_DELETED_FLD])
|
tstamp=vim_db[constants.RES_EVT_DELETED_FLD])
|
||||||
else:
|
else:
|
||||||
|
@ -181,26 +191,19 @@ class NfvoPluginDb(nfvo.NFVOPluginBase, db_base.CommonDbMixin):
|
||||||
vim_cred.pop('password', None), 'vim_project':
|
vim_cred.pop('password', None), 'vim_project':
|
||||||
vim_project})
|
vim_project})
|
||||||
vim_db.update({'updated_at': timeutils.utcnow()})
|
vim_db.update({'updated_at': timeutils.utcnow()})
|
||||||
|
|
||||||
|
# TODO(hiromu): Remove Event table
|
||||||
|
# NOTE(hiromu): "REGISTERED" in res_state is a workaround to delete
|
||||||
|
# the status field from the Vim table.
|
||||||
self._cos_db_plg.create_event(
|
self._cos_db_plg.create_event(
|
||||||
context, res_id=vim_db['id'],
|
context, res_id=vim_db['id'],
|
||||||
res_type=constants.RES_TYPE_VIM,
|
res_type=constants.RES_TYPE_VIM,
|
||||||
res_state=vim_db['status'],
|
res_state='REGISTERED',
|
||||||
evt_type=constants.RES_EVT_UPDATE,
|
evt_type=constants.RES_EVT_UPDATE,
|
||||||
tstamp=vim_db[constants.RES_EVT_UPDATED_FLD])
|
tstamp=vim_db[constants.RES_EVT_UPDATED_FLD])
|
||||||
|
|
||||||
return self.get_vim(context, vim_id)
|
return self.get_vim(context, vim_id)
|
||||||
|
|
||||||
def update_vim_status(self, context, vim_id, status):
|
|
||||||
with context.session.begin(subtransactions=True):
|
|
||||||
try:
|
|
||||||
vim_db = (self._model_query(context, nfvo_db.Vim).filter(
|
|
||||||
nfvo_db.Vim.id == vim_id).with_for_update().one())
|
|
||||||
except orm_exc.NoResultFound:
|
|
||||||
raise nfvo.VimNotFoundException(vim_id=vim_id)
|
|
||||||
vim_db.update({'status': status,
|
|
||||||
'updated_at': timeutils.utcnow()})
|
|
||||||
return self._make_vim_dict(vim_db)
|
|
||||||
|
|
||||||
def _validate_default_vim(self, context, vim, vim_id=None):
|
def _validate_default_vim(self, context, vim, vim_id=None):
|
||||||
if not vim.get('is_default'):
|
if not vim.get('is_default'):
|
||||||
return True
|
return True
|
||||||
|
|
|
@ -1,27 +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 oslo_messaging
|
|
||||||
|
|
||||||
from tacker.common import topics
|
|
||||||
|
|
||||||
|
|
||||||
class MistralActionKillRPC(object):
|
|
||||||
|
|
||||||
target = oslo_messaging.Target(
|
|
||||||
exchange='tacker',
|
|
||||||
topic=topics.TOPIC_ACTION_KILL,
|
|
||||||
fanout=False,
|
|
||||||
version='1.0')
|
|
||||||
|
|
||||||
def killAction(self, context, **kwargs):
|
|
||||||
pass
|
|
|
@ -61,7 +61,6 @@ OPENSTACK_OPTS = [
|
||||||
help=_('Number of seconds to wait between packets'))
|
help=_('Number of seconds to wait between packets'))
|
||||||
]
|
]
|
||||||
cfg.CONF.register_opts(OPTS, 'vim_keys')
|
cfg.CONF.register_opts(OPTS, 'vim_keys')
|
||||||
cfg.CONF.register_opts(OPENSTACK_OPTS, 'vim_monitor')
|
|
||||||
|
|
||||||
_VALID_RESOURCE_TYPES = {'network': {'client': neutron_client.Client,
|
_VALID_RESOURCE_TYPES = {'network': {'client': neutron_client.Client,
|
||||||
'cmd': 'list_networks',
|
'cmd': 'list_networks',
|
||||||
|
@ -87,8 +86,7 @@ SFC_ENCAP = 'sfc_encap'
|
||||||
|
|
||||||
|
|
||||||
def config_opts():
|
def config_opts():
|
||||||
return [('vim_keys', OPTS),
|
return [('vim_keys', OPTS)]
|
||||||
('vim_monitor', OPENSTACK_OPTS)]
|
|
||||||
|
|
||||||
|
|
||||||
class OpenStack_Driver(abstract_vim_driver.VimAbstractDriver,
|
class OpenStack_Driver(abstract_vim_driver.VimAbstractDriver,
|
||||||
|
|
|
@ -42,7 +42,6 @@ from tacker.extensions import common_services as cs
|
||||||
from tacker.extensions import nfvo
|
from tacker.extensions import nfvo
|
||||||
from tacker.keymgr import API as KEYMGR_API
|
from tacker.keymgr import API as KEYMGR_API
|
||||||
from tacker import manager
|
from tacker import manager
|
||||||
from tacker.nfvo.workflows.vim_monitor import vim_monitor_utils
|
|
||||||
from tacker.plugins.common import constants
|
from tacker.plugins.common import constants
|
||||||
from tacker.vnfm import keystone
|
from tacker.vnfm import keystone
|
||||||
from tacker.vnfm import vim_client
|
from tacker.vnfm import vim_client
|
||||||
|
@ -124,7 +123,6 @@ class NfvoPlugin(nfvo_db_plugin.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
|
||||||
if vim_type == 'openstack':
|
if vim_type == 'openstack':
|
||||||
vim_obj['auth_url'] = utils.get_auth_url_v3(vim_obj['auth_url'])
|
vim_obj['auth_url'] = utils.get_auth_url_v3(vim_obj['auth_url'])
|
||||||
vim_obj['id'] = uuidutils.generate_uuid()
|
vim_obj['id'] = uuidutils.generate_uuid()
|
||||||
vim_obj['status'] = 'PENDING'
|
|
||||||
try:
|
try:
|
||||||
self._vim_drivers.invoke(vim_type,
|
self._vim_drivers.invoke(vim_type,
|
||||||
'register_vim',
|
'register_vim',
|
||||||
|
@ -136,11 +134,6 @@ class NfvoPlugin(nfvo_db_plugin.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
|
||||||
'delete_vim_auth',
|
'delete_vim_auth',
|
||||||
vim_id=vim_obj['id'],
|
vim_id=vim_obj['id'],
|
||||||
auth=vim_obj['auth_cred'])
|
auth=vim_obj['auth_cred'])
|
||||||
|
|
||||||
try:
|
|
||||||
self.monitor_vim(context, vim_obj)
|
|
||||||
except Exception:
|
|
||||||
LOG.warning("Failed to set up vim monitoring")
|
|
||||||
return res
|
return res
|
||||||
|
|
||||||
def _get_vim(self, context, vim_id):
|
def _get_vim(self, context, vim_id):
|
||||||
|
@ -250,18 +243,8 @@ class NfvoPlugin(nfvo_db_plugin.NfvoPluginDb, vnffg_db.VnffgPluginDbMixin,
|
||||||
self._vim_drivers.invoke(vim_obj['type'],
|
self._vim_drivers.invoke(vim_obj['type'],
|
||||||
'deregister_vim',
|
'deregister_vim',
|
||||||
vim_obj=vim_obj)
|
vim_obj=vim_obj)
|
||||||
try:
|
|
||||||
auth_dict = self.get_auth_dict(context)
|
|
||||||
vim_monitor_utils.delete_vim_monitor(context, auth_dict, vim_obj)
|
|
||||||
except Exception:
|
|
||||||
LOG.exception("Failed to remove vim monitor")
|
|
||||||
super(NfvoPlugin, self).delete_vim(context, vim_id)
|
super(NfvoPlugin, self).delete_vim(context, vim_id)
|
||||||
|
|
||||||
@log.log
|
|
||||||
def monitor_vim(self, context, vim_obj):
|
|
||||||
auth_dict = self.get_auth_dict(context)
|
|
||||||
vim_monitor_utils.monitor_vim(auth_dict, vim_obj)
|
|
||||||
|
|
||||||
@log.log
|
@log.log
|
||||||
def validate_tosca(self, template):
|
def validate_tosca(self, template):
|
||||||
if "tosca_definitions_version" not in template:
|
if "tosca_definitions_version" not in template:
|
||||||
|
|
|
@ -1,15 +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.
|
|
||||||
|
|
||||||
|
|
||||||
RESOURCE_NAME = 'ping_vim'
|
|
||||||
PING_VIM_TASK_NAME = 'PingVIMTASK'
|
|
|
@ -1,94 +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 yaml
|
|
||||||
|
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from tacker.common import rpc
|
|
||||||
from tacker.mistral.actionrpc import kill_action as killaction
|
|
||||||
from tacker.mistral import mistral_client
|
|
||||||
from tacker.nfvo.workflows.vim_monitor import workflow_generator
|
|
||||||
from tacker.vnfm import keystone
|
|
||||||
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
def get_mistral_client(auth_dict):
|
|
||||||
return mistral_client.MistralClient(
|
|
||||||
keystone.Keystone().initialize_client(**auth_dict),
|
|
||||||
auth_dict['token']).get_client()
|
|
||||||
|
|
||||||
|
|
||||||
def prepare_and_create_workflow(mistral_client, vim_id, action,
|
|
||||||
kwargs):
|
|
||||||
wg = workflow_generator.WorkflowGenerator(vim_id, action)
|
|
||||||
wg.task(**kwargs)
|
|
||||||
yaml.SafeDumper.ignore_aliases = lambda self, data: True
|
|
||||||
definition_yaml = yaml.safe_dump(wg.definition, default_flow_style=False)
|
|
||||||
LOG.debug('vim monitor workflow: %s', definition_yaml)
|
|
||||||
workflow = mistral_client.workflows.create(definition_yaml)
|
|
||||||
return {'id': workflow[0].id, 'input': wg.get_input_dict()}
|
|
||||||
|
|
||||||
|
|
||||||
def execute_workflow(mistral_client, workflow):
|
|
||||||
return mistral_client.executions.create(
|
|
||||||
wf_identifier=workflow['id'],
|
|
||||||
workflow_input=workflow['input'],
|
|
||||||
wf_params={})
|
|
||||||
|
|
||||||
|
|
||||||
def delete_executions(mistral_client, vim_id):
|
|
||||||
executions = mistral_client.executions.list(
|
|
||||||
workflow_name='vim_id_' + vim_id)
|
|
||||||
for execution in executions:
|
|
||||||
mistral_client.executions.delete(execution.id, force=True)
|
|
||||||
|
|
||||||
|
|
||||||
def delete_workflow(mistral_client, vim_id):
|
|
||||||
return mistral_client.workflows.delete('vim_id_' + vim_id)
|
|
||||||
|
|
||||||
|
|
||||||
def monitor_vim(auth_dict, vim_obj):
|
|
||||||
mc = get_mistral_client(auth_dict)
|
|
||||||
auth_url = vim_obj["auth_url"]
|
|
||||||
vim_type = vim_obj['type']
|
|
||||||
if vim_type == 'openstack':
|
|
||||||
vim_ip = auth_url.split("//")[-1].split(":")[0].split("/")[0]
|
|
||||||
elif vim_type == 'kubernetes':
|
|
||||||
vim_ip = auth_url.split("//")[-1].split(":")[0]
|
|
||||||
workflow_input_dict = {
|
|
||||||
'vim_id': vim_obj['id'],
|
|
||||||
'count': cfg.CONF.vim_monitor.count,
|
|
||||||
'timeout': cfg.CONF.vim_monitor.timeout,
|
|
||||||
'interval': cfg.CONF.vim_monitor.interval,
|
|
||||||
'targetip': vim_ip}
|
|
||||||
workflow = prepare_and_create_workflow(
|
|
||||||
mc, vim_obj['id'], 'monitor',
|
|
||||||
workflow_input_dict)
|
|
||||||
execute_workflow(mc, workflow)
|
|
||||||
|
|
||||||
|
|
||||||
def kill_action(context, vim_obj):
|
|
||||||
target = killaction.MistralActionKillRPC.target
|
|
||||||
rpc_client = rpc.get_client(target)
|
|
||||||
cctxt = rpc_client.prepare(server=vim_obj['id'])
|
|
||||||
cctxt.cast(context, 'killAction')
|
|
||||||
|
|
||||||
|
|
||||||
def delete_vim_monitor(context, auth_dict, vim_obj):
|
|
||||||
mc = get_mistral_client(auth_dict)
|
|
||||||
delete_executions(mc, vim_obj['id'])
|
|
||||||
delete_workflow(mc, vim_obj['id'])
|
|
||||||
kill_action(context, vim_obj)
|
|
|
@ -1,114 +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 netaddr
|
|
||||||
|
|
||||||
from mistral_lib import actions
|
|
||||||
from oslo_config import cfg
|
|
||||||
from oslo_log import log as logging
|
|
||||||
|
|
||||||
from tacker.agent.linux import utils as linux_utils
|
|
||||||
from tacker.common import rpc
|
|
||||||
from tacker.common import topics
|
|
||||||
from tacker.conductor.conductorrpc import vim_monitor_rpc
|
|
||||||
from tacker import context as t_context
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class PingVimAction(actions.Action):
|
|
||||||
|
|
||||||
def __init__(self, count, targetip, vim_id,
|
|
||||||
interval, timeout):
|
|
||||||
self.killed = False
|
|
||||||
self.count = count
|
|
||||||
self.timeout = timeout
|
|
||||||
self.interval = interval
|
|
||||||
self.targetip = targetip
|
|
||||||
self.vim_id = vim_id
|
|
||||||
self.current_status = "PENDING"
|
|
||||||
|
|
||||||
def start_rpc_listeners(self):
|
|
||||||
"""Start the RPC loop to let the server communicate with actions."""
|
|
||||||
self.endpoints = [self]
|
|
||||||
self.conn = rpc.create_connection()
|
|
||||||
self.conn.create_consumer(topics.TOPIC_ACTION_KILL,
|
|
||||||
self.endpoints, fanout=False,
|
|
||||||
host=self.vim_id)
|
|
||||||
return self.conn.consume_in_threads()
|
|
||||||
|
|
||||||
def killAction(self, context, **kwargs):
|
|
||||||
self.killed = True
|
|
||||||
|
|
||||||
def _ping(self):
|
|
||||||
|
|
||||||
cmd_ping = 'ping'
|
|
||||||
if netaddr.valid_ipv6(self.targetip):
|
|
||||||
cmd_ping = 'ping6'
|
|
||||||
|
|
||||||
ping_cmd = [cmd_ping, '-c', self.count,
|
|
||||||
'-W', self.timeout,
|
|
||||||
'-i', self.interval,
|
|
||||||
self.targetip]
|
|
||||||
|
|
||||||
try:
|
|
||||||
# NOTE(gongysh) since it is called in a loop, the debug log
|
|
||||||
# should be disabled to avoid eating up mistral executor.
|
|
||||||
linux_utils.execute(ping_cmd, check_exit_code=True,
|
|
||||||
debuglog=False)
|
|
||||||
return 'REACHABLE'
|
|
||||||
except RuntimeError:
|
|
||||||
LOG.warning(("Cannot ping ip address: %s"), self.targetip)
|
|
||||||
return 'UNREACHABLE'
|
|
||||||
|
|
||||||
def _update(self, status):
|
|
||||||
LOG.info("VIM %s changed to status %s", self.vim_id, status)
|
|
||||||
target = vim_monitor_rpc.VIMUpdateRPC.target
|
|
||||||
rpc_client = rpc.get_client(target)
|
|
||||||
cctxt = rpc_client.prepare()
|
|
||||||
return cctxt.call(t_context.get_admin_context_without_session(),
|
|
||||||
'update_vim',
|
|
||||||
vim_id=self.vim_id,
|
|
||||||
status=status)
|
|
||||||
|
|
||||||
def run(self, action_ctx):
|
|
||||||
servers = []
|
|
||||||
try:
|
|
||||||
rpc.init_action_rpc(cfg.CONF)
|
|
||||||
servers = self.start_rpc_listeners()
|
|
||||||
except Exception:
|
|
||||||
LOG.exception('failed to start rpc in vim action')
|
|
||||||
return 'FAILED'
|
|
||||||
try:
|
|
||||||
while True:
|
|
||||||
if self.killed:
|
|
||||||
break
|
|
||||||
status = self._ping()
|
|
||||||
if self.current_status != status:
|
|
||||||
self.current_status = self._update(status)
|
|
||||||
# TODO(gongysh) If we need to sleep a little time here?
|
|
||||||
except Exception:
|
|
||||||
LOG.exception('failed to run mistral action for vim %s',
|
|
||||||
self.vim_id)
|
|
||||||
return 'FAILED'
|
|
||||||
# to stop rpc connection
|
|
||||||
for server in servers:
|
|
||||||
try:
|
|
||||||
server.stop()
|
|
||||||
except Exception:
|
|
||||||
LOG.exception(
|
|
||||||
'failed to stop rpc connection for vim %s',
|
|
||||||
self.vim_id)
|
|
||||||
return 'KILLED'
|
|
||||||
|
|
||||||
def test(self):
|
|
||||||
return 'REACHABLE'
|
|
|
@ -1,59 +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 oslo_log import log as logging
|
|
||||||
|
|
||||||
from tacker.mistral import workflow_generator
|
|
||||||
from tacker.nfvo.workflows import vim_monitor
|
|
||||||
|
|
||||||
LOG = logging.getLogger(__name__)
|
|
||||||
|
|
||||||
|
|
||||||
class WorkflowGenerator(workflow_generator.WorkflowGeneratorBase):
|
|
||||||
def __init__(self, vim_id, action):
|
|
||||||
super(WorkflowGenerator, self).__init__(
|
|
||||||
vim_monitor.RESOURCE_NAME, action)
|
|
||||||
self.wf_identifier = 'vim_id_' + vim_id
|
|
||||||
self._build_basic_workflow()
|
|
||||||
|
|
||||||
def _add_ping_vim_tasks(self):
|
|
||||||
task_dict = dict()
|
|
||||||
task = self.wf_name + vim_monitor.PING_VIM_TASK_NAME
|
|
||||||
task_dict[task] = {
|
|
||||||
'action': 'tacker.vim_ping_action',
|
|
||||||
'input': {'count': self.input_dict_data['count'],
|
|
||||||
'targetip': self.input_dict_data['targetip'],
|
|
||||||
'vim_id': self.input_dict_data['vim_id'],
|
|
||||||
'interval': self.input_dict_data['interval'],
|
|
||||||
'timeout': self.input_dict_data['timeout']},
|
|
||||||
}
|
|
||||||
return task_dict
|
|
||||||
|
|
||||||
def get_input_dict(self):
|
|
||||||
return self.input_dict
|
|
||||||
|
|
||||||
def _build_input(self, vim_id, count, timeout,
|
|
||||||
interval, targetip):
|
|
||||||
self.input_dict_data = {'vim_id': vim_id,
|
|
||||||
'count': count,
|
|
||||||
'timeout': timeout,
|
|
||||||
'interval': interval,
|
|
||||||
'targetip': targetip}
|
|
||||||
self.input_dict[self.resource] = self.input_dict_data
|
|
||||||
|
|
||||||
def monitor_ping_vim(self, vim_id=None, count=1, timeout=1,
|
|
||||||
interval=1, targetip="127.0.0.1"):
|
|
||||||
self._build_input(vim_id, count, timeout,
|
|
||||||
interval, targetip)
|
|
||||||
self.definition[self.wf_identifier]['tasks'] = dict()
|
|
||||||
self.definition[self.wf_identifier]['tasks'].update(
|
|
||||||
self._add_ping_vim_tasks())
|
|
|
@ -85,7 +85,6 @@ class VIMCreateTestCase(base.TestCase):
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
'shared': False,
|
'shared': False,
|
||||||
'status': 'PENDING',
|
|
||||||
'tenant_id': 'test-project',
|
'tenant_id': 'test-project',
|
||||||
'type': 'openstack',
|
'type': 'openstack',
|
||||||
'updated_at': None,
|
'updated_at': None,
|
||||||
|
|
|
@ -1,24 +0,0 @@
|
||||||
# Copyright (C) 2021 FUJITSU
|
|
||||||
# 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 tacker.conductor.conductorrpc import vim_monitor_rpc
|
|
||||||
from tacker.tests.unit import base as unit_base
|
|
||||||
|
|
||||||
|
|
||||||
class TestVIMUpdateRPC(unit_base.TestCase):
|
|
||||||
|
|
||||||
def setUp(self):
|
|
||||||
super(TestVIMUpdateRPC, self).setUp()
|
|
||||||
self.vimupdaterpc_object = vim_monitor_rpc.VIMUpdateRPC()
|
|
|
@ -3497,12 +3497,6 @@ class TestConductor(SqlTestCase, unit_base.FixturedTestCase):
|
||||||
self.vnfd_pkg_data,
|
self.vnfd_pkg_data,
|
||||||
vnfd_id)
|
vnfd_id)
|
||||||
|
|
||||||
def test_update_vim(self):
|
|
||||||
vim_id = uuidsentinel.vim_id
|
|
||||||
status = "REACHABLE"
|
|
||||||
result = self.conductor.update_vim(self.context, vim_id, status)
|
|
||||||
self.assertEqual(result, "REACHABLE")
|
|
||||||
|
|
||||||
@mock.patch.object(csar_utils, 'load_csar_data')
|
@mock.patch.object(csar_utils, 'load_csar_data')
|
||||||
@mock.patch.object(glance_store, 'load_csar')
|
@mock.patch.object(glance_store, 'load_csar')
|
||||||
@mock.patch.object(glance_store, 'delete_csar')
|
@mock.patch.object(glance_store, 'delete_csar')
|
||||||
|
|
|
@ -223,7 +223,6 @@ class TestDbMigrationToV2(SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='openstack',
|
type='openstack',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.datetime.min,
|
deleted_at=datetime.datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
|
|
@ -241,7 +241,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='openstack',
|
type='openstack',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
@ -264,7 +263,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='openstack',
|
type='openstack',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
@ -288,7 +286,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='kubernetes',
|
type='kubernetes',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
@ -311,7 +308,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='kubernetes',
|
type='kubernetes',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
@ -334,7 +330,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='kubernetes',
|
type='kubernetes',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
@ -480,9 +475,6 @@ class TestNfvoPlugin(db_base.SqlTestCase):
|
||||||
).start()
|
).start()
|
||||||
mock.patch('tacker.nfvo.nfvo_plugin.NfvoPlugin.get_auth_dict'
|
mock.patch('tacker.nfvo.nfvo_plugin.NfvoPlugin.get_auth_dict'
|
||||||
).start()
|
).start()
|
||||||
mock.patch('tacker.nfvo.workflows.vim_monitor.vim_monitor_utils.'
|
|
||||||
'delete_vim_monitor'
|
|
||||||
).start()
|
|
||||||
self._cos_db_plugin =\
|
self._cos_db_plugin =\
|
||||||
common_services_db_plugin.CommonServicesPluginDb()
|
common_services_db_plugin.CommonServicesPluginDb()
|
||||||
self.nfvo_plugin.delete_vim(self.context, vim_id)
|
self.nfvo_plugin.delete_vim(self.context, vim_id)
|
||||||
|
|
|
@ -137,7 +137,6 @@ vim_data = {
|
||||||
'description': "test_description",
|
'description': "test_description",
|
||||||
'placement_attr': "test_placement_attr",
|
'placement_attr': "test_placement_attr",
|
||||||
'shared': 0,
|
'shared': 0,
|
||||||
'status': "REACHABLE",
|
|
||||||
'is_default': 0
|
'is_default': 0
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,6 @@ class TestVNFActionVduAutoheal(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='test_vim',
|
type='test_vim',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
|
|
@ -165,7 +165,6 @@ class TestCVNFMPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='kubernetes',
|
type='kubernetes',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['default', 'kube-public',
|
placement_attr={'regions': ['default', 'kube-public',
|
||||||
'kube-system']})
|
'kube-system']})
|
||||||
|
|
|
@ -353,7 +353,6 @@ class TestVNFMPlugin(db_base.SqlTestCase):
|
||||||
name='fake_vim',
|
name='fake_vim',
|
||||||
description='fake_vim_description',
|
description='fake_vim_description',
|
||||||
type='test_vim',
|
type='test_vim',
|
||||||
status='Active',
|
|
||||||
deleted_at=datetime.min,
|
deleted_at=datetime.min,
|
||||||
placement_attr={'regions': ['RegionOne']})
|
placement_attr={'regions': ['RegionOne']})
|
||||||
vim_auth_db = nfvo_db.VimAuth(
|
vim_auth_db = nfvo_db.VimAuth(
|
||||||
|
|
|
@ -158,7 +158,7 @@ class VNFMPlugin(vnfm_db.VNFMPluginDb, VNFMMgmtMixin):
|
||||||
vnfs = self.get_vnfs(context)
|
vnfs = self.get_vnfs(context)
|
||||||
for vnf in vnfs:
|
for vnf in vnfs:
|
||||||
# Add tenant_id in context object as it is required
|
# Add tenant_id in context object as it is required
|
||||||
# to get VIM in monitoring.
|
# to get VNF in monitoring.
|
||||||
context.tenant_id = vnf['tenant_id']
|
context.tenant_id = vnf['tenant_id']
|
||||||
self.add_vnf_to_monitor(context, vnf)
|
self.add_vnf_to_monitor(context, vnf)
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue