@@ -30,6 +30,8 @@ import (
3030 "sigs.k8s.io/kustomize/kyaml/yaml"
3131)
3232
33+ var AllGroups []string
34+
3335// ResourceGroupGVK is the group/version/kind of the custom
3436// resource used to store inventory.
3537var ResourceGroupGVK = schema.GroupVersionKind {
@@ -92,6 +94,19 @@ func (icm *InventoryResourceGroup) ID() string {
9294 return ""
9395}
9496
97+ func (icm * InventoryResourceGroup ) Match (id string ) bool {
98+ invID := icm .ID ()
99+ if invID == id {
100+ return true
101+ }
102+ for _ , g := range AllGroups {
103+ if g == id {
104+ return true
105+ }
106+ }
107+ return false
108+ }
109+
95110// Load is an Inventory interface function returning the set of
96111// object metadata from the wrapped ResourceGroup, or an error.
97112func (icm * InventoryResourceGroup ) Load () ([]object.ObjMetadata , error ) {
@@ -187,6 +202,116 @@ func (icm *InventoryResourceGroup) GetObject() (*unstructured.Unstructured, erro
187202 return invCopy , nil
188203}
189204
205+ func (icm * InventoryResourceGroup ) LoadSubgroups () ([]object.ObjMetadata , error ) {
206+ objs := []object.ObjMetadata {}
207+ if icm .inv == nil {
208+ return objs , fmt .Errorf ("inventory info is nil" )
209+ }
210+ klog .V (4 ).Infof ("loading inventory..." )
211+ items , exists , err := unstructured .NestedSlice (icm .inv .Object , "spec" , "subgroups" )
212+ if err != nil {
213+ err := fmt .Errorf ("error retrieving object metadata from inventory object" )
214+ return objs , err
215+ }
216+ if ! exists {
217+ klog .V (4 ).Infof ("Inventory (spec.resources) does not exist" )
218+ return objs , nil
219+ }
220+ klog .V (4 ).Infof ("loading %d inventory items" , len (items ))
221+ for _ , itemUncast := range items {
222+ item := itemUncast .(map [string ]interface {})
223+ namespace , _ , err := unstructured .NestedString (item , "namespace" )
224+ if err != nil {
225+ return []object.ObjMetadata {}, err
226+ }
227+ name , _ , err := unstructured .NestedString (item , "name" )
228+ if err != nil {
229+ return []object.ObjMetadata {}, err
230+ }
231+ group , _ , err := unstructured .NestedString (item , "group" )
232+ if err != nil {
233+ return []object.ObjMetadata {}, err
234+ }
235+ kind , _ , err := unstructured .NestedString (item , "kind" )
236+ if err != nil {
237+ return []object.ObjMetadata {}, err
238+ }
239+ groupKind := schema.GroupKind {
240+ Group : strings .TrimSpace (group ),
241+ Kind : strings .TrimSpace (kind ),
242+ }
243+ klog .V (4 ).Infof (`creating obj metadata: "%s/%s/%s"` , namespace , name , groupKind )
244+ objMeta , err := object .CreateObjMetadata (namespace , name , groupKind )
245+ if err != nil {
246+ return []object.ObjMetadata {}, err
247+ }
248+ objs = append (objs , objMeta )
249+ }
250+ return objs , nil
251+
252+ }
253+
254+ func (icm * InventoryResourceGroup ) StoreSubgroups (objMetas []object.ObjMetadata ) (* unstructured.Unstructured , error ){
255+ if icm .inv == nil {
256+ return nil , fmt .Errorf ("inventory info is nil" )
257+ }
258+ klog .V (4 ).Infof ("getting inventory resource group" )
259+ // Create a slice of Resources as empty Interface
260+ klog .V (4 ).Infof ("Creating list of %d resources" , len (objMetas ))
261+ var objs []interface {}
262+ for _ , objMeta := range objMetas {
263+ klog .V (4 ).Infof (`storing inventory obj reference: "%s/%s"` , objMeta .Namespace , objMeta .Name )
264+ objs = append (objs , map [string ]interface {}{
265+ "group" : objMeta .GroupKind .Group ,
266+ "kind" : objMeta .GroupKind .Kind ,
267+ "namespace" : objMeta .Namespace ,
268+ "name" : objMeta .Name ,
269+ })
270+ }
271+ // Create the inventory object by copying the template.
272+ // Adds or clears the inventory ObjMetadata to the ResourceGroup "spec.resources" section
273+ if len (objs ) == 0 {
274+ klog .V (4 ).Infoln ("clearing inventory resources" )
275+ unstructured .RemoveNestedField (icm .inv .UnstructuredContent (),
276+ "spec" , "subgroups" )
277+ } else {
278+ klog .V (4 ).Infof ("storing inventory (%d) resources" , len (objs ))
279+ err := unstructured .SetNestedSlice (icm .inv .UnstructuredContent (),
280+ objs , "spec" , "subgroups" )
281+ if err != nil {
282+ return nil , err
283+ }
284+ }
285+
286+ if len (icm .objMetas ) > 0 {
287+ var objs []interface {}
288+ for _ , objMeta := range icm .objMetas {
289+ klog .V (4 ).Infof (`storing inventory obj reference: "%s/%s"` , objMeta .Namespace , objMeta .Name )
290+ objs = append (objs , map [string ]interface {}{
291+ "group" : objMeta .GroupKind .Group ,
292+ "kind" : objMeta .GroupKind .Kind ,
293+ "namespace" : objMeta .Namespace ,
294+ "name" : objMeta .Name ,
295+ })
296+ }
297+ // Adds or clears the inventory ObjMetadata to the ResourceGroup "spec.resources" section
298+ if len (objs ) == 0 {
299+ klog .V (4 ).Infoln ("clearing inventory resources" )
300+ unstructured .RemoveNestedField (icm .inv .UnstructuredContent (),
301+ "spec" , "resources" )
302+ } else {
303+ klog .V (4 ).Infof ("storing inventory (%d) resources" , len (objs ))
304+ err := unstructured .SetNestedSlice (icm .inv .UnstructuredContent (),
305+ objs , "spec" , "resources" )
306+ if err != nil {
307+ return nil , err
308+ }
309+ }
310+ }
311+
312+ return icm .inv , nil
313+ }
314+
190315// IsResourceGroupInventory returns true if the passed object is
191316// a ResourceGroup inventory object; false otherwise. If an error
192317// occurs, then false is returned and the error.
0 commit comments