[sonic-yang-mgmt] Build PY3 & PY2 packages (#5559)
Moving sonic-yang-mgmt to PY3 to support move of sonic-utilities to PY3. Signed-off-by: Praveen Chaudhary<pchaudhary@linkedin.com>
This commit is contained in:
parent
04d0e8ab00
commit
6156cb2805
@ -154,15 +154,23 @@ sudo rm -rf $FILESYSTEM_ROOT/$CONFIG_ENGINE_PY2_WHEEL_NAME
|
|||||||
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libyang_*.deb
|
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libyang_*.deb
|
||||||
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libyang-cpp_*.deb
|
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/libyang-cpp_*.deb
|
||||||
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/python2-yang_*.deb
|
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/python2-yang_*.deb
|
||||||
|
sudo dpkg --root=$FILESYSTEM_ROOT -i $debs_path/python3-yang_*.deb
|
||||||
SONIC_YANG_MODEL_PY3_WHEEL_NAME=$(basename {{sonic_yang_models_py3_wheel_path}})
|
SONIC_YANG_MODEL_PY3_WHEEL_NAME=$(basename {{sonic_yang_models_py3_wheel_path}})
|
||||||
sudo cp {{sonic_yang_models_py3_wheel_path}} $FILESYSTEM_ROOT/$SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
sudo cp {{sonic_yang_models_py3_wheel_path}} $FILESYSTEM_ROOT/$SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
||||||
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install $SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install $SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
||||||
sudo rm -rf $FILESYSTEM_ROOT/$SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
sudo rm -rf $FILESYSTEM_ROOT/$SONIC_YANG_MODEL_PY3_WHEEL_NAME
|
||||||
# Install sonic-yang-mgmt Python package
|
|
||||||
SONIC_YANG_MGMT_PY_WHEEL_NAME=$(basename {{sonic_yang_mgmt_py_wheel_path}})
|
# Install sonic-yang-mgmt Python2 package
|
||||||
sudo cp {{sonic_yang_mgmt_py_wheel_path}} $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY_WHEEL_NAME
|
SONIC_YANG_MGMT_PY2_WHEEL_NAME=$(basename {{sonic_yang_mgmt_py2_wheel_path}})
|
||||||
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip2 install $SONIC_YANG_MGMT_PY_WHEEL_NAME
|
sudo cp {{sonic_yang_mgmt_py2_wheel_path}} $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY2_WHEEL_NAME
|
||||||
sudo rm -rf $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY_WHEEL_NAME
|
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip2 install $SONIC_YANG_MGMT_PY2_WHEEL_NAME
|
||||||
|
sudo rm -rf $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY2_WHEEL_NAME
|
||||||
|
|
||||||
|
# Install sonic-yang-mgmt Python3 package
|
||||||
|
SONIC_YANG_MGMT_PY3_WHEEL_NAME=$(basename {{sonic_yang_mgmt_py3_wheel_path}})
|
||||||
|
sudo cp {{sonic_yang_mgmt_py3_wheel_path}} $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY3_WHEEL_NAME
|
||||||
|
sudo https_proxy=$https_proxy LANG=C chroot $FILESYSTEM_ROOT pip3 install $SONIC_YANG_MGMT_PY3_WHEEL_NAME
|
||||||
|
sudo rm -rf $FILESYSTEM_ROOT/$SONIC_YANG_MGMT_PY3_WHEEL_NAME
|
||||||
|
|
||||||
# Install sonic-platform-common Python 2 package
|
# Install sonic-platform-common Python 2 package
|
||||||
PLATFORM_COMMON_PY2_WHEEL_NAME=$(basename {{platform_common_py2_wheel_path}})
|
PLATFORM_COMMON_PY2_WHEEL_NAME=$(basename {{platform_common_py2_wheel_path}})
|
||||||
|
@ -22,7 +22,7 @@ $(DOCKER_SONIC_VS)_PYTHON_WHEELS += $(SWSSSDK_PY2) \
|
|||||||
$(SONIC_PY_COMMON_PY2) \
|
$(SONIC_PY_COMMON_PY2) \
|
||||||
$(SONIC_PY_COMMON_PY3) \
|
$(SONIC_PY_COMMON_PY3) \
|
||||||
$(SONIC_YANG_MODELS_PY3) \
|
$(SONIC_YANG_MODELS_PY3) \
|
||||||
$(SONIC_YANG_MGMT_PY) \
|
$(SONIC_YANG_MGMT_PY2) \
|
||||||
$(SONIC_UTILITIES_PY2) \
|
$(SONIC_UTILITIES_PY2) \
|
||||||
$(SONIC_HOST_SERVICES_PY3)
|
$(SONIC_HOST_SERVICES_PY3)
|
||||||
|
|
||||||
|
@ -83,11 +83,6 @@ RUN pip2 install urllib3
|
|||||||
RUN pip2 install requests
|
RUN pip2 install requests
|
||||||
RUN pip2 install crontab
|
RUN pip2 install crontab
|
||||||
|
|
||||||
# Install dependencies for Dynamic Port Breakout
|
|
||||||
RUN pip2 install xmltodict==0.12.0
|
|
||||||
RUN pip2 install jsondiff==1.2.0
|
|
||||||
RUN pip2 install ijson==2.6.1
|
|
||||||
|
|
||||||
{% if docker_sonic_vs_debs.strip() -%}
|
{% if docker_sonic_vs_debs.strip() -%}
|
||||||
# Copy locally-built Debian package dependencies
|
# Copy locally-built Debian package dependencies
|
||||||
{%- for deb in docker_sonic_vs_debs.split(' ') %}
|
{%- for deb in docker_sonic_vs_debs.split(' ') %}
|
||||||
|
@ -14,7 +14,7 @@ $(SONIC_UTILITIES_PY2)_DEPENDS += $(SONIC_PY_COMMON_PY2) \
|
|||||||
$(SONIC_PY_COMMON_PY3) \
|
$(SONIC_PY_COMMON_PY3) \
|
||||||
$(SWSSSDK_PY2) \
|
$(SWSSSDK_PY2) \
|
||||||
$(SONIC_CONFIG_ENGINE_PY2) \
|
$(SONIC_CONFIG_ENGINE_PY2) \
|
||||||
$(SONIC_YANG_MGMT_PY) \
|
$(SONIC_YANG_MGMT_PY2) \
|
||||||
$(SONIC_YANG_MODELS_PY3)
|
$(SONIC_YANG_MODELS_PY3)
|
||||||
$(SONIC_UTILITIES_PY2)_DEBS_DEPENDS = $(LIBYANG) \
|
$(SONIC_UTILITIES_PY2)_DEBS_DEPENDS = $(LIBYANG) \
|
||||||
$(LIBYANG_CPP) \
|
$(LIBYANG_CPP) \
|
||||||
|
@ -1,10 +1,10 @@
|
|||||||
|
|
||||||
SPATH := $($(SONIC_YANG_MGMT_PY)_SRC_PATH)
|
SPATH := $($(SONIC_YANG_MGMT_PY2)_SRC_PATH)
|
||||||
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-yang-mgmt-py2.mk rules/sonic-yang-mgmt-py2.dep
|
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-yang-mgmt-py2.mk rules/sonic-yang-mgmt-py2.dep
|
||||||
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
|
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
|
||||||
DEP_FILES += $(shell git ls-files $(SPATH))
|
DEP_FILES += $(shell git ls-files $(SPATH))
|
||||||
|
|
||||||
$(SONIC_YANG_MGMT_PY)_CACHE_MODE := GIT_CONTENT_SHA
|
$(SONIC_YANG_MGMT_PY2)_CACHE_MODE := GIT_CONTENT_SHA
|
||||||
$(SONIC_YANG_MGMT_PY)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
|
$(SONIC_YANG_MGMT_PY2)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
|
||||||
$(SONIC_YANG_MGMT_PY)_DEP_FILES := $(DEP_FILES)
|
$(SONIC_YANG_MGMT_PY2)_DEP_FILES := $(DEP_FILES)
|
||||||
|
|
||||||
|
@ -1,12 +1,12 @@
|
|||||||
# sonic-yang-mgmt python2 wheel
|
# sonic-yang-mgmt python2 wheel
|
||||||
|
|
||||||
SONIC_YANG_MGMT_PY = sonic_yang_mgmt-1.0-py2-none-any.whl
|
SONIC_YANG_MGMT_PY2 = sonic_yang_mgmt-1.0-py2-none-any.whl
|
||||||
$(SONIC_YANG_MGMT_PY)_SRC_PATH = $(SRC_PATH)/sonic-yang-mgmt
|
$(SONIC_YANG_MGMT_PY2)_SRC_PATH = $(SRC_PATH)/sonic-yang-mgmt
|
||||||
$(SONIC_YANG_MGMT_PY)_PYTHON_VERSION = 2
|
$(SONIC_YANG_MGMT_PY2)_PYTHON_VERSION = 2
|
||||||
$(SONIC_YANG_MGMT_PY)_DEBS_DEPENDS = $(LIBYANG) $(LIBYANG_CPP) $(LIBYANG_PY2) \
|
$(SONIC_YANG_MGMT_PY2)_DEBS_DEPENDS = $(LIBYANG) $(LIBYANG_CPP) $(LIBYANG_PY2) \
|
||||||
$(LIBYANG_PY3)
|
$(LIBYANG_PY3)
|
||||||
$(SONIC_YANG_MGMT_PY)_DEPENDS = $(SONIC_YANG_MODELS_PY3)
|
$(SONIC_YANG_MGMT_PY2)_DEPENDS = $(SONIC_YANG_MODELS_PY3)
|
||||||
$(SONIC_YANG_MGMT_PY)_RDEPENDS = $(SONIC_YANG_MODELS_PY3) $(LIBYANG) \
|
$(SONIC_YANG_MGMT_PY2)_RDEPENDS = $(SONIC_YANG_MODELS_PY3) $(LIBYANG) \
|
||||||
$(LIBYANG_CPP) $(LIBYANG_PY2)
|
$(LIBYANG_CPP) $(LIBYANG_PY2)
|
||||||
|
|
||||||
SONIC_PYTHON_WHEELS += $(SONIC_YANG_MGMT_PY)
|
SONIC_PYTHON_WHEELS += $(SONIC_YANG_MGMT_PY2)
|
||||||
|
10
rules/sonic-yang-mgmt-py3.dep
Normal file
10
rules/sonic-yang-mgmt-py3.dep
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
|
||||||
|
SPATH := $($(SONIC_YANG_MGMT_PY3)_SRC_PATH)
|
||||||
|
DEP_FILES := $(SONIC_COMMON_FILES_LIST) rules/sonic-yang-mgmt-py3.mk rules/sonic-yang-mgmt-py3.dep
|
||||||
|
DEP_FILES += $(SONIC_COMMON_BASE_FILES_LIST)
|
||||||
|
DEP_FILES += $(shell git ls-files $(SPATH))
|
||||||
|
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_CACHE_MODE := GIT_CONTENT_SHA
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_DEP_FLAGS := $(SONIC_COMMON_FLAGS_LIST)
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_DEP_FILES := $(DEP_FILES)
|
||||||
|
|
11
rules/sonic-yang-mgmt-py3.mk
Normal file
11
rules/sonic-yang-mgmt-py3.mk
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# sonic-yang-mgmt python3 wheel
|
||||||
|
|
||||||
|
SONIC_YANG_MGMT_PY3 = sonic_yang_mgmt-1.0-py3-none-any.whl
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_SRC_PATH = $(SRC_PATH)/sonic-yang-mgmt
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_PYTHON_VERSION = 3
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_DEBS_DEPENDS = $(LIBYANG) $(LIBYANG_CPP) $(LIBYANG_PY3)
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_DEPENDS = $(SONIC_YANG_MODELS_PY3)
|
||||||
|
$(SONIC_YANG_MGMT_PY3)_RDEPENDS = $(SONIC_YANG_MODELS_PY3) $(LIBYANG) \
|
||||||
|
$(LIBYANG_CPP) $(LIBYANG_PY3)
|
||||||
|
|
||||||
|
SONIC_PYTHON_WHEELS += $(SONIC_YANG_MGMT_PY3)
|
6
slave.mk
6
slave.mk
@ -821,7 +821,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
|||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2)) \
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY2)) \
|
||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2)) \
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_PLATFORM_API_PY2)) \
|
||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MODELS_PY3)) \
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MODELS_PY3)) \
|
||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY)) \
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY2)) \
|
||||||
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY3)) \
|
||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SYSTEM_HEALTH)) \
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SYSTEM_HEALTH)) \
|
||||||
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_HOST_SERVICES_PY3))
|
$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_HOST_SERVICES_PY3))
|
||||||
$(HEADER)
|
$(HEADER)
|
||||||
@ -864,7 +865,8 @@ $(addprefix $(TARGET_PATH)/, $(SONIC_INSTALLERS)) : $(TARGET_PATH)/% : \
|
|||||||
export redis_dump_load_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY3))"
|
export redis_dump_load_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(REDIS_DUMP_LOAD_PY3))"
|
||||||
export install_debug_image="$(INSTALL_DEBUG_TOOLS)"
|
export install_debug_image="$(INSTALL_DEBUG_TOOLS)"
|
||||||
export sonic_yang_models_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MODELS_PY3))"
|
export sonic_yang_models_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MODELS_PY3))"
|
||||||
export sonic_yang_mgmt_py_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY))"
|
export sonic_yang_mgmt_py2_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY2))"
|
||||||
|
export sonic_yang_mgmt_py3_wheel_path="$(addprefix $(PYTHON_WHEELS_PATH)/,$(SONIC_YANG_MGMT_PY3))"
|
||||||
export multi_instance="false"
|
export multi_instance="false"
|
||||||
export python_swss_debs="$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$($(LIBSWSSCOMMON)_RDEPENDS))"
|
export python_swss_debs="$(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$($(LIBSWSSCOMMON)_RDEPENDS))"
|
||||||
export python_swss_debs+=" $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(LIBSWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON_SWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON3_SWSSCOMMON))"
|
export python_swss_debs+=" $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(LIBSWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON_SWSSCOMMON)) $(addprefix $(IMAGE_DISTRO_DEBS_PATH)/,$(PYTHON3_SWSSCOMMON))"
|
||||||
|
@ -390,11 +390,7 @@ RUN pip2 install pexpect==4.6.0
|
|||||||
# For sonic-swss-common testing
|
# For sonic-swss-common testing
|
||||||
RUN pip2 install Pympler==0.8
|
RUN pip2 install Pympler==0.8
|
||||||
|
|
||||||
# For sonic_yang_mgmt build
|
# For sonic_yang_model build
|
||||||
RUN pip2 install ijson==2.6.1
|
|
||||||
RUN pip3 install ijson==2.6.1
|
|
||||||
RUN pip2 install jsondiff==1.2.0
|
|
||||||
RUN pip2 install xmltodict==0.12.0
|
|
||||||
RUN pip2 install pyang==2.1.1
|
RUN pip2 install pyang==2.1.1
|
||||||
|
|
||||||
# For mgmt-framework build
|
# For mgmt-framework build
|
||||||
|
@ -339,7 +339,7 @@ RUN pip2 install \
|
|||||||
ctypesgen==0.r125 \
|
ctypesgen==0.r125 \
|
||||||
crc16
|
crc16
|
||||||
|
|
||||||
# Note: Stick with Jinja2 2.x branch as the 3.x dropped support for Python 2.7
|
# Note: Stick with Jinja2 2.x branch as the 3.x dropped support for Python 2.7
|
||||||
RUN pip2 install --force-reinstall --upgrade "Jinja2<3.0.0"
|
RUN pip2 install --force-reinstall --upgrade "Jinja2<3.0.0"
|
||||||
|
|
||||||
# For sonic config engine testing
|
# For sonic config engine testing
|
||||||
@ -379,11 +379,7 @@ RUN pip2 install setuptools==40.8.0
|
|||||||
# For sonic-swss-common testing
|
# For sonic-swss-common testing
|
||||||
RUN pip2 install Pympler==0.8
|
RUN pip2 install Pympler==0.8
|
||||||
|
|
||||||
# For sonic_yang_mgmt build
|
# For sonic_yang_model build
|
||||||
RUN pip2 install ijson==2.6.1
|
|
||||||
RUN pip3 install ijson==2.6.1
|
|
||||||
RUN pip2 install jsondiff==1.2.0
|
|
||||||
RUN pip2 install xmltodict==0.12.0
|
|
||||||
RUN pip2 install pyang==2.1.1
|
RUN pip2 install pyang==2.1.1
|
||||||
|
|
||||||
# For mgmt-framework build
|
# For mgmt-framework build
|
||||||
|
2
src/sonic-yang-mgmt/setup.cfg
Normal file
2
src/sonic-yang-mgmt/setup.cfg
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[aliases]
|
||||||
|
test=pytest
|
@ -4,37 +4,12 @@
|
|||||||
"""The setup script."""
|
"""The setup script."""
|
||||||
|
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
from setuptools.command.build_py import build_py
|
|
||||||
from os import system
|
|
||||||
from sys import exit
|
|
||||||
import pytest
|
|
||||||
|
|
||||||
setup_requirements = ['pytest-runner']
|
|
||||||
|
|
||||||
test_requirements = ['pytest>=3']
|
|
||||||
|
|
||||||
# read me
|
# read me
|
||||||
with open('README.rst') as readme_file:
|
with open('README.rst') as readme_file:
|
||||||
readme = readme_file.read()
|
readme = readme_file.read()
|
||||||
|
|
||||||
# class for prerequisites to build this package
|
|
||||||
class pkgBuild(build_py):
|
|
||||||
"""Custom Build PLY"""
|
|
||||||
|
|
||||||
def run (self):
|
|
||||||
# run pytest for libyang python APIs
|
|
||||||
self.pytest_args = []
|
|
||||||
errno = pytest.main(self.pytest_args)
|
|
||||||
if (errno):
|
|
||||||
exit(errno)
|
|
||||||
|
|
||||||
# Continue usual build steps
|
|
||||||
build_py.run(self)
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
cmdclass={
|
|
||||||
'build_py': pkgBuild,
|
|
||||||
},
|
|
||||||
author="lnos-coders",
|
author="lnos-coders",
|
||||||
author_email='lnos-coders@linkedin.com',
|
author_email='lnos-coders@linkedin.com',
|
||||||
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
|
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
|
||||||
@ -52,15 +27,26 @@ setup(
|
|||||||
'Programming Language :: Python :: 3.8',
|
'Programming Language :: Python :: 3.8',
|
||||||
],
|
],
|
||||||
description="Package contains Python Library for YANG for sonic.",
|
description="Package contains Python Library for YANG for sonic.",
|
||||||
tests_require = test_requirements,
|
|
||||||
license="GNU General Public License v3",
|
license="GNU General Public License v3",
|
||||||
long_description=readme + '\n\n',
|
long_description=readme + '\n\n',
|
||||||
|
install_requires = [
|
||||||
|
'xmltodict==0.12.0',
|
||||||
|
'ijson==2.6.1'
|
||||||
|
],
|
||||||
|
tests_require = [
|
||||||
|
'pytest>3',
|
||||||
|
'xmltodict==0.12.0',
|
||||||
|
'ijson==2.6.1'
|
||||||
|
],
|
||||||
|
setup_requires = [
|
||||||
|
'pytest-runner',
|
||||||
|
'wheel'
|
||||||
|
],
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
keywords='sonic_yang_mgmt',
|
keywords='sonic-yang-mgmt',
|
||||||
name='sonic_yang_mgmt',
|
name='sonic-yang-mgmt',
|
||||||
py_modules=['sonic_yang', 'sonic_yang_ext'],
|
py_modules=['sonic_yang', 'sonic_yang_ext'],
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
setup_requires=setup_requirements,
|
|
||||||
version='1.0',
|
version='1.0',
|
||||||
zip_safe=False,
|
zip_safe=False,
|
||||||
)
|
)
|
||||||
|
@ -129,7 +129,8 @@ class SonicYangExtMixin:
|
|||||||
"""
|
"""
|
||||||
def _cropConfigDB(self, croppedFile=None):
|
def _cropConfigDB(self, croppedFile=None):
|
||||||
|
|
||||||
for table in self.jIn.keys():
|
tables = list(self.jIn.keys())
|
||||||
|
for table in tables:
|
||||||
if table not in self.confDbYangMap:
|
if table not in self.confDbYangMap:
|
||||||
# store in tablesWithOutYang
|
# store in tablesWithOutYang
|
||||||
self.tablesWithOutYang[table] = self.jIn[table]
|
self.tablesWithOutYang[table] = self.jIn[table]
|
||||||
@ -138,7 +139,7 @@ class SonicYangExtMixin:
|
|||||||
if len(self.tablesWithOutYang):
|
if len(self.tablesWithOutYang):
|
||||||
print("Note: Below table(s) have no YANG models:")
|
print("Note: Below table(s) have no YANG models:")
|
||||||
for table in self.tablesWithOutYang.keys():
|
for table in self.tablesWithOutYang.keys():
|
||||||
print(unicode(table), end=", ")
|
print(str(table), end=", ")
|
||||||
print()
|
print()
|
||||||
|
|
||||||
if croppedFile:
|
if croppedFile:
|
||||||
@ -274,13 +275,14 @@ class SonicYangExtMixin:
|
|||||||
# fetch regex from YANG models.
|
# fetch regex from YANG models.
|
||||||
keyRegEx = model['ext:key-regex-configdb-to-yang']['@value']
|
keyRegEx = model['ext:key-regex-configdb-to-yang']['@value']
|
||||||
# seperator `|` has special meaning in regex, so change it appropriately.
|
# seperator `|` has special meaning in regex, so change it appropriately.
|
||||||
keyRegEx = re.sub('\|', '\\|', keyRegEx)
|
keyRegEx = re.sub(r'\|', r'\\|', keyRegEx)
|
||||||
# get keys from YANG model list itself
|
# get keys from YANG model list itself
|
||||||
listKeys = model['key']['@value']
|
listKeys = model['key']['@value']
|
||||||
self.sysLog(msg="xlateList regex:{} keyList:{}".\
|
self.sysLog(msg="xlateList regex:{} keyList:{}".\
|
||||||
format(keyRegEx, listKeys))
|
format(keyRegEx, listKeys))
|
||||||
|
|
||||||
for pkey in config.keys():
|
primaryKeys = list(config.keys())
|
||||||
|
for pkey in primaryKeys:
|
||||||
try:
|
try:
|
||||||
vKey = None
|
vKey = None
|
||||||
self.sysLog(syslog.LOG_DEBUG, "xlateList Extract pkey:{}".\
|
self.sysLog(syslog.LOG_DEBUG, "xlateList Extract pkey:{}".\
|
||||||
|
@ -64,8 +64,8 @@ class Test_SonicYang(object):
|
|||||||
def load_yang_model_file(self, yang_s, yang_dir, yang_file, module_name):
|
def load_yang_model_file(self, yang_s, yang_dir, yang_file, module_name):
|
||||||
yfile = yang_dir + yang_file
|
yfile = yang_dir + yang_file
|
||||||
try:
|
try:
|
||||||
yang_s._load_schema_module(str(yfile))
|
yang_s._load_schema_module(str(yfile))
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
print(e)
|
print(e)
|
||||||
raise
|
raise
|
||||||
|
|
||||||
@ -106,7 +106,7 @@ class Test_SonicYang(object):
|
|||||||
data_files = []
|
data_files = []
|
||||||
data_files.append(data_file)
|
data_files.append(data_file)
|
||||||
data_files.append(data_merge_file)
|
data_files.append(data_merge_file)
|
||||||
print(yang_files)
|
print(yang_files)
|
||||||
yang_s._load_data_model(yang_dir, yang_files, data_files)
|
yang_s._load_data_model(yang_dir, yang_files, data_files)
|
||||||
|
|
||||||
#validate the data tree from data_merge_file is loaded
|
#validate the data tree from data_merge_file is loaded
|
||||||
|
2
src/sonic-yang-models/setup.cfg
Normal file
2
src/sonic-yang-models/setup.cfg
Normal file
@ -0,0 +1,2 @@
|
|||||||
|
[aliases]
|
||||||
|
test=pytest
|
@ -4,51 +4,12 @@
|
|||||||
"""The setup script."""
|
"""The setup script."""
|
||||||
|
|
||||||
from setuptools import setup, find_packages
|
from setuptools import setup, find_packages
|
||||||
from setuptools.command.build_py import build_py
|
|
||||||
from os import system
|
|
||||||
from sys import exit
|
|
||||||
|
|
||||||
setup_requirements = ['pytest-runner']
|
|
||||||
|
|
||||||
test_requirements = ['pytest>=3']
|
|
||||||
|
|
||||||
# read me
|
# read me
|
||||||
with open('README.rst') as readme_file:
|
with open('README.rst') as readme_file:
|
||||||
readme = readme_file.read()
|
readme = readme_file.read()
|
||||||
|
|
||||||
# class for prerequisites to build this package
|
|
||||||
class pkgBuild(build_py):
|
|
||||||
"""Custom Build PLY"""
|
|
||||||
|
|
||||||
def run (self):
|
|
||||||
# json file for YANG model test cases.
|
|
||||||
test_yangJson_file = './tests/yang_model_tests/yangTest.json'
|
|
||||||
# YANG models are in below dir
|
|
||||||
yang_model_dir = './yang-models/'
|
|
||||||
# yang model tester python module
|
|
||||||
yang_test_py = './tests/yang_model_tests/yangModelTesting.py'
|
|
||||||
# run tests for yang models
|
|
||||||
test_yang_cmd = "python {} -f {} -y {}".format(yang_test_py, test_yangJson_file, yang_model_dir)
|
|
||||||
if (system(test_yang_cmd)):
|
|
||||||
print("YANG Tests failed\n")
|
|
||||||
exit(1)
|
|
||||||
else:
|
|
||||||
print("YANG Tests passed\n")
|
|
||||||
|
|
||||||
# Generate YANG Tree
|
|
||||||
pyang_tree_cmd = "pyang -f tree ./yang-models/*.yang > ./yang-models/sonic_yang_tree"
|
|
||||||
if (system(pyang_tree_cmd)):
|
|
||||||
print("Failed: {}".format(pyang_tree_cmd))
|
|
||||||
else:
|
|
||||||
print("Passed: {}".format(pyang_tree_cmd))
|
|
||||||
|
|
||||||
# Continue usual build steps
|
|
||||||
build_py.run(self)
|
|
||||||
|
|
||||||
setup(
|
setup(
|
||||||
cmdclass={
|
|
||||||
'build_py': pkgBuild,
|
|
||||||
},
|
|
||||||
author="lnos-coders",
|
author="lnos-coders",
|
||||||
author_email='lnos-coders@linkedin.com',
|
author_email='lnos-coders@linkedin.com',
|
||||||
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
|
python_requires='>=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*',
|
||||||
@ -66,15 +27,23 @@ setup(
|
|||||||
'Programming Language :: Python :: 3.8',
|
'Programming Language :: Python :: 3.8',
|
||||||
],
|
],
|
||||||
description="Package contains YANG models for sonic.",
|
description="Package contains YANG models for sonic.",
|
||||||
tests_require = test_requirements,
|
|
||||||
license="GNU General Public License v3",
|
license="GNU General Public License v3",
|
||||||
long_description=readme + '\n\n',
|
long_description=readme + '\n\n',
|
||||||
|
install_requires = [
|
||||||
|
],
|
||||||
|
tests_require = [
|
||||||
|
'pytest',
|
||||||
|
'ijson==2.6.1'
|
||||||
|
],
|
||||||
|
setup_requires = [
|
||||||
|
'pytest-runner',
|
||||||
|
'wheel'
|
||||||
|
],
|
||||||
include_package_data=True,
|
include_package_data=True,
|
||||||
keywords='sonic_yang_models',
|
keywords='sonic-yang-models',
|
||||||
name='sonic_yang_models',
|
name='sonic-yang-models',
|
||||||
py_modules=[],
|
py_modules=[],
|
||||||
packages=find_packages(),
|
packages=find_packages(),
|
||||||
setup_requires=setup_requirements,
|
|
||||||
version='1.0',
|
version='1.0',
|
||||||
data_files=[
|
data_files=[
|
||||||
('yang-models', ['./yang-models/sonic-types.yang',
|
('yang-models', ['./yang-models/sonic-types.yang',
|
||||||
|
@ -5,6 +5,9 @@
|
|||||||
|
|
||||||
import pytest
|
import pytest
|
||||||
|
|
||||||
|
from os import system
|
||||||
|
from sys import exit
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def response():
|
def response():
|
||||||
"""Sample pytest fixture.
|
"""Sample pytest fixture.
|
||||||
@ -14,8 +17,21 @@ def response():
|
|||||||
# import requests
|
# import requests
|
||||||
# return requests.get('https://github.com/audreyr/cookiecutter-pypackage')
|
# return requests.get('https://github.com/audreyr/cookiecutter-pypackage')
|
||||||
|
|
||||||
|
|
||||||
def test_content(response):
|
def test_content(response):
|
||||||
|
|
||||||
"""Sample pytest test function with the pytest fixture as an argument."""
|
"""Sample pytest test function with the pytest fixture as an argument."""
|
||||||
|
|
||||||
|
def test_generate_yang_tree():
|
||||||
|
|
||||||
|
# Generate YANG Tree, see no error in it.
|
||||||
|
pyang_tree_cmd = "pyang -f tree ./yang-models/*.yang > ./yang-models/sonic_yang_tree"
|
||||||
|
if (system(pyang_tree_cmd)):
|
||||||
|
print("Failed: {}".format(pyang_tree_cmd))
|
||||||
|
exit(1)
|
||||||
|
else:
|
||||||
|
print("Passed: {}".format(pyang_tree_cmd))
|
||||||
|
|
||||||
|
return
|
||||||
|
|
||||||
# from bs4 import BeautifulSoup
|
# from bs4 import BeautifulSoup
|
||||||
# assert 'GitHub' in BeautifulSoup(response.content).title.string
|
# assert 'GitHub' in BeautifulSoup(response.content).title.string
|
||||||
|
@ -34,9 +34,9 @@ def printExceptionDetails():
|
|||||||
# Run function will run all the tests
|
# Run function will run all the tests
|
||||||
# from a user given list.
|
# from a user given list.
|
||||||
|
|
||||||
class YangModelTesting:
|
class Test_yang_models:
|
||||||
|
|
||||||
def __init__(self, tests, yangDir, jsonFile):
|
def initTest(self):
|
||||||
self.defaultYANGFailure = {
|
self.defaultYANGFailure = {
|
||||||
'Must': ['Must condition', 'not satisfied'],
|
'Must': ['Must condition', 'not satisfied'],
|
||||||
'InvalidValue': ['Invalid value'],
|
'InvalidValue': ['Invalid value'],
|
||||||
@ -178,11 +178,9 @@ class YangModelTesting:
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
self.tests = tests
|
self.tests = list(self.ExceptionTests.keys())+list(self.SpecialTests.keys())
|
||||||
if (self.tests == None):
|
self.yangDir = './yang-models/'
|
||||||
self.tests = self.ExceptionTests.keys()+self.SpecialTests.keys()
|
self.jsonFile = './tests/yang_model_tests/yangTest.json'
|
||||||
self.yangDir = yangDir
|
|
||||||
self.jsonFile = jsonFile
|
|
||||||
self.testNum = 1
|
self.testNum = 1
|
||||||
# other class vars
|
# other class vars
|
||||||
# self.ctx
|
# self.ctx
|
||||||
@ -212,24 +210,6 @@ class YangModelTesting:
|
|||||||
raise e
|
raise e
|
||||||
return
|
return
|
||||||
|
|
||||||
"""
|
|
||||||
Run all tests from list self.tests
|
|
||||||
"""
|
|
||||||
def run(self):
|
|
||||||
try:
|
|
||||||
self.loadYangModel(self.yangDir)
|
|
||||||
ret = 0
|
|
||||||
for test in self.tests:
|
|
||||||
test = test.strip()
|
|
||||||
if test in self.ExceptionTests:
|
|
||||||
ret = ret + self.runExceptionTest(test);
|
|
||||||
elif test in self.SpecialTests:
|
|
||||||
ret = ret + self.runSpecialTest(test);
|
|
||||||
except Exception as e:
|
|
||||||
printExceptionDetails()
|
|
||||||
raise e
|
|
||||||
return ret
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
Get the JSON input based on func name
|
Get the JSON input based on func name
|
||||||
and return jsonInput
|
and return jsonInput
|
||||||
@ -313,6 +293,8 @@ class YangModelTesting:
|
|||||||
elif (sum(1 for str in eStr if str not in s) == 0):
|
elif (sum(1 for str in eStr if str not in s) == 0):
|
||||||
log.info(desc + " Passed\n")
|
log.info(desc + " Passed\n")
|
||||||
return PASS
|
return PASS
|
||||||
|
else:
|
||||||
|
raise Exception("Unknown Error")
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
printExceptionDetails()
|
printExceptionDetails()
|
||||||
log.info(desc + " Failed\n")
|
log.info(desc + " Failed\n")
|
||||||
@ -336,7 +318,7 @@ class YangModelTesting:
|
|||||||
self.logStartTest(desc)
|
self.logStartTest(desc)
|
||||||
jInput = json.loads(self.readJsonInput(test))
|
jInput = json.loads(self.readJsonInput(test))
|
||||||
# check all Vlan from 1 to 4094
|
# check all Vlan from 1 to 4094
|
||||||
for i in xrange(4095):
|
for i in range(4095):
|
||||||
vlan = 'Vlan'+str(i)
|
vlan = 'Vlan'+str(i)
|
||||||
jInput["sonic-vlan:sonic-vlan"]["sonic-vlan:VLAN"]["VLAN_LIST"]\
|
jInput["sonic-vlan:sonic-vlan"]["sonic-vlan:VLAN"]["VLAN_LIST"]\
|
||||||
[0]["vlan_name"] = vlan
|
[0]["vlan_name"] = vlan
|
||||||
@ -349,6 +331,27 @@ class YangModelTesting:
|
|||||||
printExceptionDetails()
|
printExceptionDetails()
|
||||||
log.info(desc + " Failed\n")
|
log.info(desc + " Failed\n")
|
||||||
return FAIL
|
return FAIL
|
||||||
|
|
||||||
|
"""
|
||||||
|
Run all tests from list self.tests
|
||||||
|
"""
|
||||||
|
def test_run_tests(self):
|
||||||
|
try:
|
||||||
|
self.initTest()
|
||||||
|
self.loadYangModel(self.yangDir)
|
||||||
|
ret = 0
|
||||||
|
for test in self.tests:
|
||||||
|
test = test.strip()
|
||||||
|
if test in self.ExceptionTests:
|
||||||
|
ret = ret + self.runExceptionTest(test);
|
||||||
|
elif test in self.SpecialTests:
|
||||||
|
ret = ret + self.runSpecialTest(test);
|
||||||
|
else:
|
||||||
|
raise Exception("Unexpected Test")
|
||||||
|
except Exception as e:
|
||||||
|
printExceptionDetails()
|
||||||
|
assert ret == 0
|
||||||
|
return
|
||||||
# End of Class
|
# End of Class
|
||||||
|
|
||||||
"""
|
"""
|
@ -188,7 +188,7 @@
|
|||||||
"sonic-vlan:sonic-vlan": {
|
"sonic-vlan:sonic-vlan": {
|
||||||
"sonic-vlan:VLAN_MEMBER": {
|
"sonic-vlan:VLAN_MEMBER": {
|
||||||
"VLAN_MEMBER_LIST": [{
|
"VLAN_MEMBER_LIST": [{
|
||||||
"vlan_name": 100,
|
"vlan_name": "Vlan100",
|
||||||
"port": "Ethernet0",
|
"port": "Ethernet0",
|
||||||
"tagging_mode": "non-tagged"
|
"tagging_mode": "non-tagged"
|
||||||
}]
|
}]
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
module sonic-loopback-interface {
|
module sonic-loopback-interface {
|
||||||
|
|
||||||
|
yang-version 1.1;
|
||||||
|
|
||||||
namespace "http://github.com/Azure/sonic-loopback-interface";
|
namespace "http://github.com/Azure/sonic-loopback-interface";
|
||||||
prefix lointf;
|
prefix lointf;
|
||||||
|
|
||||||
|
@ -1,5 +1,7 @@
|
|||||||
module sonic-vlan {
|
module sonic-vlan {
|
||||||
|
|
||||||
|
yang-version 1.1;
|
||||||
|
|
||||||
namespace "http://github.com/Azure/sonic-vlan";
|
namespace "http://github.com/Azure/sonic-vlan";
|
||||||
prefix vlan;
|
prefix vlan;
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user