@@ -38,6 +38,7 @@ const (
3838 artifactoryLifecycleMinVersion = "7.68.3"
3939 signingKeyOptionalArtifactoryMinVersion = "7.104.1"
4040 promotionTypeFlagArtifactoryMinVersion = "7.106.1"
41+ draftBundleArtifactoryMinVersion = "7.136.0"
4142 gpgKeyPairName = "lc-tests-key-pair"
4243 lcTestdataPath = "lifecycle"
4344 releaseBundlesSpec = "release-bundles-spec.json"
@@ -167,7 +168,7 @@ func TestReleaseBundleCreationFromMultiBundlesUsingCommandFlagWithProject(t *tes
167168 defer deleteBuilds ()
168169
169170 // Create first release bundle from builds with project
170- createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , tests .ProjectKey , true , true )
171+ createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , tests .ProjectKey , true , true , false )
171172 defer deleteReleaseBundleWithProject (t , lcManager , tests .LcRbName1 , number1 , tests .ProjectKey )
172173 assertStatusCompletedWithProject (t , lcManager , tests .LcRbName1 , number1 , "" , tests .ProjectKey )
173174
@@ -177,7 +178,7 @@ func TestReleaseBundleCreationFromMultiBundlesUsingCommandFlagWithProject(t *tes
177178 assert .True (t , isExist , "Release bundle %s/%s should exist in project %s" , tests .LcRbName1 , number1 , tests .ProjectKey )
178179
179180 // Create second release bundle from builds with project
180- createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , tests .ProjectKey , true , true )
181+ createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , tests .ProjectKey , true , true , false )
181182 defer deleteReleaseBundleWithProject (t , lcManager , tests .LcRbName2 , number2 , tests .ProjectKey )
182183 assertStatusCompletedWithProject (t , lcManager , tests .LcRbName2 , number2 , "" , tests .ProjectKey )
183184
@@ -489,6 +490,85 @@ func TestPromoteReleaseBundleWithPromotionTypeFlag(t *testing.T) {
489490 assertStatusCompleted (t , lcManager , tests .LcRbName1 , number1 , "" )
490491}
491492
493+ func TestReleaseBundleCreationWithDraftFlagFromSpec (t * testing.T ) {
494+ cleanCallback := initLifecycleTest (t , draftBundleArtifactoryMinVersion )
495+ defer cleanCallback ()
496+ lcManager := getLcServiceManager (t )
497+
498+ deleteBuilds := uploadBuilds (t )
499+ defer deleteBuilds ()
500+
501+ // Create draft bundle from spec
502+ createRbFromSpecWithDraft (t , tests .LifecycleBuilds12 , tests .LcRbName1 , number1 , true , true , true )
503+ defer deleteReleaseBundle (t , lcManager , tests .LcRbName1 , number1 )
504+ assertStatusDraft (t , lcManager , tests .LcRbName1 , number1 )
505+ }
506+
507+ func TestReleaseBundleCreationWithDraftFlagFromFlags (t * testing.T ) {
508+ cleanCallback := initLifecycleTest (t , draftBundleArtifactoryMinVersion )
509+ defer cleanCallback ()
510+ lcManager := getLcServiceManager (t )
511+
512+ deleteBuilds := uploadBuilds (t )
513+ defer deleteBuilds ()
514+
515+ // Create draft bundle using build-name/build-number flags
516+ createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , "default" , true , true , true )
517+ defer deleteReleaseBundle (t , lcManager , tests .LcRbName2 , number2 )
518+ assertStatusDraft (t , lcManager , tests .LcRbName2 , number2 )
519+ }
520+
521+ func TestReleaseBundleUpdateWithSpec (t * testing.T ) {
522+ cleanCallback := initLifecycleTest (t , draftBundleArtifactoryMinVersion )
523+ defer cleanCallback ()
524+ lcManager := getLcServiceManager (t )
525+
526+ deleteBuilds := uploadBuilds (t )
527+ defer deleteBuilds ()
528+
529+ // Create a draft bundle from build 1
530+ createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , "default" , true , true , true )
531+ defer deleteReleaseBundle (t , lcManager , tests .LcRbName1 , number1 )
532+ assertStatusDraft (t , lcManager , tests .LcRbName1 , number1 )
533+ assertRbArtifacts (t , lcManager , tests .LcRbName1 , number1 , tests .GetExpectedLifecycleBuild1Artifacts ())
534+
535+ // Update the draft bundle by adding build 3 (which includes dependencies) using spec file
536+ updateSpecFile , err := tests .CreateSpec (tests .LifecycleBuilds3 )
537+ assert .NoError (t , err )
538+ updateRbWithFlags (t , updateSpecFile , tests .LcRbName1 , number1 , "default" , "" , true )
539+
540+ // Verify the bundle is still in DRAFT status after update
541+ assertStatusDraft (t , lcManager , tests .LcRbName1 , number1 )
542+
543+ // Verify the bundle now contains artifacts from both build 1 and build 3
544+ assertRbArtifacts (t , lcManager , tests .LcRbName1 , number1 , tests .GetExpectedLifecycleUpdateArtifacts ())
545+ }
546+
547+ func TestReleaseBundleUpdateWithFlags (t * testing.T ) {
548+ cleanCallback := initLifecycleTest (t , draftBundleArtifactoryMinVersion )
549+ defer cleanCallback ()
550+ lcManager := getLcServiceManager (t )
551+
552+ deleteBuilds := uploadBuilds (t )
553+ defer deleteBuilds ()
554+
555+ // Create a draft bundle from build 2
556+ createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , "default" , true , true , true )
557+ defer deleteReleaseBundle (t , lcManager , tests .LcRbName2 , number2 )
558+ assertStatusDraft (t , lcManager , tests .LcRbName2 , number2 )
559+ assertRbArtifacts (t , lcManager , tests .LcRbName2 , number2 , tests .GetExpectedLifecycleBuild2Artifacts ())
560+
561+ // Update draft using --source-type-builds flag to add build 3
562+ sourceBuildsFlag := fmt .Sprintf ("name=%s,id=%s,include-deps=true" , tests .LcBuildName3 , number3 )
563+ updateRbWithFlags (t , "" , tests .LcRbName2 , number2 , "default" , sourceBuildsFlag , true )
564+
565+ // Verify the bundle is still in DRAFT status after update
566+ assertStatusDraft (t , lcManager , tests .LcRbName2 , number2 )
567+
568+ // Verify the bundle now contains artifacts from both build 2 and build 3
569+ assertRbArtifacts (t , lcManager , tests .LcRbName2 , number2 , tests .GetExpectedLifecycleUpdateBuild2Artifacts ())
570+ }
571+
492572/*func deleteExportedReleaseBundle(t *testing.T, rbName string) {
493573 assert.NoError(t, os.RemoveAll(rbName))
494574}*/
@@ -524,13 +604,19 @@ func uploadBuildsWithProject(t *testing.T) func() {
524604func createRbBackwardCompatible (t * testing.T , specName , sourceOption , rbName , rbVersion string , sync bool ) {
525605 specFile , err := getSpecFile (specName )
526606 assert .NoError (t , err )
527- createRbWithFlags (t , specFile , sourceOption , "" , "" , rbName , rbVersion , "" , sync , false )
607+ createRbWithFlags (t , specFile , sourceOption , "" , "" , rbName , rbVersion , "" , sync , false , false )
528608}
529609
530610func createRbFromSpec (t * testing.T , specName , rbName , rbVersion string , sync bool , withoutSigningKey bool ) {
531611 specFile , err := tests .CreateSpec (specName )
532612 assert .NoError (t , err )
533- createRbWithFlags (t , specFile , "spec" , "" , "" , rbName , rbVersion , "" , sync , withoutSigningKey )
613+ createRbWithFlags (t , specFile , "spec" , "" , "" , rbName , rbVersion , "" , sync , withoutSigningKey , false )
614+ }
615+
616+ func createRbFromSpecWithDraft (t * testing.T , specName , rbName , rbVersion string , sync , withoutSigningKey , draft bool ) {
617+ specFile , err := tests .CreateSpec (specName )
618+ assert .NoError (t , err )
619+ createRbWithFlags (t , specFile , "spec" , "" , "" , rbName , rbVersion , "" , sync , withoutSigningKey , draft )
534620}
535621
536622func TestCreateBundleWithoutSpec (t * testing.T ) {
@@ -542,11 +628,11 @@ func TestCreateBundleWithoutSpec(t *testing.T) {
542628 deleteBuilds := uploadBuilds (t )
543629 defer deleteBuilds ()
544630
545- createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , "default" , false , false )
631+ createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , "default" , false , false , false )
546632 assertStatusCompleted (t , lcManager , tests .LcRbName1 , number1 , "" )
547633 defer deleteReleaseBundle (t , lcManager , tests .LcRbName1 , number1 )
548634
549- createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , "default" , false , true )
635+ createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , tests .LcRbName2 , number2 , "default" , false , true , false )
550636 assertStatusCompleted (t , lcManager , tests .LcRbName2 , number2 , "" )
551637 defer deleteReleaseBundle (t , lcManager , tests .LcRbName2 , number2 )
552638}
@@ -566,13 +652,13 @@ func TestCreateBundleWithoutSpecAndWithProject(t *testing.T) {
566652 deleteBuilds := uploadBuildsWithProject (t )
567653 defer deleteBuilds ()
568654
569- createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , tests .ProjectKey , false , false )
655+ createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , tests .LcRbName1 , number1 , tests .ProjectKey , false , false , false )
570656 assertStatusCompletedWithProject (t , lcManager , tests .LcRbName1 , number1 , "" , tests .ProjectKey )
571657 defer deleteReleaseBundleWithProject (t , lcManager , tests .LcRbName1 , number1 , tests .ProjectKey )
572658}
573659
574660func createRbWithFlags (t * testing.T , specFilePath , sourceOption , buildName , buildNumber , rbName , rbVersion , project string ,
575- sync , withoutSigningKey bool ,
661+ sync , withoutSigningKey , draft bool ,
576662) {
577663 argsAndOptions := []string {
578664 "rbc" ,
@@ -601,6 +687,35 @@ func createRbWithFlags(t *testing.T, specFilePath, sourceOption, buildName, buil
601687 argsAndOptions = append (argsAndOptions , getOption (cliutils .Project , project ))
602688 }
603689
690+ if draft {
691+ argsAndOptions = append (argsAndOptions , getOption (cliutils .Draft , "true" ))
692+ }
693+
694+ assert .NoError (t , lcCli .Exec (argsAndOptions ... ))
695+ }
696+
697+ func updateRbWithFlags (t * testing.T , specFilePath , rbName , rbVersion , project , sourceTypeBuilds string , sync bool ) {
698+ argsAndOptions := []string {
699+ "rbu" ,
700+ rbName ,
701+ rbVersion ,
702+ "--add" , // Mandatory flag for rbu
703+ }
704+
705+ if specFilePath != "" {
706+ argsAndOptions = append (argsAndOptions , getOption ("spec" , specFilePath ))
707+ }
708+
709+ if sourceTypeBuilds != "" {
710+ argsAndOptions = append (argsAndOptions , getOption ("source-type-builds" , sourceTypeBuilds ))
711+ }
712+
713+ if project != "" {
714+ argsAndOptions = append (argsAndOptions , getOption (cliutils .Project , project ))
715+ }
716+
717+ argsAndOptions = append (argsAndOptions , getOption (cliutils .Sync , strconv .FormatBool (sync )))
718+
604719 assert .NoError (t , lcCli .Exec (argsAndOptions ... ))
605720}
606721
@@ -665,6 +780,14 @@ func assertStatusCompleted(t *testing.T, lcManager *lifecycle.LifecycleServicesM
665780 assert .Equal (t , services .Completed , resp .Status )
666781}
667782
783+ func assertStatusDraft (t * testing.T , lcManager * lifecycle.LifecycleServicesManager , rbName , rbVersion string ) {
784+ resp , err := getStatus (lcManager , rbName , rbVersion , "" )
785+ if ! assert .NoError (t , err ) {
786+ return
787+ }
788+ assert .Equal (t , services .Draft , resp .Status )
789+ }
790+
668791// If createdMillis is provided, assert status for promotion. If blank, assert for creation.
669792//
670793//nolint:unparam // createdMillis parameter is kept for API consistency with existing tests
@@ -1204,13 +1327,13 @@ func TestReleaseBundlesSearchVersions(t *testing.T) {
12041327 }
12051328
12061329 // Create release bundles with project
1207- createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , projectRbName , projectVersionA , tests .ProjectKey , true , false )
1330+ createRbWithFlags (t , "" , "" , tests .LcBuildName1 , number1 , projectRbName , projectVersionA , tests .ProjectKey , true , false , false )
12081331 defer deleteReleaseBundleWithProject (t , lcManager , projectRbName , projectVersionA , tests .ProjectKey )
12091332 assertStatusCompletedWithProject (t , lcManager , projectRbName , projectVersionA , "" , tests .ProjectKey )
12101333
12111334 time .Sleep (1 * time .Second )
12121335
1213- createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , projectRbName , projectVersionB , tests .ProjectKey , true , false )
1336+ createRbWithFlags (t , "" , "" , tests .LcBuildName2 , number2 , projectRbName , projectVersionB , tests .ProjectKey , true , false , false )
12141337 defer deleteReleaseBundleWithProject (t , lcManager , projectRbName , projectVersionB , tests .ProjectKey )
12151338 assertStatusCompletedWithProject (t , lcManager , projectRbName , projectVersionB , "" , tests .ProjectKey )
12161339
0 commit comments