mirror of https://github.com/k3s-io/k3s
259 lines
8.5 KiB
Go
259 lines
8.5 KiB
Go
package mock
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/golang/mock/gomock"
|
|
"github.com/k3s-io/k3s/pkg/daemons/config"
|
|
"github.com/rancher/wrangler/v3/pkg/generated/controllers/core"
|
|
corev1 "github.com/rancher/wrangler/v3/pkg/generated/controllers/core/v1"
|
|
"github.com/rancher/wrangler/v3/pkg/generic/fake"
|
|
v1 "k8s.io/api/core/v1"
|
|
apierrors "k8s.io/apimachinery/pkg/api/errors"
|
|
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
|
|
"k8s.io/apimachinery/pkg/labels"
|
|
"k8s.io/apimachinery/pkg/runtime/schema"
|
|
)
|
|
|
|
//
|
|
// Mocks so that we can call Runtime.Core.Core().V1() without a functioning apiserver
|
|
//
|
|
|
|
// explicit interface check for core factory mock
|
|
var _ config.CoreFactory = &CoreFactoryMock{}
|
|
|
|
type CoreFactoryMock struct {
|
|
CoreMock *CoreMock
|
|
}
|
|
|
|
func NewCoreFactory(c *gomock.Controller) *CoreFactoryMock {
|
|
return &CoreFactoryMock{
|
|
CoreMock: NewCore(c),
|
|
}
|
|
}
|
|
|
|
func (m *CoreFactoryMock) Core() core.Interface {
|
|
return m.CoreMock
|
|
}
|
|
|
|
func (m *CoreFactoryMock) Sync(ctx context.Context) error {
|
|
return nil
|
|
}
|
|
|
|
func (m *CoreFactoryMock) Start(ctx context.Context, defaultThreadiness int) error {
|
|
return nil
|
|
}
|
|
|
|
// explicit interface check for core mock
|
|
var _ core.Interface = &CoreMock{}
|
|
|
|
type CoreMock struct {
|
|
V1Mock *V1Mock
|
|
}
|
|
|
|
func NewCore(c *gomock.Controller) *CoreMock {
|
|
return &CoreMock{
|
|
V1Mock: NewV1(c),
|
|
}
|
|
}
|
|
|
|
func (m *CoreMock) V1() corev1.Interface {
|
|
return m.V1Mock
|
|
}
|
|
|
|
// explicit interface check for core v1 mock
|
|
var _ corev1.Interface = &V1Mock{}
|
|
|
|
type V1Mock struct {
|
|
ConfigMapMock *fake.MockControllerInterface[*v1.ConfigMap, *v1.ConfigMapList]
|
|
ConfigMapCache *fake.MockCacheInterface[*v1.ConfigMap]
|
|
EndpointsMock *fake.MockControllerInterface[*v1.Endpoints, *v1.EndpointsList]
|
|
EndpointsCache *fake.MockCacheInterface[*v1.Endpoints]
|
|
EventMock *fake.MockControllerInterface[*v1.Event, *v1.EventList]
|
|
EventCache *fake.MockCacheInterface[*v1.Event]
|
|
NamespaceMock *fake.MockNonNamespacedControllerInterface[*v1.Namespace, *v1.NamespaceList]
|
|
NamespaceCache *fake.MockNonNamespacedCacheInterface[*v1.Namespace]
|
|
NodeMock *fake.MockNonNamespacedControllerInterface[*v1.Node, *v1.NodeList]
|
|
NodeCache *fake.MockNonNamespacedCacheInterface[*v1.Node]
|
|
PersistentVolumeMock *fake.MockNonNamespacedControllerInterface[*v1.PersistentVolume, *v1.PersistentVolumeList]
|
|
PersistentVolumeCache *fake.MockNonNamespacedCacheInterface[*v1.PersistentVolume]
|
|
PersistentVolumeClaimMock *fake.MockControllerInterface[*v1.PersistentVolumeClaim, *v1.PersistentVolumeClaimList]
|
|
PersistentVolumeClaimCache *fake.MockCacheInterface[*v1.PersistentVolumeClaim]
|
|
PodMock *fake.MockControllerInterface[*v1.Pod, *v1.PodList]
|
|
PodCache *fake.MockCacheInterface[*v1.Pod]
|
|
SecretMock *fake.MockControllerInterface[*v1.Secret, *v1.SecretList]
|
|
SecretCache *fake.MockCacheInterface[*v1.Secret]
|
|
ServiceMock *fake.MockControllerInterface[*v1.Service, *v1.ServiceList]
|
|
ServiceCache *fake.MockCacheInterface[*v1.Service]
|
|
ServiceAccountMock *fake.MockControllerInterface[*v1.ServiceAccount, *v1.ServiceAccountList]
|
|
ServiceAccountCache *fake.MockCacheInterface[*v1.ServiceAccount]
|
|
}
|
|
|
|
func NewV1(c *gomock.Controller) *V1Mock {
|
|
return &V1Mock{
|
|
ConfigMapMock: fake.NewMockControllerInterface[*v1.ConfigMap, *v1.ConfigMapList](c),
|
|
ConfigMapCache: fake.NewMockCacheInterface[*v1.ConfigMap](c),
|
|
EndpointsMock: fake.NewMockControllerInterface[*v1.Endpoints, *v1.EndpointsList](c),
|
|
EndpointsCache: fake.NewMockCacheInterface[*v1.Endpoints](c),
|
|
EventMock: fake.NewMockControllerInterface[*v1.Event, *v1.EventList](c),
|
|
EventCache: fake.NewMockCacheInterface[*v1.Event](c),
|
|
NamespaceMock: fake.NewMockNonNamespacedControllerInterface[*v1.Namespace, *v1.NamespaceList](c),
|
|
NamespaceCache: fake.NewMockNonNamespacedCacheInterface[*v1.Namespace](c),
|
|
NodeMock: fake.NewMockNonNamespacedControllerInterface[*v1.Node, *v1.NodeList](c),
|
|
NodeCache: fake.NewMockNonNamespacedCacheInterface[*v1.Node](c),
|
|
PersistentVolumeMock: fake.NewMockNonNamespacedControllerInterface[*v1.PersistentVolume, *v1.PersistentVolumeList](c),
|
|
PersistentVolumeCache: fake.NewMockNonNamespacedCacheInterface[*v1.PersistentVolume](c),
|
|
PersistentVolumeClaimMock: fake.NewMockControllerInterface[*v1.PersistentVolumeClaim, *v1.PersistentVolumeClaimList](c),
|
|
PersistentVolumeClaimCache: fake.NewMockCacheInterface[*v1.PersistentVolumeClaim](c),
|
|
PodMock: fake.NewMockControllerInterface[*v1.Pod, *v1.PodList](c),
|
|
PodCache: fake.NewMockCacheInterface[*v1.Pod](c),
|
|
SecretMock: fake.NewMockControllerInterface[*v1.Secret, *v1.SecretList](c),
|
|
SecretCache: fake.NewMockCacheInterface[*v1.Secret](c),
|
|
ServiceMock: fake.NewMockControllerInterface[*v1.Service, *v1.ServiceList](c),
|
|
ServiceCache: fake.NewMockCacheInterface[*v1.Service](c),
|
|
ServiceAccountMock: fake.NewMockControllerInterface[*v1.ServiceAccount, *v1.ServiceAccountList](c),
|
|
ServiceAccountCache: fake.NewMockCacheInterface[*v1.ServiceAccount](c),
|
|
}
|
|
}
|
|
|
|
func (m *V1Mock) ConfigMap() corev1.ConfigMapController {
|
|
return m.ConfigMapMock
|
|
}
|
|
|
|
func (m *V1Mock) Endpoints() corev1.EndpointsController {
|
|
return m.EndpointsMock
|
|
}
|
|
|
|
func (m *V1Mock) Event() corev1.EventController {
|
|
return m.EventMock
|
|
}
|
|
|
|
func (m *V1Mock) Namespace() corev1.NamespaceController {
|
|
return m.NamespaceMock
|
|
}
|
|
|
|
func (m *V1Mock) Node() corev1.NodeController {
|
|
return m.NodeMock
|
|
}
|
|
|
|
func (m *V1Mock) PersistentVolume() corev1.PersistentVolumeController {
|
|
return m.PersistentVolumeMock
|
|
}
|
|
|
|
func (m *V1Mock) PersistentVolumeClaim() corev1.PersistentVolumeClaimController {
|
|
return m.PersistentVolumeClaimMock
|
|
}
|
|
|
|
func (m *V1Mock) Pod() corev1.PodController {
|
|
return m.PodMock
|
|
}
|
|
|
|
func (m *V1Mock) Secret() corev1.SecretController {
|
|
return m.SecretMock
|
|
}
|
|
|
|
func (m *V1Mock) Service() corev1.ServiceController {
|
|
return m.ServiceMock
|
|
}
|
|
|
|
func (m *V1Mock) ServiceAccount() corev1.ServiceAccountController {
|
|
return m.ServiceAccountMock
|
|
}
|
|
|
|
// mock secret store interface
|
|
|
|
type SecretStore struct {
|
|
secrets map[string]map[string]v1.Secret
|
|
}
|
|
|
|
func (m *SecretStore) Create(secret *v1.Secret) (*v1.Secret, error) {
|
|
if m.secrets == nil {
|
|
m.secrets = map[string]map[string]v1.Secret{}
|
|
}
|
|
if _, ok := m.secrets[secret.Namespace]; !ok {
|
|
m.secrets[secret.Namespace] = map[string]v1.Secret{}
|
|
}
|
|
if _, ok := m.secrets[secret.Namespace][secret.Name]; ok {
|
|
return nil, ErrorAlreadyExists("secret", secret.Name)
|
|
}
|
|
m.secrets[secret.Namespace][secret.Name] = *secret
|
|
return secret, nil
|
|
}
|
|
|
|
func (m *SecretStore) Delete(namespace, name string, options *metav1.DeleteOptions) error {
|
|
if m.secrets == nil {
|
|
return ErrorNotFound("secret", name)
|
|
}
|
|
if _, ok := m.secrets[namespace]; !ok {
|
|
return ErrorNotFound("secret", name)
|
|
}
|
|
if _, ok := m.secrets[namespace][name]; !ok {
|
|
return ErrorNotFound("secret", name)
|
|
}
|
|
delete(m.secrets[namespace], name)
|
|
return nil
|
|
}
|
|
|
|
func (m *SecretStore) Get(namespace, name string) (*v1.Secret, error) {
|
|
if m.secrets == nil {
|
|
return nil, ErrorNotFound("secret", name)
|
|
}
|
|
if _, ok := m.secrets[namespace]; !ok {
|
|
return nil, ErrorNotFound("secret", name)
|
|
}
|
|
if secret, ok := m.secrets[namespace][name]; ok {
|
|
return &secret, nil
|
|
}
|
|
return nil, ErrorNotFound("secret", name)
|
|
}
|
|
|
|
// mock node store interface
|
|
|
|
type NodeStore struct {
|
|
nodes map[string]v1.Node
|
|
}
|
|
|
|
func (m *NodeStore) Create(node *v1.Node) (*v1.Node, error) {
|
|
if m.nodes == nil {
|
|
m.nodes = map[string]v1.Node{}
|
|
}
|
|
if _, ok := m.nodes[node.Name]; ok {
|
|
return nil, ErrorAlreadyExists("node", node.Name)
|
|
}
|
|
m.nodes[node.Name] = *node
|
|
return node, nil
|
|
}
|
|
|
|
func (m *NodeStore) Get(name string) (*v1.Node, error) {
|
|
if m.nodes == nil {
|
|
return nil, ErrorNotFound("node", name)
|
|
}
|
|
if node, ok := m.nodes[name]; ok {
|
|
return &node, nil
|
|
}
|
|
return nil, ErrorNotFound("node", name)
|
|
}
|
|
|
|
func (m *NodeStore) List(ls labels.Selector) ([]v1.Node, error) {
|
|
nodes := []v1.Node{}
|
|
if ls == nil {
|
|
ls = labels.Everything()
|
|
}
|
|
for _, node := range m.nodes {
|
|
if ls.Matches(labels.Set(node.Labels)) {
|
|
nodes = append(nodes, node)
|
|
}
|
|
}
|
|
return nodes, nil
|
|
}
|
|
|
|
// utility functions
|
|
|
|
func ErrorNotFound(gv, name string) error {
|
|
return apierrors.NewNotFound(schema.ParseGroupResource(gv), name)
|
|
}
|
|
|
|
func ErrorAlreadyExists(gv, name string) error {
|
|
return apierrors.NewAlreadyExists(schema.ParseGroupResource(gv), name)
|
|
}
|