@@ -69,6 +69,122 @@ func join(strs ...string) string {
6969return result
7070}
7171
72+ func (gr * GenericResources ) Cleanup (aw * arbv1.AppWrapper , awr * arbv1.AppWrapperGenericResource ) (genericResourceName string , groupversionkind * schema.GroupVersionKind , erro error ) {
73+ var err error
74+ err = nil
75+
76+ // Default generic source group-version-kind
77+ default_gvk := & schema.GroupVersionKind {
78+ Group : "unknown" ,
79+ Version : "unknown" ,
80+ Kind : "unknown" ,
81+ }
82+ // Default generic resource name
83+ name := ""
84+
85+ namespaced := true
86+ //todo:DELETEME dd := common.KubeClient.Discovery()
87+ dd := gr .clients .Discovery ()
88+ apigroups , err := restmapper .GetAPIGroupResources (dd )
89+ if err != nil {
90+ klog .Errorf ("[Cleanup] Error getting API resources, err=%#v" , err )
91+ return name , default_gvk , err
92+ }
93+ ext := awr .GenericTemplate
94+ restmapper := restmapper .NewDiscoveryRESTMapper (apigroups )
95+ _ , gvk , err := unstructured .UnstructuredJSONScheme .Decode (ext .Raw , default_gvk , nil )
96+ if err != nil {
97+ klog .Errorf ("Decoding error, please check your CR! Aborting handling the resource creation, err: `%v`" , err )
98+ return name , gvk , err
99+ }
100+
101+ mapping , err := restmapper .RESTMapping (gvk .GroupKind (), gvk .Version )
102+ if err != nil {
103+ klog .Errorf ("mapping error from raw object: `%v`" , err )
104+ return name , gvk , err
105+ }
106+
107+ //todo:DELETEME restconfig := common.KubeConfig
108+ restconfig := gr .kubeClientConfig
109+ restconfig .GroupVersion = & schema.GroupVersion {
110+ Group : mapping .GroupVersionKind .Group ,
111+ Version : mapping .GroupVersionKind .Version ,
112+ }
113+ dclient , err := dynamic .NewForConfig (restconfig )
114+ if err != nil {
115+ klog .Errorf ("[Cleanup] Error creating new dynamic client, err=%#v." , err )
116+ return name , gvk , err
117+ }
118+
119+ _ , apiresourcelist , err := dd .ServerGroupsAndResources ()
120+ if err != nil {
121+ klog .Errorf ("Error getting supported groups and resources, err=%#v" , err )
122+ return name , gvk , err
123+ }
124+ rsrc := mapping .Resource
125+ for _ , apiresourcegroup := range apiresourcelist {
126+ if apiresourcegroup .GroupVersion == join (mapping .GroupVersionKind .Group , "/" , mapping .GroupVersionKind .Version ) {
127+ for _ , apiresource := range apiresourcegroup .APIResources {
128+ if apiresource .Name == mapping .Resource .Resource && apiresource .Kind == mapping .GroupVersionKind .Kind {
129+ rsrc = mapping .Resource
130+ namespaced = apiresource .Namespaced
131+ }
132+ }
133+ }
134+ }
135+
136+ // Unmarshal generic item raw object
137+ var unstruct unstructured.Unstructured
138+ unstruct .Object = make (map [string ]interface {})
139+ var blob interface {}
140+ if err = json .Unmarshal (ext .Raw , & blob ); err != nil {
141+ klog .Errorf ("[Cleanup] Error unmarshalling, err=%#v" , err )
142+ return name , gvk , err
143+ }
144+
145+ unstruct .Object = blob .(map [string ]interface {}) //set object to the content of the blob after Unmarshalling
146+ namespace := ""
147+ if md , ok := unstruct .Object ["metadata" ]; ok {
148+
149+ metadata := md .(map [string ]interface {})
150+ if objectName , ok := metadata ["name" ]; ok {
151+ name = objectName .(string )
152+ }
153+ if objectns , ok := metadata ["namespace" ]; ok {
154+ namespace = objectns .(string )
155+ }
156+ }
157+
158+ // Get the resource to see if it exists
159+ labelSelector := fmt .Sprintf ("%s=%s, %s=%s" , appwrapperJobName , aw .Name , resourceName , unstruct .GetName ())
160+ inEtcd , err := dclient .Resource (rsrc ).List (context .Background (), metav1.ListOptions {LabelSelector : labelSelector })
161+ if err != nil {
162+ return name , gvk , err
163+ }
164+
165+ // Check to see if object already exists in etcd, if not, create the object.
166+ if inEtcd != nil || len (inEtcd .Items ) > 0 {
167+ newName := name
168+ if len (newName ) > 63 {
169+ newName = newName [:63 ]
170+ }
171+
172+ err = deleteObject (namespaced , namespace , newName , rsrc , dclient )
173+ if err != nil {
174+ if errors .IsAlreadyExists (err ) {
175+ klog .V (4 ).Infof ("%v\n " , err .Error ())
176+ } else {
177+ klog .Errorf ("[Cleanup] Error deleting the object `%v`, the error is `%v`." , newName , errors .ReasonForError (err ))
178+ return name , gvk , err
179+ }
180+ }
181+ } else {
182+ klog .Warningf ("[Cleanup] %s/%s not found using label selector: %s.\n " , name , namespace , labelSelector )
183+ }
184+
185+ return name , gvk , err
186+ }
187+
72188func (gr * GenericResources ) SyncQueueJob (aw * arbv1.AppWrapper , awr * arbv1.AppWrapperGenericResource ) (podList []* v1.Pod , err error ) {
73189startTime := time .Now ()
74190defer func () {
@@ -340,6 +456,25 @@ func createObject(namespaced bool, namespace string, name string, rsrc schema.Gr
340456}
341457}
342458
459+ func deleteObject (namespaced bool , namespace string , name string , rsrc schema.GroupVersionResource , dclient dynamic.Interface ) (erro error ) {
460+ var err error
461+ if ! namespaced {
462+ res := dclient .Resource (rsrc )
463+ err = res .Delete (context .Background (), name , metav1.DeleteOptions {})
464+ } else {
465+ res := dclient .Resource (rsrc ).Namespace (namespace )
466+ err = res .Delete (context .Background (), name , metav1.DeleteOptions {})
467+ }
468+
469+ if err != nil {
470+ klog .Errorf ("[deleteObject] Error deleting the object `%v`, the error is `%v`." , name , errors .ReasonForError (err ))
471+ return err
472+ } else {
473+ klog .V (4 ).Infof ("[deleteObject] Resource `%v` deleted.\n " , name )
474+ return nil
475+ }
476+ }
477+
343478func GetListOfPodResourcesFromOneGenericItem (awr * arbv1.AppWrapperGenericResource ) (resource []* clusterstateapi.Resource , er error ) {
344479var podResourcesList []* clusterstateapi.Resource
345480
0 commit comments