Fix for package error during vnflcm creation

Execution "openstack vnflcm create" raises some package errors.
In order to avoid them, the exception process in vnflcm creation
is fixed.

Closes-bug: #1898963
Closes-bug: #1899112
Closes-bug: #1899134

Additional Information:
---------------------------------------
- vnf_lcm_subscription.id was decoded. The code we developed in
advance was created on the premise of varbinary and there was an
unmatch, therefore, at first, the DB type was matched. To modify
the code correctly, id decode was removed.
- Spec (Support LCM notifications for VNF based on ETSI NFV-SOL
specification)
There was a discrepancy with the content and I fixed the registered
migration, but the procedure was incorrect, so it was restored.
- Spec (Support LCM notifications for VNF based on ETSI NFV-SOL
specification)
I found that some columns were not added to the DB due to a mismatch
with the contents, so I am adding a new migration file. Also, since
the type definition was different for the already registered columns,
it was also corrected.

Change-Id: I0ee9d7e1e0c4ea26dd5894ad4fca302fe9bfd4d1
This commit is contained in:
Aldinson Esto 2020-10-08 21:30:17 +09:00 committed by Koichi Edagawa
parent 25f93312c1
commit 0b4b67129e
10 changed files with 111 additions and 22 deletions

View File

@ -154,7 +154,7 @@ class ViewBuilder(base.BaseViewBuilder):
if isinstance(vnf_lcm_subscription.id, str):
decode_id = vnf_lcm_subscription.id
else:
decode_id = vnf_lcm_subscription.id.decode()
decode_id = vnf_lcm_subscription.id
return {
"_links": {
"self": {
@ -168,12 +168,12 @@ class ViewBuilder(base.BaseViewBuilder):
if 'filter' in vnf_lcm_subscription:
filter_dict = json.loads(vnf_lcm_subscription.filter)
return {
'id': vnf_lcm_subscription.id.decode(),
'id': vnf_lcm_subscription.id,
'filter': filter_dict,
'callbackUri': vnf_lcm_subscription.callback_uri.decode(),
}
return {
'id': vnf_lcm_subscription.id.decode(),
'id': vnf_lcm_subscription.id,
'callbackUri': vnf_lcm_subscription.callback_uri.decode(),
}
else:

View File

@ -335,7 +335,7 @@ class VnfLcmController(wsgi.Controller):
placement_attr=placement_attr,
status=constants.INACTIVE,
error_reason=None,
deleted_at=datetime.min)
deleted_at=datetime.datetime.min)
context.session.add(vnf_db)
for key, value in attributes.items():
arg = vnfm_db.VNFAttribute(
@ -421,6 +421,7 @@ class VnfLcmController(wsgi.Controller):
vnf_product_name=vnfd.vnf_product_name,
vnf_software_version=vnfd.vnf_software_version,
vnfd_version=vnfd.vnfd_version,
vnf_pkg_id=vnfd.package_uuid,
tenant_id=request.context.project_id,
vnf_metadata=req_body.get('metadata'))
@ -442,7 +443,10 @@ class VnfLcmController(wsgi.Controller):
# roll back db changes
self._destroy_vnf(context, vnf_instance)
vnf_instance.destroy(context)
self._update_package_usage_state(context, vnf_package)
if 'vnf_package' not in locals():
LOG.error("vnf_package is not assigned")
else:
self._update_package_usage_state(context, vnf_package)
# create notification data
notification = {

View File

@ -1483,20 +1483,20 @@ class Conductor(manager.Manager):
# Notification shipping
for line in vnf_lcm_subscriptions:
notification['subscriptionId'] = line.id.decode()
notification['subscriptionId'] = line.id
if (notification.get('notificationType') ==
'VnfLcmOperationOccurrenceNotification'):
notification['_links'] = {}
notification['_links']['subscription'] = {}
notification['_links']['subscription']['href'] = \
CONF.vnf_lcm.endpoint_url + \
"/vnflcm/v1/subscriptions/" + line.id.decode()
"/vnflcm/v1/subscriptions/" + line.id
else:
notification['links'] = {}
notification['links']['subscription'] = {}
notification['links']['subscription']['href'] = \
CONF.vnf_lcm.endpoint_url + \
"/vnflcm/v1/subscriptions/" + line.id.decode()
"/vnflcm/v1/subscriptions/" + line.id
notification['timeStamp'] = datetime.datetime.utcnow(
).isoformat()
try:

View File

@ -1 +1 @@
2c5211036579
d25c7c865ce8

View File

@ -0,0 +1,85 @@
# Copyright 2020 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.
#
# flake8: noqa: E402
"""mod_vnflcm_subscription
Revision ID: d25c7c865ce8
Revises: 2c5211036579
Create Date: 2020-10-15 14:27:04.946002
"""
# revision identifiers, used by Alembic.
revision = 'd25c7c865ce8'
down_revision = '2c5211036579'
from alembic import op
import sqlalchemy as sa
from tacker.db import types
from tacker.db import migration
def upgrade(active_plugins=None, options=None):
op.alter_column('vnf_lcm_filters', 'subscription_uuid',
type_=types.Uuid(length=36), existing_type=sa.String(length=255),
nullable=False)
sta_str = "json_unquote(json_extract('filter','$.operationTypes'))"
op.add_column(
'vnf_lcm_filters',
sa.Column('operation_types',
sa.LargeBinary(length=65536),
sa.Computed(sta_str)))
op.add_column(
'vnf_lcm_filters',
sa.Column('operation_types_len',
sa.Integer,
sa.Computed("ifnull(json_length('operation_types'),0)")))
op.drop_column('vnf_lcm_filters', 'operation_states')
op.drop_column('vnf_lcm_filters', 'operation_states_len')
op.alter_column('vnf_lcm_op_occs', 'operation_state',
type_=sa.String(length=16), existing_type=sa.String(length=255))
op.alter_column('vnf_lcm_op_occs', 'operation',
type_=sa.String(length=16),existing_type=sa.String(length=255))
op.add_column('vnf_lcm_op_occs',
sa.Column('is_cancel_pending', sa.Boolean, nullable=False)),
op.add_column('vnf_lcm_op_occs',
sa.Column('resource_changes', sa.JSON(), nullable=True))
op.add_column('vnf_lcm_op_occs',
sa.Column('error_point', sa.Integer, nullable=True))
op.add_column('vnf_lcm_op_occs',
sa.Column('changed_info', sa.JSON(), nullable=True))
op.add_column('vnf_lcm_op_occs',
sa.Column('created_at', sa.DateTime(), nullable=False))
op.add_column('vnf_lcm_op_occs',
sa.Column('updated_at', sa.DateTime(), nullable=True))
op.add_column('vnf_lcm_op_occs',
sa.Column('deleted_at', sa.DateTime(), nullable=True))
pass

View File

@ -244,7 +244,7 @@ def _vnf_lcm_subscriptions_create(context, values, filter):
operation_type=operation_type)
if vnf_lcm_subscriptions_id:
raise Exception("303" + vnf_lcm_subscriptions_id.id.decode())
raise Exception("303" + vnf_lcm_subscriptions_id)
_add_filter_data(context, values.id, filter)
@ -253,7 +253,7 @@ def _vnf_lcm_subscriptions_create(context, values, filter):
callbackUri)
if vnf_lcm_subscriptions_id:
raise Exception("303" + vnf_lcm_subscriptions_id.id.decode())
raise Exception("303" + vnf_lcm_subscriptions_id.id)
_add_filter_data(context, values.id, {})
return values

