Skip to content

Commit 22e3535

Browse files
committed
wip
Signed-off-by: Daniil Loktev <[email protected]>
1 parent ca21d7d commit 22e3535

File tree

2 files changed

+133
-26
lines changed

2 files changed

+133
-26
lines changed

images/virtualization-artifact/pkg/controller/supplements/generator.go

Lines changed: 36 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,20 @@ import (
2020
"fmt"
2121

2222
"k8s.io/apimachinery/pkg/types"
23+
kvalidation "k8s.io/apimachinery/pkg/util/validation"
24+
"k8s.io/utils/strings"
25+
)
26+
27+
const (
28+
tplCommon = "d8v-%s-%s-%s"
29+
tplDVCRAuthSecret = "d8v-%s-dvcr-auth-%s-%s"
30+
tplDVCRCABundle = "d8v-%s-dvcr-ca-%s-%s"
31+
tplCABundle = "d8v-%s-ca-%s-%s"
32+
tplImagePullSecret = "d8v-%s-pull-image-%s-%s"
33+
tplImporterPod = "d8v-%s-importer-%s-%s"
34+
tplBounderPod = "d8v-%s-bounder-%s-%s"
35+
tplUploaderPod = "d8v-%s-uploader-%s-%s"
36+
tplUploaderTLSSecret = "d8v-%s-tls-%s-%s"
2337
)
2438

2539
// Generator calculates names for supplemental resources, e.g. ImporterPod, AuthSecret or CABundleConfigMap.
@@ -33,78 +47,75 @@ func NewGenerator(prefix, name, namespace string, uid types.UID) *Generator {
3347
}
3448
}
3549

50+
func (g *Generator) generateName(template string, maxLength int) types.NamespacedName {
51+
maxNameLen := maxLength - len(template) + 6 - len(g.Prefix) - len(g.UID) // 6 is for %s placeholders
52+
name := fmt.Sprintf(template, g.Prefix, strings.ShortenString(g.Name, maxNameLen), g.UID)
53+
return types.NamespacedName{
54+
Name: name,
55+
Namespace: g.Namespace,
56+
}
57+
}
58+
3659
// DVCRAuthSecret returns name and namespace for auth Secret copy.
3760
func (g *Generator) DVCRAuthSecret() types.NamespacedName {
38-
name := fmt.Sprintf("d8v-%s-dvcr-auth-%s-%s", g.Prefix, g.Name, g.UID)
39-
return g.shortenNamespaced(name)
61+
return g.generateName(tplDVCRAuthSecret, kvalidation.DNS1123SubdomainMaxLength)
4062
}
4163

4264
// DVCRAuthSecretForDV returns name and namespace for auth Secret copy
4365
// compatible with DataVolume: with accessKeyId and secretKey fields.
4466
func (g *Generator) DVCRAuthSecretForDV() types.NamespacedName {
45-
name := fmt.Sprintf("d8v-%s-dvcr-auth-%s-%s", g.Prefix, g.Name, g.UID)
46-
return g.shortenNamespaced(name)
67+
return g.generateName(tplDVCRAuthSecret, kvalidation.DNS1123SubdomainMaxLength)
4768
}
4869

4970
// DVCRCABundleConfigMapForDV returns name and namespace for ConfigMap with ca.crt.
5071
func (g *Generator) DVCRCABundleConfigMapForDV() types.NamespacedName {
51-
name := fmt.Sprintf("d8v-%s-dvcr-ca-%s-%s", g.Prefix, g.Name, g.UID)
52-
return g.shortenNamespaced(name)
72+
return g.generateName(tplDVCRCABundle, kvalidation.DNS1123SubdomainMaxLength)
5373
}
5474

5575
// CABundleConfigMap returns name and namespace for ConfigMap which contains caBundle from dataSource.
5676
func (g *Generator) CABundleConfigMap() types.NamespacedName {
57-
name := fmt.Sprintf("d8v-%s-ca-%s-%s", g.Prefix, g.Name, g.UID)
58-
return g.shortenNamespaced(name)
77+
return g.generateName(tplCABundle, kvalidation.DNS1123SubdomainMaxLength)
5978
}
6079

6180
// ImagePullSecret returns name and namespace for image pull secret for the containerImage dataSource.
6281
func (g *Generator) ImagePullSecret() types.NamespacedName {
63-
name := fmt.Sprintf("d8v-%s-pull-image-%s-%s", g.Prefix, g.Name, g.UID)
64-
return g.shortenNamespaced(name)
82+
return g.generateName(tplImagePullSecret, kvalidation.DNS1123SubdomainMaxLength)
6583
}
6684

