Merge labels with CR
Change-Id: Ia92c7a75cfdd24321b8e27939c1de2fe05bf1426
This commit is contained in:
parent
dde446cc40
commit
5acd3683ad
@ -52,6 +52,7 @@
|
|||||||
check:
|
check:
|
||||||
jobs:
|
jobs:
|
||||||
- golangci-lint
|
- golangci-lint
|
||||||
|
- golang-go-test
|
||||||
- openstack-operator:linters:chart
|
- openstack-operator:linters:chart
|
||||||
- openstack-operator:images:build
|
- openstack-operator:images:build
|
||||||
- openstack-operator:functional:
|
- openstack-operator:functional:
|
||||||
@ -67,4 +68,4 @@
|
|||||||
- openstack-operator:images:upload
|
- openstack-operator:images:upload
|
||||||
promote:
|
promote:
|
||||||
jobs:
|
jobs:
|
||||||
- openstack-operator:images:promote
|
- openstack-operator:images:promote
|
||||||
|
9
Makefile
9
Makefile
@ -14,15 +14,15 @@ endif
|
|||||||
all: manager
|
all: manager
|
||||||
|
|
||||||
# Run tests
|
# Run tests
|
||||||
test: generate fmt vet manifests
|
test: generate fmt vet manifests lint
|
||||||
go test ./... -coverprofile cover.out
|
go test ./... -coverprofile cover.out
|
||||||
|
|
||||||
# Build manager binary
|
# Build manager binary
|
||||||
manager: generate fmt vet
|
manager: generate fmt vet lint
|
||||||
go build -o bin/manager main.go
|
go build -o bin/manager main.go
|
||||||
|
|
||||||
# Run against the configured Kubernetes cluster in ~/.kube/config
|
# Run against the configured Kubernetes cluster in ~/.kube/config
|
||||||
run: generate fmt vet manifests
|
run: generate fmt vet manifests lint
|
||||||
go run ./main.go
|
go run ./main.go
|
||||||
|
|
||||||
# Install CRDs into a cluster
|
# Install CRDs into a cluster
|
||||||
@ -48,6 +48,9 @@ manifests: controller-gen
|
|||||||
fmt:
|
fmt:
|
||||||
go fmt ./...
|
go fmt ./...
|
||||||
|
|
||||||
|
# Run golangci-lint code
|
||||||
|
lint:
|
||||||
|
golangci-lint run
|
||||||
# Run go vet against code
|
# Run go vet against code
|
||||||
vet:
|
vet:
|
||||||
go vet ./...
|
go vet ./...
|
||||||
|
@ -25,6 +25,11 @@ func PodMonitor(existing *monitoringv1.PodMonitor, owner metav1.Object, scheme *
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pm *PodMonitorBuilder) Labels(labels map[string]string) *PodMonitorBuilder {
|
||||||
|
pm.obj.Labels = labels
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
|
||||||
func (pm *PodMonitorBuilder) Selector(matchLabels map[string]string) *PodMonitorBuilder {
|
func (pm *PodMonitorBuilder) Selector(matchLabels map[string]string) *PodMonitorBuilder {
|
||||||
pm.obj.Spec.Selector = metav1.LabelSelector{
|
pm.obj.Spec.Selector = metav1.LabelSelector{
|
||||||
MatchLabels: matchLabels,
|
MatchLabels: matchLabels,
|
||||||
|
@ -24,6 +24,11 @@ func PrometheusRule(existing *monitoringv1.PrometheusRule, owner metav1.Object,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (pm *PrometheusRuleBuilder) Labels(labels map[string]string) *PrometheusRuleBuilder {
|
||||||
|
pm.obj.Labels = labels
|
||||||
|
return pm
|
||||||
|
}
|
||||||
|
|
||||||
// RuleGroups returns the ruleGroups
|
// RuleGroups returns the ruleGroups
|
||||||
func (pm *PrometheusRuleBuilder) RuleGroups(ruleGroups ...*RuleGroupBuilder) *PrometheusRuleBuilder {
|
func (pm *PrometheusRuleBuilder) RuleGroups(ruleGroups ...*RuleGroupBuilder) *PrometheusRuleBuilder {
|
||||||
pm.ruleGroups = ruleGroups
|
pm.ruleGroups = ruleGroups
|
||||||
|
@ -2,6 +2,8 @@ apiVersion: infrastructure.vexxhost.cloud/v1alpha1
|
|||||||
kind: Mcrouter
|
kind: Mcrouter
|
||||||
metadata:
|
metadata:
|
||||||
name: sample
|
name: sample
|
||||||
|
labels:
|
||||||
|
prometheus: helm
|
||||||
spec:
|
spec:
|
||||||
route: PoolRoute|default
|
route: PoolRoute|default
|
||||||
pools:
|
pools:
|
||||||
|
@ -2,5 +2,7 @@ apiVersion: infrastructure.vexxhost.cloud/v1alpha1
|
|||||||
kind: Memcached
|
kind: Memcached
|
||||||
metadata:
|
metadata:
|
||||||
name: sample
|
name: sample
|
||||||
|
labels:
|
||||||
|
monitoring: haha
|
||||||
spec:
|
spec:
|
||||||
megabytes: 128
|
megabytes: 128
|
||||||
|
@ -16,7 +16,8 @@ import (
|
|||||||
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
||||||
"opendev.org/vexxhost/openstack-operator/builders"
|
"opendev.org/vexxhost/openstack-operator/builders"
|
||||||
"opendev.org/vexxhost/openstack-operator/utils"
|
"opendev.org/vexxhost/openstack-operator/utils/baseutils"
|
||||||
|
"opendev.org/vexxhost/openstack-operator/utils/k8sutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// McrouterReconciler reconciles a Mcrouter object
|
// McrouterReconciler reconciles a Mcrouter object
|
||||||
@ -44,10 +45,15 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Labels
|
// Labels
|
||||||
|
typeLabels := baseutils.MergeMapsWithoutOverwrite(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "mcrouter",
|
||||||
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
}, mcrouter.Labels)
|
||||||
|
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"app.kubernetes.io/name": "mcrouter",
|
"app.kubernetes.io/name": "mcrouter",
|
||||||
"app.kubernetes.io/instance": req.Name,
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
"app.kubernetes.io/instance": req.Name,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ConfigMap
|
// ConfigMap
|
||||||
@ -57,7 +63,7 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err := utils.CreateOrUpdate(ctx, r, configMap, func() error {
|
op, err := k8sutils.CreateOrUpdate(ctx, r, configMap, func() error {
|
||||||
b, err := json.Marshal(mcrouter.Spec)
|
b, err := json.Marshal(mcrouter.Spec)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -80,7 +86,7 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, deployment, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, deployment, func() error {
|
||||||
return builders.Deployment(deployment, &mcrouter, r.Scheme).
|
return builders.Deployment(deployment, &mcrouter, r.Scheme).
|
||||||
Labels(labels).
|
Labels(labels).
|
||||||
Replicas(2).
|
Replicas(2).
|
||||||
@ -131,15 +137,12 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: req.Namespace,
|
Namespace: req.Namespace,
|
||||||
Name: "mcrouter-podmonitor",
|
Name: "mcrouter-podmonitor",
|
||||||
Labels: map[string]string{
|
|
||||||
"app.kubernetes.io/name": "mcrouter",
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
||||||
return builders.PodMonitor(podMonitor, &mcrouter, r.Scheme).
|
return builders.PodMonitor(podMonitor, &mcrouter, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
Selector(map[string]string{
|
Selector(map[string]string{
|
||||||
"app.kubernetes.io/name": "mcrouter",
|
"app.kubernetes.io/name": "mcrouter",
|
||||||
}).
|
}).
|
||||||
@ -163,13 +166,13 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: "mcrouter-alertrule",
|
Name: "mcrouter-alertrule",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
||||||
|
|
||||||
return builders.PrometheusRule(alertRule, &mcrouter, r.Scheme).
|
return builders.PrometheusRule(alertRule, &mcrouter, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
RuleGroups(builders.RuleGroup().
|
RuleGroups(builders.RuleGroup().
|
||||||
Name("mcrouter-rule").
|
Name("mcrouter-rule").
|
||||||
Rules(
|
Rules(
|
||||||
|
|
||||||
builders.Rule().
|
builders.Rule().
|
||||||
Alert("McrouterBackendDown").
|
Alert("McrouterBackendDown").
|
||||||
Message("Backend Memcached servers are down.").
|
Message("Backend Memcached servers are down.").
|
||||||
@ -196,7 +199,7 @@ func (r *McrouterReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
Name: fmt.Sprintf("mcrouter-%s", req.Name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, service, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, service, func() error {
|
||||||
return builders.Service(service, &mcrouter, r.Scheme).
|
return builders.Service(service, &mcrouter, r.Scheme).
|
||||||
Port("mcrouter", 11211).
|
Port("mcrouter", 11211).
|
||||||
Selector(labels).
|
Selector(labels).
|
||||||
|
@ -35,7 +35,8 @@ import (
|
|||||||
|
|
||||||
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
"opendev.org/vexxhost/openstack-operator/builders"
|
"opendev.org/vexxhost/openstack-operator/builders"
|
||||||
"opendev.org/vexxhost/openstack-operator/utils"
|
"opendev.org/vexxhost/openstack-operator/utils/baseutils"
|
||||||
|
"opendev.org/vexxhost/openstack-operator/utils/k8sutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// MemcachedReconciler reconciles a Memcached object
|
// MemcachedReconciler reconciles a Memcached object
|
||||||
@ -66,11 +67,21 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
size := memcached.Spec.Megabytes / 2
|
size := memcached.Spec.Megabytes / 2
|
||||||
|
|
||||||
// Labels
|
// Labels
|
||||||
|
typeLabels := baseutils.MergeMapsWithoutOverwrite(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "memcached",
|
||||||
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
}, memcached.Labels)
|
||||||
|
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"app.kubernetes.io/name": "memcached",
|
"app.kubernetes.io/name": "memcached",
|
||||||
"app.kubernetes.io/instance": req.Name,
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
"app.kubernetes.io/instance": req.Name,
|
||||||
}
|
}
|
||||||
|
mcrouterLabels := baseutils.MergeMapsWithoutOverwrite(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "memcached",
|
||||||
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
"app.kubernetes.io/instance": req.Name,
|
||||||
|
}, memcached.Labels)
|
||||||
|
|
||||||
// Deployment
|
// Deployment
|
||||||
deployment := &appsv1.Deployment{
|
deployment := &appsv1.Deployment{
|
||||||
@ -81,7 +92,7 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err := utils.CreateOrUpdate(ctx, r, deployment, func() error {
|
op, err := k8sutils.CreateOrUpdate(ctx, r, deployment, func() error {
|
||||||
return builders.Deployment(deployment, &memcached, r.Scheme).
|
return builders.Deployment(deployment, &memcached, r.Scheme).
|
||||||
Labels(labels).
|
Labels(labels).
|
||||||
Replicas(2).
|
Replicas(2).
|
||||||
@ -119,7 +130,6 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
log.WithValues("resource", "Deployment").WithValues("op", op).Info("Reconciled")
|
||||||
|
|
||||||
// PodMonitor
|
// PodMonitor
|
||||||
|
|
||||||
podMonitor := &monitoringv1.PodMonitor{
|
podMonitor := &monitoringv1.PodMonitor{
|
||||||
TypeMeta: metav1.TypeMeta{
|
TypeMeta: metav1.TypeMeta{
|
||||||
APIVersion: "monitoring.coreos.com/v1",
|
APIVersion: "monitoring.coreos.com/v1",
|
||||||
@ -128,15 +138,12 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: req.Namespace,
|
Namespace: req.Namespace,
|
||||||
Name: "memcached-podmonitor",
|
Name: "memcached-podmonitor",
|
||||||
Labels: map[string]string{
|
|
||||||
"app.kubernetes.io/name": "memcached",
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
||||||
return builders.PodMonitor(podMonitor, &memcached, r.Scheme).
|
return builders.PodMonitor(podMonitor, &memcached, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
Selector(map[string]string{
|
Selector(map[string]string{
|
||||||
"app.kubernetes.io/name": "memcached",
|
"app.kubernetes.io/name": "memcached",
|
||||||
}).
|
}).
|
||||||
@ -184,9 +191,10 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: "memcached-alertrule",
|
Name: "memcached-alertrule",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
||||||
|
|
||||||
return builders.PrometheusRule(alertRule, &memcached, r.Scheme).
|
return builders.PrometheusRule(alertRule, &memcached, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
RuleGroups(builders.RuleGroup().
|
RuleGroups(builders.RuleGroup().
|
||||||
Name("memcached-rule").
|
Name("memcached-rule").
|
||||||
Rules(
|
Rules(
|
||||||
@ -213,7 +221,7 @@ func (r *MemcachedReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: req.Namespace,
|
Namespace: req.Namespace,
|
||||||
Name: fmt.Sprintf("memcached-%s", req.Name),
|
Name: fmt.Sprintf("memcached-%s", req.Name),
|
||||||
Labels: labels,
|
Labels: mcrouterLabels,
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = controllerutil.CreateOrUpdate(ctx, r, mcrouter, func() error {
|
op, err = controllerutil.CreateOrUpdate(ctx, r, mcrouter, func() error {
|
||||||
|
@ -15,7 +15,8 @@ import (
|
|||||||
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
monitoringv1 "opendev.org/vexxhost/openstack-operator/api/monitoring/v1"
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
||||||
"opendev.org/vexxhost/openstack-operator/builders"
|
"opendev.org/vexxhost/openstack-operator/builders"
|
||||||
"opendev.org/vexxhost/openstack-operator/utils"
|
"opendev.org/vexxhost/openstack-operator/utils/baseutils"
|
||||||
|
"opendev.org/vexxhost/openstack-operator/utils/k8sutils"
|
||||||
)
|
)
|
||||||
|
|
||||||
// RabbitmqReconciler reconciles a Rabbitmq object
|
// RabbitmqReconciler reconciles a Rabbitmq object
|
||||||
@ -52,10 +53,15 @@ func (r *RabbitmqReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Labels
|
// Labels
|
||||||
|
typeLabels := baseutils.MergeMapsWithoutOverwrite(map[string]string{
|
||||||
|
"app.kubernetes.io/name": "rabbitmq",
|
||||||
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
}, Rabbitmq.Labels)
|
||||||
|
|
||||||
labels := map[string]string{
|
labels := map[string]string{
|
||||||
"app.kubernetes.io/name": "rabbitmq",
|
"app.kubernetes.io/name": "rabbitmq",
|
||||||
"app.kubernetes.io/instance": req.Name,
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
"app.kubernetes.io/managed-by": "openstack-operator",
|
||||||
|
"app.kubernetes.io/instance": req.Name,
|
||||||
}
|
}
|
||||||
|
|
||||||
// Deployment
|
// Deployment
|
||||||
@ -65,7 +71,7 @@ func (r *RabbitmqReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: fmt.Sprintf("rabbitmq-%s", req.Name),
|
Name: fmt.Sprintf("rabbitmq-%s", req.Name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err := utils.CreateOrUpdate(ctx, r, deployment, func() error {
|
op, err := k8sutils.CreateOrUpdate(ctx, r, deployment, func() error {
|
||||||
return builders.Deployment(deployment, &Rabbitmq, r.Scheme).
|
return builders.Deployment(deployment, &Rabbitmq, r.Scheme).
|
||||||
Labels(labels).
|
Labels(labels).
|
||||||
Replicas(1).
|
Replicas(1).
|
||||||
@ -107,15 +113,12 @@ func (r *RabbitmqReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
ObjectMeta: metav1.ObjectMeta{
|
ObjectMeta: metav1.ObjectMeta{
|
||||||
Namespace: req.Namespace,
|
Namespace: req.Namespace,
|
||||||
Name: "rabbitmq-podmonitor",
|
Name: "rabbitmq-podmonitor",
|
||||||
Labels: map[string]string{
|
|
||||||
"app.kubernetes.io/name": "rabbitmq",
|
|
||||||
"app.kubernetes.io/managed-by": "openstack-operator",
|
|
||||||
},
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, podMonitor, func() error {
|
||||||
return builders.PodMonitor(podMonitor, &Rabbitmq, r.Scheme).
|
return builders.PodMonitor(podMonitor, &Rabbitmq, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
Selector(map[string]string{
|
Selector(map[string]string{
|
||||||
"app.kubernetes.io/name": "rabbitmq",
|
"app.kubernetes.io/name": "rabbitmq",
|
||||||
}).
|
}).
|
||||||
@ -139,8 +142,9 @@ func (r *RabbitmqReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: "rabbitmq-alertrule",
|
Name: "rabbitmq-alertrule",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, alertRule, func() error {
|
||||||
return builders.PrometheusRule(alertRule, &Rabbitmq, r.Scheme).
|
return builders.PrometheusRule(alertRule, &Rabbitmq, r.Scheme).
|
||||||
|
Labels(typeLabels).
|
||||||
RuleGroups(builders.RuleGroup().
|
RuleGroups(builders.RuleGroup().
|
||||||
Name("rabbitmq-rule").
|
Name("rabbitmq-rule").
|
||||||
Rules(
|
Rules(
|
||||||
@ -180,7 +184,7 @@ func (r *RabbitmqReconciler) Reconcile(req ctrl.Request) (ctrl.Result, error) {
|
|||||||
Name: fmt.Sprintf("rabbitmq-%s", req.Name),
|
Name: fmt.Sprintf("rabbitmq-%s", req.Name),
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
op, err = utils.CreateOrUpdate(ctx, r, service, func() error {
|
op, err = k8sutils.CreateOrUpdate(ctx, r, service, func() error {
|
||||||
return builders.Service(service, &Rabbitmq, r.Scheme).
|
return builders.Service(service, &Rabbitmq, r.Scheme).
|
||||||
Port("epmd", 4369).
|
Port("epmd", 4369).
|
||||||
Port("amqp", 5671).
|
Port("amqp", 5671).
|
||||||
|
@ -1,86 +0,0 @@
|
|||||||
/*
|
|
||||||
|
|
||||||
|
|
||||||
Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
you may not use this file except in compliance with the License.
|
|
||||||
You may obtain a copy of the License at
|
|
||||||
|
|
||||||
http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
|
|
||||||
Unless required by applicable law or agreed to in writing, software
|
|
||||||
distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
See the License for the specific language governing permissions and
|
|
||||||
limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package controllers
|
|
||||||
|
|
||||||
import (
|
|
||||||
"path/filepath"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
. "github.com/onsi/ginkgo"
|
|
||||||
. "github.com/onsi/gomega"
|
|
||||||
"k8s.io/client-go/kubernetes/scheme"
|
|
||||||
"k8s.io/client-go/rest"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/client"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/envtest"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/envtest/printer"
|
|
||||||
logf "sigs.k8s.io/controller-runtime/pkg/log"
|
|
||||||
"sigs.k8s.io/controller-runtime/pkg/log/zap"
|
|
||||||
|
|
||||||
infrastructurev1alpha1 "opendev.org/vexxhost/openstack-operator/api/v1alpha1"
|
|
||||||
// +kubebuilder:scaffold:imports
|
|
||||||
)
|
|
||||||
|
|
||||||
// These tests use Ginkgo (BDD-style Go testing framework). Refer to
|
|
||||||
// http://onsi.github.io/ginkgo/ to learn more about Ginkgo.
|
|
||||||
|
|
||||||
var cfg *rest.Config
|
|
||||||
var k8sClient client.Client
|
|
||||||
var testEnv *envtest.Environment
|
|
||||||
|
|
||||||
func TestAPIs(t *testing.T) {
|
|
||||||
RegisterFailHandler(Fail)
|
|
||||||
|
|
||||||
RunSpecsWithDefaultAndCustomReporters(t,
|
|
||||||
"Controller Suite",
|
|
||||||
[]Reporter{printer.NewlineReporter{}})
|
|
||||||
}
|
|
||||||
|
|
||||||
var _ = BeforeSuite(func(done Done) {
|
|
||||||
logf.SetLogger(zap.LoggerTo(GinkgoWriter, true))
|
|
||||||
|
|
||||||
By("bootstrapping test environment")
|
|
||||||
testEnv = &envtest.Environment{
|
|
||||||
CRDDirectoryPaths: []string{filepath.Join("..", "config", "crd", "bases")},
|
|
||||||
}
|
|
||||||
|
|
||||||
var err error
|
|
||||||
cfg, err = testEnv.Start()
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(cfg).ToNot(BeNil())
|
|
||||||
|
|
||||||
err = infrastructurev1alpha1.AddToScheme(scheme.Scheme)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
err = infrastructurev1alpha1.AddToScheme(scheme.Scheme)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
err = infrastructurev1alpha1.AddToScheme(scheme.Scheme)
|
|
||||||
Expect(err).NotTo(HaveOccurred())
|
|
||||||
|
|
||||||
// +kubebuilder:scaffold:scheme
|
|
||||||
k8sClient, err = client.New(cfg, client.Options{Scheme: scheme.Scheme})
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
Expect(k8sClient).ToNot(BeNil())
|
|
||||||
|
|
||||||
close(done)
|
|
||||||
}, 60)
|
|
||||||
|
|
||||||
var _ = AfterSuite(func() {
|
|
||||||
By("tearing down the test environment")
|
|
||||||
err := testEnv.Stop()
|
|
||||||
Expect(err).ToNot(HaveOccurred())
|
|
||||||
})
|
|
3
go.mod
3
go.mod
@ -6,8 +6,7 @@ require (
|
|||||||
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf
|
github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf
|
||||||
github.com/go-logr/logr v0.1.0
|
github.com/go-logr/logr v0.1.0
|
||||||
github.com/google/go-cmp v0.3.0
|
github.com/google/go-cmp v0.3.0
|
||||||
github.com/onsi/ginkgo v1.11.0
|
github.com/stretchr/testify v1.5.1
|
||||||
github.com/onsi/gomega v1.8.1
|
|
||||||
k8s.io/api v0.17.2
|
k8s.io/api v0.17.2
|
||||||
k8s.io/apimachinery v0.17.2
|
k8s.io/apimachinery v0.17.2
|
||||||
k8s.io/client-go v0.17.2
|
k8s.io/client-go v0.17.2
|
||||||
|
3
go.sum
3
go.sum
@ -264,12 +264,15 @@ github.com/spf13/pflag v1.0.5/go.mod h1:McXfInJRrz4CZXVZOBLb0bTZqETkiAhM9Iw0y3An
|
|||||||
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
github.com/spf13/viper v1.3.2/go.mod h1:ZiWeW+zYFKm7srdB9IoDzzZXaJaI5eL9QjNiN/DMA2s=
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.2.0 h1:Hbg2NidpLE8veEBkEZTL3CvlkUIVzuU9jDplZO54c48=
|
||||||
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
github.com/stretchr/objx v0.2.0/go.mod h1:qt09Ya8vawLte6SNmTgCsAVtYtaKzEcn8ATUoHMkEqE=
|
||||||
github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v0.0.0-20151208002404-e3a8ff8ce365/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
|
||||||
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
|
||||||
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
|
||||||
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
|
||||||
|
github.com/stretchr/testify v1.5.1 h1:nOGnQDM7FYENwehXlg/kFVnos3rEvtKTjRvOWSzb6H4=
|
||||||
|
github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA=
|
||||||
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk=
|
||||||
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
github.com/tmc/grpc-websocket-proxy v0.0.0-20170815181823-89b8d40f7ca8/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U=
|
||||||
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0=
|
||||||
|
26
utils/baseutils/map.go
Normal file
26
utils/baseutils/map.go
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
package baseutils
|
||||||
|
|
||||||
|
// MergeMaps merges all maps in the list
|
||||||
|
func MergeMaps(MapList ...map[string]string) map[string]string {
|
||||||
|
var baseMap = make(map[string]string)
|
||||||
|
for _, imap := range MapList {
|
||||||
|
for k, v := range imap {
|
||||||
|
baseMap[k] = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return baseMap
|
||||||
|
}
|
||||||
|
|
||||||
|
// MergeMapsWithoutOverwrite merges all maps in the list without overwriting. The priority is the same as the sequence of the list.
|
||||||
|
func MergeMapsWithoutOverwrite(MapList ...map[string]string) map[string]string {
|
||||||
|
var baseMap = make(map[string]string)
|
||||||
|
for _, imap := range MapList {
|
||||||
|
for k, v := range imap {
|
||||||
|
if _, ok := baseMap[k]; !ok {
|
||||||
|
baseMap[k] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return baseMap
|
||||||
|
}
|
55
utils/baseutils/map_test.go
Normal file
55
utils/baseutils/map_test.go
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
package baseutils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func assertMergeMaps(t *testing.T, cr, instance, expected map[string]string) {
|
||||||
|
merged := MergeMapsWithoutOverwrite(cr, instance)
|
||||||
|
assert.Equal(t, expected, merged)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMergeMapsWithNoInstanceLabels(t *testing.T) {
|
||||||
|
cr := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
}
|
||||||
|
instance := map[string]string{}
|
||||||
|
expected := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
}
|
||||||
|
|
||||||
|
assertMergeMaps(t, cr, instance, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMergeMapsWithDifferentInstanceLabels(t *testing.T) {
|
||||||
|
cr := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
}
|
||||||
|
instance := map[string]string{
|
||||||
|
"more": "options",
|
||||||
|
}
|
||||||
|
expected := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
"more": "options",
|
||||||
|
}
|
||||||
|
|
||||||
|
assertMergeMaps(t, cr, instance, expected)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestMergeMapsWithCustomResourceLabelOverride(t *testing.T) {
|
||||||
|
cr := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
}
|
||||||
|
instance := map[string]string{
|
||||||
|
"foo": "bar2",
|
||||||
|
"more": "options",
|
||||||
|
}
|
||||||
|
expected := map[string]string{
|
||||||
|
"foo": "bar",
|
||||||
|
"more": "options",
|
||||||
|
}
|
||||||
|
|
||||||
|
assertMergeMaps(t, cr, instance, expected)
|
||||||
|
}
|
@ -1,4 +1,4 @@
|
|||||||
package utils
|
package k8sutils
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
Loading…
x
Reference in New Issue
Block a user