@@ -73,36 +73,71 @@ echo ""
7373# --- Section 2: SCC Permissions ---
7474echo " SCC Permissions:"
7575
76- SCC_SA=$( yq ' .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == "falcon-operator-node-sensor") | .serviceAccountName' " $CSV_FILE " )
77- check_eq " SCC serviceAccount present" " $SCC_SA " " falcon-operator-node-sensor"
76+ SCC_PATCH_FILE=" ${PROJECT_ROOT} /hack/patch-openshift-scc.yaml"
77+ if [ ! -f " $SCC_PATCH_FILE " ]; then
78+ fail " patch-openshift-scc.yaml not found"
79+ else
80+ # Read expected values from patch file
81+ EXPECTED_SCC_SA=$( yq ' .[0].serviceAccountName' " $SCC_PATCH_FILE " )
82+ EXPECTED_SCC_APIGROUP=$( yq ' .[0].rules[0].apiGroups[0]' " $SCC_PATCH_FILE " )
83+ EXPECTED_SCC_RESOURCE=$( yq ' .[0].rules[0].resources[0]' " $SCC_PATCH_FILE " )
84+ EXPECTED_SCC_VERB=$( yq ' .[0].rules[0].verbs[0]' " $SCC_PATCH_FILE " )
85+ EXPECTED_SCC_RESNAME=$( yq ' .[0].rules[0].resourceNames[0]' " $SCC_PATCH_FILE " )
86+
87+ # Validate against CSV
88+ SCC_SA=$( yq " .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == \" ${EXPECTED_SCC_SA} \" ) | .serviceAccountName" " $CSV_FILE " )
89+ check_eq " SCC serviceAccount present" " $SCC_SA " " $EXPECTED_SCC_SA "
7890
79- SCC_APIGROUP=$( yq ' .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == "falcon-operator-node-sensor ") | .rules[].apiGroups[]' " $CSV_FILE " )
80- check_eq " SCC apiGroup" " $SCC_APIGROUP " " security.openshift.io "
91+ SCC_APIGROUP=$( yq " .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == \" ${EXPECTED_SCC_SA} \ " ) | .rules[].apiGroups[]" " $CSV_FILE " )
92+ check_eq " SCC apiGroup" " $SCC_APIGROUP " " $EXPECTED_SCC_APIGROUP "
8193
82- SCC_RESOURCE=$( yq ' .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == "falcon-operator-node-sensor ") | .rules[].resources[]' " $CSV_FILE " )
83- check_eq " SCC resource" " $SCC_RESOURCE " " securitycontextconstraints "
94+ SCC_RESOURCE=$( yq " .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == \" ${EXPECTED_SCC_SA} \ " ) | .rules[].resources[]" " $CSV_FILE " )
95+ check_eq " SCC resource" " $SCC_RESOURCE " " $EXPECTED_SCC_RESOURCE "
8496
85- SCC_VERB=$( yq ' .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == "falcon-operator-node-sensor ") | .rules[].verbs[]' " $CSV_FILE " )
86- check_eq " SCC verb" " $SCC_VERB " " use "
97+ SCC_VERB=$( yq " .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == \" ${EXPECTED_SCC_SA} \ " ) | .rules[].verbs[]" " $CSV_FILE " )
98+ check_eq " SCC verb" " $SCC_VERB " " $EXPECTED_SCC_VERB "
8799
88- SCC_RESNAME=$( yq ' .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == "falcon-operator-node-sensor") | .rules[].resourceNames[]' " $CSV_FILE " )
89- check_eq " SCC resourceName" " $SCC_RESNAME " " privileged"
100+ SCC_RESNAME=$( yq " .spec.install.spec.clusterPermissions[] | select(.serviceAccountName == \" ${EXPECTED_SCC_SA} \" ) | .rules[].resourceNames[]" " $CSV_FILE " )
101+ check_eq " SCC resourceName" " $SCC_RESNAME " " $EXPECTED_SCC_RESNAME "
102+ fi
90103
91104echo " "
92105
93106# --- Section 3: Version and Replaces ---
94107echo " Version and Replaces:"
95108
109+ # Validate spec.version format
96110VERSION=$( yq ' .spec.version' " $CSV_FILE " )
97111if echo " $VERSION " | grep -qE ' ^[0-9]+\.[0-9]+\.[0-9]+' ; then
98112 pass " spec.version is semver ($VERSION )"
99113else
100114 fail " spec.version is not valid semver (got: $VERSION )"
101115fi
102116
117+ # Validate spec.version matches Makefile VERSION
118+ MAKEFILE_VERSION=$( grep -E ' ^VERSION\s*\?=' " ${PROJECT_ROOT} /Makefile" | awk ' {print $3}' )
119+ check_eq " spec.version matches Makefile VERSION" " $VERSION " " $MAKEFILE_VERSION "
120+
121+ # Validate spec.replaces exists and format
103122REPLACES=$( yq ' .spec.replaces' " $CSV_FILE " )
104- if echo " $REPLACES " | grep -qE ' ^falcon-operator\.v[0-9]+\.[0-9]+\.[0-9]+' ; then
123+ if [ -z " $REPLACES " ] || [ " $REPLACES " = " null" ]; then
124+ fail " spec.replaces is missing (bundle needs to be patched)"
125+ elif echo " $REPLACES " | grep -qE ' ^falcon-operator\.v[0-9]+\.[0-9]+\.[0-9]+' ; then
105126 pass " spec.replaces follows naming convention ($REPLACES )"
127+
128+ # Extract version from replaces
129+ REPLACES_VERSION=$( echo " $REPLACES " | sed ' s/^falcon-operator\.v//' )
130+
131+ # Validate replaces version differs from current version
132+ if [ " $VERSION " = " $REPLACES_VERSION " ]; then
133+ fail " spec.replaces version ($REPLACES_VERSION ) must not match spec.version ($VERSION )"
134+ else
135+ pass " spec.replaces version differs from spec.version"
136+ fi
137+
138+ # Validate replaces version matches Makefile PREVIOUS_VERSION
139+ MAKEFILE_PREVIOUS_VERSION=$( grep -E ' ^PREVIOUS_VERSION\s*\?=' " ${PROJECT_ROOT} /Makefile" | awk ' {print $3}' )
140+ check_eq " spec.replaces matches Makefile PREVIOUS_VERSION" " $REPLACES_VERSION " " $MAKEFILE_PREVIOUS_VERSION "
106141else
107142 fail " spec.replaces should match falcon-operator.vX.Y.Z (got: $REPLACES )"
108143fi
@@ -151,12 +186,30 @@ RELATED_COUNT=$(yq '.spec.relatedImages | length' "$CSV_FILE")
151186check_eq " relatedImages count" " $RELATED_COUNT " " 5"
152187
153188EXPECTED_NAMES=(" operator" " node-sensor" " sidecar-sensor" " admission-controller" " image-analyzer" )
154- for name in " ${EXPECTED_NAMES[@]} " ; do
189+ EXPECTED_REGISTRIES=(
190+ " registry.connect.redhat.com/crowdstrike/falcon-operator"
191+ " registry.crowdstrike.com/falcon-sensor/release/falcon-sensor"
192+ " registry.crowdstrike.com/falcon-container/release/falcon-container"
193+ " registry.crowdstrike.com/falcon-kac/release/falcon-kac"
194+ " registry.crowdstrike.com/falcon-imageanalyzer/release/falcon-imageanalyzer"
195+ )
196+
197+ for i in " ${! EXPECTED_NAMES[@]} " ; do
198+ name=" ${EXPECTED_NAMES[$i]} "
199+ expected_registry=" ${EXPECTED_REGISTRIES[$i]} "
200+
155201 IMG=$( yq " .spec.relatedImages[] | select(.name == \" ${name} \" ) | .image" " $CSV_FILE " )
156202 if [ -z " $IMG " ] || [ " $IMG " = " null" ]; then
157203 fail " relatedImages entry '$name ' not found"
158204 elif echo " $IMG " | grep -q " @sha256:" ; then
159205 pass " relatedImages '$name ' uses digest"
206+
207+ # Validate the registry/repo path
208+ if echo " $IMG " | grep -q " ^${expected_registry} @sha256:" ; then
209+ pass " relatedImages '$name ' uses correct registry"
210+ else
211+ fail " relatedImages '$name ' should use ${expected_registry} (got: $IMG )"
212+ fi
160213 else
161214 fail " relatedImages '$name ' should use digest (got: $IMG )"
162215 fi
@@ -167,24 +220,38 @@ echo ""
167220# --- Section 7: Skips ---
168221echo " Skips:"
169222
170- SKIPS_COUNT= $( yq ' .spec. skips | length ' " $CSV_FILE " )
171- if [ " $SKIPS_COUNT " -gt 0 ]; then
172- pass " spec. skips present ( $SKIPS_COUNT entries) "
223+ SKIPS_PATCH_FILE= " ${PROJECT_ROOT} /hack/patch-openshift- skips.yaml "
224+ if [ ! -f " $SKIPS_PATCH_FILE " ]; then
225+ fail " patch-openshift- skips.yaml not found "
173226else
174- fail " spec.skips should have entries"
227+ # Read expected skips from patch file
228+ mapfile -t EXPECTED_SKIPS < <( yq ' .[]' " $SKIPS_PATCH_FILE " )
229+ EXPECTED_COUNT=" ${# EXPECTED_SKIPS[@]} "
230+
231+ # Validate count
232+ SKIPS_COUNT=$( yq ' .spec.skips | length' " $CSV_FILE " )
233+ check_eq " skips count matches patch file" " $SKIPS_COUNT " " $EXPECTED_COUNT "
234+
235+ # Validate each skip entry
236+ for skip in " ${EXPECTED_SKIPS[@]} " ; do
237+ FOUND=$( yq " .spec.skips[] | select(. == \" ${skip} \" )" " $CSV_FILE " )
238+ if [ " $FOUND " = " $skip " ]; then
239+ pass " skips contains '$skip '"
240+ else
241+ fail " skips missing '$skip '"
242+ fi
243+ done
244+
245+ # Validate format of all entries
246+ while IFS= read -r skip_entry; do
247+ if echo " $skip_entry " | grep -qE ' ^falcon-operator\.v[0-9]+\.[0-9]+\.[0-9]+$' ; then
248+ pass " skip entry '$skip_entry ' follows naming convention"
249+ else
250+ fail " skip entry '$skip_entry ' should match falcon-operator.vX.Y.Z"
251+ fi
252+ done < <( yq ' .spec.skips[]' " $CSV_FILE " )
175253fi
176254
177- # Verify expected skips entries
178- EXPECTED_SKIPS=(" falcon-operator.v1.3.0" " falcon-operator.v1.12.0" )
179- for skip in " ${EXPECTED_SKIPS[@]} " ; do
180- FOUND=$( yq " .spec.skips[] | select(. == \" ${skip} \" )" " $CSV_FILE " )
181- if [ " $FOUND " = " $skip " ]; then
182- pass " skips contains '$skip '"
183- else
184- fail " skips missing '$skip '"
185- fi
186- done
187-
188255echo " "
189256
190257# --- Section 8: Bundle Metadata Annotations ---
0 commit comments