6785
// ImporterPod generates name for importer Pod.
6886
func (g *Generator) ImporterPod() types.NamespacedName {
69-
name := fmt.Sprintf("d8v-%s-importer-%s-%s", g.Prefix, g.Name, g.UID)
70-
return g.shortenNamespaced(name)
87+
return g.generateName(tplImporterPod, kvalidation.DNS1123SubdomainMaxLength)
7188
}
7289

7390
// BounderPod generates name for bounder Pod.
7491
func (g *Generator) BounderPod() types.NamespacedName {
75-
name := fmt.Sprintf("d8v-%s-bounder-%s-%s", g.Prefix, g.Name, g.UID)
76-
return g.shortenNamespaced(name)
92+
return g.generateName(tplBounderPod, kvalidation.DNS1123SubdomainMaxLength)
7793
}
7894

7995
// UploaderPod generates name for uploader Pod.
8096
func (g *Generator) UploaderPod() types.NamespacedName {
81-
name := fmt.Sprintf("d8v-%s-uploader-%s-%s", g.Prefix, g.Name, g.UID)
82-
return g.shortenNamespaced(name)
97+
return g.generateName(tplUploaderPod, kvalidation.DNS1123SubdomainMaxLength)
8398
}
8499

85100
// UploaderService generates name for uploader Service.
86101
func (g *Generator) UploaderService() types.NamespacedName {
87-
name := fmt.Sprintf("d8v-%s-%s-%s", g.Prefix, g.Name, g.UID)
88-
return g.shortenNamespaced(name)
102+
return g.generateName(tplCommon, kvalidation.DNS1123LabelMaxLength)
89103
}
90104

91105
// UploaderIngress generates name for uploader Ingress.
92106
func (g *Generator) UploaderIngress() types.NamespacedName {
93-
name := fmt.Sprintf("d8v-%s-%s-%s", g.Prefix, g.Name, g.UID)
94-
return g.shortenNamespaced(name)
107+
return g.generateName(tplCommon, kvalidation.DNS1123SubdomainMaxLength)
95108
}
96109

97110
// UploaderTLSSecretForIngress generates name for uploader tls secret.
98111
func (g *Generator) UploaderTLSSecretForIngress() types.NamespacedName {
99-
name := fmt.Sprintf("d8v-%s-tls-%s-%s", g.Prefix, g.Name, g.UID)
100-
return g.shortenNamespaced(name)
112+
return g.generateName(tplUploaderTLSSecret, kvalidation.DNS1123SubdomainMaxLength)
101113
}
102114

103115
// DataVolume generates name for underlying DataVolume.
104116
// DataVolume is always one for vmd/vmi, so prefix is used.
105117
func (g *Generator) DataVolume() types.NamespacedName {
106-
dvName := fmt.Sprintf("d8v-%s-%s-%s", g.Prefix, g.Name, g.UID)
107-
return g.shortenNamespaced(dvName)
118+
return g.generateName(tplCommon, kvalidation.DNS1123SubdomainMaxLength)
108119
}
109120

