mirror of
https://github.com/k8sgpt-ai/k8sgpt.git
synced 2025-09-23 04:08:04 +00:00
feat: add ClusterServiceVersion, Subscription, InstallPlan, OperatorGroup, and CatalogSource analyzers (#1564)
Signed-off-by: Bruno Andrade <bruno.balint@gmail.com>
This commit is contained in:
107
pkg/analyzer/catalogsource_test.go
Normal file
107
pkg/analyzer/catalogsource_test.go
Normal file
@@ -0,0 +1,107 @@
|
||||
package analyzer
|
||||
|
||||
import (
|
||||
"context"
|
||||
"strings"
|
||||
"testing"
|
||||
|
||||
"github.com/k8sgpt-ai/k8sgpt/pkg/common"
|
||||
"github.com/k8sgpt-ai/k8sgpt/pkg/kubernetes"
|
||||
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
|
||||
"k8s.io/apimachinery/pkg/runtime"
|
||||
"k8s.io/apimachinery/pkg/runtime/schema"
|
||||
dynamicfake "k8s.io/client-go/dynamic/fake"
|
||||
)
|
||||
|
||||
func TestCatalogSourceAnalyzer_UnhealthyState_ReturnsResult(t *testing.T) {
|
||||
cs := &unstructured.Unstructured{
|
||||
Object: map[string]any{
|
||||
"apiVersion": "operators.coreos.com/v1alpha1",
|
||||
"kind": "CatalogSource",
|
||||
"metadata": map[string]any{
|
||||
"name": "broken-operators-external",
|
||||
"namespace": "openshift-marketplace",
|
||||
},
|
||||
"status": map[string]any{
|
||||
"connectionState": map[string]any{
|
||||
"lastObservedState": "TRANSIENT_FAILURE",
|
||||
"address": "not-a-real-host.invalid:50051",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
listKinds := map[schema.GroupVersionResource]string{
|
||||
{Group: "operators.coreos.com", Version: "v1alpha1", Resource: "catalogsources"}: "CatalogSourceList",
|
||||
}
|
||||
scheme := runtime.NewScheme()
|
||||
dc := dynamicfake.NewSimpleDynamicClientWithCustomListKinds(scheme, listKinds, cs)
|
||||
|
||||
a := common.Analyzer{
|
||||
Context: context.TODO(),
|
||||
Client: &kubernetes.Client{DynamicClient: dc},
|
||||
}
|
||||
|
||||
res, err := (CatalogSourceAnalyzer{}).Analyze(a)
|
||||
if err != nil {
|
||||
t.Fatalf("Analyze error: %v", err)
|
||||
}
|
||||
if len(res) != 1 {
|
||||
t.Fatalf("expected 1 result, got %d", len(res))
|
||||
}
|
||||
if res[0].Kind != "CatalogSource" || !strings.Contains(res[0].Name, "openshift-marketplace/broken-operators-external") {
|
||||
t.Fatalf("unexpected result: %#v", res[0])
|
||||
}
|
||||
if len(res[0].Error) == 0 || !strings.Contains(res[0].Error[0].Text, "TRANSIENT_FAILURE") {
|
||||
t.Fatalf("expected TRANSIENT_FAILURE in message, got %#v", res[0].Error)
|
||||
}
|
||||
}
|
||||
|
||||
func TestCatalogSourceAnalyzer_HealthyOrNoState_Ignored(t *testing.T) {
|
||||
// One READY (healthy), one with no status at all: both should be ignored.
|
||||
ready := &unstructured.Unstructured{
|
||||
Object: map[string]any{
|
||||
"apiVersion": "operators.coreos.com/v1alpha1",
|
||||
"kind": "CatalogSource",
|
||||
"metadata": map[string]any{
|
||||
"name": "ready-operators",
|
||||
"namespace": "openshift-marketplace",
|
||||
},
|
||||
"status": map[string]any{
|
||||
"connectionState": map[string]any{
|
||||
"lastObservedState": "READY",
|
||||
"address": "somewhere",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
nostate := &unstructured.Unstructured{
|
||||
Object: map[string]any{
|
||||
"apiVersion": "operators.coreos.com/v1alpha1",
|
||||
"kind": "CatalogSource",
|
||||
"metadata": map[string]any{
|
||||
"name": "no-status-operators",
|
||||
"namespace": "openshift-marketplace",
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
listKinds := map[schema.GroupVersionResource]string{
|
||||
{Group: "operators.coreos.com", Version: "v1alpha1", Resource: "catalogsources"}: "CatalogSourceList",
|
||||
}
|
||||
scheme := runtime.NewScheme()
|
||||
dc := dynamicfake.NewSimpleDynamicClientWithCustomListKinds(scheme, listKinds, ready, nostate)
|
||||
|
||||
a := common.Analyzer{
|
||||
Context: context.TODO(),
|
||||
Client: &kubernetes.Client{DynamicClient: dc},
|
||||
}
|
||||
|
||||
res, err := (CatalogSourceAnalyzer{}).Analyze(a)
|
||||
if err != nil {
|
||||
t.Fatalf("Analyze error: %v", err)
|
||||
}
|
||||
if len(res) != 0 {
|
||||
t.Fatalf("expected 0 results (healthy/nostate ignored), got %d", len(res))
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user