[cfggen] Add basic functional test (#375)
[cfggen] Add basic functional test
This commit is contained in:
parent
799f0727a5
commit
e0fd12aa23
@ -89,6 +89,9 @@ RUN apt-get update && apt-get install -y libmysqlclient-dev libmysqld-dev libper
|
|||||||
# For mpdecimal
|
# For mpdecimal
|
||||||
RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx
|
RUN apt-get update && apt-get install -y docutils-common libjs-sphinxdoc libjs-underscore python-docutils python-jinja2 python-markupsafe python-pygments python-roman python-sphinx sphinx-common python3-sphinx
|
||||||
|
|
||||||
|
# For sonic config engine testing
|
||||||
|
RUN apt-get install -y python-lxml python-jinja2 python-netaddr python-ipaddr python-yaml
|
||||||
|
|
||||||
# For templating
|
# For templating
|
||||||
RUN pip install j2cli
|
RUN pip install j2cli
|
||||||
|
|
||||||
|
@ -1 +1,2 @@
|
|||||||
recursive-include platform *.json *.ini *.conf
|
recursive-include platform *.json *.ini *.conf
|
||||||
|
recursive-include tests *.j2 *.yml *.xml
|
||||||
|
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
from setuptools import setup
|
from setuptools import setup
|
||||||
import os.path
|
import os.path
|
||||||
|
import unittest
|
||||||
|
|
||||||
def get_platform_file_list():
|
def get_platform_file_list():
|
||||||
data_files = []
|
data_files = []
|
||||||
@ -15,6 +16,11 @@ def get_platform_file_list():
|
|||||||
data_files.append( (os.path.join('/usr/share/sonic', platform), files) )
|
data_files.append( (os.path.join('/usr/share/sonic', platform), files) )
|
||||||
return data_files
|
return data_files
|
||||||
|
|
||||||
|
def get_test_suite():
|
||||||
|
test_loader = unittest.TestLoader()
|
||||||
|
test_suite = test_loader.discover('tests', pattern='*.py')
|
||||||
|
return test_suite
|
||||||
|
|
||||||
setup(name='sonic-config-engine',
|
setup(name='sonic-config-engine',
|
||||||
version='1.0',
|
version='1.0',
|
||||||
description='Utilities for generating SONiC configuration files',
|
description='Utilities for generating SONiC configuration files',
|
||||||
@ -25,4 +31,5 @@ setup(name='sonic-config-engine',
|
|||||||
scripts=['sonic-cfggen'],
|
scripts=['sonic-cfggen'],
|
||||||
data_files=get_platform_file_list(),
|
data_files=get_platform_file_list(),
|
||||||
install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml'],
|
install_requires=['lxml', 'jinja2', 'netaddr', 'ipaddr', 'pyyaml'],
|
||||||
|
test_suite='setup.get_test_suite',
|
||||||
)
|
)
|
||||||
|
0
src/sonic-config-engine/tests/__init__.py
Normal file
0
src/sonic-config-engine/tests/__init__.py
Normal file
129
src/sonic-config-engine/tests/sample_graph.xml
Normal file
129
src/sonic-config-engine/tests/sample_graph.xml
Normal file
@ -0,0 +1,129 @@
|
|||||||
|
<DeviceMiniGraph xmlns="Microsoft.Search.Autopilot.Evolution" xmlns:i="http://www.w3.org/2001/XMLSchema-instance">
|
||||||
|
<CpgDec>
|
||||||
|
<IsisRouters xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
|
||||||
|
<PeeringSessions>
|
||||||
|
<BGPSession>
|
||||||
|
<StartRouter>OCPSCH0104001MS</StartRouter>
|
||||||
|
<StartPeer>10.10.1.14</StartPeer>
|
||||||
|
<EndRouter>OCPSCH01040DDLF</EndRouter>
|
||||||
|
<EndPeer>10.10.1.13</EndPeer>
|
||||||
|
<Multihop>1</Multihop>
|
||||||
|
<HoldTime>10</HoldTime>
|
||||||
|
<KeepAliveTime>3</KeepAliveTime>
|
||||||
|
</BGPSession>
|
||||||
|
<BGPSession>
|
||||||
|
<StartRouter>OCPSCH0104002MS</StartRouter>
|
||||||
|
<StartPeer>10.10.2.14</StartPeer>
|
||||||
|
<EndRouter>OCPSCH01040DDLF</EndRouter>
|
||||||
|
<EndPeer>10.10.2.13</EndPeer>
|
||||||
|
<Multihop>1</Multihop>
|
||||||
|
<HoldTime>10</HoldTime>
|
||||||
|
<KeepAliveTime>3</KeepAliveTime>
|
||||||
|
</BGPSession>
|
||||||
|
</PeeringSessions>
|
||||||
|
<Routers xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
|
||||||
|
<a:BGPRouterDeclaration>
|
||||||
|
<a:ASN>64536</a:ASN>
|
||||||
|
<a:Hostname>OCPSCH01040DDLF</a:Hostname>
|
||||||
|
<a:Peers>
|
||||||
|
<BGPPeer>
|
||||||
|
<Address>10.10.1.14</Address>
|
||||||
|
<RouteMapIn i:nil="true"/>
|
||||||
|
<RouteMapOut i:nil="true"/>
|
||||||
|
</BGPPeer>
|
||||||
|
<BGPPeer>
|
||||||
|
<Address>10.10.2.14</Address>
|
||||||
|
<RouteMapIn i:nil="true"/>
|
||||||
|
<RouteMapOut i:nil="true"/>
|
||||||
|
</BGPPeer>
|
||||||
|
</a:Peers>
|
||||||
|
<a:RouteMaps/>
|
||||||
|
</a:BGPRouterDeclaration>
|
||||||
|
<a:BGPRouterDeclaration>
|
||||||
|
<a:ASN>64542</a:ASN>
|
||||||
|
<a:Hostname>OCPSCH0104001MS</a:Hostname>
|
||||||
|
<a:RouteMaps/>
|
||||||
|
</a:BGPRouterDeclaration>
|
||||||
|
<a:BGPRouterDeclaration>
|
||||||
|
<a:ASN>64543</a:ASN>
|
||||||
|
<a:Hostname>OCPSCH0104002MS</a:Hostname>
|
||||||
|
<a:RouteMaps/>
|
||||||
|
</a:BGPRouterDeclaration>
|
||||||
|
</Routers>
|
||||||
|
</CpgDec>
|
||||||
|
<DpgDec>
|
||||||
|
<DeviceDataPlaneInfo>
|
||||||
|
<IPSecTunnels/>
|
||||||
|
<LoopbackIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
|
||||||
|
<a:LoopbackIPInterface>
|
||||||
|
<Name>HostIP</Name>
|
||||||
|
<AttachTo>Loopback0</AttachTo>
|
||||||
|
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.NetMux">
|
||||||
|
<b:IPPrefix>100.0.0.6/32</b:IPPrefix>
|
||||||
|
</a:Prefix>
|
||||||
|
<a:PrefixStr>100.0.0.6/32</a:PrefixStr>
|
||||||
|
</a:LoopbackIPInterface>
|
||||||
|
</LoopbackIPInterfaces>
|
||||||
|
<ManagementIPInterfaces xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution">
|
||||||
|
<a:ManagementIPInterface>
|
||||||
|
<Name>ManagementIP1</Name>
|
||||||
|
<AttachTo>Management0</AttachTo>
|
||||||
|
<a:Prefix xmlns:b="Microsoft.Search.Autopilot.NetMux">
|
||||||
|
<b:IPPrefix>192.168.200.15/24</b:IPPrefix>
|
||||||
|
</a:Prefix>
|
||||||
|
<a:PrefixStr>192.168.200.15/24</a:PrefixStr>
|
||||||
|
</a:ManagementIPInterface>
|
||||||
|
</ManagementIPInterfaces>
|
||||||
|
<MplsInterfaces/>
|
||||||
|
<MplsTeInterfaces/>
|
||||||
|
<RsvpInterfaces/>
|
||||||
|
<Hostname>OCPSCH01040DDLF</Hostname>
|
||||||
|
<PortChannelInterfaces/>
|
||||||
|
<VlanInterfaces/>
|
||||||
|
<IPInterfaces>
|
||||||
|
<IPInterface>
|
||||||
|
<Name i:nil="true"/>
|
||||||
|
<AttachTo>Ethernet0</AttachTo>
|
||||||
|
<Prefix>10.10.1.13/30</Prefix>
|
||||||
|
</IPInterface>
|
||||||
|
<IPInterface>
|
||||||
|
<Name i:nil="true"/>
|
||||||
|
<AttachTo>Ethernet1</AttachTo>
|
||||||
|
<Prefix>10.10.2.13/30</Prefix>
|
||||||
|
</IPInterface>
|
||||||
|
</IPInterfaces>
|
||||||
|
<DataAcls/>
|
||||||
|
<AclInterfaces/>
|
||||||
|
<DownstreamSummaries/>
|
||||||
|
<DownstreamSummarySet xmlns:a="http://schemas.datacontract.org/2004/07/Microsoft.Search.Autopilot.Evolution"/>
|
||||||
|
</DeviceDataPlaneInfo>
|
||||||
|
</DpgDec>
|
||||||
|
<PngDec>
|
||||||
|
<DeviceInterfaceLinks>
|
||||||
|
<DeviceLinkBase i:type="DeviceInterfaceLink">
|
||||||
|
<Bandwidth>40000</Bandwidth>
|
||||||
|
<ElementType>DeviceInterfaceLink</ElementType>
|
||||||
|
<EndDevice>OCPSCH01040DDLF</EndDevice>
|
||||||
|
<EndPort>Ethernet0</EndPort>
|
||||||
|
<StartDevice>OCPSCH0104012MS</StartDevice>
|
||||||
|
<StartPort>Ethernet12</StartPort>
|
||||||
|
</DeviceLinkBase>
|
||||||
|
<DeviceLinkBase i:type="DeviceInterfaceLink">
|
||||||
|
<Bandwidth>40000</Bandwidth>
|
||||||
|
<ElementType>DeviceInterfaceLink</ElementType>
|
||||||
|
<EndDevice>OCPCH01040DDLF</EndDevice>
|
||||||
|
<EndPort>Ethernet1</EndPort>
|
||||||
|
<StartDevice>OCPSCH0104002MS</StartDevice>
|
||||||
|
<StartPort>Ethernet12</StartPort>
|
||||||
|
</DeviceLinkBase>
|
||||||
|
</DeviceInterfaceLinks>
|
||||||
|
<Devices>
|
||||||
|
<Device i:type="LeafRouter">
|
||||||
|
<Hostname>OCPSCH01040DDLF</Hostname>
|
||||||
|
<HwSku>Force10-Z9100</HwSku>
|
||||||
|
</Device>
|
||||||
|
</Devices>
|
||||||
|
</PngDec>
|
||||||
|
<Hostname>OCPSCH01040DDLF</Hostname>
|
||||||
|
<HwSku>Force10-Z9100</HwSku>
|
||||||
|
</DeviceMiniGraph>
|
3
src/sonic-config-engine/tests/test.j2
Normal file
3
src/sonic-config-engine/tests/test.j2
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
{% for item in yml_item -%}
|
||||||
|
{{ item }}
|
||||||
|
{% endfor %}
|
3
src/sonic-config-engine/tests/test.yml
Normal file
3
src/sonic-config-engine/tests/test.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
yml_item:
|
||||||
|
- value1
|
||||||
|
- value2
|
61
src/sonic-config-engine/tests/test_cfggen.py
Normal file
61
src/sonic-config-engine/tests/test_cfggen.py
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
from unittest import TestCase
|
||||||
|
import subprocess
|
||||||
|
import os
|
||||||
|
|
||||||
|
class TestCfgGen(TestCase):
|
||||||
|
|
||||||
|
def setUp(self):
|
||||||
|
self.test_dir = os.path.dirname(os.path.realpath(__file__))
|
||||||
|
self.script_file = os.path.join(self.test_dir, '..', 'sonic-cfggen')
|
||||||
|
self.sample_graph = os.path.join(self.test_dir, 'sample_graph.xml')
|
||||||
|
|
||||||
|
def run_script(self, argument):
|
||||||
|
print '\n Running sonic-cfggen ' + argument
|
||||||
|
output = subprocess.check_output(self.script_file + ' ' + argument, shell=True)
|
||||||
|
linecount = output.strip().count('\n')
|
||||||
|
if linecount <= 0:
|
||||||
|
print ' Output: ' + output.strip()
|
||||||
|
else:
|
||||||
|
print ' Output: ({0} lines, {1} bytes)'.format(linecount + 1, len(output))
|
||||||
|
return output
|
||||||
|
|
||||||
|
def test_dummy_run(self):
|
||||||
|
argument = ''
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output, '')
|
||||||
|
|
||||||
|
def test_minigraph_sku(self):
|
||||||
|
argument = '-v minigraph_hwsku -m "' + self.sample_graph + '"'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), 'Force10-Z9100')
|
||||||
|
|
||||||
|
def test_print_data(self):
|
||||||
|
argument = '-m "' + self.sample_graph + '" --print-data'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertTrue(len(output.strip()) > 0)
|
||||||
|
|
||||||
|
def test_jinja_expression(self):
|
||||||
|
argument = '-m "' + self.sample_graph + '" -v "minigraph_devices[minigraph_hostname][\'type\']"'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), 'LeafRouter')
|
||||||
|
|
||||||
|
def test_print_alias_mapping(self):
|
||||||
|
argument = '-s'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertTrue(len(output.strip()) > 0)
|
||||||
|
|
||||||
|
def test_additional_json_data(self):
|
||||||
|
argument = '-a \'{"key1":"value1"}\' -v key1'
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), 'value1')
|
||||||
|
|
||||||
|
def test_read_yaml(self):
|
||||||
|
argument = '-v yml_item -y ' + os.path.join(self.test_dir, 'test.yml')
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), '[\'value1\', \'value2\']')
|
||||||
|
|
||||||
|
def test_render_template(self):
|
||||||
|
argument = '-y ' + os.path.join(self.test_dir, 'test.yml') + ' -t' + os.path.join(self.test_dir, 'test.j2')
|
||||||
|
output = self.run_script(argument)
|
||||||
|
self.assertEqual(output.strip(), 'value1\nvalue2')
|
||||||
|
|
Loading…
Reference in New Issue
Block a user