Add a configuration step to make the test work on GKE

pull/8/head
Karol Wychowaniec 2018-03-21 14:56:09 +01:00
parent 71f14cf335
commit 35f10074fb
2 changed files with 36 additions and 6 deletions

View File

@ -58,6 +58,7 @@ var (
AdapterForOldResourceModel = "adapter_old_resource_model.yaml" AdapterForOldResourceModel = "adapter_old_resource_model.yaml"
AdapterForNewResourceModel = "adapter_new_resource_model.yaml" AdapterForNewResourceModel = "adapter_new_resource_model.yaml"
AdapterDefault = AdapterForOldResourceModel AdapterDefault = AdapterForOldResourceModel
ClusterAdminBinding = "e2e-test-cluster-admin-binding"
) )
// CustomMetricContainerSpec allows to specify a config for StackdriverExporterDeployment // 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 // CreateAdapter creates Custom Metrics - Stackdriver adapter
// adapterDeploymentFile should be a filename for adapter deployment located in StagingDeploymentLocation // adapterDeploymentFile should be a filename for adapter deployment located in StagingDeploymentLocation
func CreateAdapter(adapterDeploymentFile string) error { 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 adapterURL := StagingDeploymentsLocation + adapterDeploymentFile
err := exec.Command("wget", adapterURL).Run() err = exec.Command("wget", adapterURL).Run()
if err != nil { if err != nil {
return err return err
} }
@ -250,6 +258,19 @@ func CreateAdapter(adapterDeploymentFile string) error {
return err 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. // CreateDescriptors creates descriptors for metrics: CustomMetricName and UnusedMetricName.
func CreateDescriptors(service *gcm.Service, projectId string) error { func CreateDescriptors(service *gcm.Service, projectId string) error {
_, err := service.Projects.MetricDescriptors.Create(fmt.Sprintf("projects/%s", projectId), &gcm.MetricDescriptor{ _, err := service.Projects.MetricDescriptors.Create(fmt.Sprintf("projects/%s", projectId), &gcm.MetricDescriptor{
@ -294,4 +315,13 @@ func CleanupAdapter(adapterDeploymentFile string) {
if err != nil { if err != nil {
framework.Logf("Failed to delete adapter deployment file: %s", err) 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)
}
} }

View File

@ -216,10 +216,10 @@ func verifyResponseFromExternalMetricsAPI(f *framework.Framework, externalMetric
req1, _ := labels.NewRequirement("resource.type", selection.Equals, []string{"k8s_pod"}) 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 // 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 // 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"}) req2, _ := labels.NewRequirement("resource.labels.namespace_name", selection.In, []string{string(f.Namespace.Name), "dummy"})
req3, _ := labels.NewRequirement("resource.label.pod_name", selection.Exists, []string{}) req3, _ := labels.NewRequirement("resource.labels.pod_name", selection.Exists, []string{})
req4, _ := labels.NewRequirement("resource.label.location", selection.NotEquals, []string{"dummy"}) req4, _ := labels.NewRequirement("resource.labels.location", selection.NotEquals, []string{"dummy"})
req5, _ := labels.NewRequirement("resource.label.cluster_name", selection.NotIn, []string{"foo", "bar"}) req5, _ := labels.NewRequirement("resource.labels.cluster_name", selection.NotIn, []string{"foo", "bar"})
values, err := externalMetricsClient. values, err := externalMetricsClient.
NamespacedMetrics("dummy"). NamespacedMetrics("dummy").
List("custom.googleapis.com|"+CustomMetricName, labels.NewSelector().Add(*req1, *req2, *req3, *req4, *req5)) 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 || if values.Items[0].MetricName != "custom.googleapis.com|"+CustomMetricName ||
values.Items[0].Value.Value() != CustomMetricValue || values.Items[0].Value.Value() != CustomMetricValue ||
// Check one label just to make sure labels are included // 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]) framework.Failf("Unexpected result for metric %s: %v", CustomMetricName, values.Items[0])
} }
} }