diff --git a/api/v1alpha1/clustergroupupgrade_types.go b/api/v1alpha1/clustergroupupgrade_types.go index 41787b36f..b7e496d53 100644 --- a/api/v1alpha1/clustergroupupgrade_types.go +++ b/api/v1alpha1/clustergroupupgrade_types.go @@ -210,6 +210,7 @@ type PrecachingSpec struct { PlatformImage string `json:"platformImage,omitempty"` OperatorsIndexes []string `json:"operatorsIndexes,omitempty"` OperatorsPackagesAndChannels []string `json:"operatorsPackagesAndChannels,omitempty"` + ExcludePrecachePatterns []string `json:"excludePrecachePatterns,omitempty"` } // PrecachingStatus defines the observed pre-caching status diff --git a/api/v1alpha1/zz_generated.deepcopy.go b/api/v1alpha1/zz_generated.deepcopy.go index cb20f2030..ae56d17e8 100644 --- a/api/v1alpha1/zz_generated.deepcopy.go +++ b/api/v1alpha1/zz_generated.deepcopy.go @@ -456,6 +456,11 @@ func (in *PrecachingSpec) DeepCopyInto(out *PrecachingSpec) { *out = make([]string, len(*in)) copy(*out, *in) } + if in.ExcludePrecachePatterns != nil { + in, out := &in.ExcludePrecachePatterns, &out.ExcludePrecachePatterns + *out = make([]string, len(*in)) + copy(*out, *in) + } } // DeepCopy is an autogenerated deepcopy function, copying the receiver, creating a new PrecachingSpec. diff --git a/bundle/manifests/ran.openshift.io_clustergroupupgrades.yaml b/bundle/manifests/ran.openshift.io_clustergroupupgrades.yaml index 0b3ef9d11..f077c0211 100644 --- a/bundle/manifests/ran.openshift.io_clustergroupupgrades.yaml +++ b/bundle/manifests/ran.openshift.io_clustergroupupgrades.yaml @@ -393,6 +393,10 @@ spec: description: PrecachingSpec defines the pre-caching software spec derived from policies properties: + excludePrecachePatterns: + items: + type: string + type: array operatorsIndexes: items: type: string diff --git a/config/crd/bases/ran.openshift.io_clustergroupupgrades.yaml b/config/crd/bases/ran.openshift.io_clustergroupupgrades.yaml index 49ee48d79..30f36fde6 100644 --- a/config/crd/bases/ran.openshift.io_clustergroupupgrades.yaml +++ b/config/crd/bases/ran.openshift.io_clustergroupupgrades.yaml @@ -395,6 +395,10 @@ spec: description: PrecachingSpec defines the pre-caching software spec derived from policies properties: + excludePrecachePatterns: + items: + type: string + type: array operatorsIndexes: items: type: string diff --git a/config/pre-cache/README.md b/config/pre-cache/README.md index c5fbdbefb..7eb1e1548 100644 --- a/config/pre-cache/README.md +++ b/config/pre-cache/README.md @@ -6,6 +6,7 @@ Supported overrides: 2. `platform.image` - OCP release image 3. `operators.indexes` - OLM index images (list of image pull specs) 4. `operators.packagesAndChannels` - operator packages and channels (list of string entries) +5. `excludePrecachePatterns` - list of patterns to exclude from precaching (using this command: grep -vG -f) :warning: We need to set the precache.image value as a container image digest. This value is going to be used by the pre-cache task to pull all the required container images and for the upgrade operator to replace the Clusterversion spec.desiredUpdate.image field. The cluster-version operator of the managed cluster requires this format to continue automatically with the upgrade since container image digest uniquely and immutably identifies a container image @@ -40,5 +41,8 @@ data: performance-addon-operator: 4.9 ptp-operator: stable sriov-network-operator: stable + excludePrecachePatterns: | + aws + thanos ``` diff --git a/config/pre-cache/overrides.yaml b/config/pre-cache/overrides.yaml index 9071a157c..82b5af1f7 100644 --- a/config/pre-cache/overrides.yaml +++ b/config/pre-cache/overrides.yaml @@ -13,4 +13,8 @@ data: # performance-addon-operator: 4.9 # ptp-operator: stable # sriov-network-operator: stable - + # excludePrecachePatterns: | + # aws + # alibaba + # azure + # vsphere diff --git a/controllers/managedClusterResources.go b/controllers/managedClusterResources.go index 242e53c4b..e1f2502b9 100644 --- a/controllers/managedClusterResources.go +++ b/controllers/managedClusterResources.go @@ -38,14 +38,15 @@ import ( // templateData provides template rendering data type templateData struct { - Cluster string - ResourceName string - PlatformImage string - Operators operatorsData - WorkloadImage string - SpaceRequired string - JobTimeout uint64 - ViewUpdateIntervalSec int + Cluster string + ResourceName string + PlatformImage string + Operators operatorsData + WorkloadImage string + SpaceRequired string + JobTimeout uint64 + ViewUpdateIntervalSec int + ExcludePrecachePatterns []string } // operatorsData provides operators data for template rendering diff --git a/controllers/managedClusterResources_test.go b/controllers/managedClusterResources_test.go index be37c426c..724963a17 100644 --- a/controllers/managedClusterResources_test.go +++ b/controllers/managedClusterResources_test.go @@ -2,6 +2,8 @@ package controllers import ( "context" + "log" + "os" "reflect" "strings" "testing" @@ -25,6 +27,40 @@ func TestMCR_renderYamlTemplates(t *testing.T) { resourceName string result string }{ + { + name: "create configmap", + resourceName: "precache-spec", + data: templateData{ + Cluster: "test", + ResourceName: "precache-spec", + ExcludePrecachePatterns: []string{"aws", "thanos"}, + }, + template: templates.MngClusterActCreatePrecachingSpecCM, + result: ` +apiVersion: action.open-cluster-management.io/v1beta1 +kind: ManagedClusterAction +metadata: + name: precache-spec + namespace: test +spec: + actionType: Create + kube: + resource: configmap + template: + apiVersion: v1 + data: + excludePrecachePatterns: | + aws + thanos + operators.indexes: "" + operators.packagesAndChannels: "" + platform.image: + kind: ConfigMap + metadata: + name: pre-cache-spec + namespace: openshift-talo-pre-cache +`, + }, { name: "create namespace", resourceName: "test-ns", @@ -351,6 +387,12 @@ spec: t.Errorf("error serializing yaml string: %v", err) } assert.Equal(t, true, reflect.DeepEqual(renderedObject, desiredObject)) + l := log.New(os.Stderr, "", 0) + + if !reflect.DeepEqual(renderedObject, desiredObject) { + l.Println(renderedObject) + l.Println(desiredObject) + } }) } } diff --git a/controllers/overrides_test.go b/controllers/overrides_test.go index 52d03fb1d..7664db531 100644 --- a/controllers/overrides_test.go +++ b/controllers/overrides_test.go @@ -31,12 +31,14 @@ func TestOverrides_getOverrides(t *testing.T) { "platform.image": "test-platform-image:test-tag", "operators.indexes": "registry.example.com:5000/test-index:v0.0", "operators.packagesAndChannels": "local-storage-operator: stable\nperformance-addon-operator: 4.9\nptp-operator: stable\nsriov-network-operator: stable", + "excludePrecachePatterns": "thanos\naws", }, rdData: map[string]string{ "precache.image": "test-image:test-tag", "platform.image": "test-platform-image:test-tag", "operators.indexes": "registry.example.com:5000/test-index:v0.0", "operators.packagesAndChannels": "local-storage-operator: stable\nperformance-addon-operator: 4.9\nptp-operator: stable\nsriov-network-operator: stable", + "excludePrecachePatterns": "thanos\naws", }, }, { @@ -48,6 +50,7 @@ func TestOverrides_getOverrides(t *testing.T) { "platform.image": "test-platform-image:test_tag", "operators.indexes": "registry.example.com:5000/test-index:v0.0", "operators.packagesAndChannels": "local-storage-operator: stable\nperformance-addon-operator: 4.9\nptp-operator: stable\nsriov-network-operator: stable", + "excludePrecachePatterns": "thanos\naws", }, rdData: map[string]string{}, }, diff --git a/controllers/precache.go b/controllers/precache.go index 8081dec71..4ebaa4477 100644 --- a/controllers/precache.go +++ b/controllers/precache.go @@ -284,6 +284,7 @@ func (r *ClusterGroupUpgradeReconciler) getPrecacheSpecTemplateData( rv.PlatformImage = spec.PlatformImage rv.Operators.Indexes = spec.OperatorsIndexes rv.Operators.PackagesAndChannels = spec.OperatorsPackagesAndChannels + rv.ExcludePrecachePatterns = spec.ExcludePrecachePatterns return rv } @@ -299,6 +300,7 @@ func (r *ClusterGroupUpgradeReconciler) getPrecacheSpecTemplateData( // 3. "operators.indexes" - OLM index images (list of index image URIs) // 4. "operators.packagesAndChannels" - operator packages and channels // (list of string entries) +// 5. "excludePrecachePatterns" - list of patterns to exclude from precaching // If overrides are used, the configmap must be created before the CGU // // returns: *ranv1alpha1.PrecachingSpec, error @@ -333,6 +335,8 @@ func (r *ClusterGroupUpgradeReconciler) includeSoftwareSpecOverrides( } rv.OperatorsPackagesAndChannels = operatorsPackagesAndChannels + rv.ExcludePrecachePatterns = strings.Split(overrides["excludePrecachePatterns"], "\n") + if err != nil { return *rv, err } diff --git a/controllers/templates/precache-templates.go b/controllers/templates/precache-templates.go index fecd3860d..24dd2eb0f 100644 --- a/controllers/templates/precache-templates.go +++ b/controllers/templates/precache-templates.go @@ -55,6 +55,8 @@ spec: {{ . }} {{ end }} operators.packagesAndChannels: |{{ range .Operators.PackagesAndChannels }} {{ . }} {{ end }} + excludePrecachePatterns: |{{ range .ExcludePrecachePatterns }} + {{ . }} {{ end }} platform.image: {{ .PlatformImage }} kind: ConfigMap metadata: diff --git a/pre-cache/precache.sh b/pre-cache/precache.sh index b5e24e2dd..ddffe9de7 100755 --- a/pre-cache/precache.sh +++ b/pre-cache/precache.sh @@ -3,6 +3,7 @@ set -e rm -rf /host/tmp/precache +rm -f /host/tmp/images.txt cp -a /opt/precache /host/tmp/ cp -rf /etc/config /host/tmp/precache/config # only check space for OCP upgrade diff --git a/pre-cache/release b/pre-cache/release index e3bc78861..10cff5e73 100755 --- a/pre-cache/release +++ b/pre-cache/release @@ -5,7 +5,17 @@ cwd=$(dirname "$0") extract_pull_spec(){ local rel_img_mount=$1 - cat ${rel_img_mount}/release-manifests/image-references |jq '.spec.tags[].from.name' >> $pull_spec_file + + # remove empty lines + sed -i '/^[[:space:]]*$/d' $config_volume_path/excludePrecachePatterns + # remove trailing and leading whitespace + sed -i 's/^[ \t]*//;s/[ \t]*$//' $config_volume_path/excludePrecachePatterns + + cat ${rel_img_mount}/release-manifests/image-references | \ + jq '.spec.tags[] | .name as $name |.from.name as $pull |[$name,$pull] |join("$")' | \ + grep -vG -f $config_volume_path/excludePrecachePatterns | \ + cut -d "$" -f2 | \ + sed 's/^/"/' >> $pull_spec_file log_debug "Release index image processing done" } diff --git a/pre-cache/test.sh b/pre-cache/test.sh index 5190646fc..9738de5d2 100755 --- a/pre-cache/test.sh +++ b/pre-cache/test.sh @@ -21,16 +21,27 @@ echo "test_index1" > /tmp/operators.indexes echo "test_index2" >> /tmp/operators.indexes echo " package1: channel1 " > /tmp/operators.packagesAndChannels echo " package2:channel2" >> /tmp/operators.packagesAndChannels +# the script should ignore traling and leading whitespaces and empty lines +echo -e "\n\n aws \n alibaba \n" > /tmp/excludePrecachePatterns + mkdir -p /tmp/release-manifests cat < /tmp/release-manifests/image-references { "spec": { "tags": [ { + "name": "redhat", + "from": { + "name": "quay.io/1" + } + }, + { + "name": "bawsa", "from": { - "name": "test" + "name": "quay.io/2" } - }] + } + ] } } EOF @@ -72,7 +83,7 @@ echo " extract_packages - pass" echo "Testing release unit:" result=$(extract_pull_spec "/tmp") [[ $? -eq 0 ]] || fatal "release_image extract unexpected exit code" -[[ $(cat $pull_spec_file) == "\"test\"" ]] || fatal "release pull spec extract failure" +[[ $(cat $pull_spec_file) == "\"quay.io/1\"" ]] || fatal "release pull spec extract failure" echo " release extract_pull_spec pass" # Clean