Skip to content

Commit

Permalink
* Add config check to detect duplicate forwarding class ID.
Browse files Browse the repository at this point in the history
Currently forwarding class id has to be unique across each
entry, adding a config check for same.
Closes-bug:#1598675

Change-Id: I320539b6d1c93e285de388cfa5dfe41eee4084bb
  • Loading branch information
naveen-n committed Jul 22, 2016
1 parent 16a4aa2 commit b080dd5
Show file tree
Hide file tree
Showing 2 changed files with 131 additions and 0 deletions.
92 changes: 92 additions & 0 deletions 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()
39 changes: 39 additions & 0 deletions src/config/api-server/vnc_cfg_types.py
Expand Up @@ -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

0 comments on commit b080dd5

Please sign in to comment.