From a08fc0498bf19abf78bdd4c83d4cf6bde097adff Mon Sep 17 00:00:00 2001 From: Ignatious Johnson Christopher Date: Thu, 4 Feb 2016 22:47:38 -0800 Subject: [PATCH] Changes to not allow deletion of a vmi, if it has sub-interfaces connected to it Partial-Bug: 1540789 Change-Id: If0f4103285b99714af23bd09284ed43f0a97862b --- src/config/api-server/vnc_cfg_api_server.py | 6 ++--- src/config/api-server/vnc_cfg_types.py | 25 +++++++++++++++++---- src/config/common/vnc_cassandra.py | 2 +- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/src/config/api-server/vnc_cfg_api_server.py b/src/config/api-server/vnc_cfg_api_server.py index 4e8b837f3cb..11b81e50c20 100644 --- a/src/config/api-server/vnc_cfg_api_server.py +++ b/src/config/api-server/vnc_cfg_api_server.py @@ -832,6 +832,9 @@ def undo_delete(result): def stateful_delete(): get_context().set_state('PRE_DBE_DELETE') + (ok, del_result) = r_class.pre_dbe_delete(id, read_result, db_conn) + if not ok: + return (ok, del_result) # Delete default children first for child_field in r_class.children_fields: child_type, is_derived = r_class.children_field_types[child_field] @@ -842,9 +845,6 @@ def stateful_delete(): continue self.delete_default_children(child_type, read_result) - (ok, del_result) = r_class.pre_dbe_delete(id, read_result, db_conn) - if not ok: - return (ok, del_result) callable = getattr(r_class, 'http_delete_fail', None) if callable: cleanup_on_failure.append((callable, [id, read_result, db_conn])) diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index 8ca7e92a0b0..3186d19308e 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -10,8 +10,6 @@ from cfgm_common import jsonutils as json import re import itertools -import copy -import bottle import socket import cfgm_common @@ -21,8 +19,7 @@ import uuid from vnc_quota import QuotaHelper -import context -from context import get_context, set_context, get_request +from context import get_context from gen.resource_xsd import * from gen.resource_common import * from gen.resource_server import * @@ -528,6 +525,14 @@ def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs): if not read_ok: return (False, (500, read_result)) + if ('virtual_machine_interface_refs' in obj_dict and + 'virtual_machine_interface_refs' in read_result): + for ref in read_result['virtual_machine_interface_refs']: + if ref not in obj_dict['virtual_machine_interface_refs']: + # Dont allow remove of vmi ref during update + msg = "VMI ref delete not allowed during update" + return (False, (409, msg)) + aap_config = obj_dict.get( 'virtual_machine_interface_allowed_address_pairs', {}) for aap in aap_config.get('allowed_address_pair', []): @@ -552,6 +557,18 @@ def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs): return True, "" # end pre_dbe_update + + @classmethod + def pre_dbe_delete(cls, id, obj_dict, db_conn): + if ('virtual_machine_interface_refs' in obj_dict and + 'virtual_machine_interface_properties' in obj_dict): + vmi_props = obj_dict['virtual_machine_interface_properties'] + if 'sub_interface_vlan_tag' not in vmi_props: + msg = "Cannot delete vmi with existing ref to sub interface" + return (False, (409, msg)) + + return True, "" + # end pre_dbe_delete # end class VirtualMachineInterfaceServer class ServiceApplianceSetServer(Resource, ServiceApplianceSet): diff --git a/src/config/common/vnc_cassandra.py b/src/config/common/vnc_cassandra.py index 8e29d84f9bc..f69145dfa67 100644 --- a/src/config/common/vnc_cassandra.py +++ b/src/config/common/vnc_cassandra.py @@ -296,7 +296,7 @@ def object_create(self, res_type, obj_id, obj_dict): # Properties for prop_field in obj_class.prop_fields: field = obj_dict.get(prop_field) - if field is None: + if not field: continue if prop_field == 'id_perms': field['created'] = datetime.datetime.utcnow().isoformat()