Skip to content

Commit 83467cd

Browse files
Fix creation of aw/job with same name in different namespaces
1 parent 7f3eda5 commit 83467cd

File tree

4 files changed

+46
-28
lines changed

4 files changed

+46
-28
lines changed

go.mod

+2-2
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,9 @@ require (
1818
k8s.io/client-go v0.26.2
1919
k8s.io/klog/v2 v2.90.1
2020
k8s.io/metrics v0.26.2
21+
k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5
2122
sigs.k8s.io/custom-metrics-apiserver v0.0.0
23+
sigs.k8s.io/structured-merge-diff/v4 v4.2.3
2224
)
2325

2426
replace sigs.k8s.io/custom-metrics-apiserver => sigs.k8s.io/custom-metrics-apiserver v1.25.1-0.20230306170449-63d8c93851f3
@@ -107,9 +109,7 @@ require (
107109
k8s.io/component-base v0.26.2 // indirect
108110
k8s.io/kms v0.26.2 // indirect
109111
k8s.io/kube-openapi v0.0.0-20230303024457-afdc3dddf62d // indirect
110-
k8s.io/utils v0.0.0-20230220204549-a5ecb0141aa5 // indirect
111112
sigs.k8s.io/apiserver-network-proxy/konnectivity-client v0.0.35 // indirect
112113
sigs.k8s.io/json v0.0.0-20221116044647-bc3834ca7abd // indirect
113-
sigs.k8s.io/structured-merge-diff/v4 v4.2.3 // indirect
114114
sigs.k8s.io/yaml v1.3.0 // indirect
115115
)

pkg/controller/queuejobresources/genericresource/genericresource.go

+19-19
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ import (
4343
"k8s.io/client-go/restmapper"
4444
)
4545

46-
var appwrapperJobName = "appwrapper.mcad.ibm.com"
46+
var appwrapperJobLabelName = "appwrapper.mcad.ibm.com"
4747
var resourceName = "resourceName"
4848
var appWrapperKind = arbv1.SchemeGroupVersion.WithKind("AppWrapper")
4949

@@ -163,7 +163,7 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
163163
}
164164

165165
// Get the resource to see if it exists
166-
labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobName, aw.Name, resourceName, unstruct.GetName())
166+
labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobLabelName, aw.Name, resourceName, unstruct.GetNamespace() + "-" + unstruct.GetName())
167167
inEtcd, err := dclient.Resource(rsrc).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
168168
if err != nil {
169169
return name, gvk, err
@@ -172,8 +172,8 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
172172
// Check to see if object already exists in etcd, if not, create the object.
173173
if inEtcd != nil || len(inEtcd.Items) > 0 {
174174
newName := name
175-
if len(newName) > 63 {
176-
newName = newName[:63]
175+
if len(newName + namespace) > 63 {
176+
newName = newName[:len(newName) - (len(newName) + len(namespace) - 63)]
177177
}
178178

179179
err = deleteObject(namespaced, namespace, newName, rsrc, dclient)
@@ -184,7 +184,7 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
184184
return name, gvk, err
185185
}
186186
} else {
187-
klog.Warningf("[Cleanup] %s/%s not found using label selector: %s.\n", name, namespace, labelSelector)
187+
klog.Warningf("[Cleanup] %s/%s not found using label selector: %s.\n", namespace, name, labelSelector)
188188
}
189189

190190
return name, gvk, err
@@ -291,18 +291,18 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
291291
} else {
292292
labels = unstruct.GetLabels()
293293
}
294-
labels[appwrapperJobName] = aw.Name
295-
labels[resourceName] = unstruct.GetName()
294+
labels[appwrapperJobLabelName] = aw.Name
295+
labels[resourceName] = unstruct.GetNamespace() + "-" + unstruct.GetName()
296296
unstruct.SetLabels(labels)
297297

298298
// Add labels to pod template if one exists.
299299
podTemplateFound := addLabelsToPodTemplateField(&unstruct, labels)
300300
if !podTemplateFound {
301-
klog.V(4).Infof("[SyncQueueJob] No pod template spec exists for resource: %s to add labels.", name)
301+
klog.V(4).Infof("[SyncQueueJob] No pod template spec exists for resource: %s/%s to add labels.", namespace, name)
302302
}
303303

