in internal/util/k8s.go [169:226]
func OperateManifest(c *kubernetes.Clientset, dc dynamic.Interface, manifest string, operation apiv1.Operation) error {
b, err := os.ReadFile(manifest)
if err != nil {
return err
}
decoder := yamlutil.NewYAMLOrJSONDecoder(bytes.NewReader(b), 100)
for {
var rawObj runtime.RawExtension
if err = decoder.Decode(&rawObj); err != nil {
break
}
obj, gvk, err := yaml.NewDecodingSerializer(unstructured.UnstructuredJSONScheme).Decode(rawObj.Raw, nil, nil)
if err != nil {
return err
}
unstructuredMap, err := runtime.DefaultUnstructuredConverter.ToUnstructured(obj)
if err != nil {
return err
}
unstructuredObj := &unstructured.Unstructured{Object: unstructuredMap}
apiGroupResource, err := restmapper.GetAPIGroupResources(c.Discovery())
if err != nil {
return err
}
mapper := restmapper.NewDiscoveryRESTMapper(apiGroupResource)
mapping, err := mapper.RESTMapping(gvk.GroupKind(), gvk.Version)
if err != nil {
return err
}
var dri dynamic.ResourceInterface
if mapping.Scope.Name() == meta.RESTScopeNameNamespace {
if unstructuredObj.GetNamespace() == "" {
unstructuredObj.SetNamespace(metav1.NamespaceDefault)
}
dri = dc.Resource(mapping.Resource).Namespace(unstructuredObj.GetNamespace())
} else {
dri = dc.Resource(mapping.Resource)
}
switch operation {
case apiv1.Create:
_, err = dri.Create(context.Background(), unstructuredObj, metav1.CreateOptions{})
case apiv1.Delete:
err = dri.Delete(context.Background(), unstructuredObj.GetName(), metav1.DeleteOptions{})
}
if err != nil {
return err
}
}
return nil
}