@@ -21,6 +21,7 @@ import (
2121 "encoding/json"
2222 "fmt"
2323 "math"
24+ "math/rand"
2425 "runtime/debug"
2526 "strings"
2627 "time"
@@ -43,8 +44,9 @@ import (
4344 "k8s.io/client-go/restmapper"
4445)
4546
46- var appwrapperJobName = "appwrapper.mcad.ibm.com"
47- var resourceName = "resourceName"
47+ var appwrapperJobLabelName = "workload.codeflare.dev/appwrapper"
48+ var appwrapperJobLabelNamespace = "workload.codeflare.dev/appwrapper-namespace"
49+ var resourceName = "workload.codeflare.dev/resourceName"
4850var appWrapperKind = arbv1.SchemeGroupVersion.WithKind("AppWrapper")
4951
5052type GenericResources struct {
@@ -72,6 +74,18 @@ func join(strs ...string) string {
7274 return result
7375}
7476
77+
78+ func GetRandomString(n int) string {
79+ var letters = []rune("abcdefghijklmnopqrstuvwxyz0123456789")
80+
81+ rand.Seed(time.Now().UnixNano())
82+ b := make([]rune, n)
83+ for i := range b {
84+ b[i] = letters[rand.Intn(len(letters))]
85+ }
86+ return string(b)
87+ }
88+
7589func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperGenericResource) (genericResourceName string, groupversionkind *schema.GroupVersionKind, erro error) {
7690 var err error
7791 err = nil
@@ -166,7 +180,7 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
166180 }
167181
168182 // Get the resource to see if it exists in the AppWrapper namespace
169- labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobName , aw.Name, resourceName, unstruct.GetName())
183+ labelSelector := fmt.Sprintf("%s=%s, %s=%s, %s=%s ", appwrapperJobLabelName , aw.Name, appwrapperJobLabelNamespace, aw.Namespace , resourceName, unstruct.GetName())
170184 inEtcd, err := dclient.Resource(rsrc).Namespace(aw.Namespace).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
171185 if err != nil {
172186 return name, gvk, err
@@ -175,8 +189,9 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
175189 // Check to see if object already exists in etcd, if not, create the object.
176190 if inEtcd != nil || len(inEtcd.Items) > 0 {
177191 newName := name
178- if len(newName) > 63 {
179- newName = newName[:63]
192+ if len(newName) > 60 {
193+ newName = newName[:60]
194+ newName += GetRandomString(3)
180195 }
181196
182197 err = deleteObject(namespaced, namespace, newName, rsrc, dclient)
@@ -187,7 +202,7 @@ func (gr *GenericResources) Cleanup(aw *arbv1.AppWrapper, awr *arbv1.AppWrapperG
187202 return name, gvk, err
188203 }
189204 } else {
190- klog.Warningf("[Cleanup] %s/%s not found using label selector: %s.\n", name, namespace , labelSelector)
205+ klog.Warningf("[Cleanup] %s/%s not found using label selector: %s.\n", namespace, name , labelSelector)
191206 }
192207
193208 return name, gvk, err
@@ -297,18 +312,19 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
297312 } else {
298313 labels = unstruct.GetLabels()
299314 }
300- labels[appwrapperJobName] = aw.Name
315+ labels[appwrapperJobLabelName] = aw.Name
316+ labels[appwrapperJobLabelNamespace] = aw.Namespace
301317 labels[resourceName] = unstruct.GetName()
302318 unstruct.SetLabels(labels)
303319
304320 // Add labels to pod template if one exists.
305321 podTemplateFound := addLabelsToPodTemplateField(&unstruct, labels)
306322 if !podTemplateFound {
307- klog.V(4).Infof("[SyncQueueJob] No pod template spec exists for resource: %s to add labels.", name)
323+ klog.V(4).Infof("[SyncQueueJob] No pod template spec exists for resource: %s/%s to add labels.", namespace , name)
308324 }
309325
310- // Get the resource to see if it exists
311- labelSelector := fmt.Sprintf("%s=%s, %s=%s", appwrapperJobName , aw.Name, resourceName, unstruct.GetName())
326+ // Get the resource to see if it exists
327+ labelSelector := fmt.Sprintf("%s=%s, %s=%s, %s=%s ", appwrapperJobLabelName , aw.Name, appwrapperJobLabelNamespace, aw.Namespace , resourceName, unstruct.GetName())
312328 inEtcd, err := dclient.Resource(rsrc).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
313329 if err != nil {
314330 return []*v1.Pod{}, err
@@ -317,8 +333,9 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
317333 // Check to see if object already exists in etcd, if not, create the object.
318334 if inEtcd == nil || len(inEtcd.Items) < 1 {
319335 newName := name
320- if len(newName) > 63 {
321- newName = newName[:63]
336+ if len(newName) > 60 {
337+ newName = newName[:60]
338+ newName += GetRandomString(3)
322339 }
323340 unstruct.SetName(newName)
324341 //Asumption object is always namespaced
@@ -329,7 +346,7 @@ func (gr *GenericResources) SyncQueueJob(aw *arbv1.AppWrapper, awr *arbv1.AppWra
329346 if errors.IsAlreadyExists(err) {
330347 klog.V(4).Infof("%v\n", err.Error())
331348 } else {
332- klog.Errorf("Error creating the object `%v `, the error is `%v`", newName, errors.ReasonForError(err))
349+ klog.Errorf("Error creating the object `%s/%s `, the error is `%v`", namespace , newName, errors.ReasonForError(err))
333350 return []*v1.Pod{}, err
334351 }
335352 }
@@ -499,7 +516,7 @@ func deleteObject(namespaced bool, namespace string, name string, rsrc schema.Gr
499516 }
500517
501518 if err != nil && !errors.IsNotFound(err) {
502- klog.Errorf("[deleteObject] Error deleting the object `%v`, the error is `%v`.", name, errors.ReasonForError(err))
519+ klog.Errorf("[deleteObject] Error deleting the object `%v`, in namespace %v, the error is `%v`.", name, namespace , errors.ReasonForError(err))
503520 return err
504521 } else {
505522 klog.V(4).Infof("[deleteObject] Resource `%v` deleted.\n", name)
@@ -531,7 +548,7 @@ func GetListOfPodResourcesFromOneGenericItem(awr *arbv1.AppWrapperGenericResourc
531548 klog.V(8).Infof("[GetListOfPodResourcesFromOneGenericItem] Requested total allocation resource from 1 pod `%v`.\n", podTotalresource)
532549 }
533550
534- // Addd individual pods to results
551+ // Add individual pods to results
535552 var replicaCount int = int(replicas)
536553 for i := 0; i < replicaCount; i++ {
537554 podResourcesList = append(podResourcesList, podTotalresource)
@@ -623,7 +640,7 @@ func getContainerResources(container v1.Container, replicas float64) *clustersta
623640}
624641
625642// returns status of an item present in etcd
626- func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResource, namespace string, appwrapperName string, genericItemName string) (completed bool) {
643+ func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResource, appwrapperNamespace string, appwrapperName string, genericItemName string) (completed bool) {
627644 dd := gr.clients.Discovery()
628645 apigroups, err := restmapper.GetAPIGroupResources(dd)
629646 if err != nil {
@@ -654,8 +671,8 @@ func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResourc
654671 return false
655672 }
656673
657- labelSelector := fmt.Sprintf("%s=%s", appwrapperJobName , appwrapperName)
658- inEtcd, err := dclient.Resource(rsrc).Namespace(namespace ).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
674+ labelSelector := fmt.Sprintf("%s=%s, %s=%s ", appwrapperJobLabelName , appwrapperName, appwrapperJobLabelNamespace, appwrapperNamespace )
675+ inEtcd, err := dclient.Resource(rsrc).Namespace(appwrapperNamespace ).List(context.Background(), metav1.ListOptions{LabelSelector: labelSelector})
659676 if err != nil {
660677 klog.Errorf("[IsItemCompleted] Error listing object: %v", err)
661678 return false
@@ -675,7 +692,7 @@ func (gr *GenericResources) IsItemCompleted(awgr *arbv1.AppWrapperGenericResourc
675692 }
676693 }
677694 if !validAwOwnerRef {
678- klog.Warningf("[IsItemCompleted] Item owner name %v does match appwrappper name %v in namespace %v", unstructuredObjectName, appwrapperName, namespace )
695+ klog.Warningf("[IsItemCompleted] Item owner name %v does match appwrappper name %v in namespace %v", unstructuredObjectName, appwrapperName, appwrapperNamespace )
679696 continue
680697 }
681698
0 commit comments