From a68cbd65b7a080fa75886199cc30295c6eda5a37 Mon Sep 17 00:00:00 2001 From: Jesse Haka Date: Thu, 15 Feb 2018 19:58:56 +0200 Subject: [PATCH] implement InstanceShutdownByProviderID to aws cloudprovider changes according what was asked use string do not delete instance if it is in any other state than running use constants fix --- pkg/cloudprovider/providers/aws/aws.go | 39 ++++++++++++++++++++------ 1 file changed, 31 insertions(+), 8 deletions(-) diff --git a/pkg/cloudprovider/providers/aws/aws.go b/pkg/cloudprovider/providers/aws/aws.go index f28e91e4ed8..bdf23adfa22 100644 --- a/pkg/cloudprovider/providers/aws/aws.go +++ b/pkg/cloudprovider/providers/aws/aws.go @@ -1336,7 +1336,7 @@ func (c *Cloud) NodeAddressesByProviderID(ctx context.Context, providerID string return extractNodeAddresses(instance) } -// InstanceExistsByProviderID returns true if the instance with the given provider id still exists and is running. +// InstanceExistsByProviderID returns true if the instance with the given provider id still exists. // If false is returned with no error, the instance will be immediately deleted by the cloud controller manager. func (c *Cloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) { instanceID, err := kubernetesInstanceID(providerID).mapToAWSInstanceID() @@ -1359,18 +1359,41 @@ func (c *Cloud) InstanceExistsByProviderID(ctx context.Context, providerID strin return false, fmt.Errorf("multiple instances found for instance: %s", instanceID) } - state := instances[0].State.Name - if *state != "running" { - glog.Warningf("the instance %s is not running", instanceID) - return false, nil - } - return true, nil } // InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes func (c *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) { - return false, cloudprovider.NotImplemented + instanceID, err := kubernetesInstanceID(providerID).mapToAWSInstanceID() + if err != nil { + return false, err + } + + request := &ec2.DescribeInstancesInput{ + InstanceIds: []*string{instanceID.awsString()}, + } + + instances, err := c.ec2.DescribeInstances(request) + if err != nil { + return false, err + } + if len(instances) == 0 { + glog.Warningf("the instance %s does not exist anymore", providerID) + return true, nil + } + if len(instances) > 1 { + return false, fmt.Errorf("multiple instances found for instance: %s", instanceID) + } + + instance := instances[0] + if instance.State != nil { + state := aws.StringValue(instance.State.Name) + // valid state for detaching volumes + if state == ec2.InstanceStateNameStopped || state == ec2.InstanceStateNameTerminated { + return true, nil + } + } + return false, nil } // InstanceID returns the cloud provider ID of the node with the specified nodeName.