Skip to content
Open
Show file tree
Hide file tree
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
85 changes: 53 additions & 32 deletions tests/utils/handler/cluster_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -1211,54 +1211,69 @@ func (ch *clusterHandler) CreateCluster(waitForClusterReady bool) (err error) {
return err
}

func (ch *clusterHandler) destroyCluster() (errors []error) {
// destroyCluster deletes the cluster and waits for uninstall to finish.
// clusterRemoved is true when there is no cluster left to block follow-on
// cleanup (already gone, or uninstall completed). It is false when delete or
// uninstall failed and the cluster may still exist — callers should skip
// resource cleanup that requires the cluster to be gone.
func (ch *clusterHandler) destroyCluster() (errors []error, clusterRemoved bool) {
var clusterID string
if ch.clusterDetail != nil && ch.clusterDetail.ClusterID != "" {
clusterID = ch.clusterDetail.ClusterID
} else if ch.resourcesHandler != nil && ch.resourcesHandler.resources.ClusterID != "" {
clusterID = ch.resourcesHandler.resources.ClusterID
}
if clusterID != "" {
clusterService := ch.rosaClient.Cluster
Comment thread
amandahla marked this conversation as resolved.
output, errDeleteCluster := clusterService.DeleteCluster(clusterID, "-y")
if errDeleteCluster != nil {
if strings.Contains(output.String(), fmt.Sprintf("There is no cluster with identifier or name '%s'", clusterID)) {
log.Logger.Infof("Cluster %s not exists.", clusterID)
} else {
log.Logger.Errorf("Error happened when delete cluster: %s", output.String())
errors = append(errors, errDeleteCluster)
}
} else {
log.Logger.Infof("Waiting for the cluster %s to be uninstalled", clusterID)
err := clusterService.WaitForClusterPassUninstalled(clusterID, 2, config.Test.GlobalENV.ClusterWaitingTime)
if err != nil {
log.Logger.Errorf("Error happened when waiting cluster uninstall: %s", err.Error())
errors = append(errors, err)
} else {
log.Logger.Infof("Delete cluster %s successfully.", clusterID)
}
if clusterID == "" {
// Nothing to uninstall; allow prepared-resource cleanup to proceed.
return nil, true
}

// Remove OIDC provider
if ch.profile.ClusterConfig.STS && ch.profile.ClusterConfig.OIDCConfig != "managed" {
_, err = ch.rosaClient.OCMResource.DeleteOIDCProvider("-c", clusterID, "-y", "--mode", "auto")
if err != nil {
log.Logger.Errorf("Error happened when delete oidc provider: %s", err.Error())
errors = append(errors, err)
}
log.Logger.Infof("Delete oidc provider successfully")
}
clusterService := ch.rosaClient.Cluster
output, errDeleteCluster := clusterService.DeleteCluster(clusterID, "-y")
if errDeleteCluster != nil {
if strings.Contains(output.String(), fmt.Sprintf("There is no cluster with identifier or name '%s'", clusterID)) {
log.Logger.Infof("Cluster %s not exists.", clusterID)
return nil, true
}
log.Logger.Errorf("Error happened when delete cluster: %s", output.String())
return []error{errDeleteCluster}, false
}
return

log.Logger.Infof("Waiting for the cluster %s to be uninstalled", clusterID)
err := clusterService.WaitForClusterPassUninstalled(clusterID, 2, config.Test.GlobalENV.ClusterWaitingTime)
if err != nil {
log.Logger.Errorf("Error happened when waiting cluster uninstall: %s", err.Error())
// Fail fast: do not attempt OIDC/provider cleanup while the cluster may
// still exist; that only produces noisy secondary errors.
return []error{err}, false
Comment thread
coderabbitai[bot] marked this conversation as resolved.
}
log.Logger.Infof("Delete cluster %s successfully.", clusterID)

// Remove OIDC provider only after uninstall completed.
if ch.profile.ClusterConfig.STS && ch.profile.ClusterConfig.OIDCConfig != "managed" {
_, err = ch.rosaClient.OCMResource.DeleteOIDCProvider("-c", clusterID, "-y", "--mode", "auto")
if err != nil {
log.Logger.Errorf("Error happened when delete oidc provider: %s", err.Error())
errors = append(errors, err)
} else {
log.Logger.Infof("Delete oidc provider successfully")
}
}
return errors, true
}

func (ch *clusterHandler) Destroy() (errors []error) {
// destroy cluster
errDestroyCluster := ch.destroyCluster()
errDestroyCluster, clusterRemoved := ch.destroyCluster()
if len(errDestroyCluster) > 0 {
errors = append(errors, errDestroyCluster...)
}

if skipPreparedResourceCleanup(clusterRemoved) {
log.Logger.Warnf(
"Skipping prepared resource cleanup because the cluster was not fully removed")
return errors
}

// Destroy ch.resourcesHandler.Prepared user data
errDestroyUserData := ch.resourcesHandler.DestroyResources()
if len(errDestroyUserData) > 0 {
Expand All @@ -1267,6 +1282,12 @@ func (ch *clusterHandler) Destroy() (errors []error) {
return errors
}

// skipPreparedResourceCleanup is true when destroy did not fully remove the
// cluster, so follow-on AWS/OCM resource cleanup would likely fail noisily.
func skipPreparedResourceCleanup(clusterRemoved bool) bool {
return !clusterRemoved
}

func (ch *clusterHandler) elaborateKMSKeyForSTSCluster(etcdKMS bool) error {
clusterID := ch.clusterDetail.ClusterID
jsonData, err := ch.rosaClient.Cluster.GetJSONClusterDescription(clusterID)
Expand Down
10 changes: 10 additions & 0 deletions tests/utils/handler/cluster_handler_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -44,3 +44,13 @@ var _ = Describe("classifyClusterState", func() {
Expect(classifyClusterState("")).To(Equal(clusterStateUnknown))
})
})

var _ = Describe("skipPreparedResourceCleanup", func() {
It("skips cleanup when the cluster was not removed", func() {
Expect(skipPreparedResourceCleanup(false)).To(BeTrue())
})

It("does not skip cleanup when the cluster was removed", func() {
Expect(skipPreparedResourceCleanup(true)).To(BeFalse())
})
})
Comment thread
coderabbitai[bot] marked this conversation as resolved.