func terminateClusters()

in tool/clean/clean_ecs/clean_ecs.go [44:139]


func terminateClusters(ctx context.Context, client *ecs.Client) {
	// you can only filter ecs by name or arn
	// not regex of tag name like ec2
	// describe cluster input max is 100
	ecsListClusterInput := ecs.ListClustersInput{
		MaxResults: aws.Int32(100),
	}
	for {
		clusterIds := make([]*string, 0)
		expirationDateCluster := time.Now().UTC().Add(clean.KeepDurationOneWeek)
		listClusterOutput, err := client.ListClusters(ctx, &ecsListClusterInput)
		if err != nil || listClusterOutput.ClusterArns == nil || len(listClusterOutput.ClusterArns) == 0 {
			break
		}
		describeClustersInput := ecs.DescribeClustersInput{Clusters: listClusterOutput.ClusterArns}
		describeClustersOutput, err := client.DescribeClusters(ctx, &describeClustersInput)
		if err != nil || describeClustersOutput.Clusters == nil || len(describeClustersOutput.Clusters) == 0 {
			break
		}
		for _, cluster := range describeClustersOutput.Clusters {
			if !strings.HasPrefix(*cluster.ClusterName, "cwagent-integ-test-cluster-") {
				continue
			}
			if cluster.RunningTasksCount == 0 && cluster.PendingTasksCount == 0 {
				clusterIds = append(clusterIds, cluster.ClusterArn)
				continue
			}
			describeTaskInput := ecs.DescribeTasksInput{Cluster: cluster.ClusterArn}
			describeTasks, err := client.DescribeTasks(ctx, &describeTaskInput)
			if err != nil {
				continue
			}
			addCluster := true
			for _, task := range describeTasks.Tasks {
				if expirationDateCluster.After(*task.StartedAt) {
					log.Printf("Task %s launch-date %s", *task.TaskArn, *task.StartedAt)
				} else {
					addCluster = false
					break
				}
			}
			if addCluster {
				clusterIds = append(clusterIds, cluster.ClusterArn)
			}
		}
		if len(clusterIds) == 0 {
			log.Printf("No clusters to terminate")
			return
		}

		for _, clusterId := range clusterIds {
			log.Printf("cluster to temrinate %s", *clusterId)
			listContainerInstanceInput := ecs.ListContainerInstancesInput{Cluster: clusterId}
			listContainerInstances, err := client.ListContainerInstances(ctx, &listContainerInstanceInput)
			if err != nil {
				log.Printf("Error %v getting container instances cluster %s", err, *clusterId)
				continue
			}
			for _, instance := range listContainerInstances.ContainerInstanceArns {
				deregisterContainerInstanceInput := ecs.DeregisterContainerInstanceInput{
					ContainerInstance: aws.String(instance),
					Cluster:           clusterId,
					Force:             aws.Bool(true),
				}
				_, err = client.DeregisterContainerInstance(ctx, &deregisterContainerInstanceInput)
				if err != nil {
					log.Printf("Error %v deregister container instances cluster %s container %v", err, *clusterId, instance)
					continue
				}
			}
			serviceInput := ecs.ListServicesInput{Cluster: clusterId}
			services, err := client.ListServices(ctx, &serviceInput)
			if err != nil {
				log.Printf("Error %v getting services cluster %s", err, *clusterId)
				continue
			}
			for _, service := range services.ServiceArns {
				deleteServiceInput := ecs.DeleteServiceInput{Cluster: clusterId, Service: aws.String(service)}
				_, err := client.DeleteService(ctx, &deleteServiceInput)
				if err != nil {
					log.Printf("Error %v deleteing service %s cluster %s", err, serviceInput, *clusterId)
					continue
				}
			}
			terminateClusterInput := ecs.DeleteClusterInput{Cluster: clusterId}
			_, err = client.DeleteCluster(ctx, &terminateClusterInput)
			if err != nil {
				log.Printf("Error %v terminating cluster %s", err, *clusterId)
			}
		}
		if ecsListClusterInput.NextToken == nil {
			break
		}
		ecsListClusterInput.NextToken = listClusterOutput.NextToken
	}
}