diff --git a/pkg/analyze/cluster_pod_statuses.go b/pkg/analyze/cluster_pod_statuses.go index 3b5a9c0c..e643ba74 100644 --- a/pkg/analyze/cluster_pod_statuses.go +++ b/pkg/analyze/cluster_pod_statuses.go @@ -10,13 +10,14 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" "github.com/replicatedhq/troubleshoot/pkg/k8sutil" corev1 "k8s.io/api/core/v1" ) func clusterPodStatuses(analyzer *troubleshootv1beta2.ClusterPodStatuses, getChildCollectedFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { excludeFiles := []string{} - collected, err := getChildCollectedFileContents(filepath.Join("cluster-resources", "pods", "*.json"), excludeFiles) + collected, err := getChildCollectedFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS, "*.json"), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to read collected pods") } diff --git a/pkg/analyze/container_runtime.go b/pkg/analyze/container_runtime.go index 48654bb2..5c03d5ab 100644 --- a/pkg/analyze/container_runtime.go +++ b/pkg/analyze/container_runtime.go @@ -2,16 +2,18 @@ package analyzer import ( "encoding/json" + "fmt" "net/url" "strings" "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" corev1 "k8s.io/api/core/v1" ) func analyzeContainerRuntime(analyzer *troubleshootv1beta2.ContainerRuntime, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { - collected, err := getCollectedFileContents("cluster-resources/nodes.json") + collected, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_NODES)) if err != nil { return nil, errors.Wrap(err, "failed to get contents of nodes.json") } diff --git a/pkg/analyze/crd.go b/pkg/analyze/crd.go index 75761f3a..c5b751d3 100644 --- a/pkg/analyze/crd.go +++ b/pkg/analyze/crd.go @@ -5,11 +5,12 @@ import ( "fmt" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" apiextensionsv1beta1 "k8s.io/apiextensions-apiserver/pkg/apis/apiextensions/v1beta1" ) func analyzeCustomResourceDefinition(analyzer *troubleshootv1beta2.CustomResourceDefinition, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { - crdData, err := getCollectedFileContents("cluster-resources/custom-resource-definitions.json") + crdData, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS)) if err != nil { return nil, err } diff --git a/pkg/analyze/deployment_status.go b/pkg/analyze/deployment_status.go index 1c61aa7b..ca405e39 100644 --- a/pkg/analyze/deployment_status.go +++ b/pkg/analyze/deployment_status.go @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" appsv1 "k8s.io/api/apps/v1" ) @@ -20,7 +21,7 @@ func analyzeDeploymentStatus(analyzer *troubleshootv1beta2.DeploymentStatus, get func analyzeOneDeploymentStatus(analyzer *troubleshootv1beta2.DeploymentStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { excludeFiles := []string{} - files, err := getFileContents(filepath.Join("cluster-resources", "deployments", fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) + files, err := getFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_DEPLOYMENTS, fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to read collected deployments from namespace") } @@ -66,15 +67,15 @@ func analyzeAllDeploymentStatuses(analyzer *troubleshootv1beta2.DeploymentStatus excludeFiles := []string{} fileNames := make([]string, 0) if analyzer.Namespace != "" { - fileNames = append(fileNames, filepath.Join("cluster-resources", "deployments", fmt.Sprintf("%s.json", analyzer.Namespace))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_DEPLOYMENTS, fmt.Sprintf("%s.json", analyzer.Namespace))) } for _, ns := range analyzer.Namespaces { - fileNames = append(fileNames, filepath.Join("cluster-resources", "deployments", fmt.Sprintf("%s.json", ns))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_DEPLOYMENTS, fmt.Sprintf("%s.json", ns))) } // no namespace specified, so we need to analyze all deployments if len(fileNames) == 0 { - fileNames = append(fileNames, filepath.Join("cluster-resources", "deployments", "*.json")) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_DEPLOYMENTS, "*.json")) } results := []*AnalyzeResult{} diff --git a/pkg/analyze/distribution.go b/pkg/analyze/distribution.go index 2312daf5..4959b3c0 100644 --- a/pkg/analyze/distribution.go +++ b/pkg/analyze/distribution.go @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" ) @@ -143,9 +144,9 @@ func ParseNodesForProviders(nodes []corev1.Node) (providers, string) { func analyzeDistribution(analyzer *troubleshootv1beta2.Distribution, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { var unknownDistribution string - collected, err := getCollectedFileContents("cluster-resources/nodes.json") + collected, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_NODES)) if err != nil { - return nil, errors.Wrap(err, "failed to get contents of nodes.json") + return nil, errors.Wrap(err, fmt.Sprintf("failed to get contents of %s.json", constants.CLUSTER_RESOURCES_NODES)) } var nodes corev1.NodeList @@ -155,7 +156,7 @@ func analyzeDistribution(analyzer *troubleshootv1beta2.Distribution, getCollecte foundProviders, _ := ParseNodesForProviders(nodes.Items) - apiResourcesBytes, err := getCollectedFileContents("cluster-resources/resources.json") + apiResourcesBytes, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_RESOURCES)) // if the file is not found, that is not a fatal error // troubleshoot 0.9.15 and earlier did not collect that file if err == nil { diff --git a/pkg/analyze/image_pull_secret.go b/pkg/analyze/image_pull_secret.go index 72d286c0..29139394 100644 --- a/pkg/analyze/image_pull_secret.go +++ b/pkg/analyze/image_pull_secret.go @@ -6,11 +6,12 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" ) func analyzeImagePullSecret(analyzer *troubleshootv1beta2.ImagePullSecret, getChildCollectedFileContents getChildCollectedFileContents) (*AnalyzeResult, error) { var excludeFiles = []string{} - imagePullSecrets, err := getChildCollectedFileContents("cluster-resources/image-pull-secrets", excludeFiles) + imagePullSecrets, err := getChildCollectedFileContents(fmt.Sprintf("%s/%s", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_IMAGE_PULL_SECRETS), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to get file contents for image pull secrets") } diff --git a/pkg/analyze/ingress.go b/pkg/analyze/ingress.go index 8d02f6ad..ea7244ee 100644 --- a/pkg/analyze/ingress.go +++ b/pkg/analyze/ingress.go @@ -6,11 +6,12 @@ import ( "path/filepath" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" extensionsv1beta1 "k8s.io/api/extensions/v1beta1" ) func analyzeIngress(analyzer *troubleshootv1beta2.Ingress, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { - ingressData, err := getCollectedFileContents(filepath.Join("cluster-resources", "ingress", fmt.Sprintf("%s.json", analyzer.Namespace))) + ingressData, err := getCollectedFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_INGRESS, fmt.Sprintf("%s.json", analyzer.Namespace))) if err != nil { return nil, err } diff --git a/pkg/analyze/job_status.go b/pkg/analyze/job_status.go index 86e2bd77..fdbfc096 100644 --- a/pkg/analyze/job_status.go +++ b/pkg/analyze/job_status.go @@ -9,6 +9,7 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" batchv1 "k8s.io/api/batch/v1" ) @@ -22,7 +23,7 @@ func analyzeJobStatus(analyzer *troubleshootv1beta2.JobStatus, getFileContents g func analyzeOneJobStatus(analyzer *troubleshootv1beta2.JobStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { excludeFiles := []string{} - files, err := getFileContents(filepath.Join("cluster-resources", "jobs", fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) + files, err := getFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_JOBS, fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to read collected jobs from namespace") } @@ -71,15 +72,15 @@ func analyzeOneJobStatus(analyzer *troubleshootv1beta2.JobStatus, getFileContent func analyzeAllJobStatuses(analyzer *troubleshootv1beta2.JobStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { fileNames := make([]string, 0) if analyzer.Namespace != "" { - fileNames = append(fileNames, filepath.Join("cluster-resources", "jobs", fmt.Sprintf("%s.json", analyzer.Namespace))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_JOBS, fmt.Sprintf("%s.json", analyzer.Namespace))) } for _, ns := range analyzer.Namespaces { - fileNames = append(fileNames, filepath.Join("cluster-resources", "jobs", fmt.Sprintf("%s.json", ns))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_JOBS, fmt.Sprintf("%s.json", ns))) } // no namespace specified, so we need to analyze all jobs if len(analyzer.Namespaces) == 0 { - fileNames = append(fileNames, filepath.Join("cluster-resources", "jobs", "*.json")) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_JOBS, "*.json")) } excludeFiles := []string{} diff --git a/pkg/analyze/kube_resource.go b/pkg/analyze/kube_resource.go index c4a8f96b..f9d82f5d 100644 --- a/pkg/analyze/kube_resource.go +++ b/pkg/analyze/kube_resource.go @@ -8,27 +8,28 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" iutils "github.com/replicatedhq/troubleshoot/pkg/interfaceutils" "gopkg.in/yaml.v2" ) var Filemap = map[string]string{ - "Deployment": "deployments", - "StatefulSet": "statefulsets", - "NetworkPolicy": "network-policy", - "Pod": "pods", - "Ingress": "ingress", - "Service": "services", - "ResourceQuota": "resource-quotas", - "Job": "jobs", - "PersistentVoumeClaim": "pvcs", - "pvc": "pvcs", - "ReplicaSet": "replicasets", - "Namespace": "namespaces.json", - "PersistentVolume": "pvs.json", - "pv": "pvs.json", - "Node": "nodes.json", - "StorageClass": "storage-classes.json", + "Deployment": constants.CLUSTER_RESOURCES_DEPLOYMENTS, + "StatefulSet": constants.CLUSTER_RESOURCES_STATEFULSETS, + "NetworkPolicy": constants.CLUSTER_RESOURCES_NETWORK_POLICY, + "Pod": constants.CLUSTER_RESOURCES_PODS, + "Ingress": constants.CLUSTER_RESOURCES_INGRESS, + "Service": constants.CLUSTER_RESOURCES_SERVICES, + "ResourceQuota": constants.CLUSTER_RESOURCES_RESOURCE_QUOTA, + "Job": constants.CLUSTER_RESOURCES_JOBS, + "PersistentVoumeClaim": constants.CLUSTER_RESOURCES_PVCS, + "pvc": constants.CLUSTER_RESOURCES_PVCS, + "ReplicaSet": constants.CLUSTER_RESOURCES_REPLICASETS, + "Namespace": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES), + "PersistentVolume": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS), + "pv": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_PVS), + "Node": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NODES), + "StorageClass": fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_STORAGE_CLASS), } // FindResource locates and returns a kubernetes resource as an interface{} from a support bundle based on some basic selectors @@ -43,12 +44,12 @@ func FindResource(kind string, clusterScoped bool, namespace string, name string return nil, errors.New("failed to find resource") } - datapath = filepath.Join("cluster-resources", resourceLocation) + datapath = filepath.Join(constants.CLUSTER_RESOURCES_DIR, resourceLocation) if !clusterScoped { if namespace == "" { namespace = "default" } - datapath = filepath.Join("cluster-resources", resourceLocation, fmt.Sprintf("%s.json", namespace)) + datapath = filepath.Join(constants.CLUSTER_RESOURCES_DIR, resourceLocation, fmt.Sprintf("%s.json", namespace)) } file, err := getFileContents(datapath) diff --git a/pkg/analyze/node_resources.go b/pkg/analyze/node_resources.go index a37815d9..ad85d868 100644 --- a/pkg/analyze/node_resources.go +++ b/pkg/analyze/node_resources.go @@ -9,12 +9,13 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" corev1 "k8s.io/api/core/v1" "k8s.io/apimachinery/pkg/api/resource" ) func analyzeNodeResources(analyzer *troubleshootv1beta2.NodeResources, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { - collected, err := getCollectedFileContents("cluster-resources/nodes.json") + collected, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_NODES)) if err != nil { return nil, errors.Wrap(err, "failed to get contents of nodes.json") } diff --git a/pkg/analyze/replicaset_status.go b/pkg/analyze/replicaset_status.go index fcb583a2..ca5e7d2f 100644 --- a/pkg/analyze/replicaset_status.go +++ b/pkg/analyze/replicaset_status.go @@ -9,6 +9,7 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" appsv1 "k8s.io/api/apps/v1" "k8s.io/apimachinery/pkg/labels" ) @@ -23,7 +24,7 @@ func analyzeReplicaSetStatus(analyzer *troubleshootv1beta2.ReplicaSetStatus, get func analyzeOneReplicaSetStatus(analyzer *troubleshootv1beta2.ReplicaSetStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { excludeFiles := []string{} - files, err := getFileContents(filepath.Join("cluster-resources", "replicasets", fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) + files, err := getFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_REPLICASETS, fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to read collected replicasets from namespace") } @@ -68,14 +69,14 @@ func analyzeOneReplicaSetStatus(analyzer *troubleshootv1beta2.ReplicaSetStatus, func analyzeAllReplicaSetStatuses(analyzer *troubleshootv1beta2.ReplicaSetStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { fileNames := make([]string, 0) if analyzer.Namespace != "" { - fileNames = append(fileNames, filepath.Join("cluster-resources", "replicasets", fmt.Sprintf("%s.json", analyzer.Namespace))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_REPLICASETS, fmt.Sprintf("%s.json", analyzer.Namespace))) } for _, ns := range analyzer.Namespaces { - fileNames = append(fileNames, filepath.Join("cluster-resources", "replicasets", fmt.Sprintf("%s.json", ns))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_REPLICASETS, fmt.Sprintf("%s.json", ns))) } if len(fileNames) == 0 { - fileNames = append(fileNames, filepath.Join("cluster-resources", "replicasets", "*.json")) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_REPLICASETS, "*.json")) } results := []*AnalyzeResult{} diff --git a/pkg/analyze/statefulset_status.go b/pkg/analyze/statefulset_status.go index 2678aa73..d2836db2 100644 --- a/pkg/analyze/statefulset_status.go +++ b/pkg/analyze/statefulset_status.go @@ -7,6 +7,7 @@ import ( "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" appsv1 "k8s.io/api/apps/v1" ) @@ -20,7 +21,7 @@ func analyzeStatefulsetStatus(analyzer *troubleshootv1beta2.StatefulsetStatus, g func analyzeOneStatefulsetStatus(analyzer *troubleshootv1beta2.StatefulsetStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { excludeFiles := []string{} - files, err := getFileContents(filepath.Join("cluster-resources", "statefulsets", fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) + files, err := getFileContents(filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STATEFULSETS, fmt.Sprintf("%s.json", analyzer.Namespace)), excludeFiles) if err != nil { return nil, errors.Wrap(err, "failed to read collected statefulsets from namespace") } @@ -69,15 +70,15 @@ func analyzeOneStatefulsetStatus(analyzer *troubleshootv1beta2.StatefulsetStatus func analyzeAllStatefulsetStatuses(analyzer *troubleshootv1beta2.StatefulsetStatus, getFileContents getChildCollectedFileContents) ([]*AnalyzeResult, error) { fileNames := make([]string, 0) if analyzer.Namespace != "" { - fileNames = append(fileNames, filepath.Join("cluster-resources", "statefulsets", fmt.Sprintf("%s.json", analyzer.Namespace))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STATEFULSETS, fmt.Sprintf("%s.json", analyzer.Namespace))) } for _, ns := range analyzer.Namespaces { - fileNames = append(fileNames, filepath.Join("cluster-resources", "statefulsets", fmt.Sprintf("%s.json", ns))) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STATEFULSETS, fmt.Sprintf("%s.json", ns))) } // no namespace specified, so we need to analyze all statefulsets if len(fileNames) == 0 { - fileNames = append(fileNames, filepath.Join("cluster-resources", "statefulsets", "*.json")) + fileNames = append(fileNames, filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STATEFULSETS, "*.json")) } excludeFiles := []string{} diff --git a/pkg/analyze/storage_class.go b/pkg/analyze/storage_class.go index 82ba42b1..450c6a67 100644 --- a/pkg/analyze/storage_class.go +++ b/pkg/analyze/storage_class.go @@ -5,11 +5,12 @@ import ( "fmt" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" storagev1beta1 "k8s.io/api/storage/v1beta1" ) func analyzeStorageClass(analyzer *troubleshootv1beta2.StorageClass, getCollectedFileContents func(string) ([]byte, error)) (*AnalyzeResult, error) { - storageClassesData, err := getCollectedFileContents("cluster-resources/storage-classes.json") + storageClassesData, err := getCollectedFileContents(fmt.Sprintf("%s/%s.json", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STORAGE_CLASS)) if err != nil { return nil, err } diff --git a/pkg/collect/cluster_resources.go b/pkg/collect/cluster_resources.go index bed27877..1e7c17a3 100644 --- a/pkg/collect/cluster_resources.go +++ b/pkg/collect/cluster_resources.go @@ -12,6 +12,7 @@ import ( "strings" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" "github.com/replicatedhq/troubleshoot/pkg/k8sutil" "gopkg.in/yaml.v2" authorizationv1 "k8s.io/api/authorization/v1" @@ -118,17 +119,17 @@ func (c *CollectClusterResources) Collect(progressChan chan<- interface{}) (Coll if len(c.Collector.Namespaces) > 0 { namespaces, namespaceErrors := getNamespaces(ctx, client, c.Collector.Namespaces) namespaceNames = c.Collector.Namespaces - output.SaveResult(c.BundlePath, "cluster-resources/namespaces.json", bytes.NewBuffer(namespaces)) - output.SaveResult(c.BundlePath, "cluster-resources/namespaces-errors.json", marshalErrors(namespaceErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES)), bytes.NewBuffer(namespaces)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_NAMESPACES)), marshalErrors(namespaceErrors)) } else if c.Namespace != "" { namespace, namespaceErrors := getNamespace(ctx, client, c.Namespace) - output.SaveResult(c.BundlePath, "cluster-resources/namespaces.json", bytes.NewBuffer(namespace)) - output.SaveResult(c.BundlePath, "cluster-resources/namespaces-errors.json", marshalErrors(namespaceErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES)), bytes.NewBuffer(namespace)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_NAMESPACES)), marshalErrors(namespaceErrors)) namespaceNames = append(namespaceNames, c.Namespace) } else { namespaces, namespaceList, namespaceErrors := getAllNamespaces(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/namespaces.json", bytes.NewBuffer(namespaces)) - output.SaveResult(c.BundlePath, "cluster-resources/namespaces-errors.json", marshalErrors(namespaceErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NAMESPACES)), bytes.NewBuffer(namespaces)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_NAMESPACES)), marshalErrors(namespaceErrors)) if namespaceList != nil { for _, namespace := range namespaceList.Items { namespaceNames = append(namespaceNames, namespace.Name) @@ -142,9 +143,9 @@ func (c *CollectClusterResources) Collect(progressChan chan<- interface{}) (Coll // auth cani authCanI := authCanI(reviewStatuses, namespaceNames) for k, v := range authCanI { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/auth-cani-list", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_AUTH_CANI, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/auth-cani-list-errors.json", marshalErrors(reviewStatusErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_AUTH_CANI)), marshalErrors(reviewStatusErrors)) if nsListedFromCluster && !c.Collector.IgnoreRBAC { filteredNamespaces := []string{} @@ -160,9 +161,9 @@ func (c *CollectClusterResources) Collect(progressChan chan<- interface{}) (Coll // pods pods, podErrors, unhealthyPods := pods(ctx, client, namespaceNames) for k, v := range pods { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/pods", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/pods-errors.json", marshalErrors(podErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_PODS)), marshalErrors(podErrors)) for _, pod := range unhealthyPods { allContainers := append(pod.Spec.InitContainers, pod.Spec.Containers...) @@ -176,7 +177,7 @@ func (c *CollectClusterResources) Collect(progressChan chan<- interface{}) (Coll } podLogs, err := savePodLogs(ctx, c.BundlePath, client, &pod, "", container.Name, limits, false, false) if err != nil { - errPath := filepath.Join("cluster-resources", "pods", "logs", pod.Namespace, pod.Name, fmt.Sprintf("%s-logs-errors.log", container.Name)) + errPath := filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS_LOGS, pod.Namespace, pod.Name, fmt.Sprintf("%s-logs-errors.log", container.Name)) output.SaveResult(c.BundlePath, errPath, bytes.NewBuffer([]byte(err.Error()))) } // Add logs collector results to the rest of the output @@ -188,156 +189,156 @@ func (c *CollectClusterResources) Collect(progressChan chan<- interface{}) (Coll PodDisruptionBudgets, pdbError := getPodDisruptionBudgets(ctx, client, namespaceNames) for k, v := range PodDisruptionBudgets { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/pod-disruption-budgets", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_POD_DISRUPTION_BUDGETS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/pod-disruption-budgets-info.json", marshalErrors(pdbError)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_POD_DISRUPTION_BUDGETS)), marshalErrors(pdbError)) // services services, servicesErrors := services(ctx, client, namespaceNames) for k, v := range services { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/services", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_SERVICES, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/services-errors.json", marshalErrors(servicesErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_SERVICES)), marshalErrors(servicesErrors)) // deployments deployments, deploymentsErrors := deployments(ctx, client, namespaceNames) for k, v := range deployments { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/deployments", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_DEPLOYMENTS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/deployments-errors.json", marshalErrors(deploymentsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_DEPLOYMENTS)), marshalErrors(deploymentsErrors)) // statefulsets statefulsets, statefulsetsErrors := statefulsets(ctx, client, namespaceNames) for k, v := range statefulsets { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/statefulsets", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_STATEFULSETS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/statefulsets-errors.json", marshalErrors(statefulsetsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_STATEFULSETS)), marshalErrors(statefulsetsErrors)) // replicasets replicasets, replicasetsErrors := replicasets(ctx, client, namespaceNames) for k, v := range replicasets { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/replicasets", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_STATEFULSETS), k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/replicasets-errors.json", marshalErrors(replicasetsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_REPLICASETS)), marshalErrors(replicasetsErrors)) // jobs jobs, jobsErrors := jobs(ctx, client, namespaceNames) for k, v := range jobs { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/jobs", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_JOBS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/jobs-errors.json", marshalErrors(jobsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_JOBS)), marshalErrors(jobsErrors)) // cronJobs cronJobs, cronJobsErrors := cronJobs(ctx, client, namespaceNames) for k, v := range cronJobs { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/cronjobs", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CRONJOBS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/cronjobs-errors.json", marshalErrors(cronJobsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_CRONJOBS)), marshalErrors(cronJobsErrors)) // ingress ingress, ingressErrors := ingress(ctx, client, namespaceNames) for k, v := range ingress { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/ingress", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_INGRESS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/ingress-errors.json", marshalErrors(ingressErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_INGRESS)), marshalErrors(ingressErrors)) // network policy networkPolicy, networkPolicyErrors := networkPolicy(ctx, client, namespaceNames) for k, v := range networkPolicy { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/network-policy", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_NETWORK_POLICY, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/network-policy-errors.json", marshalErrors(networkPolicyErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_NETWORK_POLICY)), marshalErrors(networkPolicyErrors)) // resource quotas resourceQuota, resourceQuotaErrors := resourceQuota(ctx, client, namespaceNames) for k, v := range resourceQuota { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/resource-quotas", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_RESOURCE_QUOTA, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/resource-quota-errors.json", marshalErrors(resourceQuotaErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_RESOURCE_QUOTA)), marshalErrors(resourceQuotaErrors)) // storage classes storageClasses, storageErrors := storageClasses(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/storage-classes.json", bytes.NewBuffer(storageClasses)) - output.SaveResult(c.BundlePath, "cluster-resources/storage-errors.json", marshalErrors(storageErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_STORAGE_CLASS)), bytes.NewBuffer(storageClasses)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_STORAGE_CLASS)), marshalErrors(storageErrors)) // crds customResourceDefinitions, crdErrors := crds(ctx, client, c.ClientConfig) - output.SaveResult(c.BundlePath, "cluster-resources/custom-resource-definitions.json", bytes.NewBuffer(customResourceDefinitions)) - output.SaveResult(c.BundlePath, "cluster-resources/custom-resource-definitions-errors.json", marshalErrors(crdErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS)), bytes.NewBuffer(customResourceDefinitions)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS)), marshalErrors(crdErrors)) // crs customResources, crErrors := crs(ctx, dynamicClient, client, c.ClientConfig, namespaceNames) for k, v := range customResources { - output.SaveResult(c.BundlePath, fmt.Sprintf("cluster-resources/custom-resources/%v", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/custom-resources/custom-resources-errors.json", marshalErrors(crErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS)), marshalErrors(crErrors)) // imagepullsecrets imagePullSecrets, pullSecretsErrors := imagePullSecrets(ctx, client, namespaceNames) for k, v := range imagePullSecrets { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/image-pull-secrets", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_IMAGE_PULL_SECRETS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/image-pull-secrets-errors.json", marshalErrors(pullSecretsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_IMAGE_PULL_SECRETS)), marshalErrors(pullSecretsErrors)) // nodes nodes, nodeErrors := nodes(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/nodes.json", bytes.NewBuffer(nodes)) - output.SaveResult(c.BundlePath, "cluster-resources/nodes-errors.json", marshalErrors(nodeErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_NODES)), bytes.NewBuffer(nodes)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_NODES)), marshalErrors(nodeErrors)) groups, resources, groupsResourcesErrors := apiResources(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/groups.json", bytes.NewBuffer(groups)) - output.SaveResult(c.BundlePath, "cluster-resources/resources.json", bytes.NewBuffer(resources)) - output.SaveResult(c.BundlePath, "cluster-resources/groups-resources-errors.json", marshalErrors(groupsResourcesErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_GROUPS)), bytes.NewBuffer(groups)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s.json", constants.CLUSTER_RESOURCES_RESOURCES)), bytes.NewBuffer(resources)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-%s-errors.json", constants.CLUSTER_RESOURCES_GROUPS, constants.CLUSTER_RESOURCES_RESOURCES)), marshalErrors(groupsResourcesErrors)) // limit ranges limitRanges, limitRangesErrors := limitRanges(ctx, client, namespaceNames) for k, v := range limitRanges { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/limitranges", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_LIMITRANGES, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/limitranges-errors.json", marshalErrors(limitRangesErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_LIMITRANGES)), marshalErrors(limitRangesErrors)) //Events events, eventsErrors := events(ctx, client, namespaceNames) for k, v := range events { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/events", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_EVENTS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/events-errors.json", marshalErrors(eventsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_EVENTS)), marshalErrors(eventsErrors)) //Persistent Volumes pvs, pvsErrors := pvs(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/pvs.json", bytes.NewBuffer(pvs)) - output.SaveResult(c.BundlePath, "cluster-resources/pvs-errors.json", marshalErrors(pvsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PVS), bytes.NewBuffer(pvs)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_PVS)), marshalErrors(pvsErrors)) //Persistent Volume Claims pvcs, pvcsErrors := pvcs(ctx, client, namespaceNames) for k, v := range pvcs { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/pvcs", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PVCS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/pvcs-errors.json", marshalErrors(pvcsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_PVCS)), marshalErrors(pvcsErrors)) //Roles roles, rolesErrors := roles(ctx, client, namespaceNames) for k, v := range roles { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/roles", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_ROLES, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/roles-errors.json", marshalErrors(rolesErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_ROLES)), marshalErrors(rolesErrors)) //Role Bindings roleBindings, roleBindingsErrors := roleBindings(ctx, client, namespaceNames) for k, v := range roleBindings { - output.SaveResult(c.BundlePath, path.Join("cluster-resources/rolebindings", k), bytes.NewBuffer(v)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_ROLE_BINDINGS, k), bytes.NewBuffer(v)) } - output.SaveResult(c.BundlePath, "cluster-resources/rolebindings-errors.json", marshalErrors(roleBindingsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_ROLE_BINDINGS)), marshalErrors(roleBindingsErrors)) //Cluster Roles clusterRoles, clusterRolesErrors := clusterRoles(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/clusterroles.json", bytes.NewBuffer(clusterRoles)) - output.SaveResult(c.BundlePath, "cluster-resources/clusterroles-errors.json", marshalErrors(clusterRolesErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CLUSTER_ROLES), bytes.NewBuffer(clusterRoles)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_CLUSTER_ROLES)), marshalErrors(clusterRolesErrors)) //Cluster Role Bindings clusterRoleBindings, clusterRoleBindingsErrors := clusterRoleBindings(ctx, client) - output.SaveResult(c.BundlePath, "cluster-resources/clusterRoleBindings.json", bytes.NewBuffer(clusterRoleBindings)) - output.SaveResult(c.BundlePath, "cluster-resources/clusterRoleBindings-errors.json", marshalErrors(clusterRoleBindingsErrors)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CLUSTER_ROLE_BINDINGS), bytes.NewBuffer(clusterRoleBindings)) + output.SaveResult(c.BundlePath, path.Join(constants.CLUSTER_RESOURCES_DIR, fmt.Sprintf("%s-errors.json", constants.CLUSTER_RESOURCES_CLUSTER_ROLE_BINDINGS)), marshalErrors(clusterRoleBindingsErrors)) return output, nil } diff --git a/pkg/collect/logs.go b/pkg/collect/logs.go index 2b5d60fd..666f42ec 100644 --- a/pkg/collect/logs.go +++ b/pkg/collect/logs.go @@ -173,7 +173,7 @@ func savePodLogs( // TODO: Abstract away hard coded directory structure paths // Maybe create a FS provider or something similar filePathPrefix := filepath.Join( - "cluster-resources", "pods", "logs", pod.Namespace, pod.Name, pod.Spec.Containers[0].Name, + constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS_LOGS, pod.Namespace, pod.Name, pod.Spec.Containers[0].Name, ) // TODO: If collectorName is empty, the path is stored with a leading slash @@ -185,7 +185,7 @@ func savePodLogs( if container != "" { linkRelPathPrefix = fmt.Sprintf("%s/%s/%s", collectorName, pod.Name, container) filePathPrefix = filepath.Join( - "cluster-resources", "pods", "logs", pod.Namespace, pod.Name, container, + constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS_LOGS, pod.Namespace, pod.Name, container, ) } diff --git a/pkg/constants/constants.go b/pkg/constants/constants.go index 05194e60..0238224d 100644 --- a/pkg/constants/constants.go +++ b/pkg/constants/constants.go @@ -13,4 +13,36 @@ const ( VersionFilename = "version.yaml" // DEFAULT_LOGS_COLLECTOR_TIMEOUT is the default timeout for logs collector. DEFAULT_LOGS_COLLECTOR_TIMEOUT = 60 * time.Second + + // Cluster Resources Collector Directories + CLUSTER_RESOURCES_DIR = "cluster-resources" + CLUSTER_RESOURCES_NAMESPACES = "namespace" + CLUSTER_RESOURCES_AUTH_CANI = "auth-cani-list" + CLUSTER_RESOURCES_PODS = "pods" + CLUSTER_RESOURCES_PODS_LOGS = "pods/logs" + CLUSTER_RESOURCES_POD_DISRUPTION_BUDGETS = "pod-disruption-budgets" + CLUSTER_RESOURCES_SERVICES = "services" + CLUSTER_RESOURCES_DEPLOYMENTS = "deployments" + CLUSTER_RESOURCES_REPLICASETS = "replicasets" + CLUSTER_RESOURCES_STATEFULSETS = "statefulsets" + CLUSTER_RESOURCES_JOBS = "jobs" + CLUSTER_RESOURCES_CRONJOBS = "cronjobs" + CLUSTER_RESOURCES_INGRESS = "ingress" + CLUSTER_RESOURCES_NETWORK_POLICY = "network-policy" + CLUSTER_RESOURCES_RESOURCE_QUOTA = "resource-quota" + CLUSTER_RESOURCES_STORAGE_CLASS = "storage-classes" + CLUSTER_RESOURCES_CUSTOM_RESOURCE_DEFINITIONS = "custom-resource-definitions" + CLUSTER_RESOURCES_CUSTOM_RESOURCES = "custom-resources" + CLUSTER_RESOURCES_IMAGE_PULL_SECRETS = "image-pull-secrets" + CLUSTER_RESOURCES_NODES = "nodes" + CLUSTER_RESOURCES_GROUPS = "groups" + CLUSTER_RESOURCES_RESOURCES = "resources" + CLUSTER_RESOURCES_LIMITRANGES = "limitranges" + CLUSTER_RESOURCES_EVENTS = "events" + CLUSTER_RESOURCES_PVS = "pvs" + CLUSTER_RESOURCES_PVCS = "pvcs" + CLUSTER_RESOURCES_ROLES = "roles" + CLUSTER_RESOURCES_ROLE_BINDINGS = "rolebindings" + CLUSTER_RESOURCES_CLUSTER_ROLES = "clusterroles" + CLUSTER_RESOURCES_CLUSTER_ROLE_BINDINGS = "clusterRoleBindings" ) diff --git a/pkg/redact/redact.go b/pkg/redact/redact.go index 29312e35..920a3756 100644 --- a/pkg/redact/redact.go +++ b/pkg/redact/redact.go @@ -10,6 +10,7 @@ import ( "github.com/gobwas/glob" "github.com/pkg/errors" troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2" + "github.com/replicatedhq/troubleshoot/pkg/constants" ) const ( @@ -333,7 +334,7 @@ func getRedactors(path string) ([]Redactor, error) { uniqueCRs := map[string]bool{} for _, cr := range customResources { - fileglob := fmt.Sprintf("cluster-resources/custom-resources/%s/*", cr.resource) + fileglob := fmt.Sprintf("%s/%s/%s/*", constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_CUSTOM_RESOURCES, cr.resource) redactors = append(redactors, NewYamlRedactor(cr.yamlPath, fileglob, "")) // redact kubectl last applied annotation once for each resource since it contains copies of diff --git a/pkg/supportbundle/parse.go b/pkg/supportbundle/parse.go index c5134ae9..e8843351 100644 --- a/pkg/supportbundle/parse.go +++ b/pkg/supportbundle/parse.go @@ -11,6 +11,7 @@ import ( "github.com/mholt/archiver/v3" "github.com/pkg/errors" + "github.com/replicatedhq/troubleshoot/pkg/constants" types "github.com/replicatedhq/troubleshoot/pkg/supportbundle/types" corev1 "k8s.io/api/core/v1" ) @@ -20,15 +21,15 @@ var ( ) func getPodsFilePath(namespace string) string { - return filepath.Join("cluster-resources", "pods", fmt.Sprintf("%s.json", namespace)) + return filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS, fmt.Sprintf("%s.json", namespace)) } func getContainerLogsFilePath(namespace string, podName string, containerName string) string { - return filepath.Join("cluster-resources", "pods", "logs", namespace, podName, fmt.Sprintf("%s.log", containerName)) + return filepath.Join(constants.CLUSTER_RESOURCES_DIR, constants.CLUSTER_RESOURCES_PODS_LOGS, namespace, podName, fmt.Sprintf("%s.log", containerName)) } func getEventsFilePath(namespace string) string { - return filepath.Join("cluster-resources", "events", fmt.Sprintf("%s.json", namespace)) + return filepath.Join(constants.CLUSTER_RESOURCES_DIR, "events", fmt.Sprintf("%s.json", namespace)) } func GetPodDetails(bundleArchive string, podNamespace string, podName string) (*types.PodDetails, error) {