github.com/verrazzano/verrazzano@v1.7.1/tools/vz/pkg/helpers/vzcapture_capi.go (about) 1 // Copyright (c) 2023, Oracle and/or its affiliates. 2 // Licensed under the Universal Permissive License v 1.0 as shown at https://oss.oracle.com/licenses/upl. 3 4 package helpers 5 6 import ( 7 "context" 8 "fmt" 9 "strings" 10 11 "k8s.io/apimachinery/pkg/api/errors" 12 metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" 13 "k8s.io/apimachinery/pkg/runtime/schema" 14 "k8s.io/client-go/dynamic" 15 ) 16 17 const ( 18 v1Alpha1 = "v1alpha1" 19 v1Alpha3 = "v1alpha3" 20 v1Beta1 = "v1beta1" 21 v1Beta2 = "v1beta2" 22 addonsGroup = "addons.cluster.x-k8s.io" 23 bootstrapGroup = "bootstrap.cluster.x-k8s.io" 24 clusterGroup = "cluster.x-k8s.io" 25 clusterctlGroup = "clusterctl.cluster.x-k8s.io" 26 controlPlaneGroup = "controlplane.cluster.x-k8s.io" 27 infrastructureGroup = "infrastructure.cluster.x-k8s.io" 28 ipamGroup = "ipam.cluster.x-k8s.io" 29 runtimeGroup = "runtime.cluster.x-k8s.io" 30 ) 31 32 type capiResource struct { 33 GVR schema.GroupVersionResource 34 Kind string 35 } 36 37 // capiResources - resources that are not namespaced 38 var capiResources = []capiResource{ 39 {GVR: schema.GroupVersionResource{Group: runtimeGroup, Version: v1Alpha1, Resource: "extensionconfigs"}, Kind: "ExtensionConfig"}, 40 } 41 42 // capiNamespacedResources - resources that are namespaced 43 var capiNamespacedResources = []capiResource{ 44 {GVR: schema.GroupVersionResource{Group: addonsGroup, Version: v1Beta1, Resource: "clusterresourcesetbindings"}, Kind: "ClusterResourceSetBinding"}, 45 {GVR: schema.GroupVersionResource{Group: addonsGroup, Version: v1Beta1, Resource: "clusterresourcesets"}, Kind: "ClusterResourceSet"}, 46 {GVR: schema.GroupVersionResource{Group: bootstrapGroup, Version: v1Alpha1, Resource: "ocneconfigs"}, Kind: "OCNEConfig"}, 47 {GVR: schema.GroupVersionResource{Group: bootstrapGroup, Version: v1Alpha1, Resource: "ocneconfigtemplates"}, Kind: "OCNEConfigTemplate"}, 48 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "clusterclasses"}, Kind: "ClusterClass"}, 49 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "clusters"}, Kind: "Cluster"}, 50 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "machinedeployments"}, Kind: "MachineDeployment"}, 51 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "machinehealthchecks"}, Kind: "MachineHealthCheck"}, 52 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "machinepools"}, Kind: "MachinePool"}, 53 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "machines"}, Kind: "Machine"}, 54 {GVR: schema.GroupVersionResource{Group: clusterGroup, Version: v1Beta1, Resource: "machinesets"}, Kind: "MachineSet"}, 55 {GVR: schema.GroupVersionResource{Group: clusterctlGroup, Version: v1Alpha3, Resource: "providers"}, Kind: "Provider"}, 56 {GVR: schema.GroupVersionResource{Group: controlPlaneGroup, Version: v1Alpha1, Resource: "ocnecontrolplanes"}, Kind: "OCNEControlPlane"}, 57 {GVR: schema.GroupVersionResource{Group: controlPlaneGroup, Version: v1Alpha1, Resource: "ocnecontrolplanetemplates"}, Kind: "OCNEControlPlaneTemplate"}, 58 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ociclusteridentities"}, Kind: "OCIClusterIdentity"}, 59 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ociclusters"}, Kind: "OCICluster"}, 60 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ociclustertemplates"}, Kind: "OCIClusterTemplate"}, 61 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimachinepools"}, Kind: "OCIMachinePool"}, 62 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimachines"}, Kind: "OCIMachine"}, 63 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimachinetemplates"}, Kind: "OCIMachineTemplate"}, 64 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedclusters"}, Kind: "OCIManagedCluster"}, 65 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedclustertemplates"}, Kind: "OCIManagedClusterTemplate"}, 66 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedcontrolplanes"}, Kind: "OCIManagedControlPlane"}, 67 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedcontrolplanetemplates"}, Kind: "OCIManagedControlPlaneTemplate"}, 68 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedmachinepools"}, Kind: "OCIManagedMachinePool"}, 69 {GVR: schema.GroupVersionResource{Group: infrastructureGroup, Version: v1Beta2, Resource: "ocimanagedmachinepooltemplates"}, Kind: "OCIManagedMachinePoolTemplate"}, 70 {GVR: schema.GroupVersionResource{Group: ipamGroup, Version: v1Alpha1, Resource: "ipaddressclaims"}, Kind: "IPAddressClaim"}, 71 {GVR: schema.GroupVersionResource{Group: ipamGroup, Version: v1Alpha1, Resource: "ipaddresses"}, Kind: "IPAddress"}, 72 } 73 74 // CaptureGlobalCapiResources captures global resources related to ClusterAPI 75 func CaptureGlobalCapiResources(dynamicClient dynamic.Interface, captureDir string, vzHelper VZHelper) error { 76 for _, resource := range capiResources { 77 if err := captureGlobalResource(dynamicClient, resource.GVR, resource.Kind, captureDir, vzHelper); err != nil { 78 return err 79 } 80 } 81 return nil 82 } 83 84 // captureCapiNamespacedResources captures resources related to ClusterAPI 85 func captureCapiNamespacedResources(dynamicClient dynamic.Interface, namespace, captureDir string, vzHelper VZHelper) error { 86 for _, resource := range capiNamespacedResources { 87 if err := captureNamespacedResource(dynamicClient, resource.GVR, resource.Kind, namespace, captureDir, vzHelper); err != nil { 88 return err 89 } 90 } 91 return nil 92 } 93 94 func captureGlobalResource(dynamicClient dynamic.Interface, gvr schema.GroupVersionResource, kind string, captureDir string, vzHelper VZHelper) error { 95 list, err := dynamicClient.Resource(gvr).List(context.TODO(), metav1.ListOptions{}) 96 if errors.IsNotFound(err) { 97 return nil 98 } 99 if err != nil { 100 LogError(fmt.Sprintf("An error occurred while listing cluster resource %s: %s\n", kind, err.Error())) 101 return nil 102 } 103 if len(list.Items) > 0 { 104 LogMessage(fmt.Sprintf("%s in global namespace ...\n", kind)) 105 if err = createFile(list, "", fmt.Sprintf("%s.%s.json", strings.ToLower(kind), strings.ToLower(gvr.Group)), captureDir, vzHelper); err != nil { 106 return err 107 } 108 } 109 return nil 110 } 111 112 func captureNamespacedResource(dynamicClient dynamic.Interface, gvr schema.GroupVersionResource, kind string, namespace, captureDir string, vzHelper VZHelper) error { 113 list, err := dynamicClient.Resource(gvr).Namespace(namespace).List(context.TODO(), metav1.ListOptions{}) 114 if errors.IsNotFound(err) { 115 return nil 116 } 117 if err != nil { 118 LogError(fmt.Sprintf("An error occurred while listing %s in namespace %s: %s\n", kind, namespace, err.Error())) 119 return nil 120 } 121 if len(list.Items) > 0 { 122 LogMessage(fmt.Sprintf("%s in namespace: %s ...\n", kind, namespace)) 123 if err = createFile(list, namespace, fmt.Sprintf("%s.%s.json", strings.ToLower(kind), strings.ToLower(gvr.Group)), captureDir, vzHelper); err != nil { 124 return err 125 } 126 } 127 return nil 128 }