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  }