Skip to content

Commit 33e4f5c

Browse files
committed
fixup! refactor: Change to nested image details
1 parent 382819b commit 33e4f5c

File tree

15 files changed

+170
-86
lines changed

15 files changed

+170
-86
lines changed

api/v1alpha1/clusterconfig_types.go

Lines changed: 42 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -22,11 +22,8 @@ type ClusterConfig struct {
2222

2323
// ClusterConfigSpec defines the desired state of ClusterConfig.
2424
type ClusterConfigSpec struct {
25-
// INSERT ADDITIONAL SPEC FIELDS - desired state of cluster
26-
// Important: Run "make" to regenerate code after modifying this file
27-
2825
// +optional
29-
KubernetesImageRegistry *KubernetesImageRegistry `json:"kubernetesImageRegistry,omitempty"`
26+
KubernetesImageRepository *KubernetesImageRepository `json:"kubernetesImageRepository,omitempty"`
3027

3128
// +optional
3229
Etcd *Etcd `json:"etcd,omitempty"`
@@ -44,60 +41,82 @@ func (ClusterConfigSpec) VariableSchema() clusterv1.VariableSchema {
4441
Description: "Cluster configuration",
4542
Type: "object",
4643
Properties: map[string]clusterv1.JSONSchemaProps{
47-
"kubernetesImageRegistry": KubernetesImageRegistry(
44+
"etcd": Etcd{}.VariableSchema().OpenAPIV3Schema,
45+
"extraAPIServerCertSANs": ExtraAPIServerCertSANs{}.VariableSchema().OpenAPIV3Schema,
46+
"proxy": HTTPProxy{}.VariableSchema().OpenAPIV3Schema,
47+
"kubernetesImageRepository": KubernetesImageRepository(
4848
"",
4949
).VariableSchema().
5050
OpenAPIV3Schema,
51-
"etcd": Etcd{}.VariableSchema().OpenAPIV3Schema,
52-
"proxy": HTTPProxy{}.VariableSchema().OpenAPIV3Schema,
53-
"extraAPIServerCertSANs": ExtraAPIServerCertSANs{}.VariableSchema().OpenAPIV3Schema,
5451
},
5552
},
5653
}
5754
}
5855

59-
// KubernetesImageRegistry required for overriding Kubernetes image registry.
60-
type KubernetesImageRegistry string
56+
// KubernetesImageRepository required for overriding Kubernetes image repository.
57+
type KubernetesImageRepository string
6158

62-
func (KubernetesImageRegistry) VariableSchema() clusterv1.VariableSchema {
59+
func (KubernetesImageRepository) VariableSchema() clusterv1.VariableSchema {
6360
return clusterv1.VariableSchema{
6461
OpenAPIV3Schema: clusterv1.JSONSchemaProps{
65-
Description: "Sets the Kubernetes image registry used for the KubeadmControlPlane.",
62+
Description: "Sets the Kubernetes image repository used for the KubeadmControlPlane.",
6663
Type: "string",
64+
Pattern: patterns.Anchored(patterns.ImageRepository),
6765
},
6866
}
6967
}
7068

71-
func (v KubernetesImageRegistry) String() string {
69+
func (v KubernetesImageRepository) String() string {
7270
return string(v)
7371
}
7472

75-
type Etcd struct {
76-
// ImageRepository required for overriding etcd image repository.
77-
ImageRepository string `json:"imageRepository,omitempty"`
73+
type Image struct {
74+
// Repository is used to override the image repository to pull from.
75+
//+optional
76+
Repository string `json:"repository,omitempty"`
7877

79-
// ImageTag required for overriding etcd image tag.
80-
ImageTag string `json:"imageTag,omitempty"`
78+
// Tag is used to override the default image tag.
79+
//+optional
80+
Tag string `json:"tag,omitempty"`
8181
}
8282

83-
func (Etcd) VariableSchema() clusterv1.VariableSchema {
83+
func (Image) VariableSchema() clusterv1.VariableSchema {
8484
return clusterv1.VariableSchema{
8585
OpenAPIV3Schema: clusterv1.JSONSchemaProps{
8686
Type: "object",
8787
Properties: map[string]clusterv1.JSONSchemaProps{
88-
"imageRepository": {
89-
Description: "Image repository for etcd.",
88+
"repository": {
89+
Description: "Image repository to pull from.",
9090
Type: "string",
91+
Pattern: patterns.Anchored(patterns.ImageRepository),
9192
},
92-
"imageTag": {
93-
Description: "Image tag for etcd.",
93+
"tag": {
94+
Description: "Image tag to use.",
9495
Type: "string",
96+
Pattern: patterns.Anchored(patterns.Tag),
9597
},
9698
},
9799
},
98100
}
99101
}
100102

103+
type Etcd struct {
104+
// Image required for overriding etcd image details.
105+
//+optional
106+
Image *Image `json:"image,omitempty"`
107+
}
108+
109+
func (Etcd) VariableSchema() clusterv1.VariableSchema {
110+
return clusterv1.VariableSchema{
111+
OpenAPIV3Schema: clusterv1.JSONSchemaProps{
112+
Type: "object",
113+
Properties: map[string]clusterv1.JSONSchemaProps{
114+
"image": Image{}.VariableSchema().OpenAPIV3Schema,
115+
},
116+
},
117+
}
118+
}
119+
101120
// HTTPProxy required for providing proxy configuration.
102121
type HTTPProxy struct {
103122
// HTTP proxy.

api/v1alpha1/zz_generated.deepcopy.go

Lines changed: 24 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cmd/main.go

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import (
3232
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/etcd"
3333
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/extraapiservercertsans"
3434
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/httpproxy"
35-
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/kubernetesimageregistry"
35+
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/kubernetesimagerepository"
3636
"github.com/d2iq-labs/capi-runtime-extensions/pkg/handlers/servicelbgc"
3737
)
3838

@@ -127,8 +127,8 @@ func main() {
127127

128128
auditpolicy.NewPatch(),
129129

130-
kubernetesimageregistry.NewVariable(),
131-
kubernetesimageregistry.NewPatch(kubernetesimageregistry.VariableName),
130+
kubernetesimagerepository.NewVariable(),
131+
kubernetesimagerepository.NewPatch(kubernetesimagerepository.VariableName),
132132

133133
etcd.NewVariable(),
134134
etcd.NewPatch(etcd.VariableName),
@@ -142,9 +142,9 @@ func main() {
142142
extraapiservercertsans.VariableName,
143143
),
144144
auditpolicy.NewPatch(),
145-
kubernetesimageregistry.NewPatch(
145+
kubernetesimagerepository.NewPatch(
146146
clusterconfig.VariableName,
147-
kubernetesimageregistry.VariableName,
147+
kubernetesimagerepository.VariableName,
148148
),
149149
etcd.NewPatch(clusterconfig.VariableName, etcd.VariableName),
150150
),

common/pkg/openapi/patterns/distribution.go

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,15 @@ const (
77
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L53
88
NameSeparator = `(?:[._]|__|[-]+)`
99

10-
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L123C18-L123C65
10+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L123
1111
PathComponent = Alphanumeric + `(` + NameSeparator + Alphanumeric + `)*`
1212

13-
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L130
14-
ImageRegistry = `(` + DNS1123Subdomain + `|` + IPv6 + `)` + OptionalPort + `(/` + PathComponent + `)*`
13+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L125-L130
14+
ImageRepository = `(` + HostAndOptionalPort + `/)?` + PathComponent + `(/` + PathComponent + `)*`
15+
16+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L68
17+
Tag = `[\w][\w.-]{0,127}`
18+
19+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L81
20+
Digest = `[A-Za-z][A-Za-z0-9]*(?:[-_+.][A-Za-z][A-Za-z0-9]*)*[:][0-9A-Fa-f]{32,}`
1521
)

common/pkg/openapi/patterns/net.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,12 @@ const (
99

1010
Port = `:[0-9]+`
1111

12+
// See https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L65
1213
OptionalPort = `(` + Port + `)?`
14+
15+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L106
16+
Host = `(?:` + DNS1123Subdomain + `|` + IPv6 + `)`
17+
18+
// See: https://github.com/distribution/reference/blob/v0.5.0/regexp.go#L110
19+
HostAndOptionalPort = Host + OptionalPort
1320
)

docs/content/cluster-config.md

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,10 +35,11 @@ spec:
3535
variables:
3636
- name: clusterConfig
3737
value:
38-
kubernetesImageRegistry: "my-registry.io/my-org/my-repo"
38+
kubernetesImageRepository: "my-registry.io/my-org/my-repo"
3939
etcd:
40-
imageRepository: my-registry.io/my-org/my-repo
41-
imageTag: "v3.5.99_custom.0"
40+
image:
41+
repository: my-registry.io/my-org/my-repo
42+
tag: "v3.5.99_custom.0"
4243
extraAPIServerCertSANs:
4344
- a.b.c.example.com
4445
- d.e.f.example.com

docs/content/etcd.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,8 +31,9 @@ spec:
3131
variables:
3232
- name: etcd
3333
values:
34-
imageRepository: my-registry.io/my-org/my-repo
35-
imageTag: "v3.5.99_custom.0"
34+
image:
35+
repository: my-registry.io/my-org/my-repo
36+
tag: "v3.5.99_custom.0"
3637
```
3738
3839
Applying this configuration will result in the following value being set:

docs/content/kubernetes-image-registry.md renamed to docs/content/kubernetes-image-repository.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
---
2-
title: "Kubernete Image Registry"
2+
title: "Kubernete Image Repository"
33
---
44

55
Override the container image registry used when pulling Kubernetes images.
66

7-
To enable this handler set the `imageregistrypatch` and `imageregistryvars` external patches on `ClusterClass`.
7+
To enable this handler set the `imagerepositorypatch` and `imagerepositoryvars` external patches on `ClusterClass`.
88

99
```yaml
1010
apiVersion: cluster.x-k8s.io/v1beta1
@@ -13,10 +13,10 @@ metadata:
1313
name: <NAME>
1414
spec:
1515
patches:
16-
- name: image-registry
16+
- name: image-repository
1717
external:
18-
generateExtension: "imageregistrypatch.capi-runtime-extensions"
19-
discoverVariablesExtension: "imageregistryvars.capi-runtime-extensions"
18+
generateExtension: "imagerepositorypatch.capi-runtime-extensions"
19+
discoverVariablesExtension: "imagerepositoryvars.capi-runtime-extensions"
2020
```
2121
2222
On the cluster resource then specify desired Kubernetes image registry value:
@@ -29,7 +29,7 @@ metadata:
2929
spec:
3030
topology:
3131
variables:
32-
- name: kubernetesImageRegistry
32+
- name: kubernetesImageRepository
3333
value: "my-registry.io/my-org/my-repo"
3434
```
3535

pkg/handlers/etcd/inject.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -120,11 +120,11 @@ func (h *etcdPatchHandler) GeneratePatches(
120120
}
121121

122122
localEtcd := obj.Spec.Template.Spec.KubeadmConfigSpec.ClusterConfiguration.Etcd.Local
123-
if etcd.ImageTag != "" {
124-
localEtcd.ImageTag = etcd.ImageTag
123+
if etcd.Image != nil && etcd.Image.Tag != "" {
124+
localEtcd.ImageTag = etcd.Image.Tag
125125
}
126-
if etcd.ImageRepository != "" {
127-
localEtcd.ImageRepository = etcd.ImageRepository
126+
if etcd.Image != nil && etcd.Image.Repository != "" {
127+
localEtcd.ImageRepository = etcd.Image.Repository
128128
}
129129

130130
return nil

pkg/handlers/etcd/inject_test.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,10 @@ func TestGeneratePatches(t *testing.T) {
2727
capitest.VariableWithValue(
2828
VariableName,
2929
v1alpha1.Etcd{
30-
ImageRepository: "my-registry.io/my-org/my-repo",
31-
ImageTag: "v3.5.99_custom.0",
30+
Image: &v1alpha1.Image{
31+
Repository: "my-registry.io/my-org/my-repo",
32+
Tag: "v3.5.99_custom.0",
33+
},
3234
},
3335
),
3436
},
@@ -55,7 +57,9 @@ func TestGeneratePatches(t *testing.T) {
5557
capitest.VariableWithValue(
5658
VariableName,
5759
v1alpha1.Etcd{
58-
ImageRepository: "my-registry.io/my-org/my-repo",
60+
Image: &v1alpha1.Image{
61+
Repository: "my-registry.io/my-org/my-repo",
62+
},
5963
},
6064
),
6165
},
@@ -81,7 +85,9 @@ func TestGeneratePatches(t *testing.T) {
8185
capitest.VariableWithValue(
8286
VariableName,
8387
v1alpha1.Etcd{
84-
ImageTag: "v3.5.99_custom.0",
88+
Image: &v1alpha1.Image{
89+
Tag: "v3.5.99_custom.0",
90+
},
8591
},
8692
),
8793
},

pkg/handlers/etcd/variables_test.go

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,35 @@ func TestVariableValidation(t *testing.T) {
1919
ptr.To(v1alpha1.Etcd{}.VariableSchema()),
2020
NewVariable,
2121
capitest.VariableTestDef{
22-
Name: "set",
22+
Name: "unset",
23+
Vals: v1alpha1.Etcd{},
24+
},
25+
capitest.VariableTestDef{
26+
Name: "set with valid image values",
27+
Vals: v1alpha1.Etcd{
28+
Image: &v1alpha1.Image{
29+
Repository: "my-registry.io/my-org/my-repo",
30+
Tag: "v3.5.99_custom.0",
31+
},
32+
},
33+
},
34+
capitest.VariableTestDef{
35+
Name: "set with invalid image repository",
36+
Vals: v1alpha1.Etcd{
37+
Image: &v1alpha1.Image{
38+
Repository: "https://this.should.not.have.a.scheme",
39+
},
40+
},
41+
ExpectError: true,
42+
},
43+
capitest.VariableTestDef{
44+
Name: "set with invalid image tag",
2345
Vals: v1alpha1.Etcd{
24-
ImageRepository: "my-registry.io/my-org/my-repo",
25-
ImageTag: "v3.5.99_custom.0",
46+
Image: &v1alpha1.Image{
47+
Tag: "this:is:not:a:valid:tag",
48+
},
2649
},
50+
ExpectError: true,
2751
},
2852
)
2953
}

0 commit comments

Comments
 (0)