304-
// Get the resource to see if it exists
305-
labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobName, aw.Name, resourceName, unstruct.GetName())
304+
// Get the resource to see if it exists
305+
labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobLabelName, aw.Name, resourceName, unstruct.GetNamespace() + "-" + unstruct.GetName())
306306
inEtcd, err := dclient.Resource(rsrc).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
307307
if err != nil {
308308
return []*v1.Pod{}, err
@@ -311,8 +311,8 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
311311
// Check to see if object already exists in etcd, if not, create the object.
312312
if inEtcd == nil || len(inEtcd.Items) < 1 {
313313
newName := name
314-
if len(newName) > 63 {
315-
newName = newName[:63]
314+
if len(newName + namespace) > 63 {
315+
newName = newName[:len(newName) - (len(newName) + len(namespace) - 63)]
316316
}
317317
unstruct.SetName(newName)
318318
//Asumption object is always namespaced
@@ -323,7 +323,7 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
323323
if errors.IsAlreadyExists(err) {
324324
klog.V(4).Infof("%v\n", err.Error())
325325
} else {
326-
klog.Errorf("Error creating the object `%v`, the error is `%v`", newName, errors.ReasonForError(err))
326+
klog.Errorf("Error creating the object `%s/%s`, the error is `%v`", namespace, newName, errors.ReasonForError(err))
327327
return []*v1.Pod{}, err
328328
}
329329
}
@@ -493,7 +493,7 @@ func deleteObject(namespaced bool, namespace string, name string, rsrc schema.Gr
493493
}
494494

495495
if err != nil && !errors.IsNotFound(err) {
496-
klog.Errorf("[deleteObject] Error deleting the object `%v`, the error is `%v`.", name, errors.ReasonForError(err))
496+
klog.Errorf("[deleteObject] Error deleting the object `%v`, in namespace %v, the error is `%v`.", name, namespace, errors.ReasonForError(err))
497497
return err
498498
} else {
499499
klog.V(4).Infof("[deleteObject] Resource `%v` deleted.\n", name)
@@ -525,7 +525,7 @@ func GetListOfPodResourcesFromOneGenericItem(awr *arbv1.AppWrapperGenericResourc
525525
klog.V(8).Infof("[GetListOfPodResourcesFromOneGenericItem] Requested total allocation resource from 1 pod `%v`.\n", podTotalresource)
526526
}
527527

528-
// Addd individual pods to results
528+
// Add individual pods to results
529529
var replicaCount int = int(replicas)
530530
for i := 0; i < replicaCount; i++ {
531531
podResourcesList = append(podResourcesList, podTotalresource)
@@ -617,7 +617,7 @@ func getContainerResources(container v1.Container, replicas float64) *clustersta
617617
}
618618

619619
// returns status of an item present in etcd
620-
func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResource, namespace string, appwrapperName string, genericItemName string) (completed bool) {
620+
func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResource, appwrapperNamespace string, appwrapperName string, genericItemName string) (completed bool) {
621621
dd := gr.clients.Discovery()
622622
apigroups, err := restmapper.GetAPIGroupResources(dd)
623623
if err != nil {
@@ -648,8 +648,8 @@ func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResourc
648648
return false
649649
}
650650

651-
labelSelector := fmt.Sprintf("%s=%s", appwrapperJobName, appwrapperName)
652-
inEtcd, err := dclient.Resource(rsrc).Namespace(namespace).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
651+
labelSelector := fmt.Sprintf("%s=%s", appwrapperJobLabelName, appwrapperName)
652+
inEtcd, err := dclient.Resource(rsrc).Namespace(appwrapperNamespace).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
653653
if err != nil {
654654
klog.Errorf("[IsItemCompleted] Error listing object: %v", err)
655655
return false
@@ -669,7 +669,7 @@ func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResourc
669669
}
670670
}
671671
if !validAwOwnerRef {
672-
klog.Warningf("[IsItemCompleted] Item owner name %v does match appwrappper name %v in namespace %v", unstructuredObjectName, appwrapperName, namespace)
672+
klog.Warningf("[IsItemCompleted] Item owner name %v does match appwrappper name %v in namespace %v", unstructuredObjectName, appwrapperName, appwrapperNamespace)
673673
continue
674674
}
675675

test/e2e/queue.go

+19-1
Original file line numberDiff line numberDiff line change
@@ -200,14 +200,32 @@ var _ = Describe("AppWrapper E2E Test", func() {
200200
appwrappersPtr := &appwrappers
201201
defer cleanupTestObjectsPtr(context, appwrappersPtr)
202202

203-
aw := createDeploymentAW(context, "aw-deployment-3")
203+
aw := createDeploymentAW(context, "aw-deployment-3", "test")
204204
appwrappers = append(appwrappers, aw)
205205

206206
fmt.Fprintf(GinkgoWriter, "[e2e] Awaiting %d pods running for AW %s.\n", aw.Spec.SchedSpec.MinAvailable, aw.Name)
207207
err := waitAWPodsReady(context, aw)
208208
Expect(err).NotTo(HaveOccurred())
209209
})
210210

211+
It("Create Two AppWrappers Same Name Different Namespaces - Deployment Only - 3 Pods Each", func() {
212+
fmt.Fprintf(os.Stdout, "[e2e] Create Two AppWrappers Same Name Different Namespaces - Deployment Only 3 Pods Each - Started.\n")
213+
context := initTestContext()
214+
var appwrappers []*arbv1.AppWrapper
215+
appwrappersPtr := &appwrappers
216+
defer cleanupTestObjectsPtr(context, appwrappersPtr)
217+
218+
namespaces := []string{"nstest1", "nstest2"}
219+
for _, ns := range namespaces {
220+
aw := createDeploymentAW(context, "aw-deployment-3", ns)
221+
appwrappers = append(appwrappers, aw)
222+
223+
fmt.Fprintf(GinkgoWriter, "[e2e] Awaiting %d pods running for AW %s in namespace %s.\n", aw.Spec.SchedSpec.MinAvailable, aw.Name, ns)
224+
err := waitAWPodsReady(context, aw)
225+
Expect(err).NotTo(HaveOccurred())
226+
}
227+
})
228+
211229
It("Create AppWrapper - Generic Deployment Only - 3 pods", func() {
212230
fmt.Fprintf(os.Stdout, "[e2e] Create AppWrapper - Generic Deployment Only - 3 pods - Started.\n")
213231
context := initTestContext()

test/e2e/util.go

+6-6
Original file line numberDiff line numberDiff line change
@@ -646,12 +646,12 @@ func createJobAWWithInitContainer(context *context, name string, requeuingTimeIn
646646
return appwrapper
647647
}
648648

649-
func createDeploymentAW(context *context, name string) *arbv1.AppWrapper {
650-
rb := []byte(`{"apiVersion": "apps/v1",
649+
func createDeploymentAW(context *context, name string, namespace string) *arbv1.AppWrapper {
650+
rb := []byte(fmt.Sprintf(`{"apiVersion": "apps/v1",
651651
"kind": "Deployment",
652652
"metadata": {
653653
"name": "aw-deployment-3",
654-
"namespace": "test",
654+
"namespace": "%s",
655655
"labels": {
656656
"app": "aw-deployment-3"
657657
}
@@ -686,13 +686,13 @@ func createDeploymentAW(context *context, name string) *arbv1.AppWrapper {
686686
]
687687
}
688688
}
689-
}} `)
689+
}} `, namespace))
690690
var schedSpecMin int = 3
691691

692692
aw := &arbv1.AppWrapper{
693693
ObjectMeta: metav1.ObjectMeta{
694694
Name: name,
695-
Namespace: context.namespace,
695+
Namespace: namespace,
696696
},
697697
Spec: arbv1.AppWrapperSpec{
698698
SchedSpec: arbv1.SchedulingSpecTemplate{
@@ -711,7 +711,7 @@ func createDeploymentAW(context *context, name string) *arbv1.AppWrapper {
711711
},
712712
}
713713

714-
appwrapper, err := context.karclient.WorkloadV1beta1().AppWrappers(context.namespace).Create(context.ctx, aw, metav1.CreateOptions{})
714+
appwrapper, err := context.karclient.WorkloadV1beta1().AppWrappers(namespace).Create(context.ctx, aw, metav1.CreateOptions{})
715715
Expect(err).NotTo(HaveOccurred())
716716

717717
return appwrapper

0 commit comments

Comments
 (0)