diff --git a/config/config.go b/config/config.go index 94abbc42..0cb1c9de 100644 --- a/config/config.go +++ b/config/config.go @@ -9,7 +9,6 @@ import ( "github.com/TwinProduction/gatus/alerting" "github.com/TwinProduction/gatus/alerting/provider" "github.com/TwinProduction/gatus/core" - "github.com/TwinProduction/gatus/discovery" "github.com/TwinProduction/gatus/k8s" "github.com/TwinProduction/gatus/security" "gopkg.in/yaml.v2" @@ -121,6 +120,8 @@ func parseAndValidateConfigBytes(yamlBytes []byte) (config *Config, err error) { if config == nil || config.Services == nil || len(config.Services) == 0 { err = ErrNoServiceInConfig } else { + // Note that the functions below may panic, and this is on purpose to prevent Gatus from starting with + // invalid configurations validateAlertingConfig(config) validateSecurityConfig(config) validateServicesConfig(config) @@ -131,7 +132,10 @@ func parseAndValidateConfigBytes(yamlBytes []byte) (config *Config, err error) { func validateKubernetesConfig(config *Config) { if config.Kubernetes != nil && config.Kubernetes.AutoDiscover { - discoveredServices := discovery.GetServices(config.Kubernetes) + discoveredServices, err := k8s.DiscoverServices(config.Kubernetes) + if err != nil { + panic(err) + } config.Services = append(config.Services, discoveredServices...) } } diff --git a/discovery/discovery.go b/discovery/discovery.go deleted file mode 100644 index 03b0a2ad..00000000 --- a/discovery/discovery.go +++ /dev/null @@ -1,41 +0,0 @@ -package discovery - -import ( - "fmt" - "strings" - - "github.com/TwinProduction/gatus/core" - "github.com/TwinProduction/gatus/k8s" -) - -//GetServices return discovered service -func GetServices(kubernetesConfig *k8s.Config) []*core.Service { - client := k8s.NewClient(kubernetesConfig.ClusterMode) - svcs := make([]*core.Service, 0) - - for _, ns := range kubernetesConfig.Namespaces { - services := k8s.GetServices(client, ns.Name) - for _, s := range services { - if exclude(kubernetesConfig.ExcludeSuffix, s.Name) { - continue - } - svc := core.Service{ - Name: s.Name, - URL: fmt.Sprintf("http://%s%s/%s", s.Name, ns.ServiceSuffix, ns.HealthAPI), - Interval: kubernetesConfig.ServiceTemplate.Interval, - Conditions: kubernetesConfig.ServiceTemplate.Conditions, - } - svcs = append(svcs, &svc) - } - } - return svcs -} - -func exclude(excludeList []string, name string) bool { - for _, x := range excludeList { - if strings.HasSuffix(name, x) { - return true - } - } - return false -} diff --git a/k8s/client.go b/k8s/client.go index 055cf02d..9aa5c421 100644 --- a/k8s/client.go +++ b/k8s/client.go @@ -12,23 +12,19 @@ import ( ) func NewClient(clusterMode string) *kubernetes.Clientset { - var kubeConfig *rest.Config - switch clusterMode { case "in": - kubeConfig = getInclusterConfig() + kubeConfig = getInClusterConfig() case "out": kubeConfig = getOutClusterConfig() default: panic("invalid cluster mode") } - clientset, err := kubernetes.NewForConfig(kubeConfig) if err != nil { panic(err.Error()) } - return clientset } @@ -47,20 +43,17 @@ func getOutClusterConfig() *rest.Config { kubeconfig = flag.String("kubeconfig", "", "absolute path to the kubeconfig file") } flag.Parse() - config, err := clientcmd.BuildConfigFromFlags("", *kubeconfig) if err != nil { panic(err.Error()) } - return config } -func getInclusterConfig() *rest.Config { +func getInClusterConfig() *rest.Config { config, err := rest.InClusterConfig() if err != nil { panic(err.Error()) } - return config } diff --git a/k8s/config.go b/k8s/config.go index 65130441..71a25228 100644 --- a/k8s/config.go +++ b/k8s/config.go @@ -2,30 +2,32 @@ package k8s import "github.com/TwinProduction/gatus/core" -//Config for Kubernetes auto-discovery +// Config for Kubernetes auto-discovery type Config struct { - //AutoDiscover to discover services to monitor + // AutoDiscover to discover services to monitor AutoDiscover bool `yaml:"auto-discover"` - //ServiceTemplate Template for auto disocovered services + // ServiceTemplate Template for auto disocovered services ServiceTemplate core.Service `yaml:"service-template"` - //ExcludeSuffix Ignore services with this suffix - ExcludeSuffix []string `yaml:"exclude-suffix"` + // ExcludeSuffix Ignore services with this suffix + ExcludeSuffix []string `yaml:"isExcluded-suffix"` - //ClusterMode to authenticate with kubernetes + // ClusterMode to authenticate with kubernetes ClusterMode string `yaml:"cluster-mode"` - //Namespaces from which to discover services - Namespaces []Namespace `yaml:"namespaces"` + // Namespaces from which to discover services + Namespaces []NamespaceConfig `yaml:"namespaces"` } -//Namespace level config -type Namespace struct { - //Name of namespace +// NamespaceConfig level config +type NamespaceConfig struct { + // Name of namespace Name string `yaml:"name"` - //ServiceSuffix to append to service name + + // ServiceSuffix to append to service name ServiceSuffix string `yaml:"service-suffix"` - //HealthAPI URI to append to service to reach health check API + + // HealthAPI URI to append to service to reach health check API HealthAPI string `yaml:"health-api"` } diff --git a/k8s/discovery.go b/k8s/discovery.go new file mode 100644 index 00000000..947459e3 --- /dev/null +++ b/k8s/discovery.go @@ -0,0 +1,42 @@ +package k8s + +import ( + "fmt" + "strings" + + "github.com/TwinProduction/gatus/core" +) + +// DiscoverServices return discovered services +func DiscoverServices(kubernetesConfig *Config) ([]*core.Service, error) { + client := NewClient(kubernetesConfig.ClusterMode) + services := make([]*core.Service, 0) + for _, ns := range kubernetesConfig.Namespaces { + kubernetesServices, err := GetKubernetesServices(client, ns.Name) + if err != nil { + return nil, err + } + for _, s := range kubernetesServices { + if isExcluded(kubernetesConfig.ExcludeSuffix, s.Name) { + continue + } + services = append(services, &core.Service{ + Name: s.Name, + URL: fmt.Sprintf("http://%s%s/%s", s.Name, ns.ServiceSuffix, ns.HealthAPI), + Interval: kubernetesConfig.ServiceTemplate.Interval, + Conditions: kubernetesConfig.ServiceTemplate.Conditions, + }) + } + } + return services, nil +} + +// TODO: don't uselessly allocate new things here, just move this inside the DiscoverServices function +func isExcluded(excludeList []string, name string) bool { + for _, x := range excludeList { + if strings.HasSuffix(name, x) { + return true + } + } + return false +} diff --git a/k8s/k8s.go b/k8s/k8s.go index 8833581b..1b4e2ce0 100644 --- a/k8s/k8s.go +++ b/k8s/k8s.go @@ -1,20 +1,16 @@ package k8s import ( - "log" - corev1 "k8s.io/api/core/v1" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" "k8s.io/client-go/kubernetes" ) -//GetServices return List of Services from given namespace -func GetServices(client *kubernetes.Clientset, ns string) []corev1.Service { - options := metav1.ListOptions{} - svcs, err := client.CoreV1().Services(ns).List(options) +// 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 { - log.Printf("[Discovery] : Error getting Services Err: %v", err) - return []corev1.Service{} + return nil, err } - return svcs.Items + return services.Items, nil }