From 5dd16ff32cf9f4ea3aea24f206d985515b32a98d Mon Sep 17 00:00:00 2001 From: "a.kuznetsov" Date: Fri, 19 Jun 2026 15:17:59 +0300 Subject: [PATCH] ci: lcm: making lcm-pcm test indifferent to index changes During the course of the test, containers are created and tested to properly survive a simulated software upgrade. However, pcm does not guarantee that indexes will be the same after SWU, especially if there were any gaps in numbering prior to the upgrade. This change to the test makes it index-agnostic by replacing all possibly affected indexes with placeholders. References: PPW-1787 Closes: PPW-1787 Signed-off-by: a.kuznetsov --- .gitlab/tests/cram/generic/lcm/038-lcm-pcm.t | 34 +++++---- .../cram/generic/lcm/lcm-pcm_runtime_params | 73 ++++++++++--------- .../cram/generic/lcm/script_functions.sh | 71 ++++++++++++++++++ 3 files changed, 127 insertions(+), 51 deletions(-) diff --git a/.gitlab/tests/cram/generic/lcm/038-lcm-pcm.t b/.gitlab/tests/cram/generic/lcm/038-lcm-pcm.t index 37add20462..94d09eacd1 100644 --- a/.gitlab/tests/cram/generic/lcm/038-lcm-pcm.t +++ b/.gitlab/tests/cram/generic/lcm/038-lcm-pcm.t @@ -6,10 +6,12 @@ If test is running on a Valyrian, skip the test due to PCF-2669: $ alias R="${CRAM_REMOTE_COMMAND:-}" $ alias C="${CRAM_REMOTE_COPY:-}" + $ T="/tmp/lcm-pcm" $ S=". /tmp/script_functions.sh" + $ . ${TESTDIR}/script_functions.sh $ C ${TESTDIR}/script_functions.sh root@${TARGET_LAN_IP}:/tmp/script_functions.sh 2>/dev/null $ R "${S} && setup_hostobjects" - $ mkdir /tmp/lcm-pcm + $ mkdir ${T} Restart the LCM Agent so we start fresh with resetted indexes for ease of comparing the data models: $ R "service rlyeh stop" @@ -51,9 +53,9 @@ Perform the backup process: Save the data model before simulated firmware upgrade: - $ R "ba-cli 'Cthulhu.?'" > /tmp/lcm-pcm/cthulhu_before.dm - $ R "ba-cli 'SoftwareModules.?'" > /tmp/lcm-pcm/timingila_before.dm - $ R "ba-cli 'Rlyeh.?'" > /tmp/lcm-pcm/rlyeh_before.dm + $ R "ba-cli 'Cthulhu.?'" > ${T}/cthulhu_before.dm + $ R "ba-cli 'SoftwareModules.?'" > ${T}/timingila_before.dm + $ R "ba-cli 'Rlyeh.?'" > ${T}/rlyeh_before.dm Simulate firmware upgrade with manual configuration removal: @@ -61,20 +63,22 @@ Simulate firmware upgrade with manual configuration removal: Save the data model after simulated firmware upgrade: - $ R "ba-cli 'Cthulhu.?'" > /tmp/lcm-pcm/cthulhu_after.dm - $ R "ba-cli 'SoftwareModules.?'" > /tmp/lcm-pcm/timingila_after.dm - $ R "ba-cli 'Rlyeh.?'" > /tmp/lcm-pcm/rlyeh_after.dm + $ R "ba-cli 'Cthulhu.?'" > ${T}/cthulhu_after.dm + $ R "ba-cli 'SoftwareModules.?'" > ${T}/timingila_after.dm + $ R "ba-cli 'Rlyeh.?'" > ${T}/rlyeh_after.dm Compare the data models before and after the firmware upgrade: - $ diff /tmp/lcm-pcm/rlyeh_before.dm /tmp/lcm-pcm/rlyeh_after.dm - $ sed -i -e "s/\(Sandbox\.Instances\)\.2/\1\.1/g" /tmp/lcm-pcm/cthulhu_after.dm - $ sed -i -e "s/\(Sandbox\.Instances\)\.3/\1\.2/g" /tmp/lcm-pcm/cthulhu_after.dm - $ cp ${TESTDIR}/lcm-pcm_runtime_params /tmp/lcm-pcm/runtime_params - $ cthulhu_diff_params=$(diff -n /tmp/lcm-pcm/cthulhu_before.dm /tmp/lcm-pcm/cthulhu_after.dm | grep -o '^Cthulhu[^=]\+') - $ for param in ${cthulhu_diff_params}; do grep -Fxq "${param}" /tmp/lcm-pcm/runtime_params || echo "ERROR: runtime parameter mismatch - ${param}"; done - $ timingila_diff_params=$(diff -n /tmp/lcm-pcm/timingila_before.dm /tmp/lcm-pcm/timingila_after.dm | grep -o '^SoftwareModules[^=]\+') - $ for param in ${timingila_diff_params}; do grep -Fxq "${param}" /tmp/lcm-pcm/runtime_params || echo "ERROR: runtime parameter mismatch - ${param}"; done + $ diff ${T}/rlyeh_before.dm ${T}/rlyeh_after.dm + $ normalize_dump ${T}/cthulhu_before.dm + $ normalize_dump ${T}/cthulhu_after.dm + $ cp ${TESTDIR}/lcm-pcm_runtime_params ${T}/runtime_params + $ cthulhu_diff_params=$(diff -n ${T}/cthulhu_before.dm ${T}/cthulhu_after.dm | grep -o '^Cthulhu[^=]\+') + $ for param in ${cthulhu_diff_params}; do grep -Fxq "${param}" ${T}/runtime_params || echo "ERROR: runtime parameter mismatch - ${param}"; done + $ normalize_dump ${T}/timingila_before.dm + $ normalize_dump ${T}/timingila_after.dm + $ timingila_diff_params=$(diff -n ${T}/timingila_before.dm ${T}/timingila_after.dm | grep -o '^SoftwareModules[^=]\+') + $ for param in ${timingila_diff_params}; do grep -Fxq "${param}" ${T}/runtime_params || echo "ERROR: runtime parameter mismatch - ${param}"; done Check that ApplicationData volumes are available inside the container and use them: diff --git a/.gitlab/tests/cram/generic/lcm/lcm-pcm_runtime_params b/.gitlab/tests/cram/generic/lcm/lcm-pcm_runtime_params index 348a3831ff..7c1a7cc1fc 100644 --- a/.gitlab/tests/cram/generic/lcm/lcm-pcm_runtime_params +++ b/.gitlab/tests/cram/generic/lcm/lcm-pcm_runtime_params @@ -1,36 +1,37 @@ -Cthulhu.Container.Instances.1.RootfsIsMounted -Cthulhu.Container.Instances.1.Pid -Cthulhu.Container.Instances.1.StartTime -Cthulhu.Container.Instances.1.AutoRestart.RunningSince -Cthulhu.Container.Instances.1.Interfaces.6.Addresses.1.Address -Cthulhu.Container.Instances.1.PluginsPrivate.NetworkConfig.FirewallRules.1.Path -Cthulhu.Container.Instances.1.PluginsPrivate.NetworkConfig.FirewallRules.2.Path -Cthulhu.Container.Instances.1.Resources.Stats.DiskSpace.Free -Cthulhu.Container.Instances.1.Resources.Stats.DiskSpace.Used -Cthulhu.Container.Instances.1.Resources.Stats.Memory.Used -Cthulhu.Sandbox.Instances.1.Pid -Cthulhu.Sandbox.Instances.1.Stats.DiskSpace.Free -Cthulhu.Sandbox.Instances.1.Stats.DiskSpace.Used -Cthulhu.Sandbox.Instances.1.Stats.Memory.Used -Cthulhu.Sandbox.Instances.2.Created -Cthulhu.Sandbox.Instances.2.Pid -Cthulhu.Sandbox.Instances.2.Stats.DiskSpace.Free -Cthulhu.Sandbox.Instances.2.Stats.DiskSpace.Used -Cthulhu.Sandbox.Instances.2.Stats.Memory.Used -SoftwareModules.ExecEnv.1.AvailableDiskSpace -SoftwareModules.ExecutionUnit.1.AvailableDiskSpace -SoftwareModules.ExecutionUnit.1.DiskSpaceInUse -SoftwareModules.ExecutionUnit.1.MemoryInUse -SoftwareModules.ExecutionUnit.1.Uptime -Cthulhu.Information.LocalPolicyManager.Action.1. -Cthulhu.Information.LocalPolicyManager.Action.1.Action -Cthulhu.Information.LocalPolicyManager.Action.1.Alias -Cthulhu.Information.LocalPolicyManager.Action.1.CurrentModuleVersion -Cthulhu.Information.LocalPolicyManager.Action.1.Date -Cthulhu.Information.LocalPolicyManager.Action.1.Event -Cthulhu.Information.LocalPolicyManager.Action.1.ExecEnvName -Cthulhu.Information.LocalPolicyManager.Action.1.FaultMessage -Cthulhu.Information.LocalPolicyManager.Action.1.PolicyScope -Cthulhu.Information.LocalPolicyManager.Action.1.PreviousModuleVersion -Cthulhu.Information.LocalPolicyManager.Action.1.Status -Cthulhu.Information.LocalPolicyManager.Action.1.UUID +Cthulhu.Container.Instances.{i}.RootfsIsMounted +Cthulhu.Container.Instances.{i}.Pid +Cthulhu.Container.Instances.{i}.StartTime +Cthulhu.Container.Instances.{i}.AutoRestart.RunningSince +Cthulhu.Container.Instances.{i}.Interfaces.2.Addresses.1.Address +Cthulhu.Container.Instances.{i}.Interfaces.6.Addresses.1.Address +Cthulhu.Container.Instances.{i}.PluginsPrivate.NetworkConfig.FirewallRules.1.Path +Cthulhu.Container.Instances.{i}.PluginsPrivate.NetworkConfig.FirewallRules.2.Path +Cthulhu.Container.Instances.{i}.Resources.Stats.DiskSpace.Free +Cthulhu.Container.Instances.{i}.Resources.Stats.DiskSpace.Used +Cthulhu.Container.Instances.{i}.Resources.Stats.Memory.Used +Cthulhu.Sandbox.Instances.{i}.Pid +Cthulhu.Sandbox.Instances.{i}.Stats.DiskSpace.Free +Cthulhu.Sandbox.Instances.{i}.Stats.DiskSpace.Used +Cthulhu.Sandbox.Instances.{i}.Stats.Memory.Used +Cthulhu.Sandbox.Instances.{i}.Created +Cthulhu.Sandbox.Instances.{i}.Pid +Cthulhu.Sandbox.Instances.{i}.Stats.DiskSpace.Free +Cthulhu.Sandbox.Instances.{i}.Stats.DiskSpace.Used +Cthulhu.Sandbox.Instances.{i}.Stats.Memory.Used +SoftwareModules.ExecEnv.{i}.AvailableDiskSpace +SoftwareModules.ExecutionUnit.{i}.AvailableDiskSpace +SoftwareModules.ExecutionUnit.{i}.DiskSpaceInUse +SoftwareModules.ExecutionUnit.{i}.MemoryInUse +SoftwareModules.ExecutionUnit.{i}.Uptime +Cthulhu.Information.LocalPolicyManager.Action.{i}. +Cthulhu.Information.LocalPolicyManager.Action.{i}.Action +Cthulhu.Information.LocalPolicyManager.Action.{i}.Alias +Cthulhu.Information.LocalPolicyManager.Action.{i}.CurrentModuleVersion +Cthulhu.Information.LocalPolicyManager.Action.{i}.Date +Cthulhu.Information.LocalPolicyManager.Action.{i}.Event +Cthulhu.Information.LocalPolicyManager.Action.{i}.ExecEnvName +Cthulhu.Information.LocalPolicyManager.Action.{i}.FaultMessage +Cthulhu.Information.LocalPolicyManager.Action.{i}.PolicyScope +Cthulhu.Information.LocalPolicyManager.Action.{i}.PreviousModuleVersion +Cthulhu.Information.LocalPolicyManager.Action.{i}.Status +Cthulhu.Information.LocalPolicyManager.Action.{i}.UUID diff --git a/.gitlab/tests/cram/generic/lcm/script_functions.sh b/.gitlab/tests/cram/generic/lcm/script_functions.sh index 52be68e921..39eed670f0 100755 --- a/.gitlab/tests/cram/generic/lcm/script_functions.sh +++ b/.gitlab/tests/cram/generic/lcm/script_functions.sh @@ -1198,3 +1198,74 @@ cleanup_pcm_test() { echo "Done" } +cleanup_appdata() { + umount /lcm/cthulhu/data/mounts/generic > /dev/null 2>&1 + umount /lcm/cthulhu/data/mounts/generic/applicationdata/mounts/00000000-0000-5000-b000-000000000001/Volume1 > /dev/null 2>&1 + umount /lcm/cthulhu/data/mounts/generic/applicationdata/mounts/00000000-0000-5000-b000-000000000001/Volume2 > /dev/null 2>&1 + rm -rf /lcm/cthulhu/data/mounts/generic/applicationdata + service cthulhu stop > /dev/null 2>&1 + while [ -n "$(pidof cthulhu)" ]; do sleep 1; done; sleep 10 + rm -rf /etc/config/cthulhu/* > /dev/null 2>&1 + service cthulhu start > /dev/null + sleep 2 + service timingila restart > /dev/null +} + + +## +## install_basic_container() - Install a container with default parameters and wait for it to become active. +## +## Fixed defaults applied by this function: +## --version prplos-v1 : Container image version to install. +## --ee : Execution environment (defaults to DEFAULT_EE = "generic" if not overridden). +## --uuid : Deployment unit UUID (defaults to DEFAULT_UUID if not overridden). +## --privileged true : Container is started in privileged mode. +## +## Parameters: +## "$@" : Optional extra arguments forwarded verbatim to install_ctr. +## Any supported install_ctr argument (--url, --network, --hostobject, +## --appdata, --envvar, --retaindata, --usprequired, etc.) can be supplied +## here to override the defaults above. +## +## Example: +## install_basic_container +## install_basic_container --envvar --network '{ShareParentNetwork = "true"}' +## +install_basic_container() { + install_ctr --version prplos-v1 --ee --uuid --privileged true "$@" > /dev/null +} + +## +## install_basic_container_no_wait() - Install a container with default parameters without waiting for it to become active. +## +## Fixed defaults applied by this function: +## --version prplos-v1 : Container image version to install. +## --ee : Execution environment (defaults to DEFAULT_EE = "generic" if not overridden). +## --uuid : Deployment unit UUID (defaults to DEFAULT_UUID if not overridden). +## --privileged true : Container is started in privileged mode. +## +## Parameters: +## "$@" : Optional extra arguments forwarded verbatim to install_ctr_no_wait. +## Any supported install_ctr argument (--url, --network, --hostobject, +## --appdata, --envvar, --retaindata, --usprequired, etc.) can be supplied +## here to override the defaults above. +## +## Example: +## install_basic_container_no_wait +## install_basic_container_no_wait --envvar +## +install_basic_container_no_wait() { + install_ctr_no_wait --version prplos-v1 --ee --uuid --privileged true "$@" +} + +normalize_dump(){ + ## Generic substitution of any instantionated subtree + sed -i -e "s/\(\.Instances\)\.[[:digit:]]/\1\.{i}/g" $1 + + ## Softwware modules specific cases + sed -i -e "s/\(SoftwareModules\.ExecEnv\)\.[[:digit:]]/\1\.{i}/g" $1 + sed -i -e "s/\(SoftwareModules\.ExecutionUnit\)\.[[:digit:]]/\1\.{i}/g" $1 + + ## Cthulhu LocalPolicy spacific case + sed -i -e "s/\(\.LocalPolicyManager\.Action\)\.[[:digit:]]/\1\.{i}/g" $1 +}