From b080dd5d38ae7bfc7b8e8b5658b7c10b8c428757 Mon Sep 17 00:00:00 2001 From: Naveen N Date: Tue, 12 Jul 2016 15:33:39 +0530 Subject: [PATCH] * Add config check to detect duplicate forwarding class ID. Currently forwarding class id has to be unique across each entry, adding a config check for same. Closes-bug:#1598675 Change-Id: I320539b6d1c93e285de388cfa5dfe41eee4084bb --- src/config/api-server/tests/test_fc_id.py | 92 +++++++++++++++++++++++ src/config/api-server/vnc_cfg_types.py | 39 ++++++++++ 2 files changed, 131 insertions(+) create mode 100644 src/config/api-server/tests/test_fc_id.py diff --git a/src/config/api-server/tests/test_fc_id.py b/src/config/api-server/tests/test_fc_id.py new file mode 100644 index 00000000000..73567e278a3 --- /dev/null +++ b/src/config/api-server/tests/test_fc_id.py @@ -0,0 +1,92 @@ +# +# Copyright (c) 2013,2014 Juniper Networks, Inc. All rights reserved. +# +import gevent +import os +import sys +import socket +import errno +import uuid +import logging +import coverage + +import cgitb +cgitb.enable(format='text') + +import testtools +from testtools.matchers import Equals, MismatchError, Not, Contains +from testtools import content, content_type, ExpectedException +import unittest +import re +import json +import copy +import inspect +import pycassa +import kombu +import requests + +from vnc_api.vnc_api import * +import vnc_api.gen.vnc_api_test_gen +from vnc_api.gen.resource_test import * +import cfgm_common + +sys.path.append('../common/tests') +from test_utils import * +import test_common +import test_case + +logger = logging.getLogger(__name__) +logger.setLevel(logging.DEBUG) + +class TestForwardingClassId(test_case.ApiServerTestCase): + def __init__(self, *args, **kwargs): + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + logger.addHandler(ch) + super(TestForwardingClassId, self).__init__(*args, **kwargs) + + def test_requested_fc_id(self): + fc1 = ForwardingClass(name = "fc1", + forwarding_class_id = 1) + fc1_id = self._vnc_lib.forwarding_class_create(fc1) + logger.debug('Created Forwarding class with ID 1') + + test_fc = ForwardingClass(name = "test_fc", + forwarding_class_id = 1) + try: + self._vnc_lib.forwarding_class_create(test_fc) + self.assertTrue(False, 'Forwarding class updated' + 'with duplicate ID... Test failed!!') + logger.debug(' Test failed! got id 1') + except: + logger.debug(' Test passed for FC id 1') + + + fc2 = ForwardingClass(name = "fc2", + forwarding_class_id = 2) + fc2_id = self._vnc_lib.forwarding_class_create(fc2) + logger.debug('Created Forwarding class with ID 2') + + fc1.forwarding_class_id = 2 + try: + self._vnc_lib.forwarding_class_update(fc1); + self.assertTrue(False, 'Forwarding class updated' + 'with duplicate ID... Test failed!!') + except: + logger.debug(' Test passed for FC id 2') + + gevent.sleep(0.1) + #cleanup + logger.debug('Cleaning up FC test case') + self._vnc_lib.forwarding_class_delete(id=fc1_id) + self._vnc_lib.forwarding_class_delete(id=fc2_id) + logger.debug('Cleaned up FC test case') + #end + +#end class TestForwardingClass + +if __name__ == '__main__': + ch = logging.StreamHandler() + ch.setLevel(logging.DEBUG) + logger.addHandler(ch) + unittest.main() diff --git a/src/config/api-server/vnc_cfg_types.py b/src/config/api-server/vnc_cfg_types.py index 749374fe71d..b0d935bcad1 100644 --- a/src/config/api-server/vnc_cfg_types.py +++ b/src/config/api-server/vnc_cfg_types.py @@ -1942,3 +1942,42 @@ def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs): return cls._check(obj_dict, db_conn) # end class RouteAggregateServer + +class ForwardingClassServer(Resource, ForwardingClass): + @classmethod + def _check_fc_id(cls, obj_dict, db_conn): + if obj_dict.get('forwarding_class_id') == None: + return (True, '') + + id_filters = {'forwarding_class_id' : [obj_dict['forwarding_class_id']]} + (ok, forwarding_class_list) = db_conn.dbe_list('forwarding_class', + filters = id_filters) + if not ok: + return (ok, (500, 'Error in dbe_list: %s' %(forwarding_class_list))) + + if len(forwarding_class_list) != 0: + return (False, (400, "Forwarding class %s is configured " + "with a id %d" % (forwarding_class_list[0][0], + obj_dict.get('forwarding_class_id')))) + return (True, '') + # end _check_fc_id + + @classmethod + def pre_dbe_create(cls, tenant_name, obj_dict, db_conn): + if 'forwarding_class_id' in obj_dict: + return cls._check_fc_id(obj_dict, db_conn) + return (True, '') + + @classmethod + def pre_dbe_update(cls, id, fq_name, obj_dict, db_conn, **kwargs): + ok, forwarding_class = cls.dbe_read(db_conn, 'forwarding_class', id) + if not ok: + return ok, read_result + + if 'forwarding_class_id' in obj_dict: + fc_id = obj_dict['forwarding_class_id'] + if 'forwarding_class_id' in forwarding_class: + if fc_id != forwarding_class.get('forwarding_class_id'): + return cls._check_fc_id(obj_dict, db_conn) + return (True, '') +# end class ForwardingClassServer