From 35f10074fb413717a3fe5fb5639892798f8cbebf Mon Sep 17 00:00:00 2001 From: Karol Wychowaniec Date: Wed, 21 Mar 2018 14:56:09 +0100 Subject: [PATCH] Add a configuration step to make the test work on GKE --- .../monitoring/custom_metrics_deployments.go | 32 ++++++++++++++++++- .../monitoring/custom_metrics_stackdriver.go | 10 +++--- 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/test/e2e/instrumentation/monitoring/custom_metrics_deployments.go b/test/e2e/instrumentation/monitoring/custom_metrics_deployments.go index 793b3e425d8..898d6e1a3db 100644 --- a/test/e2e/instrumentation/monitoring/custom_metrics_deployments.go +++ b/test/e2e/instrumentation/monitoring/custom_metrics_deployments.go @@ -58,6 +58,7 @@ var ( AdapterForOldResourceModel = "adapter_old_resource_model.yaml" AdapterForNewResourceModel = "adapter_new_resource_model.yaml" AdapterDefault = AdapterForOldResourceModel + ClusterAdminBinding = "e2e-test-cluster-admin-binding" ) // CustomMetricContainerSpec allows to specify a config for StackdriverExporterDeployment @@ -240,8 +241,15 @@ func prometheusExporterPodSpec(metricName string, metricValue int64, port int32) // CreateAdapter creates Custom Metrics - Stackdriver adapter // adapterDeploymentFile should be a filename for adapter deployment located in StagingDeploymentLocation func CreateAdapter(adapterDeploymentFile string) error { + // A workaround to make the work on GKE. GKE doesn't normally allow to create cluster roles, + // which the adapter deployment does. The solution is to create cluster role binding for + // cluster-admin role and currently used service account. + err := createClusterAdminBinding() + if err != nil { + return err + } adapterURL := StagingDeploymentsLocation + adapterDeploymentFile - err := exec.Command("wget", adapterURL).Run() + err = exec.Command("wget", adapterURL).Run() if err != nil { return err } @@ -250,6 +258,19 @@ func CreateAdapter(adapterDeploymentFile string) error { return err } +func createClusterAdminBinding() error { + stdout, stderr, err := framework.RunCmd("gcloud", "config", "get-value", "core/account") + if err != nil { + framework.Logf(stderr) + return err + } + serviceAccount := strings.TrimSpace(stdout) + framework.Logf("current service account: %q", serviceAccount) + stat, err := framework.RunKubectl("create", "clusterrolebinding", ClusterAdminBinding, "--clusterrole=cluster-admin", "--user="+serviceAccount) + framework.Logf(stat) + return err +} + // CreateDescriptors creates descriptors for metrics: CustomMetricName and UnusedMetricName. func CreateDescriptors(service *gcm.Service, projectId string) error { _, err := service.Projects.MetricDescriptors.Create(fmt.Sprintf("projects/%s", projectId), &gcm.MetricDescriptor{ @@ -294,4 +315,13 @@ func CleanupAdapter(adapterDeploymentFile string) { if err != nil { framework.Logf("Failed to delete adapter deployment file: %s", err) } + cleanupClusterAdminBinding() +} + +func cleanupClusterAdminBinding() { + stat, err := framework.RunKubectl("delete", "clusterrolebinding", ClusterAdminBinding) + framework.Logf(stat) + if err != nil { + framework.Logf("Failed to delete cluster admin binding: %s", err) + } } diff --git a/test/e2e/instrumentation/monitoring/custom_metrics_stackdriver.go b/test/e2e/instrumentation/monitoring/custom_metrics_stackdriver.go index fe1ab44b1ae..a2c09ea5dff 100644 --- a/test/e2e/instrumentation/monitoring/custom_metrics_stackdriver.go +++ b/test/e2e/instrumentation/monitoring/custom_metrics_stackdriver.go @@ -216,10 +216,10 @@ func verifyResponseFromExternalMetricsAPI(f *framework.Framework, externalMetric req1, _ := labels.NewRequirement("resource.type", selection.Equals, []string{"k8s_pod"}) // It's important to filter out only metrics from the right namespace, since multiple e2e tests // may run in the same project concurrently. "dummy" is added to test - req2, _ := labels.NewRequirement("resource.label.namespace_name", selection.In, []string{string(f.Namespace.Name), "dummy"}) - req3, _ := labels.NewRequirement("resource.label.pod_name", selection.Exists, []string{}) - req4, _ := labels.NewRequirement("resource.label.location", selection.NotEquals, []string{"dummy"}) - req5, _ := labels.NewRequirement("resource.label.cluster_name", selection.NotIn, []string{"foo", "bar"}) + req2, _ := labels.NewRequirement("resource.labels.namespace_name", selection.In, []string{string(f.Namespace.Name), "dummy"}) + req3, _ := labels.NewRequirement("resource.labels.pod_name", selection.Exists, []string{}) + req4, _ := labels.NewRequirement("resource.labels.location", selection.NotEquals, []string{"dummy"}) + req5, _ := labels.NewRequirement("resource.labels.cluster_name", selection.NotIn, []string{"foo", "bar"}) values, err := externalMetricsClient. NamespacedMetrics("dummy"). List("custom.googleapis.com|"+CustomMetricName, labels.NewSelector().Add(*req1, *req2, *req3, *req4, *req5)) @@ -232,7 +232,7 @@ func verifyResponseFromExternalMetricsAPI(f *framework.Framework, externalMetric if values.Items[0].MetricName != "custom.googleapis.com|"+CustomMetricName || values.Items[0].Value.Value() != CustomMetricValue || // Check one label just to make sure labels are included - values.Items[0].MetricLabels["resource.label.namespace_name"] != string(f.Namespace.Name) { + values.Items[0].MetricLabels["resource.labels.namespace_name"] != string(f.Namespace.Name) { framework.Failf("Unexpected result for metric %s: %v", CustomMetricName, values.Items[0]) } }