sonic-buildimage/platform/mellanox/integration-scripts/tests/test_sdkaction.py

301 lines
12 KiB
Python
Raw Normal View History

[Mellanox] Facilitate automatic integration of sdk kernel patches (#14652) #### Why I did it Facilitate Automatic integration of sdk kernel patches into SONiC. **Inputs to the Script:** 1) `MLNX_SDK_VERSION` Eg: `4.5.4206` 2) `MLNX_SDK_ISSU_VERSION` Eg: `101` **Note: If nothing is provided the one already present in the sdk.mk file is used** 3) `MLNX_SDK_SOURCE_BASE_URL:` **Note: If nothing is provided the upstream sdk drivers url is used** 4) `CREATE_BRANCH: (y|n)` Creates a branch instead of a commit (optional, default: n) 5) `BRANCH_SONIC`: Only relevant when CREATE_BRANCH is y. `Default: master`. Note: These should be provided through `SONIC_OVERRIDE_BUILD_VARS ` parameter **Output:** 1) Script creates a commit in sonic-linux-kernel with any updates to sdk-kernel patches in sonic in accordance with the version provided by `MLNX_SDK_VERSION` **Note: Script Doesn't commit anything to linux-kernel when there aren't any changes required..** #### How I did it 1) Added a new make target which can be invoked by calling `make integrate-mlnx-sdk` ``` user@server:/sonic-buildimage/src/sonic-linux-kernel$ git rev-parse --abbrev-ref HEAD master_6f38dca_integrate_4.5.4206 user@server:/sonic-buildimage/src/sonic-linux-kernel$ git log --oneline -n 1 d64d1e7 (HEAD -> master_6f38dca_integrate_4.5.4206) Intgerate MLNX SDK 4.5.4206 Kernel Patches ``` Changes made will be summarized under `sonic-buildimage/integrate-mlnx-sdk_user.out` file. Debugging and troubleshooting output is written to `sonic-buildimage/integrate-mlnx-sdk.log` files [log_files.zip](https://github.com/sonic-net/sonic-buildimage/files/11226441/log_files.zip) #### Limitations: 1) Assumes that the sdk kernel patches are always upstreamed #### How to verify it Build the Kernel and test
2023-05-30 00:24:06 -05:00
#
# Copyright (c) 2023 NVIDIA CORPORATION & AFFILIATES.
# Apache-2.0
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
import sys
from unittest import mock, TestCase
from pyfakefs.fake_filesystem_unittest import Patcher
sys.path.append('../')
from sdk_kernel_patches import *
MOCK_SLK_SERIES = """\
# Trtnetlink-catch-EOPNOTSUPP-errors.patch
# Mellanox patches for 5.10
###-> mellanox_sdk-start
###-> mellanox_sdk-end
###-> mellanox_hw_mgmt-start
0001-i2c-mlxcpld-Update-module-license.patch
###-> mellanox_hw_mgmt-end
0001-psample-Encapsulate-packet-metadata-in-a-struct.patch
0002-psample-Add-additional-metadata-attributes.patch
#####
"""
EXP_SLK_SERIES_STG1 = """\
# Trtnetlink-catch-EOPNOTSUPP-errors.patch
# Mellanox patches for 5.10
###-> mellanox_sdk-start
###-> mellanox_sdk-end
###-> mellanox_hw_mgmt-start
0001-i2c-mlxcpld-Update-module-license.patch
###-> mellanox_hw_mgmt-end
#####
"""
MOCK_SLK_SERIES_1 = """\
# Trtnetlink-catch-EOPNOTSUPP-errors.patch
# Mellanox patches for 5.10
###-> mellanox_sdk-start
0001-psample-Encapsulate-packet-metadata-in-a-struct.patch
###-> mellanox_sdk-end
###-> mellanox_hw_mgmt-start
0001-i2c-mlxcpld-Update-module-license.patch
###-> mellanox_hw_mgmt-end
#####
"""
MOCK_FINAL_SLK_SERIES = """\
# Trtnetlink-catch-EOPNOTSUPP-errors.patch
# Mellanox patches for 5.10
###-> mellanox_sdk-start
0001-psample-Encapsulate-packet-metadata-in-a-struct.patch
0002-psample-Add-additional-metadata-attributes.patch
0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch
0004-new-sdk-driver-change-1.patch
0005-new-sdk-driver-change-1.patch
###-> mellanox_sdk-end
###-> mellanox_hw_mgmt-start
0001-i2c-mlxcpld-Update-module-license.patch
###-> mellanox_hw_mgmt-end
#####
"""
PTCH_LIST = ["0001-psample-Encapsulate-packet-metadata-in-a-struct.patch", \
"0002-psample-Add-additional-metadata-attributes.patch"]
EXT_PTCH_LIST = ["0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch", \
"0004-new-sdk-driver-change-1.patch", \
"0005-new-sdk-driver-change-1.patch"]
MOCK_SLK_VER = "5.10.104"
MOCK_README = """\
Copy the whole directory which contains this README to some folder on the machine where you plan to build the linux kernel,
then execute "./apply_patches_example.sh -d <your_linux_kernel_source_folder>".
Patch Upstream-Commit From-Kernel-Version
==========================================================================================================================================
0001-psample-Encapsulate-packet-metadata-in-a-struct.patch a03e99d39f1943ec88f6fd3b0b9f34c20663d401 5.13
0002-psample-Add-additional-metadata-attributes.patch 07e1a5809b595df6e125504dff6245cb2c8ed3de 5.13
0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch N/A N/A
wrong-patch-name Whatevrr rqrwf vwvwvrvrv
==================================================
"""
TEST_SLK_COMMIT = """\
Integrate SDK 4.5.1000 Kernel Patches
## Patch List
* 0001-psample-Encapsulate-packet-metadata-in-a-struct.patch : https://github.com/torvalds/linux/commit/a03e99d39f1943ec88f6fd3b0b9f34c20663d401
* 0002-psample-Add-additional-metadata-attributes.patch : https://github.com/torvalds/linux/commit/07e1a5809b595df6e125504dff6245cb2c8ed3de
* 0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch :
"""
LINES_READ = ""
def mock_sdk_args():
with mock.patch("sys.argv", ["sdk_kernel_patches.py",
"--sonic_kernel_ver", MOCK_SLK_VER,
"--patches", "/tmp",
"--sdk_ver", "4.5.1000",
"--slk_msg", "/tmp/slk-commit-msg.hgsdhg",
"--build_root", "/sonic"]):
parser = create_parser()
return parser.parse_args()
def check_lists(exp, rec):
print(" ------- Expected ----------- ")
print("".join(exp))
print("Size: {}".format(len(exp)))
print(" ------- Recieved ----------- ")
print("".join(rec))
print("Size: {}".format(len(rec)))
if len(exp) != len(rec):
return False
for i in range(0, len(exp)):
if exp[i] != rec[i]:
return False
return True
def read_strip_mock(path, as_string=False):
global LINES_READ
return LINES_READ
class TestSDKAction(TestCase):
def setUp(self):
self.action = SDKAction(mock_sdk_args())
self.action.check()
self.path_kernel = os.path.join(KERNEL_BACKPORTS, "5.10")
self.patcher = Patcher()
self.patcher.setUp()
def tearDown(self):
Data.new_series = list()
Data.new_patches = list()
Data.old_series = list()
Data.old_patches = list()
Data.k_dir = ""
Data.i_sdk_start = -1
Data.i_sdk_end = -1
self.patcher.tearDown()
global LINES_READ
LINES_READ = ""
def create_files(self, root_dir, lis):
for file in lis:
self.patcher.fs.create_file(os.path.join(root_dir, file))
def test_get_kernel_dir_1(self):
dir_ = os.path.join(self.path_kernel, MOCK_SLK_VER)
self.patcher.fs.create_dir(os.path.join("/tmp", dir_))
self.action.get_kernel_dir()
assert dir_ == Data.k_dir
def test_get_kernel_dir_2(self):
dir_ = os.path.join(self.path_kernel, "5.10.99")
self.patcher.fs.create_dir(os.path.join("/tmp", dir_))
self.action.get_kernel_dir()
assert dir_ == Data.k_dir
dir_2 = os.path.join(self.path_kernel, "5.10.105")
self.patcher.fs.create_dir(os.path.join("/tmp", dir_2))
self.action.get_kernel_dir()
assert dir_ == Data.k_dir
def test_find_sdk_patches(self):
Data.old_series = MOCK_SLK_SERIES.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
assert "mellanox_sdk-start" in Data.old_series[Data.i_sdk_start]
assert "mellanox_sdk-end" in Data.old_series[Data.i_sdk_end]
assert not Data.old_patches
Data.old_series = MOCK_SLK_SERIES_1.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
assert "mellanox_sdk-start" in Data.old_series[Data.i_sdk_start]
assert "mellanox_sdk-end" in Data.old_series[Data.i_sdk_end]
assert len(Data.old_patches) == 1
assert Data.old_patches[-1] == "0001-psample-Encapsulate-packet-metadata-in-a-struct.patch"
def test_get_new_patches(self):
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
self.action.get_kernel_dir()
print(Data.k_dir)
self.action.get_new_patches()
assert len(Data.new_patches) == 2
assert Data.new_patches[0] == "0001-psample-Encapsulate-packet-metadata-in-a-struct.patch"
assert Data.new_patches[1] == "0002-psample-Add-additional-metadata-attributes.patch"
def test_update_series(self):
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
Data.old_series = MOCK_SLK_SERIES.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
self.action.get_kernel_dir()
self.action.get_new_patches()
self.action.update_series()
assert check_lists(EXP_SLK_SERIES_STG1.splitlines(True), Data.old_series)
self.action.refresh_markers()
assert "mellanox_sdk-start" in Data.old_series[Data.i_sdk_start]
assert "mellanox_sdk-end" in Data.old_series[Data.i_sdk_end]
def test_update_series_1(self):
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
Data.old_series = MOCK_SLK_SERIES_1.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
self.action.get_kernel_dir()
self.action.get_new_patches()
self.action.update_series()
assert check_lists(EXP_SLK_SERIES_STG1.splitlines(True), Data.old_series)
self.action.refresh_markers()
assert "mellanox_sdk-start" in Data.old_series[Data.i_sdk_start]
assert "mellanox_sdk-end" in Data.old_series[Data.i_sdk_end]
def test_process_patches_1(self):
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
self.create_files(root_dir, EXT_PTCH_LIST)
Data.old_series = MOCK_SLK_SERIES.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
self.action.get_kernel_dir()
self.action.get_new_patches()
self.action.update_series()
self.action.refresh_markers()
self.action.add_new_patch_series()
assert check_lists(MOCK_FINAL_SLK_SERIES.splitlines(True), Data.new_series)
def test_process_patches_2(self):
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
self.create_files(root_dir, EXT_PTCH_LIST)
Data.old_series = MOCK_SLK_SERIES_1.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
self.action.get_kernel_dir()
self.action.get_new_patches()
self.action.update_series()
self.action.refresh_markers()
self.action.add_new_patch_series()
assert check_lists(MOCK_FINAL_SLK_SERIES.splitlines(True), Data.new_series)
@mock.patch('helper.FileHandler.read_strip', side_effect=read_strip_mock)
def test_patch_table(self, mock_read_strip_mock):
global LINES_READ
LINES_READ = MOCK_README.splitlines()
table = self.action.fetch_patch_table("")
assert "0001-psample-Encapsulate-packet-metadata-in-a-struct.patch" in table
assert "0002-psample-Add-additional-metadata-attributes.patch" in table
assert "0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch" in table
assert table["0001-psample-Encapsulate-packet-metadata-in-a-struct.patch"] == "a03e99d39f1943ec88f6fd3b0b9f34c20663d401"
assert table["0002-psample-Add-additional-metadata-attributes.patch"] == "07e1a5809b595df6e125504dff6245cb2c8ed3de"
assert table["0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch"] == "N/A"
@mock.patch('helper.FileHandler.read_strip', side_effect=read_strip_mock)
def test_commit_msg(self, mock_read_strip_mock):
global LINES_READ
LINES_READ = MOCK_README.splitlines()
root_dir = "/tmp/kernel_backports/5.10/5.10.27"
self.create_files(root_dir, PTCH_LIST)
self.create_files(root_dir, ["0003-psample-define-the-macro-PSAMPLE_MD_EXTENDED_ATTR.patch"])
Data.old_series = MOCK_SLK_SERIES.splitlines(True)
self.action.refresh_markers()
self.action.find_sdk_patches()
self.action.get_kernel_dir()
self.action.get_new_patches()
table = self.action.fetch_patch_table("")
msg = self.action.create_commit_msg(table)
print(msg)
assert check_lists(TEST_SLK_COMMIT.splitlines(True), msg.splitlines(True))