diff --git a/cmd/kops/rollingupdatecluster.go b/cmd/kops/rollingupdatecluster.go index 714df3a80ab14..7d4d6d5a52335 100644 --- a/cmd/kops/rollingupdatecluster.go +++ b/cmd/kops/rollingupdatecluster.go @@ -347,6 +347,7 @@ func RunRollingUpdateCluster(ctx context.Context, f *util.Factory, out io.Writer ValidateSuccessDuration: 10 * time.Second, Ctx: ctx, Cluster: cluster, + Clientset: clientset, } err = d.AdjustNeedUpdate(groups, list) diff --git a/pkg/instancegroups/BUILD.bazel b/pkg/instancegroups/BUILD.bazel index be31d811c6dff..bc074c612d513 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", @@ -33,22 +34,28 @@ go_library( go_test( name = "go_default_test", srcs = [ + "rollingupdate_os_test.go", "rollingupdate_test.go", "settings_test.go", ], 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/cloudinstances:go_default_library", "//pkg/validation:go_default_library", "//upup/pkg/fi:go_default_library", "//upup/pkg/fi/cloudup/awsup:go_default_library", + "//upup/pkg/fi/cloudup/openstack:go_default_library", "//vendor/github.com/aws/aws-sdk-go/aws:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/autoscaling:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/autoscaling/autoscalingiface:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/ec2:go_default_library", "//vendor/github.com/aws/aws-sdk-go/service/ec2/ec2iface:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/compute/v2/servers:go_default_library", + "//vendor/github.com/gophercloud/gophercloud/openstack/networking/v2/ports:go_default_library", "//vendor/github.com/stretchr/testify/assert:go_default_library", "//vendor/k8s.io/api/core/v1:go_default_library", "//vendor/k8s.io/apimachinery/pkg/apis/meta/v1:go_default_library", diff --git a/pkg/instancegroups/instancegroups.go b/pkg/instancegroups/instancegroups.go index 9ed5b4c0e03ad..bcddeaf42eb16 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,28 @@ 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{ + 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 a75d207ddf0b1..e8bbe7eb7e654 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" @@ -76,6 +78,8 @@ type RollingUpdateCluster struct { Ctx context.Context Cluster *api.Cluster + + Clientset simple.Clientset } // AdjustNeedUpdate adjusts the set of instances that need updating, using factors outside those known by the cloud implementation diff --git a/upup/pkg/fi/cloudup/openstack/instance.go b/upup/pkg/fi/cloudup/openstack/instance.go index ee9752ee60122..e9932312d5f77 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) }