Skip to content

Commit cd3252c

Browse files
Use valid UUIDs for Korifi resources guids
* Do not prefix uuids for orgs, spaces and routes * Use uuidv5 for CFProcess guids for optimistic locking. The app GUID is used as a UUID namespace, the process type is used as name * Document the decision in an ADR fixes #2330, #2177 Co-authored-by: Danail Branekov <[email protected]>
1 parent 723ce24 commit cd3252c

36 files changed

+157
-95
lines changed

api/repositories/app_repository.go

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,6 @@ const (
3636
StartedState DesiredState = "STARTED"
3737
StoppedState DesiredState = "STOPPED"
3838

39-
Kind string = "CFApp"
40-
APIVersion string = "korifi.cloudfoundry.org/v1alpha1"
4139
CFAppGUIDLabel string = "korifi.cloudfoundry.org/app-guid"
4240
AppResourceType string = "App"
4341
AppEnvResourceType string = "App Env"
@@ -292,7 +290,7 @@ func (f *AppRepo) CreateApp(ctx context.Context, authInfo authorization.Info, ap
292290

293291
envSecret := &corev1.Secret{
294292
ObjectMeta: metav1.ObjectMeta{
295-
Name: GenerateEnvSecretName(cfApp.Name),
293+
Name: cfApp.Spec.EnvSecretName,
296294
Namespace: cfApp.Namespace,
297295
Labels: map[string]string{
298296
CFAppGUIDLabel: cfApp.Name,
@@ -388,16 +386,27 @@ func (f *AppRepo) ListApps(ctx context.Context, authInfo authorization.Info, mes
388386
}
389387

390388
func (f *AppRepo) PatchAppEnvVars(ctx context.Context, authInfo authorization.Info, message PatchAppEnvVarsMessage) (AppEnvVarsRecord, error) {
391-
secretObj := corev1.Secret{
389+
userClient, err := f.userClientFactory.BuildClient(authInfo)
390+
if err != nil {
391+
return AppEnvVarsRecord{}, fmt.Errorf("failed to build user client: %w", err)
392+
}
393+
394+
cfApp := &korifiv1alpha1.CFApp{
392395
ObjectMeta: metav1.ObjectMeta{
393-
Name: GenerateEnvSecretName(message.AppGUID),
394396
Namespace: message.SpaceGUID,
397+
Name: message.AppGUID,
395398
},
396399
}
397-
398-
userClient, err := f.userClientFactory.BuildClient(authInfo)
400+
err = userClient.Get(ctx, client.ObjectKeyFromObject(cfApp), cfApp)
399401
if err != nil {
400-
return AppEnvVarsRecord{}, fmt.Errorf("failed to build user client: %w", err)
402+
return AppEnvVarsRecord{}, apierrors.FromK8sError(err, AppEnvResourceType)
403+
}
404+
405+
secretObj := corev1.Secret{
406+
ObjectMeta: metav1.ObjectMeta{
407+
Name: cfApp.Spec.EnvSecretName,
408+
Namespace: message.SpaceGUID,
409+
},
401410
}
402411

403412
err = PatchResource(ctx, userClient, &secretObj, func() {
@@ -617,23 +626,18 @@ func getAppEnv(ctx context.Context, userClient client.Client, app AppRecord) (ma
617626
return appEnvMap, nil
618627
}
619628

620-
func GenerateEnvSecretName(appGUID string) string {
621-
return appGUID + "-env"
622-
}
623-
624629
func (m *CreateAppMessage) toCFApp() korifiv1alpha1.CFApp {
625-
guid := uuid.NewString()
626630
return korifiv1alpha1.CFApp{
627631
ObjectMeta: metav1.ObjectMeta{
628-
Name: guid,
632+
Name: uuid.NewString(),
629633
Namespace: m.SpaceGUID,
630634
Labels: m.Labels,
631635
Annotations: m.Annotations,
632636
},
633637
Spec: korifiv1alpha1.CFAppSpec{
634638
DisplayName: m.Name,
635639
DesiredState: korifiv1alpha1.AppState(m.State),
636-
EnvSecretName: GenerateEnvSecretName(guid),
640+
EnvSecretName: uuid.NewString(),
637641
Lifecycle: korifiv1alpha1.Lifecycle{
638642
Type: korifiv1alpha1.LifecycleType(m.Lifecycle.Type),
639643
Data: korifiv1alpha1.LifecycleData{

api/repositories/app_repository_test.go

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -742,21 +742,18 @@ var _ = Describe("AppRepository", func() {
742742
)
743743

744744
var (
745-
envSecretName string
746-
secretRecord repositories.AppEnvVarsRecord
747-
patchErr error
745+
secretRecord repositories.AppEnvVarsRecord
746+
patchErr error
748747
)
749748

750749
BeforeEach(func() {
751-
envSecretName = cfApp.Name + "-env"
752-
753750
envVars := map[string]string{
754751
key0: "VAL0",
755752
key1: "original-value",
756753
}
757754
secret := corev1.Secret{
758755
ObjectMeta: metav1.ObjectMeta{
759-
Name: repositories.GenerateEnvSecretName(cfApp.Name),
756+
Name: cfApp.Spec.EnvSecretName,
760757
Namespace: cfSpace.Name,
761758
},
762759
StringData: envVars,
@@ -796,13 +793,16 @@ var _ = Describe("AppRepository", func() {
796793
})
797794

798795
It("patches the underlying secret", func() {
799-
cfAppSecretLookupKey := types.NamespacedName{Name: envSecretName, Namespace: cfSpace.Name}
800-
801-
var updatedSecret corev1.Secret
802-
err := k8sClient.Get(ctx, cfAppSecretLookupKey, &updatedSecret)
796+
envSecret := corev1.Secret{
797+
ObjectMeta: metav1.ObjectMeta{
798+
Name: cfApp.Spec.EnvSecretName,
799+
Namespace: cfSpace.Name,
800+
},
801+
}
802+
err := k8sClient.Get(ctx, client.ObjectKeyFromObject(&envSecret), &envSecret)
803803
Expect(err).NotTo(HaveOccurred())
804804

805-
Expect(asMapOfStrings(updatedSecret.Data)).To(SatisfyAll(
805+
Expect(asMapOfStrings(envSecret.Data)).To(SatisfyAll(
806806
HaveLen(2),
807807
HaveKeyWithValue(key0, "VAL0"),
808808
HaveKeyWithValue(key2, "VAL2"),

api/repositories/build_repository.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,10 +197,9 @@ type CreateBuildMessage struct {
197197
}
198198

199199
func (m CreateBuildMessage) toCFBuild() korifiv1alpha1.CFBuild {
200-
guid := uuid.NewString()
201200
return korifiv1alpha1.CFBuild{
202201
ObjectMeta: metav1.ObjectMeta{
203-
Name: guid,
202+
Name: uuid.NewString(),
204203
Namespace: m.SpaceGUID,
205204
Labels: m.Labels,
206205
Annotations: m.Annotations,

api/repositories/build_repository_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -479,7 +479,7 @@ var _ = Describe("BuildRepository", func() {
479479
It("returns correct build record", func() {
480480
Expect(buildCreateErr).NotTo(HaveOccurred())
481481

482-
Expect(buildCreateRecord.GUID).NotTo(BeEmpty())
482+
Expect(buildCreateRecord.GUID).To(matchers.BeValidUUID())
483483
Expect(buildCreateRecord.Lifecycle.Type).To(Equal("docker"))
484484
Expect(buildCreateRecord.Lifecycle.Data).To(Equal(repositories.LifecycleData{}))
485485
})

api/repositories/domain_repository_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ var _ = Describe("DomainRepository", func() {
122122
Expect(createErr).NotTo(HaveOccurred())
123123

124124
createdDomainGUID := createdDomain.GUID
125-
Expect(createdDomainGUID).NotTo(BeEmpty())
125+
Expect(createdDomainGUID).To(matchers.BeValidUUID())
126126
Expect(createdDomain.Name).To(Equal("my.domain"))
127127
Expect(createdDomain.Labels).To(HaveKeyWithValue("foo", "bar"))
128128
Expect(createdDomain.Annotations).To(HaveKeyWithValue("bar", "baz"))

api/repositories/org_repository.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,6 @@ import (
2121
)
2222

2323
const (
24-
OrgPrefix = "cf-org-"
2524
OrgResourceType = "Org"
2625
)
2726

@@ -95,7 +94,7 @@ func (r *OrgRepo) CreateOrg(ctx context.Context, info authorization.Info, messag
9594

9695
cfOrg := &korifiv1alpha1.CFOrg{
9796
ObjectMeta: metav1.ObjectMeta{
98-
Name: OrgPrefix + uuid.NewString(),
97+
Name: uuid.NewString(),
9998
Namespace: r.rootNamespace,
10099
Labels: message.Labels,
101100
Annotations: message.Annotations,

api/repositories/org_repository_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,7 @@ var _ = Describe("OrgRepository", func() {
109109
Expect(createErr).NotTo(HaveOccurred())
110110

111111
Expect(orgRecord.Name).To(Equal(orgGUID))
112-
Expect(orgRecord.GUID).To(HavePrefix("cf-org-"))
112+
Expect(orgRecord.GUID).To(matchers.BeValidUUID())
113113
Expect(orgRecord.CreatedAt).To(BeTemporally("~", time.Now(), timeCheckThreshold))
114114
Expect(orgRecord.UpdatedAt).To(PointTo(BeTemporally("~", time.Now(), timeCheckThreshold)))
115115
Expect(orgRecord.DeletedAt).To(BeNil())

api/repositories/package_repository.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,14 +172,13 @@ type PackageData struct {
172172
}
173173

174174
func (message CreatePackageMessage) toCFPackage() *korifiv1alpha1.CFPackage {
175-
packageGUID := uuid.NewString()
176175
pkg := &korifiv1alpha1.CFPackage{
177176
TypeMeta: metav1.TypeMeta{
178177
Kind: kind,
179178
APIVersion: korifiv1alpha1.SchemeGroupVersion.Identifier(),
180179
},
181180
ObjectMeta: metav1.ObjectMeta{
182-
Name: packageGUID,
181+
Name: uuid.NewString(),
183182
Namespace: message.SpaceGUID,
184183
Labels: message.Metadata.Labels,
185184
Annotations: message.Metadata.Annotations,

api/repositories/package_repository_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ var _ = Describe("PackageRepository", func() {
152152
Expect(createErr).NotTo(HaveOccurred())
153153

154154
packageGUID := createdPackage.GUID
155-
Expect(packageGUID).NotTo(BeEmpty())
155+
Expect(packageGUID).To(matchers.BeValidUUID())
156156
Expect(createdPackage.Type).To(Equal("bits"))
157157
Expect(createdPackage.AppGUID).To(Equal(appGUID))
158158
Expect(createdPackage.State).To(Equal("AWAITING_UPLOAD"))
@@ -244,7 +244,7 @@ var _ = Describe("PackageRepository", func() {
244244
Expect(createErr).NotTo(HaveOccurred())
245245

246246
packageGUID := createdPackage.GUID
247-
Expect(packageGUID).NotTo(BeEmpty())
247+
Expect(packageGUID).To(matchers.BeValidUUID())
248248
Expect(createdPackage.Type).To(Equal("docker"))
249249
Expect(createdPackage.AppGUID).To(Equal(appGUID))
250250
Expect(createdPackage.Labels).To(HaveKeyWithValue("bob", "foo"))

api/repositories/process_repository.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,7 @@ func (r *ProcessRepo) CreateProcess(ctx context.Context, authInfo authorization.
217217
process := &korifiv1alpha1.CFProcess{
218218
ObjectMeta: metav1.ObjectMeta{
219219
Namespace: message.SpaceGUID,
220+
Name: tools.NamespacedUUID(message.AppGUID, message.Type),
220221
},
221222
Spec: korifiv1alpha1.CFProcessSpec{
222223
AppRef: corev1.LocalObjectReference{Name: message.AppGUID},
@@ -231,7 +232,6 @@ func (r *ProcessRepo) CreateProcess(ctx context.Context, authInfo authorization.
231232
DiskQuotaMB: message.DiskQuotaMB,
232233
},
233234
}
234-
process.SetStableName(message.AppGUID)
235235
err = userClient.Create(ctx, process)
236236
return apierrors.FromK8sError(err, ProcessResourceType)
237237
}

0 commit comments

Comments
 (0)