Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
36 changes: 0 additions & 36 deletions pkg/controllers/revision/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,6 @@ package revision

import (
"context"
"fmt"
"os"
"path/filepath"
"slices"

. "github.com/onsi/ginkgo/v2"
Expand Down Expand Up @@ -52,7 +49,6 @@ func newManagerWrapper(providerImgs []providerimages.ProviderImageManifests) *ma

// Clone so callers' slices are not mutated.
imgs := slices.Clone(providerImgs)
ensureManifestPaths(imgs)

mgr, err := ctrl.NewManager(cfg, ctrl.Options{
Scheme: cl.Scheme(),
Expand Down Expand Up @@ -185,35 +181,3 @@ func latestRevision(revisions []operatorv1alpha1.ClusterAPIInstallerRevision) op

return latest
}

// configMapYAML returns a minimal valid ConfigMap YAML document.
func configMapYAML(name string) string {
return fmt.Sprintf(`apiVersion: v1
kind: ConfigMap
metadata:
name: %s
namespace: default
data:
key: value`, name)
}

// ensureManifestPaths creates manifest files for providers that don't already
// have a ManifestsPath set. Each provider's ContentID is used as the ConfigMap
// name so that different providers produce different revision contentIDs.
func ensureManifestPaths(providerImgs []providerimages.ProviderImageManifests) {
GinkgoHelper()

manifestDir, err := os.MkdirTemp("", "revision-test-manifests")
Expect(err).NotTo(HaveOccurred())
DeferCleanup(func() {
Expect(os.RemoveAll(manifestDir)).To(Succeed())
})

for i := range providerImgs {
if providerImgs[i].ManifestsPath == "" {
path := filepath.Join(manifestDir, providerImgs[i].Name+"-manifests.yaml")
Expect(os.WriteFile(path, []byte(configMapYAML(providerImgs[i].ContentID)), 0644)).To(Succeed())
providerImgs[i].ManifestsPath = path
}
}
}
63 changes: 5 additions & 58 deletions pkg/controllers/revision/revision_controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -41,62 +41,10 @@ var (
clusterAPI *operatorv1alpha1.ClusterAPI
clusterOperator *configv1.ClusterOperator

defaultProviderImgs = []providerimages.ProviderImageManifests{
{
ProviderMetadata: providerimages.ProviderMetadata{
Name: "core",
InstallOrder: 10,
},
ContentID: "core-content-id",
ImageRef: "registry.example.com/core@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef",
Profile: "default",
},
{
ProviderMetadata: providerimages.ProviderMetadata{
Name: "infra-aws",
InstallOrder: 20,
OCPPlatform: configv1.AWSPlatformType,
},
ContentID: "infra-aws-content-id",
ImageRef: "registry.example.com/infra-aws@sha256:fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210",
Profile: "default",
},
}

updatedProviderImgs = []providerimages.ProviderImageManifests{
{
ProviderMetadata: providerimages.ProviderMetadata{
Name: "core",
InstallOrder: 10,
},
ContentID: "core-content-id-2",
ImageRef: "registry.example.com/core@sha256:1111111111111111111111111111111111111111111111111111111111111111",
Profile: "default",
},
{
ProviderMetadata: providerimages.ProviderMetadata{
Name: "infra-aws",
InstallOrder: 20,
OCPPlatform: configv1.AWSPlatformType,
},
ContentID: "infra-aws-content-id-2",
ImageRef: "registry.example.com/infra-aws@sha256:2222222222222222222222222222222222222222222222222222222222222222",
Profile: "default",
},
}

nonMatchingProviderImgs = []providerimages.ProviderImageManifests{
{
ProviderMetadata: providerimages.ProviderMetadata{
Name: "infra-gcp",
InstallOrder: 20,
OCPPlatform: configv1.GCPPlatformType,
},
ContentID: "infra-gcp-content-id",
ImageRef: "registry.example.com/infra-gcp@sha256:3333333333333333333333333333333333333333333333333333333333333333",
Profile: "default",
},
}
// Provider image fixtures - set by setupProviderFixtures in BeforeSuite.
defaultProviderImgs []providerimages.ProviderImageManifests
updatedProviderImgs []providerimages.ProviderImageManifests
nonMatchingProviderImgs []providerimages.ProviderImageManifests
)

const (
Expand Down Expand Up @@ -522,10 +470,9 @@ var _ = Describe("RevisionController error handling", Serial, func() {
BeforeEach(func(ctx context.Context) {
createFixtures(ctx)

// Clone provider images and ensure manifest paths for direct reconcile use.
// Clone provider images for direct reconcile use.
providerImgs := make([]providerimages.ProviderImageManifests, len(defaultProviderImgs))
copy(providerImgs, defaultProviderImgs)
ensureManifestPaths(providerImgs)

interceptorCl = interceptor.NewClient(cl, interceptor.Funcs{
SubResourcePatch: func(ctx context.Context, c client.Client, subResourceName string, obj client.Object, patch client.Patch, opts ...client.SubResourcePatchOption) error {
Expand Down
51 changes: 51 additions & 0 deletions pkg/controllers/revision/suite_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ import (

. "github.com/onsi/ginkgo/v2"
. "github.com/onsi/gomega"
configv1 "github.com/openshift/api/config/v1"
"github.com/openshift/cluster-capi-operator/pkg/providerimages"
"k8s.io/client-go/rest"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/client"
Expand Down Expand Up @@ -62,8 +64,57 @@ var _ = BeforeSuite(func() {
By("tearing down the test environment")
Expect(test.StopEnvTest(testEnv)).To(Succeed())
})

By("setting up provider image fixtures")
setupProviderFixtures()
})

func setupProviderFixtures() {
tb := GinkgoTB()

// Each provider uses its ContentID as the ConfigMap name so that
// different provider sets produce different revision contentIDs.
defaultProviderImgs = []providerimages.ProviderImageManifests{
test.NewProviderImageManifests(tb, "core").
WithContentID("core-content-id").
WithImageRef("registry.example.com/core@sha256:0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef").
WithManifests(test.ConfigMapYAML("core-content-id")).
Build(),
test.NewProviderImageManifests(tb, "infra-aws").
WithInstallOrder(20).
WithPlatform(configv1.AWSPlatformType).
WithContentID("infra-aws-content-id").
WithImageRef("registry.example.com/infra-aws@sha256:fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210").
WithManifests(test.ConfigMapYAML("infra-aws-content-id")).
Build(),
}

updatedProviderImgs = []providerimages.ProviderImageManifests{
test.NewProviderImageManifests(tb, "core").
WithContentID("core-content-id-2").
WithImageRef("registry.example.com/core@sha256:1111111111111111111111111111111111111111111111111111111111111111").
WithManifests(test.ConfigMapYAML("core-content-id-2")).
Build(),
test.NewProviderImageManifests(tb, "infra-aws").
WithInstallOrder(20).
WithPlatform(configv1.AWSPlatformType).
WithContentID("infra-aws-content-id-2").
WithImageRef("registry.example.com/infra-aws@sha256:2222222222222222222222222222222222222222222222222222222222222222").
WithManifests(test.ConfigMapYAML("infra-aws-content-id-2")).
Build(),
}

nonMatchingProviderImgs = []providerimages.ProviderImageManifests{
test.NewProviderImageManifests(tb, "infra-gcp").
WithInstallOrder(20).
WithPlatform(configv1.GCPPlatformType).
WithContentID("infra-gcp-content-id").
WithImageRef("registry.example.com/infra-gcp@sha256:3333333333333333333333333333333333333333333333333333333333333333").
WithManifests(test.ConfigMapYAML("infra-gcp-content-id")).
Build(),
}
}

func kWithCtx(ctx context.Context) komega.Komega {
return komega.New(cl).WithContext(ctx)
}
28 changes: 7 additions & 21 deletions pkg/revisiongenerator/helpers_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -17,14 +17,12 @@ limitations under the License.
package revisiongenerator

import (
"os"
"path/filepath"
"strings"
"testing"

. "github.com/onsi/gomega"

"github.com/openshift/cluster-capi-operator/pkg/providerimages"
"github.com/openshift/cluster-capi-operator/pkg/test"
)

func must[T any](value T, err error) func(g *WithT) T {
Expand All @@ -36,28 +34,16 @@ func must[T any](value T, err error) func(g *WithT) T {
}
}

// writeManifestFile writes YAML content to a temp file and returns the path.
func writeManifestFile(t *testing.T, content string) string {
t.Helper()
dir := t.TempDir()
path := filepath.Join(dir, "manifests.yaml")
g := NewWithT(t)
g.Expect(os.WriteFile(path, []byte(content), 0644)).To(Succeed())

return path
}

// profile creates a ProviderImageManifests with the given fields and manifest
// content written to a temp file.
func profile(t *testing.T, name, imageRef, profileName, manifestContent string) providerimages.ProviderImageManifests {
t.Helper()

return providerimages.ProviderImageManifests{
ProviderMetadata: providerimages.ProviderMetadata{Name: name},
ImageRef: imageRef,
Profile: profileName,
ManifestsPath: writeManifestFile(t, manifestContent),
}
return test.NewProviderImageManifests(t, name).
WithImageRef(imageRef).
WithProfile(profileName).
WithManifests(manifestContent).
Build()
}

// contentIDForProfiles computes the contentID for a set of profiles.
Expand All @@ -76,5 +62,5 @@ func forInstall(g *WithT, rev RenderedRevision, releaseVersion string, revisionI

// multiDoc joins YAML documents with the standard separator.
func multiDoc(docs ...string) string {
return strings.Join(docs, "\n---\n")
return test.MultiDoc(docs...)
}
26 changes: 13 additions & 13 deletions pkg/revisiongenerator/revision_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,7 @@ import (

operatorv1alpha1 "github.com/openshift/api/operator/v1alpha1"
"github.com/openshift/cluster-capi-operator/pkg/providerimages"
"github.com/openshift/cluster-capi-operator/pkg/test"
)

// Reusable YAML manifest fixtures.
Expand Down Expand Up @@ -357,28 +358,27 @@ func TestNewRenderedRevision(t *testing.T) {

// Manifest with envsubst variable; revision built from this should
// produce the same contentID as one built from the expanded form.
pathWithVar := writeManifestFile(t, `apiVersion: v1
provWithVar := test.NewProviderImageManifests(t, "p1").
WithImageRef("img1").
WithManifests(`apiVersion: v1
kind: ConfigMap
metadata:
name: cm
data:
v: "${EXP_BOOTSTRAP_FORMAT_IGNITION}"`)
pathExpanded := writeManifestFile(t, `apiVersion: v1
v: "${EXP_BOOTSTRAP_FORMAT_IGNITION}"`).
Build()
provExpanded := test.NewProviderImageManifests(t, "p1").
WithImageRef("img1").
WithManifests(`apiVersion: v1
kind: ConfigMap
metadata:
name: cm
data:
v: "true"`)
v: "true"`).
Build()

p := providerimages.ProviderImageManifests{
ProviderMetadata: providerimages.ProviderMetadata{Name: "p1"}, ImageRef: "img1", Profile: "default",
}

p.ManifestsPath = pathWithVar
rev1 := must(NewRenderedRevision([]providerimages.ProviderImageManifests{p}))(g)

p.ManifestsPath = pathExpanded
rev2 := must(NewRenderedRevision([]providerimages.ProviderImageManifests{p}))(g)
rev1 := must(NewRenderedRevision([]providerimages.ProviderImageManifests{provWithVar}))(g)
rev2 := must(NewRenderedRevision([]providerimages.ProviderImageManifests{provExpanded}))(g)

id1 := must(rev1.ContentID())(g)
id2 := must(rev2.ContentID())(g)
Expand Down
Loading