From aa66c4f6d840180de31d7696a50559c8bb27121c Mon Sep 17 00:00:00 2001 From: Ole Markus With Date: Sat, 19 Sep 2020 10:40:48 +0200 Subject: [PATCH] Add rolling upgrade to openstack --- cmd/kops/rollingupdatecluster.go | 1 + pkg/instancegroups/BUILD.bazel | 3 +-- pkg/instancegroups/instancegroups.go | 31 +++++++++++++++++++++++ pkg/instancegroups/rollingupdate.go | 9 ++++--- upup/pkg/fi/cloudup/openstack/instance.go | 1 - 5 files changed, 39 insertions(+), 6 deletions(-) diff --git a/cmd/kops/rollingupdatecluster.go b/cmd/kops/rollingupdatecluster.go index a5dbf0a75f..203d059b8c 100644 --- a/cmd/kops/rollingupdatecluster.go +++ b/cmd/kops/rollingupdatecluster.go @@ -328,6 +328,7 @@ func RunRollingUpdateCluster(ctx context.Context, f *util.Factory, out io.Writer } d := &instancegroups.RollingUpdateCluster{ + Clientset: clientset, Ctx: ctx, Cluster: cluster, MasterInterval: options.MasterInterval, diff --git a/pkg/instancegroups/BUILD.bazel b/pkg/instancegroups/BUILD.bazel index 8f969e12a7..022cd01436 100644 --- a/pkg/instancegroups/BUILD.bazel +++ b/pkg/instancegroups/BUILD.bazel @@ -17,6 +17,7 @@ go_library( "//pkg/featureflag:go_default_library", "//pkg/validation:go_default_library", "//upup/pkg/fi:go_default_library", + "//upup/pkg/fi/cloudup:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/api/errors:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", @@ -40,8 +41,6 @@ go_test( embed = [":go_default_library"], deps = [ "//cloudmock/aws/mockautoscaling:go_default_library", - "//cloudmock/openstack/mockcompute:go_default_library", - "//cloudmock/openstack/mocknetworking:go_default_library", "//pkg/apis/kops:go_default_library", "//pkg/assets:go_default_library", "//pkg/client/simple/vfsclientset:go_default_library", diff --git a/pkg/instancegroups/instancegroups.go b/pkg/instancegroups/instancegroups.go index 9ed5b4c0e0..bc78a8acbf 100644 --- a/pkg/instancegroups/instancegroups.go +++ b/pkg/instancegroups/instancegroups.go @@ -24,6 +24,9 @@ import ( "strings" "time" + "k8s.io/kops/upup/pkg/fi" + "k8s.io/kops/upup/pkg/fi/cloudup" + corev1 "k8s.io/api/core/v1" apierrors "k8s.io/apimachinery/pkg/api/errors" metav1 "k8s.io/apimachinery/pkg/apis/meta/v1" @@ -371,6 +374,11 @@ func (c *RollingUpdateCluster) drainTerminateAndWait(u *cloudinstances.CloudInst return err } + if err := c.reconcileInstanceGroup(); err != nil { + klog.Errorf("error reconciling instance group %q: %v", u.CloudInstanceGroup.HumanName, err) + return err + } + // Wait for the minimum interval klog.Infof("waiting for %v after terminating instance", sleepAfterTerminate) time.Sleep(sleepAfterTerminate) @@ -378,6 +386,29 @@ func (c *RollingUpdateCluster) drainTerminateAndWait(u *cloudinstances.CloudInst return nil } +func (c *RollingUpdateCluster) reconcileInstanceGroup() error { + if api.CloudProviderID(c.Cluster.Spec.CloudProvider) != api.CloudProviderOpenstack { + return nil + } + rto := fi.RunTasksOptions{} + rto.InitDefaults() + applyCmd := &cloudup.ApplyClusterCmd{ + Cloud: c.Cloud, + Clientset: c.Clientset, + Cluster: c.Cluster, + DryRun: false, + AllowKopsDowngrade: true, + RunTasksOptions: &rto, + OutDir: "", + Phase: "", + TargetName: "direct", + LifecycleOverrides: map[string]fi.Lifecycle{}, + } + + return applyCmd.Run(c.Ctx) + +} + func (c *RollingUpdateCluster) maybeValidate(operation string, validateCount int) error { if c.CloudOnly { klog.Warningf("Not validating cluster as cloudonly flag is set.") diff --git a/pkg/instancegroups/rollingupdate.go b/pkg/instancegroups/rollingupdate.go index 178e4a696c..70a6366ad6 100644 --- a/pkg/instancegroups/rollingupdate.go +++ b/pkg/instancegroups/rollingupdate.go @@ -23,6 +23,8 @@ import ( "sync" "time" + "k8s.io/kops/pkg/client/simple" + "k8s.io/client-go/kubernetes" "k8s.io/klog/v2" api "k8s.io/kops/pkg/apis/kops" @@ -33,9 +35,10 @@ import ( // RollingUpdateCluster is a struct containing cluster information for a rolling update. type RollingUpdateCluster struct { - Ctx context.Context - Cluster *api.Cluster - Cloud fi.Cloud + Clientset simple.Clientset + Ctx context.Context + Cluster *api.Cluster + Cloud fi.Cloud // MasterInterval is the amount of time to wait after stopping a master instance MasterInterval time.Duration diff --git a/upup/pkg/fi/cloudup/openstack/instance.go b/upup/pkg/fi/cloudup/openstack/instance.go index ee9752ee60..e9932312d5 100644 --- a/upup/pkg/fi/cloudup/openstack/instance.go +++ b/upup/pkg/fi/cloudup/openstack/instance.go @@ -117,7 +117,6 @@ func (c *openstackCloud) DeleteInstance(i *cloudinstances.CloudInstance) error { } func deleteInstance(c OpenstackCloud, i *cloudinstances.CloudInstance) error { - klog.Warning("This does not work without running kops update cluster --yes in another terminal") return deleteInstanceWithID(c, i.ID) }