1
0
Fork 0
mirror of https://github.com/prometheus-operator/prometheus-operator.git synced 2025-04-16 09:16:38 +00:00
prometheus-operator/test/framework/framework.go
2017-11-08 18:33:09 +01:00

176 lines
5.8 KiB
Go

// Copyright 2016 The prometheus-operator Authors
//
// 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 framework
import (
"net/http"
"testing"
"time"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/fields"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/pkg/api/v1"
"k8s.io/client-go/rest"
"k8s.io/client-go/tools/clientcmd"
monitoringv1 "github.com/coreos/prometheus-operator/pkg/client/monitoring/v1"
"github.com/coreos/prometheus-operator/pkg/k8sutil"
"github.com/pkg/errors"
)
type Framework struct {
KubeClient kubernetes.Interface
MonClient monitoringv1.MonitoringV1Interface
HTTPClient *http.Client
MasterHost string
Namespace *v1.Namespace
OperatorPod *v1.Pod
DefaultTimeout time.Duration
}
// Setup setups a test framework and returns it.
func New(ns, kubeconfig, opImage string) (*Framework, error) {
config, err := clientcmd.BuildConfigFromFlags("", kubeconfig)
if err != nil {
return nil, errors.Wrap(err, "build config from flags failed")
}
cli, err := kubernetes.NewForConfig(config)
if err != nil {
return nil, errors.Wrap(err, "creating new kube-client failed")
}
httpc := cli.CoreV1().RESTClient().(*rest.RESTClient).Client
if err != nil {
return nil, errors.Wrap(err, "creating http-client failed")
}
mclient, err := monitoringv1.NewForConfig(&monitoringv1.DefaultCrdKinds, monitoringv1.Group, config)
if err != nil {
return nil, errors.Wrap(err, "creating monitoring client failed")
}
namespace, err := CreateNamespace(cli, ns)
if err != nil {
return nil, err
}
f := &Framework{
MasterHost: config.Host,
KubeClient: cli,
MonClient: mclient,
HTTPClient: httpc,
Namespace: namespace,
DefaultTimeout: time.Minute,
}
err = f.Setup(opImage)
if err != nil {
return nil, errors.Wrap(err, "setup test environment failed")
}
return f, nil
}
func (f *Framework) Setup(opImage string) error {
if err := f.setupPrometheusOperator(opImage); err != nil {
return errors.Wrap(err, "setup prometheus operator failed")
}
return nil
}
func (f *Framework) setupPrometheusOperator(opImage string) error {
if _, err := CreateServiceAccount(f.KubeClient, f.Namespace.Name, "../../example/rbac/prometheus-operator/prometheus-operator-service-account.yaml"); err != nil && !apierrors.IsAlreadyExists(err) {
return errors.Wrap(err, "failed to create prometheus operator service account")
}
if err := CreateClusterRole(f.KubeClient, "../../example/rbac/prometheus-operator/prometheus-operator-cluster-role.yaml"); err != nil && !apierrors.IsAlreadyExists(err) {
return errors.Wrap(err, "failed to create prometheus cluster role")
}
if _, err := CreateClusterRoleBinding(f.KubeClient, f.Namespace.Name, "../../example/rbac/prometheus-operator/prometheus-operator-cluster-role-binding.yaml"); err != nil && !apierrors.IsAlreadyExists(err) {
return errors.Wrap(err, "failed to create prometheus cluster role binding")
}
if err := CreateClusterRole(f.KubeClient, "../../example/rbac/prometheus/prometheus-cluster-role.yaml"); err != nil && !apierrors.IsAlreadyExists(err) {
return errors.Wrap(err, "failed to create prometheus cluster role")
}
deploy, err := MakeDeployment("../../example/rbac/prometheus-operator/prometheus-operator.yaml")
if err != nil {
return err
}
if opImage != "" {
// Override operator image used, if specified when running tests.
deploy.Spec.Template.Spec.Containers[0].Image = opImage
}
err = CreateDeployment(f.KubeClient, f.Namespace.Name, deploy)
if err != nil {
return err
}
opts := metav1.ListOptions{LabelSelector: fields.SelectorFromSet(fields.Set(deploy.Spec.Template.ObjectMeta.Labels)).String()}
err = WaitForPodsReady(f.KubeClient, f.Namespace.Name, f.DefaultTimeout, 1, opts)
if err != nil {
return errors.Wrap(err, "failed to wait for prometheus operator to become ready")
}
pl, err := f.KubeClient.Core().Pods(f.Namespace.Name).List(opts)
if err != nil {
return err
}
f.OperatorPod = &pl.Items[0]
return nil
}
func (ctx *TestCtx) SetupPrometheusRBAC(t *testing.T, ns string, kubeClient kubernetes.Interface) {
if finalizerFn, err := CreateServiceAccount(kubeClient, ns, "../../example/rbac/prometheus/prometheus-service-account.yaml"); err != nil {
t.Fatal(errors.Wrap(err, "failed to create prometheus service account"))
} else {
ctx.AddFinalizerFn(finalizerFn)
}
if finalizerFn, err := CreateRoleBinding(kubeClient, ns, "../framework/ressources/prometheus-role-binding.yml"); err != nil {
t.Fatal(errors.Wrap(err, "failed to create prometheus role binding"))
} else {
ctx.AddFinalizerFn(finalizerFn)
}
}
// Teardown tears down a previously initialized test environment.
func (f *Framework) Teardown() error {
if err := f.KubeClient.Core().Services(f.Namespace.Name).Delete("prometheus-operated", nil); err != nil && !k8sutil.IsResourceNotFoundError(err) {
return err
}
if err := f.KubeClient.Core().Services(f.Namespace.Name).Delete("alertmanager-operated", nil); err != nil && !k8sutil.IsResourceNotFoundError(err) {
return err
}
if err := f.KubeClient.Extensions().Deployments(f.Namespace.Name).Delete("prometheus-operator", nil); err != nil {
return err
}
if err := DeleteNamespace(f.KubeClient, f.Namespace.Name); err != nil {
return err
}
return nil
}