From a64bf28ab92dfda84f20199d28af8137c137f390 Mon Sep 17 00:00:00 2001 From: Jan Knipper Date: Fri, 13 Jan 2023 15:40:05 +0100 Subject: [PATCH 1/2] Test if sharding is disabled in project before cluster creation --- pkg/client/openstack/project/client.go | 10 ++++++++ pkg/client/openstack/project/logging.go | 15 +++++++++++ pkg/controller/ground.go | 33 +++++++++++++++++++++++++ 3 files changed, 58 insertions(+) diff --git a/pkg/client/openstack/project/client.go b/pkg/client/openstack/project/client.go index eae79021e4..1e23b3f144 100644 --- a/pkg/client/openstack/project/client.go +++ b/pkg/client/openstack/project/client.go @@ -5,6 +5,7 @@ import ( "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/availabilityzones" "github.com/gophercloud/gophercloud/openstack/compute/v2/extensions/keypairs" "github.com/gophercloud/gophercloud/openstack/compute/v2/flavors" + "github.com/gophercloud/gophercloud/openstack/identity/v3/projects" "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/layer3/routers" securitygroups "github.com/gophercloud/gophercloud/openstack/networking/v2/extensions/security/groups" "github.com/gophercloud/gophercloud/openstack/networking/v2/networks" @@ -17,6 +18,7 @@ import ( type ProjectClient interface { GetMetadata() (*models.OpenstackMetadata, error) + GetProjectTags() ([]string, error) } type projectClient struct { @@ -70,6 +72,14 @@ func (c *projectClient) GetMetadata() (metadata *models.OpenstackMetadata, err e return metadata, nil } +func (c *projectClient) GetProjectTags() ([]string, error) { + project, err := projects.Get(c.IdentityClient, c.projectID).Extract() + if err != nil { + return nil, err + } + return project.Tags, nil +} + func (c *projectClient) getRouters() ([]*models.Router, error) { result := []*models.Router{} diff --git a/pkg/client/openstack/project/logging.go b/pkg/client/openstack/project/logging.go index 9cb217f2a4..b3892a92ee 100644 --- a/pkg/client/openstack/project/logging.go +++ b/pkg/client/openstack/project/logging.go @@ -1,6 +1,7 @@ package project import ( + "fmt" "time" "github.com/go-kit/kit/log" @@ -29,3 +30,17 @@ func (c LoggingClient) GetMetadata() (metadata *models.OpenstackMetadata, err er return c.Client.GetMetadata() } + +func (c LoggingClient) GetProjectTags() (tags []string, err error) { + defer func(begin time.Time) { + c.Logger.Log( + "msg", "fetched project tags", + "tags", fmt.Sprintf("%v", tags), + "took", time.Since(begin), + "v", 2, + "err", err, + ) + }(time.Now()) + + return c.Client.GetProjectTags() +} diff --git a/pkg/controller/ground.go b/pkg/controller/ground.go index c7f2b0675c..b7325a91d8 100644 --- a/pkg/controller/ground.go +++ b/pkg/controller/ground.go @@ -54,6 +54,8 @@ const ( UpgradeEnableAnnotation = "kubernikus.cloud.sap/upgrade" SeedReconcileLabelKey = "kubernikus.cloud.sap/seed-reconcile" + + ShardingEnabledProjectTag = "sharding_enabled" ) type GroundControl struct { @@ -230,6 +232,16 @@ func (op *GroundControl) handler(key string) error { return nil } + if disabled, err := op.isShardingDisabledInProject(kluster); err != nil || !disabled { + if err != nil { + op.Recorder.Eventf(kluster, api_v1.EventTypeWarning, FailedCreate, "Cluster creation failed. Could not examine project tags: %s", err) + return err + } + msg := "Cluster creation failed. VCenter sharding must be disabled for project." + op.Recorder.Eventf(kluster, api_v1.EventTypeWarning, FailedCreate, msg) + return fmt.Errorf("Cluster creation failed. VCenter sharding must be disabled for project.") + } + op.Logger.Log( "msg", "creating kluster", "kluster", kluster.GetName(), @@ -898,6 +910,27 @@ func (op *GroundControl) requiresKubernikusInfo(kluster *v1.Kluster) bool { return kluster.Status.Apiserver == "" || kluster.Status.Wormhole == "" || kluster.Spec.Version == "" || (swag.BoolValue(kluster.Spec.Dashboard) && kluster.Status.Dashboard == "") } +func (op *GroundControl) isShardingDisabledInProject(kluster *v1.Kluster) (bool, error) { + client, err := op.Factories.Openstack.ProjectAdminClientFor(kluster.Account()) + if err != nil { + return false, err + } + + tags, err := client.GetProjectTags() + if err != nil { + return false, err + } + + for _, tag := range tags { + if tag == ShardingEnabledProjectTag { + return false, nil + } + + } + + return true, nil +} + func (op *GroundControl) discoverKubernikusInfo(kluster *v1.Kluster) error { op.Logger.Log( "msg", "discovering KubernikusInfo", From bf210d150bd1dd484547481b90b184339b07f141 Mon Sep 17 00:00:00 2001 From: Jan Knipper Date: Thu, 19 Jan 2023 16:49:14 +0100 Subject: [PATCH 2/2] Remove double negation :-) --- pkg/controller/ground.go | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/pkg/controller/ground.go b/pkg/controller/ground.go index b7325a91d8..824558f4e6 100644 --- a/pkg/controller/ground.go +++ b/pkg/controller/ground.go @@ -232,14 +232,14 @@ func (op *GroundControl) handler(key string) error { return nil } - if disabled, err := op.isShardingDisabledInProject(kluster); err != nil || !disabled { + if enabled, err := op.isShardingEnabledInProject(kluster); err != nil || enabled { if err != nil { op.Recorder.Eventf(kluster, api_v1.EventTypeWarning, FailedCreate, "Cluster creation failed. Could not examine project tags: %s", err) return err } msg := "Cluster creation failed. VCenter sharding must be disabled for project." op.Recorder.Eventf(kluster, api_v1.EventTypeWarning, FailedCreate, msg) - return fmt.Errorf("Cluster creation failed. VCenter sharding must be disabled for project.") + return fmt.Errorf(msg) } op.Logger.Log( @@ -910,25 +910,25 @@ func (op *GroundControl) requiresKubernikusInfo(kluster *v1.Kluster) bool { return kluster.Status.Apiserver == "" || kluster.Status.Wormhole == "" || kluster.Spec.Version == "" || (swag.BoolValue(kluster.Spec.Dashboard) && kluster.Status.Dashboard == "") } -func (op *GroundControl) isShardingDisabledInProject(kluster *v1.Kluster) (bool, error) { +func (op *GroundControl) isShardingEnabledInProject(kluster *v1.Kluster) (bool, error) { client, err := op.Factories.Openstack.ProjectAdminClientFor(kluster.Account()) if err != nil { - return false, err + return true, err } tags, err := client.GetProjectTags() if err != nil { - return false, err + return true, err } for _, tag := range tags { if tag == ShardingEnabledProjectTag { - return false, nil + return true, nil } } - return true, nil + return false, nil } func (op *GroundControl) discoverKubernikusInfo(kluster *v1.Kluster) error {