github.com/jfrog/jfrog-cli-core/v2@v2.51.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 }