k9s/internal/dao/container_test.go

147 lines
4.8 KiB
Go

// SPDX-License-Identifier: Apache-2.0
// Copyright Authors of K9s
package dao_test
import (
"context"
"testing"
"github.com/derailed/k9s/internal"
"github.com/derailed/k9s/internal/client"
"github.com/derailed/k9s/internal/dao"
"github.com/derailed/k9s/internal/watch"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
v1 "k8s.io/api/core/v1"
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
"k8s.io/apimachinery/pkg/labels"
"k8s.io/apimachinery/pkg/runtime"
"k8s.io/apimachinery/pkg/version"
"k8s.io/client-go/discovery/cached/disk"
"k8s.io/client-go/dynamic"
"k8s.io/client-go/informers"
"k8s.io/client-go/kubernetes"
restclient "k8s.io/client-go/rest"
versioned "k8s.io/metrics/pkg/client/clientset/versioned"
"sigs.k8s.io/yaml"
)
func TestContainerList(t *testing.T) {
c := dao.Container{}
c.Init(makePodFactory(), client.CoGVR)
ctx := context.WithValue(context.Background(), internal.KeyPath, "fred/p1")
oo, err := c.List(ctx, "")
require.NoError(t, err)
assert.Len(t, oo, 1)
}
// ----------------------------------------------------------------------------
// Helpers...
type conn struct{}
func makeConn() *conn {
return &conn{}
}
func (*conn) Config() *client.Config { return nil }
func (*conn) Dial() (kubernetes.Interface, error) { return nil, nil }
func (*conn) DialLogs() (kubernetes.Interface, error) { return nil, nil }
func (*conn) ConnectionOK() bool { return true }
func (*conn) SwitchContext(string) error { return nil }
func (*conn) CachedDiscovery() (*disk.CachedDiscoveryClient, error) { return nil, nil }
func (*conn) RestConfig() (*restclient.Config, error) { return nil, nil }
func (*conn) MXDial() (*versioned.Clientset, error) { return nil, nil }
func (*conn) DynDial() (dynamic.Interface, error) { return nil, nil }
func (*conn) HasMetrics() bool { return false }
func (*conn) CheckConnectivity() bool { return false }
func (*conn) IsNamespaced(string) bool { return false }
func (*conn) SupportsResource(string) bool { return false }
func (*conn) ValidNamespaces() ([]v1.Namespace, error) { return nil, nil }
func (*conn) SupportsRes(string, []string) (a string, b bool, e error) { return "", false, nil }
func (*conn) ServerVersion() (*version.Info, error) { return nil, nil }
func (*conn) CurrentNamespaceName() (string, error) { return "", nil }
func (*conn) CanI(string, *client.GVR, string, []string) (bool, error) { return true, nil }
func (*conn) ActiveContext() string { return "" }
func (*conn) ActiveNamespace() string { return "" }
func (*conn) IsValidNamespace(string) bool { return true }
func (*conn) ValidNamespaceNames() (client.NamespaceNames, error) { return nil, nil }
func (*conn) IsActiveNamespace(string) bool { return false }
type podFactory struct{}
var _ dao.Factory = &testFactory{}
func (podFactory) Client() client.Connection {
return makeConn()
}
func (podFactory) Get(*client.GVR, string, bool, labels.Selector) (runtime.Object, error) {
var m map[string]any
if err := yaml.Unmarshal([]byte(poYaml()), &m); err != nil {
return nil, err
}
return &unstructured.Unstructured{Object: m}, nil
}
func (podFactory) List(*client.GVR, string, bool, labels.Selector) ([]runtime.Object, error) {
return nil, nil
}
func (podFactory) ForResource(string, *client.GVR) (informers.GenericInformer, error) {
return nil, nil
}
func (podFactory) CanForResource(string, *client.GVR, []string) (informers.GenericInformer, error) {
return nil, nil
}
func (podFactory) WaitForCacheSync() {}
func (podFactory) Forwarders() watch.Forwarders { return nil }
func (podFactory) DeleteForwarder(string) {}
func makePodFactory() dao.Factory {
return podFactory{}
}
func poYaml() string {
return `apiVersion: v1
kind: Pod
metadata:
creationTimestamp: "2018-12-14T17:36:43Z"
labels:
blee: duh
name: fred
namespace: blee
spec:
containers:
- env:
- name: fred
value: "1"
valueFrom:
configMapKeyRef:
key: blee
image: blee
name: fred
resources: {}
priority: 1
priorityClassName: bozo
volumes:
- hostPath:
path: /blee
type: Directory
name: fred
status:
containerStatuses:
- image: ""
imageID: ""
lastState: {}
name: fred
ready: false
restartCount: 0
state:
running:
startedAt: null
phase: Running
`
}