diff --git a/cmd/operator/main.go b/cmd/operator/main.go index d3a232c11..14806b6d3 100644 --- a/cmd/operator/main.go +++ b/cmd/operator/main.go @@ -59,6 +59,7 @@ func init() { flagset.StringVar(&cfg.Namespace, "namespace", kapi.NamespaceAll, "Namespace to scope the interaction of the Prometheus Operator and the apiserver.") flagset.Var(&cfg.Labels, "labels", "Labels to be add to all resources created by the operator") flagset.StringVar(&cfg.CrdGroup, "crd-apigroup", monitoringv1.Group, "prometheus CRD API group name") + flagset.Var(&cfg.CrdKinds, "crd-kinds", " - EXPERIMENTAL (could be removed in future releases) - customize CRD kind names") flagset.Parse(os.Args[1:]) } diff --git a/pkg/alertmanager/operator.go b/pkg/alertmanager/operator.go index cab318e03..eb22bd214 100644 --- a/pkg/alertmanager/operator.go +++ b/pkg/alertmanager/operator.go @@ -69,6 +69,7 @@ type Config struct { AlertmanagerDefaultBaseImage string Namespace string Labels prometheusoperator.Labels + CrdKinds monitoringv1.CrdKinds CrdGroup string } @@ -84,7 +85,7 @@ func New(c prometheusoperator.Config, logger log.Logger) (*Operator, error) { return nil, errors.Wrap(err, "instantiating kubernetes client failed") } - mclient, err := monitoring.NewForConfig(c.CrdGroup, cfg) + mclient, err := monitoring.NewForConfig(&c.CrdKinds, c.CrdGroup, cfg) if err != nil { return nil, errors.Wrap(err, "instantiating monitoring client failed") } @@ -106,6 +107,7 @@ func New(c prometheusoperator.Config, logger log.Logger) (*Operator, error) { AlertmanagerDefaultBaseImage: c.AlertmanagerDefaultBaseImage, Namespace: c.Namespace, CrdGroup: c.CrdGroup, + CrdKinds: c.CrdKinds, Labels: c.Labels, }, } @@ -524,7 +526,7 @@ func (c *Operator) createCRDs() error { } crds := []*extensionsobj.CustomResourceDefinition{ - k8sutil.NewAlertmanagerCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap), + k8sutil.NewAlertmanagerCustomResourceDefinition(c.config.CrdKinds.Alertmanager, c.config.CrdGroup, c.config.Labels.LabelsMap), } crdClient := c.crdclient.ApiextensionsV1beta1().CustomResourceDefinitions() diff --git a/pkg/api/api.go b/pkg/api/api.go index 14c10ae02..9ce674213 100644 --- a/pkg/api/api.go +++ b/pkg/api/api.go @@ -45,7 +45,7 @@ func New(conf prometheus.Config, l log.Logger) (*API, error) { return nil, err } - mclient, err := v1.NewForConfig(conf.CrdGroup, cfg) + mclient, err := v1.NewForConfig(&conf.CrdKinds, conf.CrdGroup, cfg) if err != nil { return nil, err } diff --git a/pkg/client/monitoring/clientset.go b/pkg/client/monitoring/clientset.go index 091aa2821..98bf773d7 100644 --- a/pkg/client/monitoring/clientset.go +++ b/pkg/client/monitoring/clientset.go @@ -48,7 +48,7 @@ func (c *Clientset) MonitoringV1() v1.MonitoringV1Interface { return c.MonitoringV1Client } -func NewForConfig(apiGroup string, c *rest.Config) (*Clientset, error) { +func NewForConfig(crdKinds *v1.CrdKinds, apiGroup string, c *rest.Config) (*Clientset, error) { configShallowCopy := *c if configShallowCopy.RateLimiter == nil && configShallowCopy.QPS > 0 { configShallowCopy.RateLimiter = flowcontrol.NewTokenBucketRateLimiter(configShallowCopy.QPS, configShallowCopy.Burst) @@ -61,7 +61,7 @@ func NewForConfig(apiGroup string, c *rest.Config) (*Clientset, error) { return nil, err } - cs.MonitoringV1Client, err = v1.NewForConfig(apiGroup, &configShallowCopy) + cs.MonitoringV1Client, err = v1.NewForConfig(crdKinds, apiGroup, &configShallowCopy) if err != nil { return nil, err } diff --git a/pkg/client/monitoring/v1/alertmanager.go b/pkg/client/monitoring/v1/alertmanager.go index 08deb003d..16d4ae1e6 100644 --- a/pkg/client/monitoring/v1/alertmanager.go +++ b/pkg/client/monitoring/v1/alertmanager.go @@ -54,13 +54,13 @@ type alertmanagers struct { ns string } -func newAlertmanagers(r rest.Interface, c *dynamic.Client, namespace string) *alertmanagers { +func newAlertmanagers(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *alertmanagers { return &alertmanagers{ r, c.Resource( &metav1.APIResource{ - Kind: AlertmanagersKind, - Name: AlertmanagerName, + Kind: crdKind.Kind, + Name: crdKind.Plural, Namespaced: true, }, namespace, diff --git a/pkg/client/monitoring/v1/client.go b/pkg/client/monitoring/v1/client.go index 914efa1ba..8b48abc23 100644 --- a/pkg/client/monitoring/v1/client.go +++ b/pkg/client/monitoring/v1/client.go @@ -15,17 +15,75 @@ package v1 import ( + "fmt" "k8s.io/apimachinery/pkg/runtime/schema" "k8s.io/apimachinery/pkg/runtime/serializer" "k8s.io/client-go/dynamic" "k8s.io/client-go/pkg/api" "k8s.io/client-go/rest" + "strings" ) const ( - Group = "monitoring.coreos.com" + Group = "monitoring.coreos.com" + PrometheusKindKey = "prometheus" + AlertManagerKindKey = "alermanager" + ServiceMonitorKindKey = "servicemonitor" ) +type CrdKind struct { + Kind string + Plural string +} + +type CrdKinds struct { + KindsString string + Prometheus CrdKind + Alertmanager CrdKind + ServiceMonitor CrdKind +} + +// Implement the flag.Value interface +func (crdkinds *CrdKinds) String() string { + return crdkinds.KindsString +} + +// Set Implement the flag.Set interface +func (crdkinds *CrdKinds) Set(value string) error { + if value == "" { + value = fmt.Sprintf("%s=%s:%s,%s=%s:%s,%s=%s:%s", + PrometheusKindKey, PrometheusesKind, PrometheusName, + AlertManagerKindKey, AlertmanagersKind, AlertmanagerName, + ServiceMonitorKindKey, ServiceMonitorsKind, ServiceMonitorName) + } + splited := strings.Split(value, ",") + for _, pair := range splited { + sp := strings.Split(pair, "=") + kind := strings.Split(sp[1], ":") + crdKind := CrdKind{Plural: kind[1], Kind: kind[0]} + switch kindKey := sp[0]; kindKey { + case PrometheusKindKey: + (*crdkinds).Prometheus = crdKind + case ServiceMonitorKindKey: + (*crdkinds).ServiceMonitor = crdKind + case AlertManagerKindKey: + (*crdkinds).Alertmanager = crdKind + default: + fmt.Printf("Warning: unknown kind: %s... ignoring", kindKey) + } + + } + (*crdkinds).KindsString = value + return nil +} + +var DefaultCrdKinds CrdKinds = CrdKinds{ + KindsString: "", + Prometheus: CrdKind{Plural: PrometheusName, Kind: PrometheusesKind}, + ServiceMonitor: CrdKind{Plural: ServiceMonitorName, Kind: ServiceMonitorsKind}, + Alertmanager: CrdKind{Plural: AlertmanagerName, Kind: AlertmanagersKind}, +} + var Version = "v1" type MonitoringV1Interface interface { @@ -38,25 +96,26 @@ type MonitoringV1Interface interface { type MonitoringV1Client struct { restClient rest.Interface dynamicClient *dynamic.Client + crdKinds *CrdKinds } func (c *MonitoringV1Client) Prometheuses(namespace string) PrometheusInterface { - return newPrometheuses(c.restClient, c.dynamicClient, namespace) + return newPrometheuses(c.restClient, c.dynamicClient, c.crdKinds.Prometheus, namespace) } func (c *MonitoringV1Client) Alertmanagers(namespace string) AlertmanagerInterface { - return newAlertmanagers(c.restClient, c.dynamicClient, namespace) + return newAlertmanagers(c.restClient, c.dynamicClient, c.crdKinds.Alertmanager, namespace) } func (c *MonitoringV1Client) ServiceMonitors(namespace string) ServiceMonitorInterface { - return newServiceMonitors(c.restClient, c.dynamicClient, namespace) + return newServiceMonitors(c.restClient, c.dynamicClient, c.crdKinds.ServiceMonitor, namespace) } func (c *MonitoringV1Client) RESTClient() rest.Interface { return c.restClient } -func NewForConfig(apiGroup string, c *rest.Config) (*MonitoringV1Client, error) { +func NewForConfig(crdKinds *CrdKinds, apiGroup string, c *rest.Config) (*MonitoringV1Client, error) { config := *c SetConfigDefaults(apiGroup, &config) client, err := rest.RESTClientFor(&config) @@ -69,7 +128,7 @@ func NewForConfig(apiGroup string, c *rest.Config) (*MonitoringV1Client, error) return nil, err } - return &MonitoringV1Client{client, dynamicClient}, nil + return &MonitoringV1Client{client, dynamicClient, crdKinds}, nil } func SetConfigDefaults(apiGroup string, config *rest.Config) { diff --git a/pkg/client/monitoring/v1/prometheus.go b/pkg/client/monitoring/v1/prometheus.go index bf0ff14c9..88b089eaf 100644 --- a/pkg/client/monitoring/v1/prometheus.go +++ b/pkg/client/monitoring/v1/prometheus.go @@ -54,13 +54,13 @@ type prometheuses struct { ns string } -func newPrometheuses(r rest.Interface, c *dynamic.Client, namespace string) *prometheuses { +func newPrometheuses(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *prometheuses { return &prometheuses{ r, c.Resource( &metav1.APIResource{ - Kind: PrometheusesKind, - Name: PrometheusName, + Kind: crdKind.Kind, + Name: crdKind.Plural, Namespaced: true, }, namespace, diff --git a/pkg/client/monitoring/v1/servicemonitor.go b/pkg/client/monitoring/v1/servicemonitor.go index 622aa668a..916c1b91c 100644 --- a/pkg/client/monitoring/v1/servicemonitor.go +++ b/pkg/client/monitoring/v1/servicemonitor.go @@ -54,13 +54,13 @@ type servicemonitors struct { ns string } -func newServiceMonitors(r rest.Interface, c *dynamic.Client, namespace string) *servicemonitors { +func newServiceMonitors(r rest.Interface, c *dynamic.Client, crdKind CrdKind, namespace string) *servicemonitors { return &servicemonitors{ r, c.Resource( &metav1.APIResource{ - Kind: ServiceMonitorsKind, - Name: ServiceMonitorName, + Kind: crdKind.Kind, + Name: crdKind.Plural, Namespaced: true, }, namespace, diff --git a/pkg/k8sutil/k8sutil.go b/pkg/k8sutil/k8sutil.go index 4db3f75b7..8f97fc7f1 100644 --- a/pkg/k8sutil/k8sutil.go +++ b/pkg/k8sutil/k8sutil.go @@ -205,10 +205,10 @@ func NewAlertmanagerTPRDefinition() *extensionsobjold.ThirdPartyResource { } } -func NewPrometheusCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { +func NewPrometheusCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { return &extensionsobj.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ - Name: monitoringv1.PrometheusName + "." + group, + Name: crdkind.Plural + "." + group, Labels: labels, }, Spec: extensionsobj.CustomResourceDefinitionSpec{ @@ -216,35 +216,36 @@ func NewPrometheusCustomResourceDefinition(group string, labels map[string]strin Version: monitoringv1.Version, Scope: extensionsobj.NamespaceScoped, Names: extensionsobj.CustomResourceDefinitionNames{ - Plural: monitoringv1.PrometheusName, - Kind: monitoringv1.PrometheusesKind, + Plural: crdkind.Plural, + Kind: crdkind.Kind, }, }, } } -func NewServiceMonitorCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { +func NewServiceMonitorCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { return &extensionsobj.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ - Name: monitoringv1.ServiceMonitorName + "." + group, + Name: crdkind.Plural + "." + group, Labels: labels, }, + Spec: extensionsobj.CustomResourceDefinitionSpec{ Group: group, Version: monitoringv1.Version, Scope: extensionsobj.NamespaceScoped, Names: extensionsobj.CustomResourceDefinitionNames{ - Plural: monitoringv1.ServiceMonitorName, - Kind: monitoringv1.ServiceMonitorsKind, + Plural: crdkind.Plural, + Kind: crdkind.Kind, }, }, } } -func NewAlertmanagerCustomResourceDefinition(group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { +func NewAlertmanagerCustomResourceDefinition(crdkind monitoringv1.CrdKind, group string, labels map[string]string) *extensionsobj.CustomResourceDefinition { return &extensionsobj.CustomResourceDefinition{ ObjectMeta: metav1.ObjectMeta{ - Name: monitoringv1.AlertmanagerName + "." + group, + Name: crdkind.Plural + "." + group, Labels: labels, }, Spec: extensionsobj.CustomResourceDefinitionSpec{ @@ -252,8 +253,8 @@ func NewAlertmanagerCustomResourceDefinition(group string, labels map[string]str Version: monitoringv1.Version, Scope: extensionsobj.NamespaceScoped, Names: extensionsobj.CustomResourceDefinitionNames{ - Plural: monitoringv1.AlertmanagerName, - Kind: monitoringv1.AlertmanagersKind, + Plural: crdkind.Plural, + Kind: crdkind.Kind, }, }, } diff --git a/pkg/migrator/migrator.go b/pkg/migrator/migrator.go index f4c44bdea..8ed5bfec8 100644 --- a/pkg/migrator/migrator.go +++ b/pkg/migrator/migrator.go @@ -118,7 +118,7 @@ func NewMigrator(cfg *rest.Config, logger log.Logger) (*Migrator, error) { return nil, errors.Wrap(err, "creating kubernetes client") } - mclient, err := monitoring.NewForConfig(monitoringv1.Group, cfg) + mclient, err := monitoring.NewForConfig(&monitoringv1.DefaultCrdKinds, monitoringv1.Group, cfg) if err != nil { return nil, errors.Wrap(err, "creating monitoring client") } @@ -179,9 +179,15 @@ func (m *Migrator) migrateTPR2CRD() error { m.logger.Log("msg", "Creating CRDs.") err = m.createCRDs( - k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}), - k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}), - k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}), + k8sutil.NewPrometheusCustomResourceDefinition( + monitoringv1.DefaultCrdKinds.Prometheus, + monitoringv1.Group, map[string]string{}), + k8sutil.NewServiceMonitorCustomResourceDefinition( + monitoringv1.DefaultCrdKinds.ServiceMonitor, + monitoringv1.Group, map[string]string{}), + k8sutil.NewAlertmanagerCustomResourceDefinition( + monitoringv1.DefaultCrdKinds.Alertmanager, + monitoringv1.Group, map[string]string{}), ) if err != nil { return errors.Wrap(err, "creating CRDs failed") @@ -507,9 +513,9 @@ func (m *Migrator) rollback() error { if ms.crdCreated { m.logger.Log("msg", "Deleting CRDs.") err := m.deleteCRDs( - k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}), - k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}), - k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}), + k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Prometheus, monitoringv1.Group, map[string]string{}), + k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.DefaultCrdKinds.ServiceMonitor, monitoringv1.Group, map[string]string{}), + k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Alertmanager, monitoringv1.Group, map[string]string{}), ) if err != nil { return errors.Wrapf(err, "deleting the CRDs failed") diff --git a/pkg/prometheus/operator.go b/pkg/prometheus/operator.go index a4df872fc..e5e75820e 100644 --- a/pkg/prometheus/operator.go +++ b/pkg/prometheus/operator.go @@ -125,6 +125,7 @@ type Config struct { Namespace string Labels Labels CrdGroup string + CrdKinds monitoringv1.CrdKinds } type BasicAuthCredentials struct { @@ -143,7 +144,7 @@ func New(conf Config, logger log.Logger) (*Operator, error) { return nil, err } - mclient, err := monitoring.NewForConfig(conf.CrdGroup, cfg) + mclient, err := monitoring.NewForConfig(&conf.CrdKinds, conf.CrdGroup, cfg) if err != nil { return nil, err } @@ -1021,8 +1022,8 @@ func (c *Operator) createCRDs() error { } crds := []*extensionsobj.CustomResourceDefinition{ - k8sutil.NewPrometheusCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap), - k8sutil.NewServiceMonitorCustomResourceDefinition(c.config.CrdGroup, c.config.Labels.LabelsMap), + k8sutil.NewPrometheusCustomResourceDefinition(c.config.CrdKinds.Prometheus, c.config.CrdGroup, c.config.Labels.LabelsMap), + k8sutil.NewServiceMonitorCustomResourceDefinition(c.config.CrdKinds.ServiceMonitor, c.config.CrdGroup, c.config.Labels.LabelsMap), } crdClient := c.crdclient.ApiextensionsV1beta1().CustomResourceDefinitions() diff --git a/test/framework/framework.go b/test/framework/framework.go index 928d37aca..a864ad9ec 100644 --- a/test/framework/framework.go +++ b/test/framework/framework.go @@ -59,7 +59,7 @@ func New(ns, kubeconfig, opImage string) (*Framework, error) { return nil, errors.Wrap(err, "creating http-client failed") } - mclient, err := monitoringv1.NewForConfig(monitoringv1.Group, config) + mclient, err := monitoringv1.NewForConfig(&monitoringv1.DefaultCrdKinds, monitoringv1.Group, config) if err != nil { return nil, errors.Wrap(err, "creating monitoring client failed") } diff --git a/test/migration/migration_test.go b/test/migration/migration_test.go index 58989ee6a..1aa4cac3f 100644 --- a/test/migration/migration_test.go +++ b/test/migration/migration_test.go @@ -238,7 +238,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC } // Check if CRDs are created. - _, err = crdClient.Get(k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) + _, err = crdClient.Get(k8sutil.NewPrometheusCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Prometheus, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) if err != nil && apierrors.IsNotFound(err) { fmt.Println("Expected Prometheus CRD definition to be created, but it does not exists.") return false, nil @@ -247,7 +247,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC return false, err } - _, err = crdClient.Get(k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) + _, err = crdClient.Get(k8sutil.NewAlertmanagerCustomResourceDefinition(monitoringv1.DefaultCrdKinds.Alertmanager, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) if err != nil && apierrors.IsNotFound(err) { fmt.Println("Expected Alertmanager CRD definition to be created, but it does not exists.") return false, nil @@ -256,7 +256,7 @@ func checkMigrationDone(ns2 string, framework *operatorFramework.Framework, tprC return false, err } - _, err = crdClient.Get(k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) + _, err = crdClient.Get(k8sutil.NewServiceMonitorCustomResourceDefinition(monitoringv1.DefaultCrdKinds.ServiceMonitor, monitoringv1.Group, map[string]string{}).Name, metav1.GetOptions{}) if err != nil && apierrors.IsNotFound(err) { fmt.Println("Expected ServiceMonitor CRD definition to be created, but it does not exists.") return false, nil