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
This commit is contained in:
Jesse Haka 2018-02-15 19:58:56 +02:00
parent 113872798d
commit a68cbd65b7

View File

@ -1336,7 +1336,7 @@ func (c *Cloud) NodeAddressesByProviderID(ctx context.Context, providerID string
return extractNodeAddresses(instance) 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. // 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) { func (c *Cloud) InstanceExistsByProviderID(ctx context.Context, providerID string) (bool, error) {
instanceID, err := kubernetesInstanceID(providerID).mapToAWSInstanceID() 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) 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 return true, nil
} }
// InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes // InstanceShutdownByProviderID returns true if the instance is in safe state to detach volumes
func (c *Cloud) InstanceShutdownByProviderID(ctx context.Context, providerID string) (bool, error) { 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. // InstanceID returns the cloud provider ID of the node with the specified nodeName.