110121
func (g *Generator) PersistentVolumeClaim() types.NamespacedName {
@@ -113,6 +124,5 @@ func (g *Generator) PersistentVolumeClaim() types.NamespacedName {
113124

114125
// NetworkPolicy generates name for NetworkPolicy.
115126
func (g *Generator) NetworkPolicy() types.NamespacedName {
116-
name := fmt.Sprintf("d8v-%s-%s-%s", g.Prefix, g.Name, g.UID)
117-
return g.shortenNamespaced(name)
127+
return g.generateName(tplCommon, kvalidation.DNS1123SubdomainMaxLength)
118128
}
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
/*
2+
Copyright 2025 Flant JSC
3+
4+
Licensed under the Apache License, Version 2.0 (the "License");
5+
you may not use this file except in compliance with the License.
6+
You may obtain a copy of the License at
7+
8+
http://www.apache.org/licenses/LICENSE-2.0
9+
10+
Unless required by applicable law or agreed to in writing, software
11+
distributed under the License is distributed on an "AS IS" BASIS,
12+
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
See the License for the specific language governing permissions and
14+
limitations under the License.
15+
*/
16+
17+
package supplements
18+
19+
import (
20+
"strings"
21+
22+
. "github.com/onsi/ginkgo/v2"
23+
. "github.com/onsi/gomega"
24+
"k8s.io/apimachinery/pkg/types"
25+
kvalidation "k8s.io/apimachinery/pkg/util/validation"
26+
)
27+
28+
var _ = Describe("Generator", func() {
29+
var (
30+
gen *Generator
31+
prefix string
32+
namespace string
33+
uid types.UID
34+
)
35+
36+
BeforeEach(func() {
37+
prefix = "vi"
38+
namespace = "default"
39+
uid = types.UID("12345678-1234-1234-1234-123456789012")
40+
})
41+
42+
Context("Name shortening", func() {
43+
DescribeTable("should handle short names without truncation",
44+
func(method func(*Generator) types.NamespacedName, expectedPrefix string) {
45+
name := "test-image"
46+
gen = NewGenerator(prefix, name, namespace, uid)
47+
result := method(gen)
48+
49+
Expect(result.Name).To(HavePrefix("d8v-"))
50+
Expect(result.Name).To(ContainSubstring(expectedPrefix))
51+
Expect(result.Name).To(ContainSubstring(name))
52+
Expect(result.Name).To(HaveSuffix(string(uid)))
53+
},
54+
Entry("DVCRAuthSecret", (*Generator).DVCRAuthSecret, "dvcr-auth"),
55+
Entry("DVCRAuthSecretForDV", (*Generator).DVCRAuthSecretForDV, "dvcr-auth"),
56+
Entry("DVCRCABundleConfigMapForDV", (*Generator).DVCRCABundleConfigMapForDV, "dvcr-ca"),
57+
Entry("CABundleConfigMap", (*Generator).CABundleConfigMap, "ca"),
58+
Entry("ImagePullSecret", (*Generator).ImagePullSecret, "pull-image"),
59+
Entry("ImporterPod", (*Generator).ImporterPod, "importer"),
60+
Entry("BounderPod", (*Generator).BounderPod, "bounder"),
61+
Entry("UploaderPod", (*Generator).UploaderPod, "uploader"),
62+
Entry("UploaderService", (*Generator).UploaderService, "vi"),
63+
Entry("UploaderIngress", (*Generator).UploaderIngress, "vi"),
64+
Entry("UploaderTLSSecret", (*Generator).UploaderTLSSecretForIngress, "tls"),
65+
Entry("DataVolume", (*Generator).DataVolume, "vi"),
66+
Entry("PersistentVolumeClaim", (*Generator).PersistentVolumeClaim, "vi"),
67+
Entry("NetworkPolicy", (*Generator).NetworkPolicy, "vi"),
68+
)
69+
70+
DescribeTable("should truncate long names to respect limits",
71+
func(method func(*Generator) types.NamespacedName, maxLength int) {
72+
name := strings.Repeat("very-long-resource-name-", 30)
73+
gen = NewGenerator(prefix, name, namespace, uid)
74+
result := method(gen)
75+
76+
Expect(len(result.Name)).To(BeNumerically("<=", maxLength))
77+
Expect(result.Name).To(HavePrefix("d8v-"))
78+
Expect(result.Name).To(ContainSubstring(string(uid)))
79+
},
80+
Entry("DVCRAuthSecret - 253 limit", (*Generator).DVCRAuthSecret, kvalidation.DNS1123SubdomainMaxLength),
81+
Entry("DVCRAuthSecretForDV - 253 limit", (*Generator).DVCRAuthSecretForDV, kvalidation.DNS1123SubdomainMaxLength),
82+
Entry("DVCRCABundleConfigMapForDV - 253 limit", (*Generator).DVCRCABundleConfigMapForDV, kvalidation.DNS1123SubdomainMaxLength),
83+
Entry("CABundleConfigMap - 253 limit", (*Generator).CABundleConfigMap, kvalidation.DNS1123SubdomainMaxLength),
84+
Entry("ImagePullSecret - 253 limit", (*Generator).ImagePullSecret, kvalidation.DNS1123SubdomainMaxLength),
85+
Entry("ImporterPod - 253 limit", (*Generator).ImporterPod, kvalidation.DNS1123SubdomainMaxLength),
86+
Entry("BounderPod - 253 limit", (*Generator).BounderPod, kvalidation.DNS1123SubdomainMaxLength),
87+
Entry("UploaderPod - 253 limit", (*Generator).UploaderPod, kvalidation.DNS1123SubdomainMaxLength),
88+
Entry("UploaderService - 63 limit", (*Generator).UploaderService, kvalidation.DNS1123LabelMaxLength),
89+
Entry("UploaderIngress - 253 limit", (*Generator).UploaderIngress, kvalidation.DNS1123SubdomainMaxLength),
90+
Entry("UploaderTLSSecret - 253 limit", (*Generator).UploaderTLSSecretForIngress, kvalidation.DNS1123SubdomainMaxLength),
91+
Entry("DataVolume - 253 limit", (*Generator).DataVolume, kvalidation.DNS1123SubdomainMaxLength),
92+
Entry("PersistentVolumeClaim - 253 limit", (*Generator).PersistentVolumeClaim, kvalidation.DNS1123SubdomainMaxLength),
93+
Entry("NetworkPolicy - 253 limit", (*Generator).NetworkPolicy, kvalidation.DNS1123SubdomainMaxLength),
94+
)
95+
})
96+
})
97+

0 commit comments

Comments
 (0)