Start working on tests for auto discovery

This commit is contained in:
TwinProduction
2020-11-11 18:05:18 -05:00
parent dbc893fbc4
commit d4d4ca236a
7 changed files with 188 additions and 23 deletions

View File

@ -6,28 +6,64 @@ import (
"os"
"path/filepath"
"github.com/TwinProduction/gatus/k8stest"
"k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
_ "k8s.io/client-go/plugin/pkg/client/auth/gcp"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
)
// KubernetesClientApi is a minimal interface for interacting with Kubernetes
// Created mostly to make mocking the Kubernetes client easier
type KubernetesClientApi interface {
GetServices(namespace string) ([]v1.Service, error)
}
// KubernetesClient is a working implementation of KubernetesClientApi
type KubernetesClient struct {
client *kubernetes.Clientset
}
// GetServices returns a list of services for a given namespace
func (k *KubernetesClient) GetServices(namespace string) ([]v1.Service, error) {
services, err := k.client.CoreV1().Services(namespace).List(metav1.ListOptions{})
if err != nil {
return nil, err
}
return services.Items, nil
}
// NewKubernetesClient creates a KubernetesClient
func NewKubernetesClient(client *kubernetes.Clientset) *KubernetesClient {
return &KubernetesClient{
client: client,
}
}
// NewClient creates a Kubernetes client for the given ClusterMode
func NewClient(clusterMode ClusterMode) (*kubernetes.Clientset, error) {
func NewClient(clusterMode ClusterMode) (KubernetesClientApi, error) {
var kubeConfig *rest.Config
var err error
switch clusterMode {
case ClusterModeIn:
kubeConfig, err = getInClusterConfig()
kubeConfig, err = rest.InClusterConfig()
case ClusterModeOut:
kubeConfig, err = getOutClusterConfig()
case ClusterModeMock:
return k8stest.GetMockedKubernetesClient(), nil
default:
return nil, fmt.Errorf("invalid cluster mode, try '%s' or '%s'", ClusterModeIn, ClusterModeOut)
}
if err != nil {
return nil, fmt.Errorf("unable to get cluster config for mode '%s': %s", clusterMode, err.Error())
}
return kubernetes.NewForConfig(kubeConfig)
client, err := kubernetes.NewForConfig(kubeConfig)
if err != nil {
return nil, err
}
return NewKubernetesClient(client), nil
}
func homeDir() string {
@ -47,7 +83,3 @@ func getOutClusterConfig() (*rest.Config, error) {
flag.Parse()
return clientcmd.BuildConfigFromFlags("", *kubeConfig)
}
func getInClusterConfig() (*rest.Config, error) {
return rest.InClusterConfig()
}

View File

@ -39,6 +39,7 @@ type NamespaceConfig struct {
type ClusterMode string
const (
ClusterModeIn ClusterMode = "in"
ClusterModeOut ClusterMode = "out"
ClusterModeIn ClusterMode = "in"
ClusterModeOut ClusterMode = "out"
ClusterModeMock ClusterMode = "mock"
)

View File

@ -1,16 +1,10 @@
package k8s
import (
corev1 "k8s.io/api/core/v1"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/api/core/v1"
)
// GetKubernetesServices return List of Services from given namespace
func GetKubernetesServices(client *kubernetes.Clientset, ns string) ([]corev1.Service, error) {
services, err := client.CoreV1().Services(ns).List(metav1.ListOptions{})
if err != nil {
return nil, err
}
return services.Items, nil
// GetKubernetesServices return a list of Services from the given namespace
func GetKubernetesServices(client KubernetesClientApi, namespace string) ([]v1.Service, error) {
return client.GetServices(namespace)
}