Skip to content

Commit

Permalink
Add support for versioned images (#1463)
Browse files Browse the repository at this point in the history
Signed-off-by: Marko Mudrinić <[email protected]>
  • Loading branch information
xmudrii authored Aug 20, 2021
1 parent fd57014 commit 92c2671
Show file tree
Hide file tree
Showing 3 changed files with 72 additions and 29 deletions.
5 changes: 4 additions & 1 deletion pkg/cmd/config-images.go
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,10 @@ func listImages(opts *listImagesOpts) error {
}
return ""
})
resolveropts = append(resolveropts, overRegGetter)
kubeVerGetter := images.WithKubernetesVersionGetter(func() string {
return conf.Versions.Kubernetes
})
resolveropts = append(resolveropts, overRegGetter, kubeVerGetter)
}

imgResolver := images.NewResolver(resolveropts...)
Expand Down
7 changes: 7 additions & 0 deletions pkg/state/context.go
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,13 @@ func New(ctx context.Context) (*State, error) {

return s.Cluster.RegistryConfiguration.OverwriteRegistry
}),
images.WithKubernetesVersionGetter(func() string {
if s.Cluster == nil {
return "0.0.0"
}

return s.Cluster.Versions.Kubernetes
}),
)

return s, err
Expand Down
89 changes: 61 additions & 28 deletions pkg/templates/images/images.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,14 +22,24 @@ import (
"fmt"
"sort"

"github.com/Masterminds/semver/v3"
"github.com/docker/distribution/reference"
)

type Resource int

func (res Resource) namedReference() reference.Named {
named, _ := reference.ParseNormalizedNamed(allResources()[res])
return named
func (res Resource) namedReference(kubernetesVersionGetter func() string) reference.Named {
kubeVer, _ := semver.NewVersion(kubernetesVersionGetter())

for ver, img := range allResources()[res] {
sv, _ := semver.NewConstraint(ver)
if sv.Check(kubeVer) {
named, _ := reference.ParseNormalizedNamed(img)
return named
}
}

return nil
}

const (
Expand Down Expand Up @@ -62,34 +72,34 @@ func FindResource(name string) (Resource, error) {
return 0, fmt.Errorf("no such resource: %q", name)
}

func baseResources() map[Resource]string {
return map[Resource]string{
CalicoCNI: "docker.io/calico/cni:v3.19.1",
CalicoController: "docker.io/calico/kube-controllers:v3.19.1",
CalicoNode: "docker.io/calico/node:v3.19.1",
DNSNodeCache: "k8s.gcr.io/k8s-dns-node-cache:1.15.13",
Flannel: "quay.io/coreos/flannel:v0.13.0",
MachineController: "docker.io/kubermatic/machine-controller:v1.35.1",
MetricsServer: "k8s.gcr.io/metrics-server:v0.3.6",
func baseResources() map[Resource]map[string]string {
return map[Resource]map[string]string{
CalicoCNI: {"*": "docker.io/calico/cni:v3.19.1"},
CalicoController: {"*": "docker.io/calico/kube-controllers:v3.19.1"},
CalicoNode: {"*": "docker.io/calico/node:v3.19.1"},
DNSNodeCache: {"*": "k8s.gcr.io/k8s-dns-node-cache:1.15.13"},
Flannel: {"*": "quay.io/coreos/flannel:v0.13.0"},
MachineController: {"*": "docker.io/kubermatic/machine-controller:v1.35.1"},
MetricsServer: {"*": "k8s.gcr.io/metrics-server:v0.3.6"},
}
}

func optionalResources() map[Resource]string {
return map[Resource]string{
AzureCCM: "mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager:v1.0.1",
AzureCNM: "mcr.microsoft.com/oss/kubernetes/azure-cloud-node-manager:v1.0.1",
DigitaloceanCCM: "docker.io/digitalocean/digitalocean-cloud-controller-manager:v0.1.33",
HetznerCCM: "docker.io/hetznercloud/hcloud-cloud-controller-manager:v1.9.1",
OpenstackCCM: "docker.io/k8scloudprovider/openstack-cloud-controller-manager:v1.17.0",
PacketCCM: "docker.io/packethost/packet-ccm:v1.0.0",
VsphereCCM: "gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.2.1",
WeaveNetCNIKube: "docker.io/weaveworks/weave-kube:2.8.1",
WeaveNetCNINPC: "docker.io/weaveworks/weave-npc:2.8.1",
func optionalResources() map[Resource]map[string]string {
return map[Resource]map[string]string{
AzureCCM: {"*": "mcr.microsoft.com/oss/kubernetes/azure-cloud-controller-manager:v1.0.1"},
AzureCNM: {"*": "mcr.microsoft.com/oss/kubernetes/azure-cloud-node-manager:v1.0.1"},
DigitaloceanCCM: {"*": "docker.io/digitalocean/digitalocean-cloud-controller-manager:v0.1.33"},
HetznerCCM: {"*": "docker.io/hetznercloud/hcloud-cloud-controller-manager:v1.9.1"},
OpenstackCCM: {"*": "docker.io/k8scloudprovider/openstack-cloud-controller-manager:v1.17.0"},
PacketCCM: {"*": "docker.io/packethost/packet-ccm:v1.0.0"},
VsphereCCM: {"*": "gcr.io/cloud-provider-vsphere/cpi/release/manager:v1.2.1"},
WeaveNetCNIKube: {"*": "docker.io/weaveworks/weave-kube:2.8.1"},
WeaveNetCNINPC: {"*": "docker.io/weaveworks/weave-npc:2.8.1"},
}
}

func allResources() map[Resource]string {
ret := map[Resource]string{}
func allResources() map[Resource]map[string]string {
ret := map[Resource]map[string]string{}
for k, v := range baseResources() {
ret[k] = v
}
Expand All @@ -107,16 +117,32 @@ func WithOverwriteRegistryGetter(getter func() string) Opt {
}
}

func WithKubernetesVersionGetter(getter func() string) Opt {
return func(r *Resolver) {
r.kubernetesVersionGetter = getter
}
}

func NewResolver(opts ...Opt) *Resolver {
r := &Resolver{}
for _, opt := range opts {
opt(r)
}

// If KubernetesVersionGetter is not provided, we'll default to 0.0.0,
// so that we can at least get images that are version-independent.
if r.kubernetesVersionGetter == nil {
r.kubernetesVersionGetter = func() string {
return "0.0.0"
}
}

return r
}

type Resolver struct {
overwriteRegistryGetter func() string
kubernetesVersionGetter func() string
}

type ListFilter int
Expand All @@ -139,15 +165,18 @@ func (r *Resolver) List(lf ListFilter) []string {
}

for res := range fn() {
list = append(list, r.Get(res))
img := r.Get(res)
if img != "" {
list = append(list, img)
}
}

sort.Strings(list)
return list
}

func (r *Resolver) Tag(res Resource) string {
named := res.namedReference()
named := res.namedReference(r.kubernetesVersionGetter)
if tagged, ok := named.(reference.Tagged); ok {
return tagged.Tag()
}
Expand Down Expand Up @@ -175,7 +204,11 @@ func WithTag(tag string) GetOpt {
}

func (r *Resolver) Get(res Resource, opts ...GetOpt) string {
named := res.namedReference()
named := res.namedReference(r.kubernetesVersionGetter)
if named == nil {
return ""
}

domain := reference.Domain(named)
reminder := reference.Path(named)

Expand Down

0 comments on commit 92c2671

Please sign in to comment.