-
Notifications
You must be signed in to change notification settings - Fork 28
/
machine_image.go
82 lines (71 loc) · 2.95 KB
/
machine_image.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
package util
import (
"fmt"
"time"
"github.com/Masterminds/semver/v3"
gardencorev1beta1 "github.com/gardener/gardener/pkg/apis/core/v1beta1"
"github.com/pkg/errors"
"k8s.io/utils/strings/slices"
)
// GetLatestK8sVersion returns the latest avilable kubernetes version from the cloudprofile
func GetLatestMachineImageVersion(cloudprofile gardencorev1beta1.CloudProfile, imageName, arch string) (gardencorev1beta1.MachineImageVersion, error) {
machineImage, err := GetMachineImage(cloudprofile, imageName)
if err != nil {
return gardencorev1beta1.MachineImageVersion{}, err
}
machineVersions := machineImage.Versions
if len(machineVersions) == 0 {
return gardencorev1beta1.MachineImageVersion{}, fmt.Errorf("no machine image versions found for cloudprofle %s", cloudprofile.GetName())
}
machineVersions = FilterArchSpecificMachineImage(machineVersions, arch)
return getLatestMachineImageVersion(FilterExpiredMachineImageVersions(machineVersions))
}
// FilterArchSpecificMachineImage removes all version which doesn't support given architecture.
func FilterArchSpecificMachineImage(versions []gardencorev1beta1.MachineImageVersion, architecture string) []gardencorev1beta1.MachineImageVersion {
filtered := make([]gardencorev1beta1.MachineImageVersion, 0)
for _, v := range versions {
if slices.Contains(v.Architectures, architecture) {
filtered = append(filtered, v)
}
}
return filtered
}
// FilterExpiredMachineImageVersions removes all expired versions from the list.
func FilterExpiredMachineImageVersions(versions []gardencorev1beta1.MachineImageVersion) []gardencorev1beta1.MachineImageVersion {
filtered := make([]gardencorev1beta1.MachineImageVersion, 0)
for _, v := range versions {
if v.ExpirationDate == nil || v.ExpirationDate.Time.After(time.Now()) {
filtered = append(filtered, v)
}
}
return filtered
}
// getLatestMachineImageVersion returns the latest image from a list of expirable versions
func getLatestMachineImageVersion(rawVersions []gardencorev1beta1.MachineImageVersion) (gardencorev1beta1.MachineImageVersion, error) {
if len(rawVersions) == 0 {
return gardencorev1beta1.MachineImageVersion{}, errors.New("no machine image versions found")
}
var (
latestExpVersion gardencorev1beta1.MachineImageVersion
latestVersion *semver.Version
)
for _, rawVersion := range rawVersions {
v, err := semver.NewVersion(rawVersion.Version)
if err != nil {
return gardencorev1beta1.MachineImageVersion{}, err
}
if latestVersion == nil || v.GreaterThan(latestVersion) {
latestVersion = v
latestExpVersion = rawVersion
}
}
return latestExpVersion, nil
}
func GetMachineImage(cloudprofile gardencorev1beta1.CloudProfile, imageName string) (gardencorev1beta1.MachineImage, error) {
for _, image := range cloudprofile.Spec.MachineImages {
if image.Name == imageName {
return image, nil
}
}
return gardencorev1beta1.MachineImage{}, fmt.Errorf("no image %s defined in the cloudprofile %s", imageName, cloudprofile.GetName())
}