Merge "ONOS-2503 Add NBI-Network test scipts"
diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params
new file mode 100644
index 0000000..3ca917f
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.params
@@ -0,0 +1,45 @@
+<PARAMS>
+    # CASE - Description
+    # 1 - Variable initialization and optional pull and build ONOS package
+    # 2 - Create Network northbound test
+    # 3 - Update Network northbound test
+    # 4 - Delete Network northbound test
+    # 5 - Create Subnet northbound test
+    # 6 - Update Subnet northbound test
+    # 7 - Delete Subnet northbound test
+    # 8 - Create Virtualport northbound test
+    # 9 - Update Virtualport northbound test
+    #10 - Delete Virtualport northbound test
+
+    <testcases>1,2,3,4</testcases>
+
+    <SLEEP>
+        <startup>15</startup>
+    </SLEEP>
+
+    <ENV>
+        <cellName>singlenode</cellName>
+        <cellApps>drivers,openflow,proxyarp,mobility</cellApps>
+    </ENV>
+
+    <CTRL>
+        <ip1>OC1</ip1>
+        <port1>6633</port1>
+    </CTRL>
+
+    <HTTP>
+        <port>8181</port>
+        <path>/onos/vtn/</path>
+    </HTTP>
+
+    <GIT>
+        <pull>False</pull>
+        <branch>master</branch>
+    </GIT>
+
+    <MININET>
+        <switch>7</switch>
+        <links>20</links>
+    </MININET>
+
+</PARAMS>
diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py
new file mode 100644
index 0000000..e3c3cc4
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.py
@@ -0,0 +1,402 @@
+"""
+Description: This test is to determine if North bound
+    can handle the request
+
+List of test cases:
+CASE1 - Variable initialization and optional pull and build ONOS package
+CASE2 - Create Network northbound test
+CASE3 - Update Network northbound test
+CASE4 - Delete Network northbound test
+CASE5 - Create Subnet northbound test
+CASE6 - Update Subnet northbound test
+CASE7 - Delete Subnet northbound test
+CASE8 - Create Virtualport northbound test
+CASE9 - Update Virtualport northbound test
+CASE10 - Delete Virtualport northbound test
+
+lanqinglong@huawei.com
+"""
+import os
+
+class FUNCvirNetNB:
+
+    def __init__( self ):
+        self.default = ''
+
+    def CASE1( self, main ):
+        """
+        CASE1 is to compile ONOS and push it to the test machines
+
+        Startup sequence:
+        cell<name>
+        onos-verify-cell
+        NOTE:temporary - onos-remove-raft-logs
+        onos-uninstall
+        git pull
+        mvn clean install
+        onos-package
+        onos-install -f
+        onos-wait-for-start
+        start cli sessions
+        start vtnrsc
+        """
+
+        import time
+        import os
+        main.log.info( "ONOS Single node Start "+
+                      "VirtualNet Northbound test - initialization" )
+        main.case( "Setting up test environment" )
+        main.caseExplanation  = "Setup the test environment including "+\
+                                "installing ONOS,start ONOS."
+
+        # load some variables from the params file
+        PULLCODE = False
+        if main.params['GIT']['pull'] =='True':
+            PULLCODE = True
+        gitBranch = main.params['GIT']['branch']
+        cellName = main.params['ENV']['cellName']
+        ipList = os.getenv( main.params['CTRL']['ip1'] )
+
+        main.step("Create cell file")
+        cellAppString = main.params['ENV']['cellApps']
+        main.ONOSbench.createCellFile(main.ONOSbench.ip_address,cellName,
+                                      main.Mininet1.ip_address,
+                                      cellAppString,ipList )
+
+        main.step( "Applying cell variable to environment" )
+        cellResult = main.ONOSbench.setCell(cellName)
+        verifyResult = main.ONOSbench.verifyCell()
+
+        #FIXME:this is short term fix
+        main.log.info( "Removing raft logs" )
+        main.ONOSbench.onosRemoveRaftlogs()
+
+        main.CLIs = []
+        main.nodes = []
+        main.numCtrls=1
+        main.startUpSleep = int( main.params[ 'SLEEP' ][ 'startup' ] )
+
+        for i in range ( 1, main.numCtrls +1):
+            try:
+                main.CLIs.append( getattr( main, 'ONOScli' + str(i) ) )
+                main.nodes.append( getattr( main, 'ONOS' + str(i) ) )
+                ipList.append( main.nodes[ -1 ].ip_address )
+            except AttributeError:
+                break
+
+        main.log.info( "Uninstalling ONOS" )
+        for node in main.nodes:
+            main.ONOSbench.onosUninstall( node.ip_address )
+
+        #Make sure ONOS is DEAD
+        main.log.info( "Killing any ONOS processes" )
+        killResults = main.TRUE
+        for node in main.nodes:
+            killed = main.ONOSbench.onosKill( node.ip_address )
+            killResults = killResults and killed
+
+        cleanInstallResult = main.TRUE
+        gitPullResult = main.TRUE
+        main.step( "Git checkout and pull " + gitBranch )
+        if PULLCODE:
+            main.ONOSbench.gitCheckout ( gitBranch )
+            gitPullResult = main.ONOSbench.gitPull()
+            # values of 1 or 3 are good
+            utilities.assert_lesser ( expect=0, actual=gitPullResult,
+                                      onpass="Git pull successful",
+                                      onfail ="Git pull failed" )
+        main.ONOSbench.getVersion( report =True )
+        main.step( "Using mvn clean install" )
+        cleanInstallResult= main.TRUE
+        if PULLCODE and gitPullResult == main.TRUE:
+            cleanInstallResult = main.ONOSbench.cleanInstall()
+        else:
+            main.log.warn("Did not pull new code so skipping mvn "+
+                          "clean install")
+
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=cleanInstallResult,
+                                 onpass="MCI successful",
+                                 onfail="MCI failed" )
+
+        main.step( "Creating ONOS package" )
+        packageResult = main.ONOSbench.onosPackage()
+        utilities.assert_equals( expect=main.TRUE,
+                                 actual=packageResult,
+                                 onpass="Successfully created ONOS package",
+                                 onfail="Failed to create ONOS package " )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Installing ONOS package" )
+        onosInstallResult = main.ONOSbench.onosInstall(
+            options="-f",node=main.nodes[0].ip_address )
+        utilities.assert_equals( expect=main.TRUE, actual=onosInstallResult,
+                                onpass="ONOS install successful",
+                                onfail="ONOS install failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "Checking if ONOS is up yet" )
+
+        for i in range( 2 ):
+            onos1Isup =  main.ONOSbench.isup( main.nodes[0].ip_address )
+            if onos1Isup:
+                break
+        utilities.assert_equals( expect=main.TRUE, actual=onos1Isup,
+                     onpass="ONOS startup successful",
+                     onfail="ONOS startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.log.step( "Starting ONOS CLI sessions" )
+
+        print main.nodes[0].ip_address
+        cliResults = main.ONOScli1.startOnosCli(main.nodes[0].ip_address)
+        utilities.assert_equals( expect=main.TRUE, actual=cliResults,
+                                onpass="ONOS cli startup successful",
+                                onfail="ONOS cli startup failed" )
+        time.sleep( main.startUpSleep )
+
+        main.step( "App Ids check" )
+        appCheck = main.ONOScli1.appToIDCheck()
+        if appCheck != main.TRUE:
+            main.log.warn( main.CLIs[0].apps() )
+            main.log.warn( main.CLIs[0].appIDs() )
+        utilities.assert_equals( expect=main.TRUE, actual=appCheck,
+                     onpass="App Ids seem to be correct",
+                     onfail="Something is wrong with app Ids" )
+
+        if cliResults == main.FALSE:
+            main.log.error( "Failed to start ONOS, stopping test" )
+            main.cleanup()
+            main.exit()
+
+        main.step( "Install onos-app-vtnrsc app" )
+        installResults = main.ONOScli1.featureInstall( "onos-app-vtnrsc" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                     onpass="Install onos-app-vtnrsc successful",
+                     onfail="Install onos-app-vtnrsc app failed" )
+
+        time.sleep( main.startUpSleep )
+        
+        main.step( "Install onos-app-vtnweb app" )
+        installResults = main.ONOScli1.featureInstall( "onos-app-vtnweb" )
+        utilities.assert_equals( expect=main.TRUE, actual=installResults,
+                     onpass="Install onos-app-vtnweb successful",
+                     onfail="Install onos-app-vtnweb app failed" )
+
+        time.sleep( main.startUpSleep )
+
+    def CASE2 ( self,main ):
+
+        """
+        Test Post Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Post test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Post NBI " +\
+                                "Verify Post Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks/',
+                                                'POST', None, postdata)
+
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None)
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.log.info("Post Network Data is :%s\nGet Network Data is:%s"%(postdata,result))
+
+        main.step( "Compare Send Id and Get Id" )
+        IDcmpresult = network.JsonCompare( postdata, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdata, result, 'network', 'tenant_id' )
+        Cmpresult = IDcmpresult and TanantIDcmpresult
+
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare: " + str( IDcmpresult ) + \
+                       ",Tenant id compare :" + str( TanantIDcmpresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed")
+
+        if Cmpresult !=True:
+            main.log.error( "Post Network compare failed" )
+
+    def CASE3( self,main ):
+
+        """
+        Test Update Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Update test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation  = "Test Network Update NBI " +\
+                                "Verify Update Data same with Stored Data"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        network.shared = 'false'
+        postdata = network.DictoJson()
+
+        network.shared = 'true'
+        postdatanew = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port, '', path+'networks',
+                                                 'POST', None, postdata )
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Update Data via HTTP" )
+        Updatestatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                   'PUT', None, postdatanew)
+        utilities.assert_equals(
+                expect='200',
+                actual=Updatestatus,
+                onpass="Update Success",
+                onfail="Update Failed " + str( Updatestatus ) + str( result ) )
+
+        main.step( "Get Data via HTTP" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Getstatus,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        main.step( "Compare Update data." )
+        IDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'id' )
+        TanantIDcmpresult = network.JsonCompare( postdatanew, result, 'network', 'tenant_id' )
+        Shareresult = network.JsonCompare( postdatanew, result, 'network', 'shared' )
+
+        Cmpresult = IDcmpresult and TanantIDcmpresult and Shareresult
+        utilities.assert_equals(
+                expect=True,
+                actual=Cmpresult,
+                onpass="Compare Success",
+                onfail="Compare Failed:ID compare:" + str( IDcmpresult ) + \
+                       ",Tenant id compare:"+ str( TanantIDcmpresult ) + \
+                       ",Name compare:" + str( Shareresult ) )
+
+        deletestatus,result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                 'DELETE', None, None )
+
+        utilities.assert_equals(
+                expect='200',
+                actual=deletestatus,
+                onpass="Delete Network Success",
+                onfail="Delete Network Failed" )
+
+        if Cmpresult!=True:
+            main.log.error( "Update Network compare failed" )
+
+    def CASE4( self,main ):
+
+        """
+        Test Delete Network
+        """
+        import os,sys
+        sys.path.append("..")
+        try:
+            from tests.FUNCvirNetNB.dependencies.Nbdata import NetworkData
+        except ImportError:
+            main.log.exception( "Something wrong with import file or code error." )
+            main.log.info( "Import Error,please check!" )
+
+        main.log.info( "ONOS Network Delete test Start" )
+        main.case( "Virtual Network NBI Test - Network" )
+        main.caseExplanation = "Test Network Delete NBI " +\
+                                "Verify Stored Data is NULL after Delete"
+
+        ctrlip = os.getenv( main.params['CTRL']['ip1'] )
+        port = main.params['HTTP']['port']
+        path = main.params['HTTP']['path']
+
+        main.step( "Generate Post Data" )
+        network = NetworkData()
+        network.id = '030d6d3d-fa36-45bf-ae2b-4f4bc43a54dc'
+        network.tenant_id = '26cd996094344a0598b0a1af1d525cdc'
+        postdata = network.DictoJson()
+
+        main.step( "Post Data via HTTP" )
+        Poststatus, result = main.ONOSrest.send( ctrlip, port , '' , path + 'networks/',
+                                                 'POST', None , postdata )
+
+        utilities.assert_equals(
+                expect='200',
+                actual=Poststatus,
+                onpass="Post Success",
+                onfail="Post Failed " + str( Poststatus ) + str( result ) )
+
+        main.step( "Delete Data via HTTP" )
+        Deletestatus, result = main.ONOSrest.send( ctrlip,port,network.id,path+'networks/',
+                                                'DELETE', None, None )
+        utilities.assert_equals(
+                expect='200',
+                actual=Deletestatus,
+                onpass="Delete Success",
+                onfail="Delete Failed " + str( Getstatus ) + str( result ) )
+
+        main.step( "Get Data is NULL" )
+        Getstatus, result = main.ONOSrest.send( ctrlip, port, network.id, path+'networks/',
+                                                'GET', None, None )
+        utilities.assert_equals(
+                expect='The tenantNetwork does not exists',
+                actual=result,
+                onpass="Get Success",
+                onfail="Get Failed " + str( Getstatus ) + str( result ) )
+
+        if result != 'The tenantNetwork does not exists':
+            main.log.error( "Delete Network failed" )
diff --git a/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo
new file mode 100644
index 0000000..fbe743b
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/FUNCvirNetNB.topo
@@ -0,0 +1,53 @@
+<TOPOLOGY>
+    <COMPONENT>
+
+        <ONOSbench>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosDriver</type>
+            <connect_order>1</connect_order>
+            <COMPONENTS>
+            </COMPONENTS>
+        </ONOSbench>
+
+        <ONOScli1>
+            <host>localhost</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>OnosCliDriver</type>
+            <connect_order>2</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOScli1>
+
+        <ONOS1>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosDriver</type>
+            <connect_order>3</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOS1>
+
+        <ONOSrest>
+            <host>OC1</host>
+            <user>sdn</user>
+            <password>rocks</password>
+            <type>OnosRestDriver</type>
+            <connect_order>4</connect_order>
+            <COMPONENTS> </COMPONENTS>
+        </ONOSrest>
+
+        <Mininet1>
+            <host>OCN</host>
+            <user>admin</user>
+            <password>onos_test</password>
+            <type>MininetCliDriver</type>
+            <connect_order>5</connect_order>
+            <COMPONENTS>
+                <controller> none </controller>
+            </COMPONENTS>
+        </Mininet1>
+
+    </COMPONENT>
+</TOPOLOGY>
diff --git a/TestON/tests/FUNCvirNetNB/__init__.py b/TestON/tests/FUNCvirNetNB/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/__init__.py
diff --git a/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py b/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py
new file mode 100644
index 0000000..c002c4a
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/dependencies/Nbdata.py
@@ -0,0 +1,221 @@
+"""
+This file provide the data
+lanqinglong@huawei.com
+"""
+import json
+
+class NetworkData:
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.name = 'onosfw-1'
+        self.physicalNetwork = 'none'
+        self.admin_state_up = 'true'
+        self.tenant_id = ''
+        self.routerExternal = 'false'
+        self.type ='LOCAL'
+        self.segmentationID = '6'
+        self.shared = 'false'
+
+    def DictoJson(self):
+
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        if self.id !='':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['status'] = self.state
+        if self.name !='':
+            Dicdata['name'] = self.name
+        if self.physicalNetwork !='':
+            Dicdata['provider:physical_network'] = self.physicalNetwork
+        if self.admin_state_up !='':
+            Dicdata['admin_state_up'] = self.admin_state_up
+        if self.tenant_id !='':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.routerExternal !='':
+            Dicdata['router:external'] = self.routerExternal
+        if self.type !='':
+            Dicdata['provider:network_type'] = self.type
+        if self.segmentationID !='':
+            Dicdata['provider:segmentation_id'] = self.segmentationID
+        if self.shared !='':
+            Dicdata['shared'] = self.shared
+
+        Dicdata = {'network': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+
+        if isinstance(obj, dict):
+            return sorted((k,self.Ordered(v)) for k,  v in obj.items())
+        if isinstance(obj, list):
+            return sorted(self.Ordered(x) for x in obj )
+        else:
+            return obj
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+
+        try:
+            SourceCompareDataDic = json.loads(SourceData)
+            DestiCompareDataDic = json.loads(DestiData)
+        except ValueError:
+            print "SourceData or DestData is not JSON Type!"
+            return False
+
+        Socom = SourceCompareDataDic[FirstPara][SecondPara]
+        Decom = DestiCompareDataDic[FirstPara][SecondPara]
+        if Socom == Decom:
+            return True
+        else:
+            print "Source Compare data:"+FirstPara+"."+SecondPara+"="+Socom
+            print "Dest Compare data: "+FirstPara+"."+SecondPara+"="+str(Decom)
+            return False
+
+class SubnetData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.tenant_id = ''
+        self.network_id = ''
+        self.nexthop = '192.168.1.1'
+        self.destination = '192.168.1.1/24'
+        self.start = '192.168.2.2'
+        self.end = '192.168.2.254'
+        self.ipv6_address_mode = 'DHCPV6_STATELESS'
+        self.ipv6_ra_mode = 'DHCPV6_STATELESS'
+        self.cidr = '192.168.1.1/24'
+        self.enable_dhcp = 'true'
+        self.dns_nameservers = 'aaa'
+        self.gateway_ip = '192.168.2.1'
+        self.ip_version = 'INET'
+        self.shared = 'false'
+        self.name = 'demo-subnet'
+
+    def DictoJson(self):
+        if self.id =='' or self.tenant_id == '':
+            print 'Id and tenant id is necessary!'
+
+        Dicdata = {}
+        host_routesdata = []
+        host_routesdata.append({'nexthop': self.nexthop,'destination': self.destination})
+        allocation_pools = []
+        allocation_pools.append({'start': self.start,'end':self.end})
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.network_id != '':
+            Dicdata['network_id'] = self.network_id
+        if self.name != '':
+            Dicdata['name'] = self.name
+        if self.nexthop != '':
+            Dicdata['host_routes'] = host_routesdata
+        if self.tenant_id != '':
+            Dicdata['tenant_id'] = self.tenant_id
+        if self.start != '':
+            Dicdata['allocation_pools'] = allocation_pools
+        if self.shared != '':
+            Dicdata['shared'] = self.shared
+        if self.ipv6_address_mode != '':
+            Dicdata['ipv6_address_mode'] = self.ipv6_address_mode
+        if self.ipv6_ra_mode != '':
+            Dicdata['ipv6_ra_mode'] = self.ipv6_ra_mode
+        if self.cidr != '':
+            Dicdata['cidr'] = self.cidr
+        if self.enable_dhcp != '':
+            Dicdata['enable_dhcp'] = self.enable_dhcp
+        if self.dns_nameservers != '':
+            Dicdata['dns_nameservers'] = self.dns_nameservers
+        if self.gateway_ip != '':
+            Dicdata['gateway_ip'] = self.gateway_ip
+        if self.ip_version != '':
+            Dicdata['ip_version'] = self.ip_version
+
+        Dicdata = {'subnet': Dicdata}
+
+        return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+        super(NetworkData,self).Ordered(obj)
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+        super(NetworkData,self).JsonCompare(SourceData,DestiData,FirstPara,SecondPara)
+
+class VirtualPortData(NetworkData):
+
+    def __init__(self):
+        self.id = ''
+        self.state = 'ACTIVE'
+        self.bindingHostId = 'fa:16:3e:76:8e:88'
+        self.allowedAddressPairs = [{'macAddress':'fa:16:3e:76:8e:88','ipAddress':'192.168.1.1'}]
+        self.deviceOwner = 'none'
+        self.fixedIp = []
+        self.securityGroups = [{'securityGroup':'asd'}]
+        self.adminStateUp = 'true'
+        self.networkId = ''
+        self.tenantId = ''
+        self.subnetId = ''
+        self.bindingvifDetails = 'port_filter'
+        self.bindingvnicType = 'normal'
+        self.bindingvifType = 'ovs'
+        self.macAddress = 'fa:16:3e:76:8e:88'
+        self.deviceId = 'a08aa'
+        self.name = 'u'
+
+    def DictoJson(self):
+        if self.id == '' or self.tenant_id == ' ' or self.networkId == '':
+            print 'Id/tenant id/networkid/subnetId is necessary!'
+
+        Dicdata = {}
+        fixedIp =[]
+        fixedIp.append({'subnetId':self.subnetId,'ipAddress':'192.168.1.4'})
+        allocation_pools = []
+
+        if self.id != '':
+            Dicdata['id'] = self.id
+        if self.state != '':
+            Dicdata['state'] = self.state
+        if self.bindingHostId != '':
+            Dicdata['bindingHostId'] = self.bindingHostId
+        if self.allowedAddressPairs != '':
+            Dicdata['allowedAddressPairs'] = self.allowedAddressPairs
+        if self.deviceOwner != '':
+            Dicdata['deviceOwner'] = self.deviceOwner
+        if self.fixedIp != []:
+            Dicdata['fixedIp'] = fixedIp
+        if self.securityGroups != '':
+            Dicdata['securityGroups'] = self.securityGroups
+        if self.adminStateUp != '':
+            Dicdata['adminStateUp'] = self.adminStateUp
+        if self.networkId != '':
+            Dicdata['networkId'] = self.networkId
+        if self.tenantId != '':
+            Dicdata['tenantId'] = self.tenantId
+        if self.subnetId != '':
+            Dicdata['subnetId'] = self.subnetId
+        if self.bindingvifDetails != '':
+            Dicdata['bindingvifDetails'] = self.bindingvifDetails
+        if self.bindingvnicType != '':
+            Dicdata['bindingvnicType'] = self.bindingvnicType
+        if self.bindingvifType != '':
+            Dicdata['bindingvifType'] = self.bindingvifType
+        if self.macAddress != '':
+            Dicdata['macAddress'] = self.macAddress
+        if self.deviceId != '':
+            Dicdata['deviceId'] = self.deviceId
+        if self.name != '':
+            Dicdata['name'] = self.name
+
+            Dicdata = {'virtualport': Dicdata}
+
+            return json.dumps(Dicdata,indent=4)
+
+    def Ordered(self,obj):
+        super(NetworkData,self).Ordered(obj)
+
+    def JsonCompare(self,SourceData,DestiData,FirstPara,SecondPara):
+        super(NetworkData,self).JsonCompare(SourceData,DestiData,FirstPara,SecondPara)
\ No newline at end of file
diff --git a/TestON/tests/FUNCvirNetNB/dependencies/__init__.py b/TestON/tests/FUNCvirNetNB/dependencies/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/TestON/tests/FUNCvirNetNB/dependencies/__init__.py