From 497e0d9b27130c80b50dcf2e317ad80a8de8ad85 Mon Sep 17 00:00:00 2001 From: Matus Skvarla Date: Wed, 4 Sep 2024 00:04:19 +0200 Subject: [PATCH] bundle validation: check for bundle preset mismatch during setup --- pkg/crc/machine/bundle/metadata.go | 35 ++++++++++++++++++++++++++ pkg/crc/machine/start.go | 9 +------ pkg/crc/validation/validation.go | 40 +++++++++++++++++++++++++++++- 3 files changed, 75 insertions(+), 9 deletions(-) diff --git a/pkg/crc/machine/bundle/metadata.go b/pkg/crc/machine/bundle/metadata.go index 2eead2a612..7df64a229f 100644 --- a/pkg/crc/machine/bundle/metadata.go +++ b/pkg/crc/machine/bundle/metadata.go @@ -52,6 +52,13 @@ type ClusterInfo struct { OpenshiftPullSecret string `json:"openshiftPullSecret,omitempty"` } +type FilenameInfo struct { + Preset crcPreset.Preset + Driver string + Version string + Arch string +} + type Node struct { Kind []string `json:"kind"` Hostname string `json:"hostname"` @@ -244,6 +251,34 @@ func GetBundleNameFromURI(bundleURI string) string { } } +// GetBundleInfoFromName Parses the bundle filename and returns a FilenameInfo struct +func GetBundleInfoFromName(bundleName string) (*FilenameInfo, error) { + var filenameInfo FilenameInfo + bundleName = GetBundleNameWithoutExtension(bundleName) + filenameParts := strings.Split(bundleName, "_") + + switch len(filenameParts) { + case 4: + filenameInfo.Preset = crcPreset.OpenShift + filenameInfo.Driver = filenameParts[1] + filenameInfo.Version = filenameParts[2] + filenameInfo.Arch = filenameParts[3] + case 5: + parsedPreset, err := crcPreset.ParsePresetE(filenameParts[1]) + if err != nil { + return &filenameInfo, err + } + filenameInfo.Preset = parsedPreset + filenameInfo.Driver = filenameParts[2] + filenameInfo.Version = filenameParts[3] + filenameInfo.Arch = filenameParts[4] + default: + return &filenameInfo, fmt.Errorf("bundle filename is in unrecognized format") + } + + return &filenameInfo, nil +} + func getBundleDownloadInfo(preset crcPreset.Preset) (*download.RemoteFile, error) { sha256sum, err := getDefaultBundleVerifiedHash(preset) if err != nil { diff --git a/pkg/crc/machine/start.go b/pkg/crc/machine/start.go index d247273d2f..bd4632434d 100644 --- a/pkg/crc/machine/start.go +++ b/pkg/crc/machine/start.go @@ -284,7 +284,7 @@ func (client *client) Start(ctx context.Context, startConfig types.StartConfig) return nil, errors.Wrap(err, "Error getting bundle metadata") } - if err := bundleMismatchWithPreset(startConfig.Preset, crcBundleMetadata); err != nil { + if err := validation.BundleMismatchWithPresetMetadata(startConfig.Preset, crcBundleMetadata); err != nil { return nil, err } @@ -854,13 +854,6 @@ func updateKubeconfig(ctx context.Context, ocConfig oc.Config, sshRunner *crcssh return nil } -func bundleMismatchWithPreset(preset crcPreset.Preset, bundleMetadata *bundle.CrcBundleInfo) error { - if preset != bundleMetadata.GetBundleType() { - return errors.Errorf("Preset %s is used but bundle is provided for %s preset", preset, bundleMetadata.GetBundleType()) - } - return nil -} - func startMicroshift(ctx context.Context, sshRunner *crcssh.Runner, ocConfig oc.Config, pullSec cluster.PullSecretLoader) error { logging.Infof("Starting Microshift service... [takes around 1min]") if err := ensurePullSecretPresentInVM(sshRunner, pullSec); err != nil { diff --git a/pkg/crc/validation/validation.go b/pkg/crc/validation/validation.go index 4433d3b6da..ab186955f8 100644 --- a/pkg/crc/validation/validation.go +++ b/pkg/crc/validation/validation.go @@ -95,8 +95,28 @@ func ValidateBundle(bundlePath string, preset crcpreset.Preset) error { if bundlePath == constants.GetDefaultBundlePath(preset) { return nil } - return ValidateBundlePath(bundlePath, preset) + + if err := ValidateBundlePath(bundlePath, preset); err != nil { + return err + } + + bundleInfo, err := bundle.GetBundleInfoFromName(bundleName) + if err != nil { + return err + } + + if err := BundleMismatchWithPresetFilename(preset, bundleInfo); err != nil { + logging.Fatal(err.Error()) + return err + } + return nil + } + + if err := BundleMismatchWithPresetMetadata(preset, bundleMetadata); err != nil { + logging.Fatal(err.Error()) + return err } + bundleMismatchWarning(bundleMetadata.GetBundleName(), preset) /* 'bundle' is already unpacked in ~/.crc/cache */ return nil @@ -117,6 +137,24 @@ func bundleMismatchWarning(userProvidedBundle string, preset crcpreset.Preset) { } } +// BundleMismatchWithPresetFilename checks whether the bundle matches the configured preset based on the bundle filename +// (bundle is not downloaded or uncompressed yet) +func BundleMismatchWithPresetFilename(preset crcpreset.Preset, bundleFilenameInfo *bundle.FilenameInfo) error { + if preset != bundleFilenameInfo.Preset { + return fmt.Errorf("Preset %s is used but bundle is provided for %s preset", preset, bundleFilenameInfo.Preset) + } + return nil +} + +// BundleMismatchWithPresetMetadata checks whether the bundle matches the configured preset based on the bundle metadata +// (bundle is already downloaded and uncompressed) +func BundleMismatchWithPresetMetadata(preset crcpreset.Preset, bundleMetadata *bundle.CrcBundleInfo) error { + if preset != bundleMetadata.GetBundleType() { + return fmt.Errorf("Preset %s is used but bundle is provided for %s preset", preset, bundleMetadata.GetBundleType()) + } + return nil +} + // ValidateIPAddress checks if provided IP is valid func ValidateIPAddress(ipAddress string) error { ip := net.ParseIP(ipAddress).To4()