mirror of
https://github.com/replicatedhq/troubleshoot.git
synced 2026-02-14 18:29:53 +00:00
* Uses secrets from cluster * updated gitignore to stop ignoring needed files * Delete specs.go.bak * make fmt * added preflight to generic loader * Tells user to run in cluster if using secretKeyRef * Update loader.go * Update loader.go
290 lines
7.2 KiB
Go
290 lines
7.2 KiB
Go
package loader
|
|
|
|
import (
|
|
"context"
|
|
"testing"
|
|
|
|
troubleshootv1beta2 "github.com/replicatedhq/troubleshoot/pkg/apis/troubleshoot/v1beta2"
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
corev1 "k8s.io/api/core/v1"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/client-go/kubernetes/fake"
|
|
)
|
|
|
|
func TestLoadSpecs_V1Beta3WithSecretRef(t *testing.T) {
|
|
// Create test secret
|
|
secret := &corev1.Secret{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "postgres-secret",
|
|
Namespace: "default",
|
|
},
|
|
Data: map[string][]byte{
|
|
"uri": []byte("postgresql://user:password@localhost:5432/mydb"),
|
|
},
|
|
}
|
|
|
|
client := fake.NewSimpleClientset(secret)
|
|
|
|
spec := `
|
|
apiVersion: troubleshoot.sh/v1beta3
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: test-bundle
|
|
spec:
|
|
collectors:
|
|
- postgres:
|
|
collectorName: main-db
|
|
uri:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: postgres-secret
|
|
key: uri
|
|
`
|
|
|
|
kinds, err := LoadSpecs(context.Background(), LoadOptions{
|
|
RawSpec: spec,
|
|
Client: client,
|
|
Namespace: "default",
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, kinds)
|
|
require.Len(t, kinds.SupportBundlesV1Beta2, 1)
|
|
|
|
bundle := kinds.SupportBundlesV1Beta2[0]
|
|
assert.Equal(t, "test-bundle", bundle.Name)
|
|
assert.Equal(t, "troubleshoot.sh/v1beta2", bundle.APIVersion)
|
|
|
|
require.Len(t, bundle.Spec.Collectors, 1)
|
|
require.NotNil(t, bundle.Spec.Collectors[0].Postgres)
|
|
assert.Equal(t, "main-db", bundle.Spec.Collectors[0].Postgres.CollectorName)
|
|
assert.Equal(t, "postgresql://user:password@localhost:5432/mydb", bundle.Spec.Collectors[0].Postgres.URI)
|
|
}
|
|
|
|
func TestLoadSpecs_V1Beta3WithTLSSecrets(t *testing.T) {
|
|
// Create test secret with TLS certs
|
|
secret := &corev1.Secret{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "tls-secret",
|
|
Namespace: "default",
|
|
},
|
|
Data: map[string][]byte{
|
|
"ca.crt": []byte("CA_CERT_DATA"),
|
|
"client.crt": []byte("CLIENT_CERT_DATA"),
|
|
"client.key": []byte("CLIENT_KEY_DATA"),
|
|
},
|
|
}
|
|
|
|
client := fake.NewSimpleClientset(secret)
|
|
|
|
spec := `
|
|
apiVersion: troubleshoot.sh/v1beta3
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: test-bundle
|
|
spec:
|
|
collectors:
|
|
- postgres:
|
|
uri:
|
|
value: "postgresql://localhost:5432/db"
|
|
tls:
|
|
cacert:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: tls-secret
|
|
key: ca.crt
|
|
clientCert:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: tls-secret
|
|
key: client.crt
|
|
clientKey:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: tls-secret
|
|
key: client.key
|
|
`
|
|
|
|
kinds, err := LoadSpecs(context.Background(), LoadOptions{
|
|
RawSpec: spec,
|
|
Client: client,
|
|
Namespace: "default",
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, kinds)
|
|
require.Len(t, kinds.SupportBundlesV1Beta2, 1)
|
|
|
|
bundle := kinds.SupportBundlesV1Beta2[0]
|
|
require.Len(t, bundle.Spec.Collectors, 1)
|
|
require.NotNil(t, bundle.Spec.Collectors[0].Postgres)
|
|
require.NotNil(t, bundle.Spec.Collectors[0].Postgres.TLS)
|
|
|
|
assert.Equal(t, "CA_CERT_DATA", bundle.Spec.Collectors[0].Postgres.TLS.CACert)
|
|
assert.Equal(t, "CLIENT_CERT_DATA", bundle.Spec.Collectors[0].Postgres.TLS.ClientCert)
|
|
assert.Equal(t, "CLIENT_KEY_DATA", bundle.Spec.Collectors[0].Postgres.TLS.ClientKey)
|
|
}
|
|
|
|
func TestLoadSpecs_V1Beta3MultipleCollectors(t *testing.T) {
|
|
pgSecret := &corev1.Secret{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "postgres-secret",
|
|
Namespace: "default",
|
|
},
|
|
Data: map[string][]byte{
|
|
"uri": []byte("postgresql://localhost:5432/db"),
|
|
},
|
|
}
|
|
|
|
mysqlSecret := &corev1.Secret{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "mysql-secret",
|
|
Namespace: "default",
|
|
},
|
|
Data: map[string][]byte{
|
|
"uri": []byte("mysql://localhost:3306/db"),
|
|
},
|
|
}
|
|
|
|
client := fake.NewSimpleClientset(pgSecret, mysqlSecret)
|
|
|
|
spec := `
|
|
apiVersion: troubleshoot.sh/v1beta3
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: test-bundle
|
|
spec:
|
|
collectors:
|
|
- postgres:
|
|
uri:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: postgres-secret
|
|
key: uri
|
|
- mysql:
|
|
uri:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: mysql-secret
|
|
key: uri
|
|
`
|
|
|
|
kinds, err := LoadSpecs(context.Background(), LoadOptions{
|
|
RawSpec: spec,
|
|
Client: client,
|
|
Namespace: "default",
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, kinds)
|
|
require.Len(t, kinds.SupportBundlesV1Beta2, 1)
|
|
|
|
bundle := kinds.SupportBundlesV1Beta2[0]
|
|
require.Len(t, bundle.Spec.Collectors, 2)
|
|
|
|
require.NotNil(t, bundle.Spec.Collectors[0].Postgres)
|
|
assert.Equal(t, "postgresql://localhost:5432/db", bundle.Spec.Collectors[0].Postgres.URI)
|
|
|
|
require.NotNil(t, bundle.Spec.Collectors[1].Mysql)
|
|
assert.Equal(t, "mysql://localhost:3306/db", bundle.Spec.Collectors[1].Mysql.URI)
|
|
}
|
|
|
|
func TestLoadSpecs_V1Beta3WithoutClient(t *testing.T) {
|
|
spec := `
|
|
apiVersion: troubleshoot.sh/v1beta3
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: test-bundle
|
|
spec:
|
|
collectors:
|
|
- postgres:
|
|
uri:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: postgres-secret
|
|
key: uri
|
|
`
|
|
|
|
_, err := LoadSpecs(context.Background(), LoadOptions{
|
|
RawSpec: spec,
|
|
Strict: true, // Enable strict mode to get error instead of warning
|
|
// No client provided
|
|
})
|
|
|
|
require.Error(t, err)
|
|
assert.Contains(t, err.Error(), "kubernetes client required")
|
|
}
|
|
|
|
func TestLoadSpecs_V1Beta3MixedWithV1Beta2(t *testing.T) {
|
|
secret := &corev1.Secret{
|
|
ObjectMeta: metav1.ObjectMeta{
|
|
Name: "postgres-secret",
|
|
Namespace: "default",
|
|
},
|
|
Data: map[string][]byte{
|
|
"uri": []byte("postgresql://localhost:5432/db"),
|
|
},
|
|
}
|
|
|
|
client := fake.NewSimpleClientset(secret)
|
|
|
|
specs := `
|
|
---
|
|
apiVersion: troubleshoot.sh/v1beta3
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: v1beta3-bundle
|
|
spec:
|
|
collectors:
|
|
- postgres:
|
|
uri:
|
|
valueFrom:
|
|
secretKeyRef:
|
|
name: postgres-secret
|
|
key: uri
|
|
---
|
|
apiVersion: troubleshoot.sh/v1beta2
|
|
kind: SupportBundle
|
|
metadata:
|
|
name: v1beta2-bundle
|
|
spec:
|
|
collectors:
|
|
- clusterInfo: {}
|
|
`
|
|
|
|
kinds, err := LoadSpecs(context.Background(), LoadOptions{
|
|
RawSpec: specs,
|
|
Client: client,
|
|
Namespace: "default",
|
|
})
|
|
|
|
require.NoError(t, err)
|
|
require.NotNil(t, kinds)
|
|
require.Len(t, kinds.SupportBundlesV1Beta2, 2)
|
|
|
|
// Find the v1beta3-converted bundle
|
|
var v3Bundle *troubleshootv1beta2.SupportBundle
|
|
var v2Bundle *troubleshootv1beta2.SupportBundle
|
|
for i := range kinds.SupportBundlesV1Beta2 {
|
|
if kinds.SupportBundlesV1Beta2[i].Name == "v1beta3-bundle" {
|
|
v3Bundle = &kinds.SupportBundlesV1Beta2[i]
|
|
}
|
|
if kinds.SupportBundlesV1Beta2[i].Name == "v1beta2-bundle" {
|
|
v2Bundle = &kinds.SupportBundlesV1Beta2[i]
|
|
}
|
|
}
|
|
|
|
require.NotNil(t, v3Bundle, "v1beta3 bundle should be converted and loaded")
|
|
require.NotNil(t, v2Bundle, "v1beta2 bundle should be loaded")
|
|
|
|
// Verify v1beta3 bundle was resolved correctly
|
|
require.Len(t, v3Bundle.Spec.Collectors, 1)
|
|
require.NotNil(t, v3Bundle.Spec.Collectors[0].Postgres)
|
|
assert.Equal(t, "postgresql://localhost:5432/db", v3Bundle.Spec.Collectors[0].Postgres.URI)
|
|
|
|
// Verify v1beta2 bundle was loaded correctly
|
|
require.Len(t, v2Bundle.Spec.Collectors, 1)
|
|
require.NotNil(t, v2Bundle.Spec.Collectors[0].ClusterInfo)
|
|
}
|