github.com/jfrog/jfrog-cli-core/v2@v2.52.0/lifecycle/deletelocal.go (about)

     1  package lifecycle
     2  
     3  import (
     4  	"errors"
     5  	"fmt"
     6  	"github.com/jfrog/jfrog-cli-core/v2/utils/config"
     7  	"github.com/jfrog/jfrog-cli-core/v2/utils/coreutils"
     8  	"github.com/jfrog/jfrog-client-go/lifecycle"
     9  	"github.com/jfrog/jfrog-client-go/lifecycle/services"
    10  	"github.com/jfrog/jfrog-client-go/utils/log"
    11  	"strings"
    12  )
    13  
    14  type ReleaseBundleDeleteCommand struct {
    15  	releaseBundleCmd
    16  	environment string
    17  	quiet       bool
    18  }
    19  
    20  func NewReleaseBundleDeleteCommand() *ReleaseBundleDeleteCommand {
    21  	return &ReleaseBundleDeleteCommand{}
    22  }
    23  
    24  func (rbd *ReleaseBundleDeleteCommand) SetServerDetails(serverDetails *config.ServerDetails) *ReleaseBundleDeleteCommand {
    25  	rbd.serverDetails = serverDetails
    26  	return rbd
    27  }
    28  
    29  func (rbd *ReleaseBundleDeleteCommand) SetReleaseBundleName(releaseBundleName string) *ReleaseBundleDeleteCommand {
    30  	rbd.releaseBundleName = releaseBundleName
    31  	return rbd
    32  }
    33  
    34  func (rbd *ReleaseBundleDeleteCommand) SetReleaseBundleVersion(releaseBundleVersion string) *ReleaseBundleDeleteCommand {
    35  	rbd.releaseBundleVersion = releaseBundleVersion
    36  	return rbd
    37  }
    38  
    39  func (rbd *ReleaseBundleDeleteCommand) SetSync(sync bool) *ReleaseBundleDeleteCommand {
    40  	rbd.sync = sync
    41  	return rbd
    42  }
    43  
    44  func (rbd *ReleaseBundleDeleteCommand) SetReleaseBundleProject(rbProjectKey string) *ReleaseBundleDeleteCommand {
    45  	rbd.rbProjectKey = rbProjectKey
    46  	return rbd
    47  }
    48  
    49  func (rbd *ReleaseBundleDeleteCommand) SetEnvironment(environment string) *ReleaseBundleDeleteCommand {
    50  	rbd.environment = environment
    51  	return rbd
    52  }
    53  
    54  func (rbd *ReleaseBundleDeleteCommand) SetQuiet(quiet bool) *ReleaseBundleDeleteCommand {
    55  	rbd.quiet = quiet
    56  	return rbd
    57  }
    58  
    59  func (rbd *ReleaseBundleDeleteCommand) CommandName() string {
    60  	return "rb_delete"
    61  }
    62  
    63  func (rbd *ReleaseBundleDeleteCommand) ServerDetails() (*config.ServerDetails, error) {
    64  	return rbd.serverDetails, nil
    65  }
    66  
    67  func (rbd *ReleaseBundleDeleteCommand) Run() error {
    68  	if err := validateArtifactoryVersionSupported(rbd.serverDetails); err != nil {
    69  		return err
    70  	}
    71  
    72  	servicesManager, rbDetails, queryParams, err := rbd.getPrerequisites()
    73  	if err != nil {
    74  		return err
    75  	}
    76  
    77  	if rbd.environment != "" {
    78  		return rbd.deletePromotionsOnly(servicesManager, rbDetails, queryParams)
    79  	}
    80  	return rbd.deleteLocalReleaseBundle(servicesManager, rbDetails, queryParams)
    81  }
    82  
    83  func (rbd *ReleaseBundleDeleteCommand) deletePromotionsOnly(servicesManager *lifecycle.LifecycleServicesManager,
    84  	rbDetails services.ReleaseBundleDetails, commonQueryParams services.CommonOptionalQueryParams) error {
    85  
    86  	deletionSubject := fmt.Sprintf("all promotions to environment '%s' of release bundle '%s/%s'", rbd.environment, rbd.releaseBundleName, rbd.releaseBundleVersion)
    87  	if !rbd.confirmDelete(deletionSubject) {
    88  		return nil
    89  	}
    90  
    91  	optionalQueryParams := services.GetPromotionsOptionalQueryParams{ProjectKey: commonQueryParams.ProjectKey}
    92  	response, err := servicesManager.GetReleaseBundleVersionPromotions(rbDetails, optionalQueryParams)
    93  	if err != nil {
    94  		return err
    95  	}
    96  	success := 0
    97  	fail := 0
    98  	for _, promotion := range response.Promotions {
    99  		if strings.EqualFold(promotion.Environment, rbd.environment) {
   100  			if curErr := servicesManager.DeleteReleaseBundleVersionPromotion(rbDetails, commonQueryParams, promotion.CreatedMillis.String()); curErr != nil {
   101  				err = errors.Join(err, curErr)
   102  				fail++
   103  			} else {
   104  				success++
   105  			}
   106  		}
   107  	}
   108  	if success == 0 && fail == 0 {
   109  		log.Info(fmt.Sprintf("No promotions were found for environment '%s'", rbd.environment))
   110  	} else {
   111  		log.Info(fmt.Sprintf("Promotions deleted successfully: %d, failed: %d", success, fail))
   112  	}
   113  
   114  	return err
   115  }
   116  
   117  func (rbd *ReleaseBundleDeleteCommand) deleteLocalReleaseBundle(servicesManager *lifecycle.LifecycleServicesManager,
   118  	rbDetails services.ReleaseBundleDetails, queryParams services.CommonOptionalQueryParams) error {
   119  	deletionSubject := fmt.Sprintf("release bundle '%s/%s' locally with all its promotions", rbd.releaseBundleName, rbd.releaseBundleVersion)
   120  	if !rbd.confirmDelete(deletionSubject) {
   121  		return nil
   122  	}
   123  	return servicesManager.DeleteReleaseBundleVersion(rbDetails, queryParams)
   124  }
   125  
   126  func (rbd *ReleaseBundleDeleteCommand) confirmDelete(deletionSubject string) bool {
   127  	if rbd.quiet {
   128  		return true
   129  	}
   130  	return coreutils.AskYesNo(
   131  		fmt.Sprintf("Are you sure you want to delete %s?\n"+avoidConfirmationMsg, deletionSubject), false)
   132  }