Skip to content

Commit 845efc5

Browse files
authored
fix(sdk): set worker name max length to 63 characters (#6097)
1 parent e0def48 commit 845efc5

File tree

8 files changed

+83
-115
lines changed

8 files changed

+83
-115
lines changed

engine/api/event/event.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ func Initialize(ctx context.Context, db *gorp.DbMap, cache Store, config *Config
116116
}
117117
// generates an API name. api_foo_bar, only 3 first letters to have a readable status
118118
cdsname = "api_"
119-
for _, v := range strings.Split(namesgenerator.GetRandomNameCDS(0), "_") {
119+
for _, v := range strings.Split(namesgenerator.GetRandomNameCDS(), "_") {
120120
if len(v) > 3 {
121121
cdsname += v[:3]
122122
} else {

engine/config.go

+12-12
Original file line numberDiff line numberDiff line change
@@ -67,41 +67,41 @@ func configBootstrap(args []string) Configuration {
6767
switch a {
6868
case sdk.TypeAPI:
6969
conf.API = &api.Configuration{}
70-
conf.API.Name = "cds-api-" + namesgenerator.GetRandomNameCDS(0)
70+
conf.API.Name = "cds-api-" + namesgenerator.GetRandomNameCDS()
7171
defaults.SetDefaults(conf.API)
7272
conf.API.Database.Schema = "public"
7373
conf.API.HTTP.Port = 8081
7474
case sdk.TypeUI:
7575
conf.UI = &ui.Configuration{}
76-
conf.UI.Name = "cds-ui-" + namesgenerator.GetRandomNameCDS(0)
76+
conf.UI.Name = "cds-ui-" + namesgenerator.GetRandomNameCDS()
7777
defaults.SetDefaults(conf.UI)
7878
conf.UI.HTTP.Port = 8080
7979
case "migrate":
8080
conf.DatabaseMigrate = &migrateservice.Configuration{}
8181
defaults.SetDefaults(conf.DatabaseMigrate)
82-
conf.DatabaseMigrate.Name = "cds-migrate-" + namesgenerator.GetRandomNameCDS(0)
82+
conf.DatabaseMigrate.Name = "cds-migrate-" + namesgenerator.GetRandomNameCDS()
8383
conf.DatabaseMigrate.ServiceAPI.DB.Schema = "public"
8484
conf.DatabaseMigrate.ServiceCDN.DB.Schema = "cdn"
8585
conf.DatabaseMigrate.HTTP.Port = 8087
8686
case sdk.TypeHatchery + ":local":
8787
conf.Hatchery.Local = &local.HatcheryConfiguration{}
8888
defaults.SetDefaults(conf.Hatchery.Local)
89-
conf.Hatchery.Local.Name = "cds-hatchery-local-" + namesgenerator.GetRandomNameCDS(0)
89+
conf.Hatchery.Local.Name = "cds-hatchery-local-" + namesgenerator.GetRandomNameCDS()
9090
conf.Hatchery.Local.HTTP.Port = 8086
9191
case sdk.TypeHatchery + ":kubernetes":
9292
conf.Hatchery.Kubernetes = &kubernetes.HatcheryConfiguration{}
9393
defaults.SetDefaults(conf.Hatchery.Kubernetes)
94-
conf.Hatchery.Kubernetes.Name = "cds-hatchery-kubernetes-" + namesgenerator.GetRandomNameCDS(0)
94+
conf.Hatchery.Kubernetes.Name = "cds-hatchery-kubernetes-" + namesgenerator.GetRandomNameCDS()
9595
conf.Hatchery.Kubernetes.HTTP.Port = 8086
9696
case sdk.TypeHatchery + ":marathon":
9797
conf.Hatchery.Marathon = &marathon.HatcheryConfiguration{}
9898
defaults.SetDefaults(conf.Hatchery.Marathon)
99-
conf.Hatchery.Marathon.Name = "cds-hatchery-marathon-" + namesgenerator.GetRandomNameCDS(0)
99+
conf.Hatchery.Marathon.Name = "cds-hatchery-marathon-" + namesgenerator.GetRandomNameCDS()
100100
conf.Hatchery.Marathon.HTTP.Port = 8086
101101
case sdk.TypeHatchery + ":openstack":
102102
conf.Hatchery.Openstack = &openstack.HatcheryConfiguration{}
103103
defaults.SetDefaults(conf.Hatchery.Openstack)
104-
conf.Hatchery.Openstack.Name = "cds-hatchery-openstack-" + namesgenerator.GetRandomNameCDS(0)
104+
conf.Hatchery.Openstack.Name = "cds-hatchery-openstack-" + namesgenerator.GetRandomNameCDS()
105105
conf.Hatchery.Openstack.HTTP.Port = 8086
106106
case sdk.TypeHatchery + ":swarm":
107107
conf.Hatchery.Swarm = &swarm.HatcheryConfiguration{}
@@ -111,20 +111,20 @@ func configBootstrap(args []string) Configuration {
111111
Host: "unix:///var/run/docker.sock",
112112
},
113113
}
114-
conf.Hatchery.Swarm.Name = "cds-hatchery-swarm-" + namesgenerator.GetRandomNameCDS(0)
114+
conf.Hatchery.Swarm.Name = "cds-hatchery-swarm-" + namesgenerator.GetRandomNameCDS()
115115
conf.Hatchery.Swarm.HTTP.Port = 8086
116116
conf.Hatchery.Swarm.RegistryCredentials = []swarm.RegistryCredential{{
117117
Domain: "docker.io",
118118
}}
119119
case sdk.TypeHatchery + ":vsphere":
120120
conf.Hatchery.VSphere = &vsphere.HatcheryConfiguration{}
121121
defaults.SetDefaults(conf.Hatchery.VSphere)
122-
conf.Hatchery.VSphere.Name = "cds-hatchery-vsphere-" + namesgenerator.GetRandomNameCDS(0)
122+
conf.Hatchery.VSphere.Name = "cds-hatchery-vsphere-" + namesgenerator.GetRandomNameCDS()
123123
conf.Hatchery.VSphere.HTTP.Port = 8086
124124
case sdk.TypeHooks:
125125
conf.Hooks = &hooks.Configuration{}
126126
defaults.SetDefaults(conf.Hooks)
127-
conf.Hooks.Name = "cds-hooks-" + namesgenerator.GetRandomNameCDS(0)
127+
conf.Hooks.Name = "cds-hooks-" + namesgenerator.GetRandomNameCDS()
128128
conf.Hooks.HTTP.Port = 8083
129129
case sdk.TypeVCS:
130130
conf.VCS = &vcs.Configuration{}
@@ -146,12 +146,12 @@ func configBootstrap(args []string) Configuration {
146146
"gitlab": {URL: "https://gitlab.com", Gitlab: &gitlab},
147147
"gerrit": {URL: "http://localhost:8080", Gerrit: &gerrit},
148148
}
149-
conf.VCS.Name = "cds-vcs-" + namesgenerator.GetRandomNameCDS(0)
149+
conf.VCS.Name = "cds-vcs-" + namesgenerator.GetRandomNameCDS()
150150
conf.VCS.HTTP.Port = 8084
151151
case sdk.TypeRepositories:
152152
conf.Repositories = &repositories.Configuration{}
153153
defaults.SetDefaults(conf.Repositories)
154-
conf.Repositories.Name = "cds-repositories-" + namesgenerator.GetRandomNameCDS(0)
154+
conf.Repositories.Name = "cds-repositories-" + namesgenerator.GetRandomNameCDS()
155155
conf.Repositories.HTTP.Port = 8085
156156
case sdk.TypeCDN:
157157
conf.CDN = &cdn.Configuration{}

engine/hatchery/kubernetes/kubernetes_client.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ func (k *kubernetesClient) PodDelete(ctx context.Context, ns string, name string
140140

141141
func (k *kubernetesClient) PodList(ctx context.Context, ns string, opts metav1.ListOptions) (*corev1.PodList, error) {
142142
ctx = context.WithValue(ctx, logNS, ns)
143-
log.Info(ctx, "listing pod")
143+
log.Info(ctx, "listing pod in namespace %s", ns)
144144
pods, err := k.client.CoreV1().Pods(ns).List(ctx, opts)
145145
return pods, sdk.WrapError(err, "unable to list pods in namespace %s", ns)
146146
}

engine/hatchery/vsphere/hatchery.go

+1-8
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"github.com/ovh/cds/sdk/cdsclient"
2020
"github.com/ovh/cds/sdk/hatchery"
2121
"github.com/ovh/cds/sdk/namesgenerator"
22-
"github.com/ovh/cds/sdk/slug"
2322
)
2423

2524
// New instanciates a new Hatchery vsphere
@@ -416,13 +415,7 @@ func (h *HatcheryVSphere) provisioning(ctx context.Context) {
416415
log.Info(ctx, "model %q provisioning: %d/%d", modelPath, mapAlreadyProvisionned[modelPath], number)
417416

418417
for i := 0; i < int(number)-mapAlreadyProvisionned[modelPath]; i++ {
419-
var nameFirstPart = "provision-" + modelPath
420-
if len(nameFirstPart) > maxLength-10 {
421-
nameFirstPart = nameFirstPart[:maxLength-10]
422-
}
423-
var remainingLength = maxLength - len(nameFirstPart) - 1
424-
random := namesgenerator.GetRandomNameCDSWithMaxLength(remainingLength)
425-
workerName := slug.Convert(fmt.Sprintf("%s-%s", nameFirstPart, random))
418+
workerName := namesgenerator.GenerateWorkerName(modelPath, "provision")
426419

427420
h.cacheProvisioning.mu.Lock()
428421
h.cacheProvisioning.pending = append(h.cacheProvisioning.pending, workerName)

sdk/hatchery/starter.go

+2-24
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import (
1010
"github.com/ovh/cds/sdk"
1111
cdslog "github.com/ovh/cds/sdk/log"
1212
"github.com/ovh/cds/sdk/namesgenerator"
13-
"github.com/ovh/cds/sdk/slug"
1413
"github.com/ovh/cds/sdk/telemetry"
1514
"github.com/rockbears/log"
1615
)
@@ -58,7 +57,7 @@ func workerStarter(ctx context.Context, h Interface, workerNum string, jobs <-ch
5857
continue
5958
}
6059

61-
workerName := generateWorkerName(h.Service().Name, true, m.Name)
60+
workerName := namesgenerator.GenerateWorkerName(m.Name, "register")
6261

6362
atomic.AddInt64(&nbWorkerToStart, 1)
6463
// increment nbRegisteringWorkerModels, but no decrement.
@@ -168,7 +167,7 @@ func spawnWorkerForJob(ctx context.Context, h Interface, j workerStarterRequest)
168167
})
169168
next()
170169

171-
workerName := generateWorkerName(h.Service().Name, false, modelName)
170+
workerName := namesgenerator.GenerateWorkerName(modelName, "")
172171

173172
ctxSpawnWorker, next := telemetry.Span(ctx, "hatchery.SpawnWorker", telemetry.Tag(telemetry.TagWorker, workerName))
174173
arg := SpawnArguments{
@@ -226,24 +225,3 @@ func spawnWorkerForJob(ctx context.Context, h Interface, j workerStarterRequest)
226225
}
227226
return true // ok for this job
228227
}
229-
230-
// a worker name must be 60 char max, without '.' and '_', "/" -> replaced by '-'
231-
const maxLength = 64
232-
233-
func generateWorkerName(hatcheryName string, isRegister bool, modelName string) string {
234-
prefix := ""
235-
if isRegister {
236-
prefix = "register-"
237-
}
238-
239-
var nameFirstPart = fmt.Sprintf("%s%s", prefix, modelName)
240-
if len(nameFirstPart) > maxLength-10 {
241-
nameFirstPart = nameFirstPart[:maxLength-10]
242-
}
243-
var remainingLength = maxLength - len(nameFirstPart) - 1
244-
245-
random := namesgenerator.GetRandomNameCDSWithMaxLength(remainingLength)
246-
workerName := fmt.Sprintf("%s-%s", nameFirstPart, random)
247-
248-
return slug.Convert(workerName)
249-
}

sdk/hatchery/starter_test.go

-52
This file was deleted.

sdk/namesgenerator/namesgenerator.go

+20-6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,8 @@ import (
66
"fmt"
77
"math/rand"
88
"time"
9+
10+
"github.com/ovh/cds/sdk/slug"
911
)
1012

1113
func init() {
@@ -847,7 +849,7 @@ begin:
847849
//
848850

849851
// GetRandomNameCDS generates a random name from the list of adjectives and surnames in this package
850-
func GetRandomNameCDS(retry int) string {
852+
func GetRandomNameCDS() string {
851853
format := rand.Intn(3)
852854
var name string
853855
switch format {
@@ -858,10 +860,6 @@ func GetRandomNameCDS(retry int) string {
858860
default:
859861
name = fmt.Sprintf("%s_%s", left[rand.Intn(len(left))], right[rand.Intn(len(right))])
860862
}
861-
862-
if retry > 0 {
863-
name = fmt.Sprintf("%s%d", name, rand.Intn(10))
864-
}
865863
return name
866864
}
867865

@@ -874,9 +872,25 @@ func GetRandomNameCDSWithMaxLength(maxLength int) string {
874872
return s[:maxLength]
875873
}
876874
for {
877-
var s = GetRandomNameCDS(0)
875+
var s = GetRandomNameCDS()
878876
if len(s) <= maxLength {
879877
return s
880878
}
881879
}
882880
}
881+
882+
// A worker name must be 63 char max, without '.' and '_', "/" -> replaced by '-'
883+
const maxWorkerNameLength = 63
884+
885+
func GenerateWorkerName(model, prefix string) string {
886+
nameFirstPart := model
887+
if len(prefix) > 0 {
888+
nameFirstPart = prefix + "-" + model
889+
}
890+
if len(nameFirstPart) > maxWorkerNameLength-10 {
891+
nameFirstPart = nameFirstPart[:maxWorkerNameLength-10]
892+
}
893+
remainingLength := maxWorkerNameLength - len(nameFirstPart) - 1
894+
random := GetRandomNameCDSWithMaxLength(remainingLength)
895+
return slug.Convert(nameFirstPart + "-" + random)
896+
}

sdk/namesgenerator/namesgenerator_test.go

+46-11
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ import (
66
)
77

88
func TestNameFormat(t *testing.T) {
9-
name := GetRandomNameCDS(0)
9+
name := GetRandomNameCDS()
1010
if !strings.Contains(name, "_") {
1111
t.Fatalf("Generated name does not contain an underscore")
1212
}
@@ -16,16 +16,6 @@ func TestNameFormat(t *testing.T) {
1616
}
1717
}
1818

19-
func TestNameRetries(t *testing.T) {
20-
name := GetRandomNameCDS(1)
21-
if !strings.Contains(name, "_") {
22-
t.Fatalf("Generated name does not contain an underscore")
23-
}
24-
if !strings.ContainsAny(name, "0123456789") {
25-
t.Fatalf("Generated name doesn't contain a number")
26-
}
27-
}
28-
2919
func TestGetRandomNameCDSWithMaxLength(t *testing.T) {
3020
type args struct {
3121
maxLength int
@@ -57,3 +47,48 @@ func TestGetRandomNameCDSWithMaxLength(t *testing.T) {
5747
})
5848
}
5949
}
50+
51+
func Test_GenerateWorkerName(t *testing.T) {
52+
type args struct {
53+
prefix string
54+
model string
55+
}
56+
tests := []struct {
57+
name string
58+
args args
59+
wantPrefix string
60+
}{
61+
{
62+
name: "simple",
63+
args: args{prefix: "register", model: "rust-official-1.41"},
64+
wantPrefix: "register-rust-official-1-41",
65+
},
66+
{
67+
name: "simple special char",
68+
args: args{prefix: "register", model: "shared.infra-rust-official-1.41"},
69+
wantPrefix: "register-shared-infra-rust-official-1-41",
70+
},
71+
{
72+
name: "long hatchery name",
73+
args: args{prefix: "register", model: "shared.infra-rust-official-1.41"},
74+
wantPrefix: "register-shared-infra-rust-official-1-41",
75+
},
76+
{
77+
name: "long model name",
78+
args: args{prefix: "register", model: "shared.infra-rust-official-1.41-xxx-xxx-xxx-xxx"},
79+
wantPrefix: "register-shared-infra-rust-official-1-41-xxx-xxx-xxx",
80+
},
81+
}
82+
for _, tt := range tests {
83+
t.Run(tt.name, func(t *testing.T) {
84+
got := GenerateWorkerName(tt.args.model, tt.args.prefix)
85+
if len(got) > 63 {
86+
t.Errorf("len must be < 63() = %d - got: %s", len(got), got)
87+
}
88+
89+
if !strings.HasPrefix(got, tt.wantPrefix) {
90+
t.Errorf("GenerateWorkerName() = %s, want prefix: %s", got, tt.wantPrefix)
91+
}
92+
})
93+
}
94+
}

0 commit comments

Comments
 (0)