diff --git a/tacker/api/views/vnf_lcm.py b/tacker/api/views/vnf_lcm.py index bfc09e213..74ad37384 100644 --- a/tacker/api/views/vnf_lcm.py +++ b/tacker/api/views/vnf_lcm.py @@ -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: diff --git a/tacker/api/vnflcm/v1/controller.py b/tacker/api/vnflcm/v1/controller.py index 251a61f3c..1ab6fd5f6 100644 --- a/tacker/api/vnflcm/v1/controller.py +++ b/tacker/api/vnflcm/v1/controller.py @@ -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 = { diff --git a/tacker/conductor/conductor_server.py b/tacker/conductor/conductor_server.py index bc25c5eb5..b806245de 100644 --- a/tacker/conductor/conductor_server.py +++ b/tacker/conductor/conductor_server.py @@ -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: diff --git a/tacker/db/migration/alembic_migrations/versions/HEAD b/tacker/db/migration/alembic_migrations/versions/HEAD index 7f99de5cd..506f664be 100644 --- a/tacker/db/migration/alembic_migrations/versions/HEAD +++ b/tacker/db/migration/alembic_migrations/versions/HEAD @@ -1 +1 @@ -2c5211036579 \ No newline at end of file +d25c7c865ce8 diff --git a/tacker/db/migration/alembic_migrations/versions/d25c7c865ce8_mod_vnflcm_subscription.py b/tacker/db/migration/alembic_migrations/versions/d25c7c865ce8_mod_vnflcm_subscription.py new file mode 100644 index 000000000..7ebe2a0c3 --- /dev/null +++ b/tacker/db/migration/alembic_migrations/versions/d25c7c865ce8_mod_vnflcm_subscription.py @@ -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 diff --git a/tacker/objects/vnf_lcm_subscriptions.py b/tacker/objects/vnf_lcm_subscriptions.py index 7909d209d..ce8f2f520 100644 --- a/tacker/objects/vnf_lcm_subscriptions.py +++ b/tacker/objects/vnf_lcm_subscriptions.py @@ -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 diff --git a/tacker/objects/vnf_package.py b/tacker/objects/vnf_package.py index 451d7f850..4f8002e50 100644 --- a/tacker/objects/vnf_package.py +++ b/tacker/objects/vnf_package.py @@ -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) diff --git a/tacker/tests/unit/conductor/test_conductor_server.py b/tacker/tests/unit/conductor/test_conductor_server.py index df1c58081..e652622ab 100644 --- a/tacker/tests/unit/conductor/test_conductor_server.py +++ b/tacker/tests/unit/conductor/test_conductor_server.py @@ -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): diff --git a/tacker/vnflcm/vnflcm_driver.py b/tacker/vnflcm/vnflcm_driver.py index ad03223f1..4280f15e8 100644 --- a/tacker/vnflcm/vnflcm_driver.py +++ b/tacker/vnflcm/vnflcm_driver.py @@ -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( diff --git a/tacker/vnfm/infra_drivers/openstack/openstack.py b/tacker/vnfm/infra_drivers/openstack/openstack.py index b5bfbc581..6fc1dba5e 100644 --- a/tacker/vnfm/infra_drivers/openstack/openstack.py +++ b/tacker/vnfm/infra_drivers/openstack/openstack.py @@ -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)