Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 18 additions & 58 deletions pkg/destroy/aws/aws.go
Original file line number Diff line number Diff line change
Expand Up @@ -55,10 +55,9 @@ type ClusterUninstaller struct {
// }
//
// will match resources with (a:b and c:d) or d:e.
Filters []Filter // filter(s) we will be searching for
Logger logrus.FieldLogger
Region string
ClusterID string
Filters []Filter // filter(s) we will be searching for
Logger logrus.FieldLogger
Region string

// Session is the AWS session to be used for deletion. If nil, a
// new session will be created based on the usual credential
Expand All @@ -79,11 +78,10 @@ func New(logger logrus.FieldLogger, metadata *types.ClusterMetadata) (providers.
}

return &ClusterUninstaller{
Filters: filters,
Region: metadata.ClusterPlatformMetadata.AWS.Region,
Logger: logger,
ClusterID: metadata.InfraID,
Session: session,
Filters: filters,
Region: metadata.ClusterPlatformMetadata.AWS.Region,
Logger: logger,
Session: session,
}, nil
}

Expand Down Expand Up @@ -148,7 +146,7 @@ func (o *ClusterUninstaller) Run() error {
return err
}

err = wait.PollImmediateInfinite(
return wait.PollImmediateInfinite(
time.Second*10,
func() (done bool, err error) {
var loopError error
Expand Down Expand Up @@ -254,16 +252,6 @@ func (o *ClusterUninstaller) Run() error {
return len(tagClients) == 0 && loopError == nil, nil
},
)
if err != nil {
return err
}

o.Logger.Debug("search for untaggable resources")
if err := o.deleteUntaggedResources(awsSession); err != nil {
o.Logger.Debug(err)
return err
}
return nil
}

func splitSlash(name string, input string) (base string, suffix string, err error) {
Expand Down Expand Up @@ -755,27 +743,6 @@ func terminateEC2InstancesByTags(ec2Client *ec2.EC2, iamClient *iam.IAM, filters
return terminated, err
}

// This is a bit of hack. Some objects, like Instance Profiles, can not be tagged in AWS.
// We "normally" find those objects by their relation to other objects. We have found,
// however, that people regularly delete all of their instances and roles outside of
// openshift-install destroy cluster. This means that we are unable to find the Instance
// Profiles.
//
// This code is a place to find specific objects like this which might be dangling.
func (o *ClusterUninstaller) deleteUntaggedResources(awsSession *session.Session) error {
iamClient := iam.New(awsSession)
masterProfile := fmt.Sprintf("%s-master-profile", o.ClusterID)
if err := deleteIAMInstanceProfileByName(iamClient, &masterProfile, o.Logger); err != nil {
return err
}
workerProfile := fmt.Sprintf("%s-worker-profile", o.ClusterID)
if err := deleteIAMInstanceProfileByName(iamClient, &workerProfile, o.Logger); err != nil {
return err
}

return nil
}

func deleteEC2InternetGateway(client *ec2.EC2, id string, logger logrus.FieldLogger) error {
response, err := client.DescribeInternetGateways(&ec2.DescribeInternetGatewaysInput{
InternetGatewayIds: []*string{aws.String(id)},
Expand Down Expand Up @@ -1464,25 +1431,12 @@ func deleteIAM(session *session.Session, arn arn.ARN, logger logrus.FieldLogger)
}
}

func deleteIAMInstanceProfileByName(client *iam.IAM, name *string, logger logrus.FieldLogger) error {
_, err := client.DeleteInstanceProfile(&iam.DeleteInstanceProfileInput{
InstanceProfileName: name,
})
if err != nil {
if err.(awserr.Error).Code() == iam.ErrCodeNoSuchEntityException {
return nil
}
return err
}
logger.WithField("InstanceProfileName", *name).Info("Deleted")
return err
}

func deleteIAMInstanceProfile(client *iam.IAM, profileARN arn.ARN, logger logrus.FieldLogger) error {
resourceType, name, err := splitSlash("resource", profileARN.Resource)
if err != nil {
return err
}
logger = logger.WithField("name", name)

if resourceType != "instance-profile" {
return errors.Errorf("%s ARN passed to deleteIAMInstanceProfile: %s", resourceType, profileARN.String())
Expand All @@ -1507,14 +1461,20 @@ func deleteIAMInstanceProfile(client *iam.IAM, profileARN arn.ARN, logger logrus
if err != nil {
return errors.Wrapf(err, "dissociating %s", *role.RoleName)
}
logger.WithField("name", name).WithField("role", *role.RoleName).Info("Disassociated")
logger.WithField("role", *role.RoleName).Info("Disassociated")
}

logger = logger.WithField("arn", profileARN.String())
if err := deleteIAMInstanceProfileByName(client, profile.InstanceProfileName, logger); err != nil {
_, err = client.DeleteInstanceProfile(&iam.DeleteInstanceProfileInput{
InstanceProfileName: profile.InstanceProfileName,
})
if err != nil {
if err.(awserr.Error).Code() == iam.ErrCodeNoSuchEntityException {
return nil
}
return err
}

logger.Info("Deleted")
return nil
}

Expand Down