github.com/jfrog/jfrog-cli-core/v2@v2.51.0/lifecycle/createfrombundles.go (about)

     1  package lifecycle
     2  
     3  import (
     4  	"encoding/json"
     5  	"github.com/jfrog/jfrog-cli-core/v2/common/spec"
     6  	"github.com/jfrog/jfrog-client-go/artifactory/services/utils"
     7  	"github.com/jfrog/jfrog-client-go/lifecycle"
     8  	"github.com/jfrog/jfrog-client-go/lifecycle/services"
     9  	"github.com/jfrog/jfrog-client-go/utils/errorutils"
    10  	"github.com/jfrog/jfrog-client-go/utils/io/fileutils"
    11  )
    12  
    13  func (rbc *ReleaseBundleCreateCommand) createFromReleaseBundles(servicesManager *lifecycle.LifecycleServicesManager,
    14  	rbDetails services.ReleaseBundleDetails, queryParams services.CommonOptionalQueryParams) error {
    15  
    16  	var releaseBundlesSource services.CreateFromReleaseBundlesSource
    17  	var err error
    18  	if rbc.releaseBundlesSpecPath != "" {
    19  		releaseBundlesSource, err = rbc.getReleaseBundlesSourceFromBundlesSpec()
    20  	} else {
    21  		releaseBundlesSource, err = rbc.convertSpecToReleaseBundlesSource(rbc.spec.Files)
    22  	}
    23  	if err != nil {
    24  		return err
    25  	}
    26  
    27  	if len(releaseBundlesSource.ReleaseBundles) == 0 {
    28  		return errorutils.CheckErrorf("at least one release bundle is expected in order to create a release bundle from release bundles")
    29  	}
    30  
    31  	return servicesManager.CreateReleaseBundleFromBundles(rbDetails, queryParams, rbc.signingKeyName, releaseBundlesSource)
    32  }
    33  
    34  func (rbc *ReleaseBundleCreateCommand) convertToReleaseBundlesSource(bundles CreateFromReleaseBundlesSpec) services.CreateFromReleaseBundlesSource {
    35  	releaseBundlesSource := services.CreateFromReleaseBundlesSource{}
    36  	for _, rb := range bundles.ReleaseBundles {
    37  		rbSource := services.ReleaseBundleSource{
    38  			ReleaseBundleName:    rb.Name,
    39  			ReleaseBundleVersion: rb.Version,
    40  			ProjectKey:           rb.Project,
    41  		}
    42  		releaseBundlesSource.ReleaseBundles = append(releaseBundlesSource.ReleaseBundles, rbSource)
    43  	}
    44  	return releaseBundlesSource
    45  }
    46  
    47  func (rbc *ReleaseBundleCreateCommand) convertSpecToReleaseBundlesSource(files []spec.File) (services.CreateFromReleaseBundlesSource, error) {
    48  	releaseBundlesSource := services.CreateFromReleaseBundlesSource{}
    49  	for _, file := range files {
    50  		name, version, err := utils.ParseNameAndVersion(file.Bundle, false)
    51  		if err != nil {
    52  			return releaseBundlesSource, err
    53  		}
    54  		if name == "" || version == "" {
    55  			return releaseBundlesSource, errorutils.CheckErrorf(
    56  				"invalid release bundle source was provided. Both name and version are mandatory. Provided name: '%s', version: '%s'", name, version)
    57  		}
    58  		rbSource := services.ReleaseBundleSource{
    59  			ReleaseBundleName:    name,
    60  			ReleaseBundleVersion: version,
    61  			ProjectKey:           file.Project,
    62  		}
    63  		releaseBundlesSource.ReleaseBundles = append(releaseBundlesSource.ReleaseBundles, rbSource)
    64  	}
    65  	return releaseBundlesSource, nil
    66  }
    67  
    68  func (rbc *ReleaseBundleCreateCommand) getReleaseBundlesSourceFromBundlesSpec() (releaseBundlesSource services.CreateFromReleaseBundlesSource, err error) {
    69  	releaseBundles := CreateFromReleaseBundlesSpec{}
    70  	content, err := fileutils.ReadFile(rbc.releaseBundlesSpecPath)
    71  	if err != nil {
    72  		return
    73  	}
    74  	if err = json.Unmarshal(content, &releaseBundles); errorutils.CheckError(err) != nil {
    75  		return
    76  	}
    77  
    78  	return rbc.convertToReleaseBundlesSource(releaseBundles), nil
    79  }
    80  
    81  type CreateFromReleaseBundlesSpec struct {
    82  	ReleaseBundles []SourceReleaseBundleSpec `json:"releaseBundles,omitempty"`
    83  }
    84  
    85  type SourceReleaseBundleSpec struct {
    86  	Name    string `json:"name,omitempty"`
    87  	Version string `json:"version,omitempty"`
    88  	Project string `json:"project,omitempty"`
    89  }