View File

@ -554,8 +554,6 @@ class VnfPackage(base.TackerObject, base.TackerPersistentObject,
# check if vnf package is used by any vnf instances.
query = context.session.query(
func.count(models.VnfInstance.id)).\
filter_by(
instantiation_state=fields.VnfInstanceState.INSTANTIATED).\
filter_by(tenant_id=self.tenant_id).\
filter_by(vnfd_id=self.vnfd.vnfd_id).\
filter_by(deleted=False)

View File

@ -130,7 +130,7 @@ class TestConductor(SqlTestCase, unit_base.FixturedTestCase):
self.subscription_authentication = json.dumps(
auth_params).encode()
self.id = uuidsentinel.lcm_subscription_id.encode()
self.id = uuidsentinel.lcm_subscription_id
self.callback_uri = 'https://localhost/callback'.encode()
def __getattr__(self, name):

View File

@ -302,10 +302,11 @@ class VnfLcmDriver(abstract_driver.VnfInstanceAbstractDriver):
vim_connection_info, instantiate_vnf_req):
vnfd_dict = vnflcm_utils._get_vnfd_dict(context, vnf_instance.vnfd_id,
instantiate_vnf_req.flavour_id)
base_hot_dict, nested_hot_dict = vnflcm_utils. \
get_base_nest_hot_dict(context,
instantiate_vnf_req.flavour_id,
vnf_instance.vnfd_id)
base_hot_dict, nested_hot_dict = \
vnflcm_utils.get_base_nest_hot_dict(
context,
instantiate_vnf_req.flavour_id,
vnf_instance.vnfd_id)
vnf_package_path = None
if base_hot_dict is not None:
vnf_package_path = vnflcm_utils._get_vnf_package_path(

View File

@ -163,10 +163,11 @@ class OpenStack(abstract_driver.VnfAbstractDriver,
if user_data_path is not None and user_data_class is not None:
LOG.info('Execute user data and create heat-stack.')
base_hot_dict, nested_hot_dict = vnflcm_utils. \
get_base_nest_hot_dict(context,
inst_req_info.flavour_id,
vnf_instance.vnfd_id)
base_hot_dict, nested_hot_dict = \
vnflcm_utils.get_base_nest_hot_dict(
context,
inst_req_info.flavour_id,
vnf_instance.vnfd_id)
if base_hot_dict is None:
error_reason = _("failed to get Base HOT.")
raise vnfm.LCMUserDataFailed(reason=error_reason)