Skip to content

Commit b5a8b9e

Browse files
[mq] working branch - merge 7db47bf on top of main at 3fd9f96
{"baseBranch":"main","baseCommit":"3fd9f96b6d3bfaea50455c830eeb4595631bca67","createdAt":"2025-10-29T14:14:19.186641Z","headSha":"7db47bfee5afcb0d5d1dc7952a35b31f4b95c271","id":"8a8b0698-dc15-4220-aa1c-41fac9387aaf","priority":"200","pullRequestNumber":"1736","queuedAt":"2025-10-29T14:14:19.185918Z","status":"STATUS_QUEUED"}
2 parents c769298 + 7db47bf commit b5a8b9e

File tree

2 files changed

+56
-2
lines changed

2 files changed

+56
-2
lines changed

common/config/environment.go

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ const (
2727
// Infra namespace
2828
DDInfraEnvironment = "env"
2929
DDInfraKubernetesVersion = "kubernetesVersion"
30+
DDInfraKindVersion = "kindVersion"
31+
DDInfraKubeNodeURL = "kubeNodeUrl"
3032
DDInfraOSDescriptor = "osDescriptor" // osDescriptor is expected in the format: <osFamily>:<osVersion>:<osArch>, see components/os/descriptor.go
3133
DDInfraOSImageID = "osImageID"
3234
DDInfraOSImageIDUseLatest = "osImageIDUseLatest"
@@ -110,6 +112,8 @@ type Env interface {
110112
InfraOSDescriptor() string
111113
InfraOSImageID() string
112114
KubernetesVersion() string
115+
KubeNodeURL() string
116+
KindVersion() string
113117
DefaultResourceTags() map[string]string
114118
ExtraResourcesTags() map[string]string
115119
ResourcesTags() pulumi.StringMapInput
@@ -226,6 +230,14 @@ func (e *CommonEnvironment) KubernetesVersion() string {
226230
return e.GetStringWithDefault(e.InfraConfig, DDInfraKubernetesVersion, "1.32")
227231
}
228232

233+
func (e *CommonEnvironment) KindVersion() string {
234+
return e.GetStringWithDefault(e.InfraConfig, DDInfraKindVersion, "v0.30.0")
235+
}
236+
237+
func (e *CommonEnvironment) KubeNodeURL() string {
238+
return e.GetStringWithDefault(e.InfraConfig, DDInfraKubeNodeURL, "")
239+
}
240+
229241
func (e *CommonEnvironment) DefaultResourceTags() map[string]string {
230242
return map[string]string{"managed-by": "pulumi", "username": e.username}
231243
}

components/kubernetes/kind.go

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package kubernetes
33
import (
44
_ "embed"
55
"fmt"
6+
"log"
67
"regexp"
78
"strings"
89

@@ -30,6 +31,20 @@ func NewKindCluster(env config.Env, vm *remote.Host, name string, kubeVersion st
3031
return NewKindClusterWithConfig(env, vm, name, kubeVersion, kindClusterConfig, opts...)
3132
}
3233

34+
func validateKubeVersionFormat(kubeVersion string) error {
35+
// Pattern: v{semver}@sha256:{hash}
36+
// Example: v1.32.0@sha256:c48c62eac5da28cdadcf560d1d8616cfa6783b58f0d94cf63ad1bf49600cb027
37+
pattern := `^v\d+\.\d+\.\d+@sha256:[a-f0-9]{64}$`
38+
matched, err := regexp.MatchString(pattern, kubeVersion)
39+
if err != nil {
40+
return fmt.Errorf("error validating kubeVersion format: %w", err)
41+
}
42+
if !matched {
43+
return fmt.Errorf("kubeVersion must be in format 'v{semver}@sha256:{hash}' (e.g., v1.32.0@sha256:c48c62eac5da28cdadcf560d1d8616cfa6783b58f0d94cf63ad1bf49600cb027), got: %s", kubeVersion)
44+
}
45+
return nil
46+
}
47+
3348
func NewKindClusterWithConfig(env config.Env, vm *remote.Host, name string, kubeVersion, kindConfig string, opts ...pulumi.ResourceOption) (*Cluster, error) {
3449
return components.NewComponent(env, name, func(clusterComp *Cluster) error {
3550
kindClusterName := env.CommonNamer().DisplayName(49) // We can have some issues if the name is longer than 50 characters
@@ -48,9 +63,25 @@ func NewKindClusterWithConfig(env config.Env, vm *remote.Host, name string, kube
4863
}
4964
opts = utils.MergeOptions(opts, utils.PulumiDependsOn(dockerManager, curlCommand))
5065

66+
/*
67+
We'll first try to resolve the kind version and node image from our static map, if we can't find
68+
it (ex. 1.34 not in our map yet), we'll continue because we have the ability to pull down arbitrary
69+
versions from the mirror - although it should be noted the sha is required. So sometimes the version is
70+
just the tag, and sometimes it's the tag with the sha.
71+
*/
5172
kindVersionConfig, err := GetKindVersionConfig(kubeVersion)
5273
if err != nil {
53-
return err
74+
log.Printf("[WARN] Could not find version %s in our static map, using default kind version and the provided k8s version as node image", kubeVersion)
75+
76+
// Validate the kubeVersion format when not in static map
77+
if err := validateKubeVersionFormat(kubeVersion); err != nil {
78+
return err
79+
}
80+
81+
kindVersionConfig = &KindConfig{
82+
KindVersion: env.KindVersion(),
83+
NodeImageVersion: kubeVersion,
84+
}
5485
}
5586

5687
kindInstall, err := InstallKindBinary(env, vm, kindVersionConfig.KindVersion, opts...)
@@ -66,7 +97,18 @@ func NewKindClusterWithConfig(env config.Env, vm *remote.Host, name string, kube
6697
return err
6798
}
6899

69-
nodeImage := fmt.Sprintf("%s/%s:%s", env.InternalDockerhubMirror(), kindNodeImageName, kindVersionConfig.NodeImageVersion)
100+
/*
101+
The internal mirror should be able to pull arbitrary kubernetes images but the sha is required
102+
with the tag. We also support the user supplying the url (in case we want to host
103+
kubernetes rc candidates in some registry, etc)
104+
*/
105+
var nodeImage string
106+
if env.KubeNodeURL() != "" {
107+
nodeImage = env.KubeNodeURL()
108+
} else {
109+
nodeImage = fmt.Sprintf("%s/%s:%s", env.InternalDockerhubMirror(), kindNodeImageName, kindVersionConfig.NodeImageVersion)
110+
}
111+
log.Printf("[INFO] Resolved node image url: %s", nodeImage)
70112
createCluster, err := runner.Command(
71113
commonEnvironment.CommonNamer().ResourceName("kind-create-cluster"),
72114
&command.Args{

0 commit comments

Comments
 (0)