Skip to content
Closed
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
47 changes: 35 additions & 12 deletions internal/mirror/releases/versions.go
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ package releases
import (
"encoding/json"
"fmt"
"slices"

"github.com/Masterminds/semver/v3"
"github.com/google/go-containerregistry/pkg/authn"
Expand All @@ -32,18 +33,28 @@ import (
"github.com/deckhouse/deckhouse-cli/pkg/libmirror/util/errorutil"
)

// allKnownChannels contains all officially supported release channels
var allChannels = []string{"alpha", "beta", "early-access", "stable", "rock-solid", "lts"}

func VersionsToMirror(pullParams *params.PullParams) ([]semver.Version, error) {
releaseChannelsToCopy := []string{"alpha", "beta", "early-access", "stable", "rock-solid", "lts"}
releaseChannelsVersions := make([]*semver.Version, len(releaseChannelsToCopy))
for i, channel := range releaseChannelsToCopy {
channelVersions := make(map[string]*semver.Version)

// Collect available channel versions
for _, channel := range allChannels {
v, err := getReleaseChannelVersionFromRegistry(pullParams, channel)
if err != nil {
return nil, fmt.Errorf("get %s release version from registry: %w", channel, err)
}
releaseChannelsVersions[i] = v
if v != nil {
channelVersions[channel] = v
}
}

rockSolidVersion := releaseChannelsVersions[len(releaseChannelsToCopy)-1]
// Direct access to required versions
rockSolidVersion := channelVersions["rock-solid"]
if rockSolidVersion == nil {
return nil, fmt.Errorf("rock-solid channel is required but not available")
}
mirrorFromVersion := *rockSolidVersion
if pullParams.SinceVersion != nil {
mirrorFromVersion = *pullParams.SinceVersion
Expand All @@ -57,17 +68,21 @@ func VersionsToMirror(pullParams *params.PullParams) ([]semver.Version, error) {
return nil, fmt.Errorf("get releases from github: %w", err)
}

alphaChannelVersion := releaseChannelsVersions[0]
for i := range releaseChannelsToCopy {
if releaseChannelsToCopy[i] == "alpha" {
alphaChannelVersion = releaseChannelsVersions[i]
break
}
// Direct access to alpha version
alphaChannelVersion := channelVersions["alpha"]
if alphaChannelVersion == nil {
return nil, fmt.Errorf("alpha channel is required but not available")
}
versionsAboveMinimal := parseAndFilterVersionsAboveMinimalAnbBelowAlpha(&mirrorFromVersion, tags, alphaChannelVersion)
versionsAboveMinimal = FilterOnlyLatestPatches(versionsAboveMinimal)

return deduplicateVersions(append(releaseChannelsVersions, versionsAboveMinimal...)), nil
// Convert map values to slice for deduplication
var versions []*semver.Version
for _, v := range channelVersions {
versions = append(versions, v)
}

return deduplicateVersions(append(versions, versionsAboveMinimal...)), nil
}

func getReleasedTagsFromRegistry(pullParams *params.PullParams) ([]string, error) {
Expand Down Expand Up @@ -119,6 +134,10 @@ func FilterOnlyLatestPatches(versions []*semver.Version) []*semver.Version {
return topPatches
}

func isReleaseChannel(channel string) bool {
return slices.Contains(allChannels, channel)
}

func getReleaseChannelVersionFromRegistry(mirrorCtx *params.PullParams, releaseChannel string) (*semver.Version, error) {
nameOpts, remoteOpts := auth.MakeRemoteRegistryRequestOptionsFromMirrorParams(&mirrorCtx.BaseParams)
nameOpts = append(nameOpts, name.StrictValidation)
Expand All @@ -130,6 +149,10 @@ func getReleaseChannelVersionFromRegistry(mirrorCtx *params.PullParams, releaseC

rockSolidReleaseImage, err := remote.Image(ref, remoteOpts...)
if err != nil {
// If release channel doesn't exist, only ignore for known channels
if errorutil.IsImageNotFoundError(err) && isReleaseChannel(releaseChannel) {
return nil, nil
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are we sure about it?
looks like a place for bug possibility

}
return nil, fmt.Errorf("get %s release channel data: %w", releaseChannel, err)
}

Expand Down