You've already forked sap-jenkins-library
							
							
				mirror of
				https://github.com/SAP/jenkins-library.git
				synced 2025-10-30 23:57:50 +02:00 
			
		
		
		
	abapAddonAssemblyKitPublishTargetVector polling + refactoring (#3271)
* new checks for commitIDs * new checks for commitIDs * relocate step from build stage to initial checks + refac * log list * fix log + check * log format * fix unit tests * targetVector refac + polling * refac * refac 2 * polling * remove debug output * remove debug output Co-authored-by: Christian Luttenberger <42861202+bluesbrother84@users.noreply.github.com>
This commit is contained in:
		| @@ -1,8 +1,7 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/abap/aakaas" | ||||
| 	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" | ||||
| 	"github.com/SAP/jenkins-library/pkg/abaputils" | ||||
| 	"github.com/SAP/jenkins-library/pkg/command" | ||||
| @@ -30,96 +29,29 @@ func abapAddonAssemblyKitCreateTargetVector(config abapAddonAssemblyKitCreateTar | ||||
|  | ||||
| func runAbapAddonAssemblyKitCreateTargetVector(config *abapAddonAssemblyKitCreateTargetVectorOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender, cpe *abapAddonAssemblyKitCreateTargetVectorCommonPipelineEnvironment) error { | ||||
| 	conn := new(abapbuild.Connector) | ||||
| 	conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client) | ||||
| 	var addonDescriptor abaputils.AddonDescriptor | ||||
| 	json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor) | ||||
|  | ||||
| 	var tv targetVector | ||||
| 	err := tv.init(addonDescriptor) | ||||
| 	if err != nil { | ||||
| 	if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	addonDescriptor := new(abaputils.AddonDescriptor) | ||||
| 	if err := addonDescriptor.InitFromJSONstring(config.AddonDescriptor); err != nil { | ||||
| 		return errors.Wrap(err, "Reading AddonDescriptor failed [Make sure abapAddonAssemblyKit...CheckCVs|CheckPV steps have been run before]") | ||||
| 	} | ||||
|  | ||||
| 	var tv aakaas.TargetVector | ||||
| 	if err := tv.InitNew(addonDescriptor); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Entry().Infof("Create target vector for product %s version %s", addonDescriptor.AddonProduct, addonDescriptor.AddonVersionYAML) | ||||
| 	err = tv.createTargetVector(*conn) | ||||
| 	if err != nil { | ||||
| 	if err := tv.CreateTargetVector(conn); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Entry().Infof("Created target vector %s", tv.ID) | ||||
| 	addonDescriptor.TargetVectorID = tv.ID | ||||
|  | ||||
| 	log.Entry().Info("Write target vector to CommonPipelineEnvironment") | ||||
| 	toCPE, _ := json.Marshal(addonDescriptor) | ||||
| 	cpe.abap.addonDescriptor = string(toCPE) | ||||
| 	cpe.abap.addonDescriptor = addonDescriptor.AsJSONstring() | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (tv *targetVector) init(addonDescriptor abaputils.AddonDescriptor) error { | ||||
| 	if addonDescriptor.AddonProduct == "" || addonDescriptor.AddonVersion == "" || addonDescriptor.AddonSpsLevel == "" || addonDescriptor.AddonPatchLevel == "" { | ||||
| 		return errors.New("Parameters missing. Please provide product name, version, spslevel and patchlevel") | ||||
| 	} | ||||
|  | ||||
| 	tv.ProductName = addonDescriptor.AddonProduct | ||||
| 	tv.ProductVersion = addonDescriptor.AddonVersion | ||||
| 	tv.SpsLevel = addonDescriptor.AddonSpsLevel | ||||
| 	tv.PatchLevel = addonDescriptor.AddonPatchLevel | ||||
|  | ||||
| 	var tvCVs []targetVectorCV | ||||
| 	var tvCV targetVectorCV | ||||
| 	for i := range addonDescriptor.Repositories { | ||||
| 		if addonDescriptor.Repositories[i].Name == "" || addonDescriptor.Repositories[i].Version == "" || addonDescriptor.Repositories[i].SpLevel == "" || | ||||
| 			addonDescriptor.Repositories[i].PatchLevel == "" || addonDescriptor.Repositories[i].PackageName == "" { | ||||
| 			return errors.New("Parameters missing. Please provide software component name, version, splevel, patchlevel and packagename") | ||||
| 		} | ||||
| 		tvCV.ScName = addonDescriptor.Repositories[i].Name | ||||
| 		tvCV.ScVersion = addonDescriptor.Repositories[i].Version | ||||
| 		tvCV.DeliveryPackage = addonDescriptor.Repositories[i].PackageName | ||||
| 		tvCV.SpLevel = addonDescriptor.Repositories[i].SpLevel | ||||
| 		tvCV.PatchLevel = addonDescriptor.Repositories[i].PatchLevel | ||||
| 		tvCVs = append(tvCVs, tvCV) | ||||
| 	} | ||||
| 	tv.Content.TargetVectorCVs = tvCVs | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (tv *targetVector) createTargetVector(conn abapbuild.Connector) error { | ||||
| 	conn.GetToken("/odata/aas_ocs_package") | ||||
| 	tvJSON, err := json.Marshal(tv) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	appendum := "/odata/aas_ocs_package/TargetVectorSet" | ||||
| 	body, err := conn.Post(appendum, string(tvJSON)) | ||||
| 	if err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	var jTV jsonTargetVector | ||||
| 	json.Unmarshal(body, &jTV) | ||||
| 	tv.ID = jTV.Tv.ID | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| type jsonTargetVector struct { | ||||
| 	Tv *targetVector `json:"d"` | ||||
| } | ||||
|  | ||||
| type targetVector struct { | ||||
| 	ID             string          `json:"Id"` | ||||
| 	ProductName    string          `json:"ProductName"` | ||||
| 	ProductVersion string          `json:"ProductVersion"` | ||||
| 	SpsLevel       string          `json:"SpsLevel"` | ||||
| 	PatchLevel     string          `json:"PatchLevel"` | ||||
| 	Content        targetVectorCVs `json:"Content"` | ||||
| } | ||||
|  | ||||
| type targetVectorCV struct { | ||||
| 	ID              string `json:"Id"` | ||||
| 	ScName          string `json:"ScName"` | ||||
| 	ScVersion       string `json:"ScVersion"` | ||||
| 	DeliveryPackage string `json:"DeliveryPackage"` | ||||
| 	SpLevel         string `json:"SpLevel"` | ||||
| 	PatchLevel      string `json:"PatchLevel"` | ||||
| } | ||||
|  | ||||
| type targetVectorCVs struct { | ||||
| 	TargetVectorCVs []targetVectorCV `json:"results"` | ||||
| } | ||||
|   | ||||
| @@ -11,7 +11,10 @@ import ( | ||||
|  | ||||
| func TestCreateTargetVectorStep(t *testing.T) { | ||||
| 	//setup | ||||
| 	config := abapAddonAssemblyKitCreateTargetVectorOptions{} | ||||
| 	config := abapAddonAssemblyKitCreateTargetVectorOptions{ | ||||
| 		Username: "dummy", | ||||
| 		Password: "dummy", | ||||
| 	} | ||||
| 	addonDescriptor := abaputils.AddonDescriptor{ | ||||
| 		AddonProduct:    "dummy", | ||||
| 		AddonVersion:    "dummy", | ||||
|   | ||||
| @@ -1,8 +1,9 @@ | ||||
| package cmd | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/abap/aakaas" | ||||
| 	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" | ||||
| 	"github.com/SAP/jenkins-library/pkg/abaputils" | ||||
| 	"github.com/SAP/jenkins-library/pkg/command" | ||||
| @@ -22,33 +23,51 @@ func abapAddonAssemblyKitPublishTargetVector(config abapAddonAssemblyKitPublishT | ||||
| 	client := piperhttp.Client{} | ||||
|  | ||||
| 	// error situations should stop execution through log.Entry().Fatal() call which leads to an os.Exit(1) in the end | ||||
| 	err := runAbapAddonAssemblyKitPublishTargetVector(&config, telemetryData, &client) | ||||
| 	err := runAbapAddonAssemblyKitPublishTargetVector(&config, telemetryData, &client, time.Duration(config.MaxRuntimeInMinutes)*time.Minute, time.Duration(config.PollingIntervalInSeconds)*time.Second) | ||||
| 	if err != nil { | ||||
| 		log.Entry().WithError(err).Fatal("step execution failed") | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func runAbapAddonAssemblyKitPublishTargetVector(config *abapAddonAssemblyKitPublishTargetVectorOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender) error { | ||||
| func runAbapAddonAssemblyKitPublishTargetVector(config *abapAddonAssemblyKitPublishTargetVectorOptions, telemetryData *telemetry.CustomData, client piperhttp.Sender, | ||||
| 	maxRuntime time.Duration, pollingInterval time.Duration) error { | ||||
|  | ||||
| 	conn := new(abapbuild.Connector) | ||||
| 	conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client) | ||||
| 	var addonDescriptor abaputils.AddonDescriptor | ||||
| 	json.Unmarshal([]byte(config.AddonDescriptor), &addonDescriptor) | ||||
|  | ||||
| 	if addonDescriptor.TargetVectorID == "" { | ||||
| 		return errors.New("Parameter missing. Please provide the target vector id") | ||||
| 	} | ||||
|  | ||||
| 	if config.TargetVectorScope == "T" { | ||||
| 		log.Entry().Infof("Publish target vector %s to test SPC", addonDescriptor.TargetVectorID) | ||||
| 	} | ||||
| 	if config.TargetVectorScope == "P" { | ||||
| 		log.Entry().Infof("Publish target vector %s to SPC", addonDescriptor.TargetVectorID) | ||||
| 	} | ||||
| 	conn.GetToken("/odata/aas_ocs_package") | ||||
| 	appendum := "/odata/aas_ocs_package/PublishTargetVector?Id='" + addonDescriptor.TargetVectorID + "'&Scope='" + config.TargetVectorScope + "'" | ||||
| 	_, err := conn.Post(appendum, "") | ||||
| 	if err != nil { | ||||
| 	if err := conn.InitAAKaaS(config.AbapAddonAssemblyKitEndpoint, config.Username, config.Password, client); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
| 	conn.MaxRuntime = maxRuntime | ||||
| 	conn.PollingInterval = pollingInterval | ||||
|  | ||||
| 	addonDescriptor := new(abaputils.AddonDescriptor) | ||||
| 	if err := addonDescriptor.InitFromJSONstring(config.AddonDescriptor); err != nil { | ||||
| 		return errors.Wrap(err, "Reading AddonDescriptor failed [Make sure abapAddonAssemblyKit...CheckCVs|CheckPV steps have been run before]") | ||||
| 	} | ||||
|  | ||||
| 	if addonDescriptor.TargetVectorID == "" { | ||||
| 		return errors.New("Parameter missing. Please provide the target vector id (e.g. by running step abapAddonAssemblyKitCreateTargetVector beforehand") | ||||
| 	} | ||||
| 	targetVector := new(aakaas.TargetVector) | ||||
| 	targetVector.InitExisting(addonDescriptor.TargetVectorID) | ||||
|  | ||||
| 	switch config.TargetVectorScope { | ||||
| 	case string(aakaas.TargetVectorStatusTest): | ||||
| 		log.Entry().Infof("Publish target vector %s for test use", addonDescriptor.TargetVectorID) | ||||
| 	case string(aakaas.TargetVectorStatusProductive): | ||||
| 		log.Entry().Infof("Publish target vector %s for productive use", addonDescriptor.TargetVectorID) | ||||
| 	default: | ||||
| 		return errors.New("Invalid Value of configuration Parameter TargetVectorScope: " + config.TargetVectorScope) | ||||
| 	} | ||||
|  | ||||
| 	if err := targetVector.PublishTargetVector(conn, aakaas.TargetVectorStatus(config.TargetVectorScope)); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Entry().Info("Waiting for target vector publishing to finish") | ||||
| 	if err := targetVector.PollForStatus(conn, aakaas.TargetVectorStatus(config.TargetVectorScope)); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|  | ||||
| 	log.Entry().Info("Success: Publishing finised") | ||||
| 	return nil | ||||
| } | ||||
|   | ||||
| @@ -20,6 +20,8 @@ type abapAddonAssemblyKitPublishTargetVectorOptions struct { | ||||
| 	Username                     string `json:"username,omitempty"` | ||||
| 	Password                     string `json:"password,omitempty"` | ||||
| 	TargetVectorScope            string `json:"targetVectorScope,omitempty" validate:"oneof=T P"` | ||||
| 	MaxRuntimeInMinutes          int    `json:"maxRuntimeInMinutes,omitempty"` | ||||
| 	PollingIntervalInSeconds     int    `json:"pollingIntervalInSeconds,omitempty"` | ||||
| 	AddonDescriptor              string `json:"addonDescriptor,omitempty"` | ||||
| } | ||||
|  | ||||
| @@ -116,6 +118,8 @@ func addAbapAddonAssemblyKitPublishTargetVectorFlags(cmd *cobra.Command, stepCon | ||||
| 	cmd.Flags().StringVar(&stepConfig.Username, "username", os.Getenv("PIPER_username"), "User for the Addon Assembly Kit as a Service (AAKaaS) system") | ||||
| 	cmd.Flags().StringVar(&stepConfig.Password, "password", os.Getenv("PIPER_password"), "Password for the Addon Assembly Kit as a Service (AAKaaS) system") | ||||
| 	cmd.Flags().StringVar(&stepConfig.TargetVectorScope, "targetVectorScope", `T`, "Determines whether the Target Vector is published to the productive ('P') or test ('T') environment") | ||||
| 	cmd.Flags().IntVar(&stepConfig.MaxRuntimeInMinutes, "maxRuntimeInMinutes", 5, "Maximum runtime for status polling in minutes") | ||||
| 	cmd.Flags().IntVar(&stepConfig.PollingIntervalInSeconds, "pollingIntervalInSeconds", 30, "Wait time in seconds between polling calls") | ||||
| 	cmd.Flags().StringVar(&stepConfig.AddonDescriptor, "addonDescriptor", os.Getenv("PIPER_addonDescriptor"), "Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions") | ||||
|  | ||||
| 	cmd.MarkFlagRequired("abapAddonAssemblyKitEndpoint") | ||||
| @@ -174,6 +178,24 @@ func abapAddonAssemblyKitPublishTargetVectorMetadata() config.StepData { | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 						Default:     `T`, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "maxRuntimeInMinutes", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"}, | ||||
| 						Type:        "int", | ||||
| 						Mandatory:   false, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 						Default:     5, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name:        "pollingIntervalInSeconds", | ||||
| 						ResourceRef: []config.ResourceReference{}, | ||||
| 						Scope:       []string{"PARAMETERS", "STAGES", "STEPS", "GENERAL"}, | ||||
| 						Type:        "int", | ||||
| 						Mandatory:   false, | ||||
| 						Aliases:     []config.Alias{}, | ||||
| 						Default:     30, | ||||
| 					}, | ||||
| 					{ | ||||
| 						Name: "addonDescriptor", | ||||
| 						ResourceRef: []config.ResourceReference{ | ||||
|   | ||||
| @@ -3,7 +3,10 @@ package cmd | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	"github.com/SAP/jenkins-library/pkg/abap/aakaas" | ||||
| 	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" | ||||
| 	"github.com/SAP/jenkins-library/pkg/abaputils" | ||||
| 	"github.com/pkg/errors" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| @@ -13,22 +16,25 @@ func TestPublishTargetVectorStep(t *testing.T) { | ||||
| 	//setup | ||||
| 	config := abapAddonAssemblyKitPublishTargetVectorOptions{ | ||||
| 		TargetVectorScope: "P", | ||||
| 		Username:          "dummy", | ||||
| 		Password:          "dummy", | ||||
| 	} | ||||
| 	addonDescriptor := abaputils.AddonDescriptor{ | ||||
| 		TargetVectorID: "dummy", | ||||
| 		TargetVectorID: "W7Q00207512600000353", | ||||
| 	} | ||||
| 	adoDesc, _ := json.Marshal(addonDescriptor) | ||||
| 	config.AddonDescriptor = string(adoDesc) | ||||
|  | ||||
| 	client := &abaputils.ClientMock{ | ||||
| 		Body:       "dummy", | ||||
| 		Token:      "myToken", | ||||
| 		StatusCode: 200, | ||||
| 	} | ||||
|  | ||||
| 	t.Run("step success prod", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(aakaas.AAKaaSHead) | ||||
| 		mc.AddData(aakaas.AAKaaSTVPublishProdPost) | ||||
| 		mc.AddData(aakaas.AAKaaSGetTVPublishRunning) | ||||
| 		mc.AddData(aakaas.AAKaaSGetTVPublishProdSuccess) | ||||
|  | ||||
| 		//act | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, client) | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &mc, time.Duration(1*time.Second), time.Duration(1*time.Microsecond)) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err, "Did not expect error") | ||||
| 	}) | ||||
| @@ -36,8 +42,13 @@ func TestPublishTargetVectorStep(t *testing.T) { | ||||
| 	t.Run("step success test", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		config.TargetVectorScope = "T" | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(aakaas.AAKaaSHead) | ||||
| 		mc.AddData(aakaas.AAKaaSTVPublishTestPost) | ||||
| 		mc.AddData(aakaas.AAKaaSGetTVPublishRunning) | ||||
| 		mc.AddData(aakaas.AAKaaSGetTVPublishTestSuccess) | ||||
| 		//act | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, client) | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &mc, time.Duration(1*time.Second), time.Duration(1*time.Microsecond)) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err, "Did not expect error") | ||||
| 	}) | ||||
| @@ -49,7 +60,7 @@ func TestPublishTargetVectorStep(t *testing.T) { | ||||
| 			Error: errors.New("dummy"), | ||||
| 		} | ||||
| 		//act | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, client) | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, client, time.Duration(1*time.Second), time.Duration(1*time.Microsecond)) | ||||
| 		//assert | ||||
| 		assert.Error(t, err, "Must end with error") | ||||
| 	}) | ||||
| @@ -57,8 +68,9 @@ func TestPublishTargetVectorStep(t *testing.T) { | ||||
| 	t.Run("step fail no id", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		config := abapAddonAssemblyKitPublishTargetVectorOptions{} | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		//act | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, client) | ||||
| 		err := runAbapAddonAssemblyKitPublishTargetVector(&config, nil, &mc, time.Duration(1*time.Second), time.Duration(1*time.Microsecond)) | ||||
| 		//assert | ||||
| 		assert.Error(t, err, "Must end with error") | ||||
| 	}) | ||||
|   | ||||
							
								
								
									
										323
									
								
								pkg/abap/aakaas/targetVector.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										323
									
								
								pkg/abap/aakaas/targetVector.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,323 @@ | ||||
| package aakaas | ||||
|  | ||||
| import ( | ||||
| 	"encoding/json" | ||||
| 	"net/http" | ||||
| 	"net/url" | ||||
| 	"time" | ||||
|  | ||||
| 	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" | ||||
| 	"github.com/SAP/jenkins-library/pkg/abaputils" | ||||
| 	"github.com/pkg/errors" | ||||
| ) | ||||
|  | ||||
| // TargetVectorStatus : Status of TargetVector in AAKaaS | ||||
| type TargetVectorStatus string | ||||
|  | ||||
| const ( | ||||
| 	// TargetVectorStatusGenerated : TargetVector is Generated (not published yet) | ||||
| 	TargetVectorStatusGenerated TargetVectorStatus = "G" | ||||
| 	// TargetVectorStatusTest : TargetVector is published for testing | ||||
| 	TargetVectorStatusTest TargetVectorStatus = "T" | ||||
| 	// TargetVectorStatusProductive : TargetVector is published for productive use | ||||
| 	TargetVectorStatusProductive TargetVectorStatus = "P" | ||||
|  | ||||
| 	TargetVectorPublishStatusRunning TargetVectorStatus = "R" | ||||
| 	TargetVectorPublishStatusSuccess TargetVectorStatus = "S" | ||||
| 	TargetVectorPublishStatusError   TargetVectorStatus = "E" | ||||
| ) | ||||
|  | ||||
| // internal usage : Json Structure for AAKaaS Odata Service | ||||
| type jsonTargetVector struct { | ||||
| 	Tv *TargetVector `json:"d"` | ||||
| } | ||||
|  | ||||
| // TargetVector : TargetVector desribes a deployble state of an ABAP product version | ||||
| type TargetVector struct { | ||||
| 	ID             string          `json:"Id"` | ||||
| 	ProductName    string          `json:"ProductName"` | ||||
| 	ProductVersion string          `json:"ProductVersion"` | ||||
| 	SpsLevel       string          `json:"SpsLevel"` | ||||
| 	PatchLevel     string          `json:"PatchLevel"` | ||||
| 	Status         string          `json:"Status"` | ||||
| 	PublishStatus  string          `json:"PublishStatus"` | ||||
| 	Content        TargetVectorCVs `json:"Content"` | ||||
| } | ||||
|  | ||||
| // TargetVectorCV : deployable state of an software Component Version as part of an TargetVector | ||||
| type TargetVectorCV struct { | ||||
| 	ID              string `json:"Id"` | ||||
| 	ScName          string `json:"ScName"` | ||||
| 	ScVersion       string `json:"ScVersion"` | ||||
| 	DeliveryPackage string `json:"DeliveryPackage"` | ||||
| 	SpLevel         string `json:"SpLevel"` | ||||
| 	PatchLevel      string `json:"PatchLevel"` | ||||
| } | ||||
|  | ||||
| // TargetVectorCVs : deployable states of the software Component Versions of the product version | ||||
| type TargetVectorCVs struct { | ||||
| 	TargetVectorCVs []TargetVectorCV `json:"results"` | ||||
| } | ||||
|  | ||||
| // Init : Initialize TargetVector for Creation in AAKaaS | ||||
| func (tv *TargetVector) InitNew(addonDescriptor *abaputils.AddonDescriptor) error { | ||||
| 	if addonDescriptor.AddonProduct == "" || addonDescriptor.AddonVersion == "" || addonDescriptor.AddonSpsLevel == "" || addonDescriptor.AddonPatchLevel == "" { | ||||
| 		return errors.New("Parameters missing. Please provide product name, version, spslevel and patchlevel") | ||||
| 	} | ||||
| 	tv.ProductName = addonDescriptor.AddonProduct | ||||
| 	tv.ProductVersion = addonDescriptor.AddonVersion | ||||
| 	tv.SpsLevel = addonDescriptor.AddonSpsLevel | ||||
| 	tv.PatchLevel = addonDescriptor.AddonPatchLevel | ||||
|  | ||||
| 	var tvCVs []TargetVectorCV | ||||
| 	var tvCV TargetVectorCV | ||||
| 	for i := range addonDescriptor.Repositories { | ||||
| 		if addonDescriptor.Repositories[i].Name == "" || addonDescriptor.Repositories[i].Version == "" || addonDescriptor.Repositories[i].SpLevel == "" || | ||||
| 			addonDescriptor.Repositories[i].PatchLevel == "" || addonDescriptor.Repositories[i].PackageName == "" { | ||||
| 			return errors.New("Parameters missing. Please provide software component name, version, splevel, patchlevel and packagename") | ||||
| 		} | ||||
| 		tvCV.ScName = addonDescriptor.Repositories[i].Name | ||||
| 		tvCV.ScVersion = addonDescriptor.Repositories[i].Version | ||||
| 		tvCV.DeliveryPackage = addonDescriptor.Repositories[i].PackageName | ||||
| 		tvCV.SpLevel = addonDescriptor.Repositories[i].SpLevel | ||||
| 		tvCV.PatchLevel = addonDescriptor.Repositories[i].PatchLevel | ||||
| 		tvCVs = append(tvCVs, tvCV) | ||||
| 	} | ||||
| 	tv.Content.TargetVectorCVs = tvCVs | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // InitExisting : Initialize an already in AAKaaS existing TargetVector | ||||
| func (tv *TargetVector) InitExisting(ID string) { | ||||
| 	tv.ID = ID | ||||
| } | ||||
|  | ||||
| // CreateTargetVector : Initial Creation of an TargetVector | ||||
| func (tv *TargetVector) CreateTargetVector(conn *abapbuild.Connector) error { | ||||
| 	conn.GetToken("/odata/aas_ocs_package") | ||||
| 	tvJSON, err := json.Marshal(tv) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Generating Request Data for Create Target Vector failed") | ||||
| 	} | ||||
| 	appendum := "/odata/aas_ocs_package/TargetVectorSet" | ||||
| 	body, err := conn.Post(appendum, string(tvJSON)) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Creating Target Vector in AAKaaS failed") | ||||
| 	} | ||||
| 	var jTV jsonTargetVector | ||||
| 	if err := json.Unmarshal(body, &jTV); err != nil { | ||||
| 		return errors.Wrap(err, "Unexpected AAKaaS response for create target vector: "+string(body)) | ||||
| 	} | ||||
| 	tv.ID = jTV.Tv.ID | ||||
| 	tv.Status = jTV.Tv.Status | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| func (tv *TargetVector) PublishTargetVector(conn *abapbuild.Connector, targetVectorScope TargetVectorStatus) error { | ||||
| 	conn.GetToken("/odata/aas_ocs_package") | ||||
| 	appendum := "/odata/aas_ocs_package/PublishTargetVector?Id='" + url.QueryEscape(tv.ID) + "'&Scope='" + url.QueryEscape(string(targetVectorScope)) + "'" | ||||
| 	body, err := conn.Post(appendum, "") | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Publish Target Vector in AAKaaS failed") | ||||
| 	} | ||||
|  | ||||
| 	var jTV jsonTargetVector | ||||
| 	if err := json.Unmarshal(body, &jTV); err != nil { | ||||
| 		return errors.Wrap(err, "Unexpected AAKaaS response for publish target vector: "+string(body)) | ||||
| 	} | ||||
|  | ||||
| 	tv.Status = jTV.Tv.Status | ||||
| 	tv.PublishStatus = jTV.Tv.PublishStatus | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // GetTargetVector : Read details of the TargetVector | ||||
| func (tv *TargetVector) GetTargetVector(conn *abapbuild.Connector) error { | ||||
| 	if tv.ID == "" { | ||||
| 		return errors.New("Without ID no details of a targetVector can be obtained from AAKaaS") | ||||
| 	} | ||||
| 	appendum := "/odata/aas_ocs_package/TargetVectorSet('" + url.QueryEscape(tv.ID) + "')" | ||||
| 	body, err := conn.Get(appendum) | ||||
| 	if err != nil { | ||||
| 		return errors.Wrap(err, "Getting Target Vector details from AAKaaS failed") | ||||
| 	} | ||||
|  | ||||
| 	var jTV jsonTargetVector | ||||
| 	if err := json.Unmarshal(body, &jTV); err != nil { | ||||
| 		return errors.Wrap(err, "Unexpected AAKaaS response for getting target vector details: "+string(body)) | ||||
| 	} | ||||
|  | ||||
| 	tv.Status = jTV.Tv.Status | ||||
| 	tv.PublishStatus = jTV.Tv.PublishStatus | ||||
| 	//other fields not needed atm | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| // PollForStatus : Poll AAKaaS until final PublishStatus reached and check if desired Status was reached | ||||
| func (tv *TargetVector) PollForStatus(conn *abapbuild.Connector, targetStatus TargetVectorStatus) error { | ||||
| 	timeout := time.After(conn.MaxRuntime) | ||||
| 	ticker := time.Tick(conn.PollingInterval) | ||||
| 	for { | ||||
| 		select { | ||||
| 		case <-timeout: | ||||
| 			return errors.New("Timed out (AAKaaS target Vector Status change)") | ||||
| 		case <-ticker: | ||||
| 			if err := tv.GetTargetVector(conn); err != nil { | ||||
| 				return errors.Wrap(err, "Getting TargetVector status during polling resulted in an error") | ||||
| 			} | ||||
| 			switch TargetVectorStatus(tv.PublishStatus) { | ||||
| 			case TargetVectorPublishStatusRunning: | ||||
| 				continue | ||||
| 			case TargetVectorPublishStatusSuccess: | ||||
| 				if TargetVectorStatus(tv.Status) == targetStatus { | ||||
| 					return nil | ||||
| 				} else { | ||||
| 					return errors.New("Publishing of Targetvector " + tv.ID + " resulted in state " + string(tv.Status) + "instead of expected state " + string(targetStatus)) | ||||
| 				} | ||||
| 			case TargetVectorPublishStatusError: | ||||
| 				return errors.New("Publishing of Targetvector " + tv.ID + " failed in AAKaaS") | ||||
| 			default: | ||||
| 				return errors.New("Polling returned invalid TargetVectorPublishStatus: " + string(tv.PublishStatus)) | ||||
| 			} | ||||
| 		} | ||||
| 	} | ||||
| } | ||||
|  | ||||
| /**************** | ||||
|  Mock Client Data | ||||
| ****************/ | ||||
|  | ||||
| var AAKaaSHead = abapbuild.MockData{ | ||||
| 	Method: `HEAD`, | ||||
| 	Url:    `/odata/aas_ocs_package`, | ||||
| 	Body: `<?xml version="1.0"?> | ||||
| 	<HTTP_BODY/>`, | ||||
| 	StatusCode: 200, | ||||
| 	Header:     http.Header{"x-csrf-token": {"HRfJP0OhB9C9mHs2RRqUzw=="}}, | ||||
| } | ||||
|  | ||||
| var AAKaaSTVPublishTestPost = abapbuild.MockData{ | ||||
| 	Method: `POST`, | ||||
| 	Url:    `/odata/aas_ocs_package/PublishTargetVector?Id='W7Q00207512600000353'&Scope='T'`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000353", | ||||
| 			"Vendor": "0000029218", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "G", | ||||
| 			"PublishStatus": "R" | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var AAKaaSTVPublishProdPost = abapbuild.MockData{ | ||||
| 	Method: `POST`, | ||||
| 	Url:    `/odata/aas_ocs_package/PublishTargetVector?Id='W7Q00207512600000353'&Scope='P'`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000353", | ||||
| 			"Vendor": "0000029218", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "G", | ||||
| 			"PublishStatus": "R" | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var AAKaaSGetTVPublishRunning = abapbuild.MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/odata/aas_ocs_package/TargetVectorSet('W7Q00207512600000353')`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000353", | ||||
| 			"Vendor": "0000029218", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "G", | ||||
| 			"PublishStatus": "R" | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var AAKaaSGetTVPublishTestSuccess = abapbuild.MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/odata/aas_ocs_package/TargetVectorSet('W7Q00207512600000353')`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000353", | ||||
| 			"Vendor": "0000029218", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "T", | ||||
| 			"PublishStatus": "S" | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var AAKaaSGetTVPublishProdSuccess = abapbuild.MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/odata/aas_ocs_package/TargetVectorSet('W7Q00207512600000353')`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000353", | ||||
| 			"Vendor": "0000029218", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "P", | ||||
| 			"PublishStatus": "S" | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var AAKaaSTVCreatePost = abapbuild.MockData{ | ||||
| 	Method: `POST`, | ||||
| 	Url:    `/odata/aas_ocs_package/TargetVectorSet`, | ||||
| 	Body: `{ | ||||
| 		"d": { | ||||
| 			"Id": "W7Q00207512600000262", | ||||
| 			"Vendor": "0000203069", | ||||
| 			"ProductName": "/DRNMSPC/PRD01", | ||||
| 			"ProductVersion": "0001", | ||||
| 			"SpsLevel": "0000", | ||||
| 			"PatchLevel": "0000", | ||||
| 			"Status": "G", | ||||
| 			"Content": { | ||||
| 				"results": [ | ||||
| 					{ | ||||
| 						"Id": "W7Q00207512600000262", | ||||
| 						"ScName": "/DRNMSPC/COMP01", | ||||
| 						"ScVersion": "0001", | ||||
| 						"DeliveryPackage": "SAPK-001AAINDRNMSPC", | ||||
| 						"SpLevel": "0000", | ||||
| 						"PatchLevel": "0000" | ||||
| 					} | ||||
| 				] | ||||
| 			} | ||||
| 		} | ||||
| 	}`, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var templateMockData = abapbuild.MockData{ | ||||
| 	Method:     `GET`, | ||||
| 	Url:        ``, | ||||
| 	Body:       ``, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
							
								
								
									
										180
									
								
								pkg/abap/aakaas/targetVector_test.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										180
									
								
								pkg/abap/aakaas/targetVector_test.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,180 @@ | ||||
| package aakaas | ||||
|  | ||||
| import ( | ||||
| 	"testing" | ||||
| 	"time" | ||||
|  | ||||
| 	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build" | ||||
| 	"github.com/SAP/jenkins-library/pkg/abaputils" | ||||
| 	"github.com/stretchr/testify/assert" | ||||
| ) | ||||
|  | ||||
| func TestTargetVectorInitExisting(t *testing.T) { | ||||
| 	t.Run("ID is set", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		id := "dummyID" | ||||
| 		targetVector := new(TargetVector) | ||||
| 		//act | ||||
| 		targetVector.InitExisting(id) | ||||
| 		//assert | ||||
| 		assert.Equal(t, id, targetVector.ID) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestTargetVectorInitNew(t *testing.T) { | ||||
| 	t.Run("Ensure values not initial", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		addonDescriptor := abaputils.AddonDescriptor{ | ||||
| 			AddonProduct:    "dummy", | ||||
| 			AddonVersion:    "dummy", | ||||
| 			AddonSpsLevel:   "dummy", | ||||
| 			AddonPatchLevel: "dummy", | ||||
| 			TargetVectorID:  "dummy", | ||||
| 			Repositories: []abaputils.Repository{ | ||||
| 				{ | ||||
| 					Name:        "dummy", | ||||
| 					Version:     "dummy", | ||||
| 					SpLevel:     "dummy", | ||||
| 					PatchLevel:  "dummy", | ||||
| 					PackageName: "dummy", | ||||
| 				}, | ||||
| 			}, | ||||
| 		} | ||||
| 		targetVector := new(TargetVector) | ||||
| 		//act | ||||
| 		err := targetVector.InitNew(&addonDescriptor) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, "dummy", targetVector.ProductVersion) | ||||
| 	}) | ||||
| 	t.Run("Fail if values initial", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		addonDescriptor := abaputils.AddonDescriptor{} | ||||
| 		targetVector := new(TargetVector) | ||||
| 		//act | ||||
| 		err := targetVector.InitNew(&addonDescriptor) | ||||
| 		//assert | ||||
| 		assert.Error(t, err) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestTargetVectorGet(t *testing.T) { | ||||
| 	//arrange global | ||||
| 	targetVector := new(TargetVector) | ||||
| 	conn := new(abapbuild.Connector) | ||||
|  | ||||
| 	t.Run("Ensure error if ID is initial", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		targetVector.ID = "" | ||||
| 		//act | ||||
| 		err := targetVector.GetTargetVector(conn) | ||||
| 		//assert | ||||
| 		assert.Error(t, err) | ||||
| 	}) | ||||
| 	t.Run("Normal Get Test Success", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		targetVector.ID = "W7Q00207512600000353" | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(AAKaaSGetTVPublishTestSuccess) | ||||
| 		conn.Client = &mc | ||||
| 		//act | ||||
| 		err := targetVector.GetTargetVector(conn) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, TargetVectorPublishStatusSuccess, TargetVectorStatus(targetVector.PublishStatus)) | ||||
| 		assert.Equal(t, TargetVectorStatusTest, TargetVectorStatus(targetVector.Status)) | ||||
| 	}) | ||||
| 	t.Run("Error Get", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		targetVector.ID = "W7Q00207512600000353" | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		conn.Client = &mc | ||||
| 		//act | ||||
| 		err := targetVector.GetTargetVector(conn) | ||||
| 		//assert | ||||
| 		assert.Error(t, err) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestTargetVectorPollForStatus(t *testing.T) { | ||||
| 	//arrange global | ||||
| 	targetVector := new(TargetVector) | ||||
| 	conn := new(abapbuild.Connector) | ||||
| 	conn.MaxRuntime = time.Duration(1 * time.Second) | ||||
| 	conn.PollingInterval = time.Duration(1 * time.Microsecond) | ||||
|  | ||||
| 	t.Run("Normal Poll", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		targetVector.ID = "W7Q00207512600000353" | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(AAKaaSGetTVPublishRunning) | ||||
| 		mc.AddData(AAKaaSGetTVPublishTestSuccess) | ||||
| 		conn.Client = &mc | ||||
| 		//act | ||||
| 		err := targetVector.PollForStatus(conn, TargetVectorStatusTest) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestTargetVectorCreate(t *testing.T) { | ||||
| 	//arrange global | ||||
| 	targetVector := new(TargetVector) | ||||
| 	conn := new(abapbuild.Connector) | ||||
|  | ||||
| 	addonDescriptor := abaputils.AddonDescriptor{ | ||||
| 		AddonProduct:    "dummy", | ||||
| 		AddonVersion:    "dummy", | ||||
| 		AddonSpsLevel:   "dummy", | ||||
| 		AddonPatchLevel: "dummy", | ||||
| 		TargetVectorID:  "dummy", | ||||
| 		Repositories: []abaputils.Repository{ | ||||
| 			{ | ||||
| 				Name:        "dummy", | ||||
| 				Version:     "dummy", | ||||
| 				SpLevel:     "dummy", | ||||
| 				PatchLevel:  "dummy", | ||||
| 				PackageName: "dummy", | ||||
| 			}, | ||||
| 		}, | ||||
| 	} | ||||
|  | ||||
| 	t.Run("Create Success", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(AAKaaSHead) | ||||
| 		mc.AddData(AAKaaSTVCreatePost) | ||||
| 		errInitConn := conn.InitAAKaaS("", "dummyUser", "dummyPassword", &mc) | ||||
| 		assert.NoError(t, errInitConn) | ||||
|  | ||||
| 		errInitTV := targetVector.InitNew(&addonDescriptor) | ||||
| 		assert.NoError(t, errInitTV) | ||||
| 		//act | ||||
| 		err := targetVector.CreateTargetVector(conn) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, "W7Q00207512600000262", targetVector.ID) | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func TestTargetVectorPublish(t *testing.T) { | ||||
| 	//arrange global | ||||
| 	targetVector := new(TargetVector) | ||||
| 	conn := new(abapbuild.Connector) | ||||
|  | ||||
| 	t.Run("Publish Test", func(t *testing.T) { | ||||
| 		//arrange | ||||
| 		targetVector.ID = "W7Q00207512600000353" | ||||
| 		mc := abapbuild.NewMockClient() | ||||
| 		mc.AddData(AAKaaSHead) | ||||
| 		mc.AddData(AAKaaSTVPublishTestPost) | ||||
| 		errInitConn := conn.InitAAKaaS("", "dummyUser", "dummyPassword", &mc) | ||||
| 		assert.NoError(t, errInitConn) | ||||
|  | ||||
| 		//act | ||||
| 		err := targetVector.PublishTargetVector(conn, TargetVectorStatusTest) | ||||
| 		//assert | ||||
| 		assert.NoError(t, err) | ||||
| 		assert.Equal(t, string(TargetVectorPublishStatusRunning), targetVector.PublishStatus) | ||||
| 	}) | ||||
| } | ||||
| @@ -16,10 +16,12 @@ import ( | ||||
|  | ||||
| // Connector : Connector Utility Wrapping http client | ||||
| type Connector struct { | ||||
| 	Client         piperhttp.Sender | ||||
| 	DownloadClient piperhttp.Downloader | ||||
| 	Header         map[string][]string | ||||
| 	Baseurl        string | ||||
| 	Client          piperhttp.Sender | ||||
| 	DownloadClient  piperhttp.Downloader | ||||
| 	Header          map[string][]string | ||||
| 	Baseurl         string | ||||
| 	MaxRuntime      time.Duration // just as handover parameter for polling functions | ||||
| 	PollingInterval time.Duration // just as handover parameter for polling functions | ||||
| } | ||||
|  | ||||
| // ConnectorConfiguration : Handover Structure for Connector Creation | ||||
|   | ||||
| @@ -12,16 +12,17 @@ import ( | ||||
|  | ||||
| // MockClient : use NewMockClient for construction | ||||
| type MockClient struct { | ||||
| 	//Key = HTTP-Method + url | ||||
| 	//Key = HTTP-Method + Url | ||||
| 	Data map[string][]http.Response | ||||
| } | ||||
|  | ||||
| type mockData struct { | ||||
| 	method     string | ||||
| 	url        string | ||||
| 	body       string | ||||
| 	statusCode int | ||||
| 	header     http.Header | ||||
| // MockData: data for the mockClient | ||||
| type MockData struct { | ||||
| 	Method     string | ||||
| 	Url        string | ||||
| 	Body       string | ||||
| 	StatusCode int | ||||
| 	Header     http.Header | ||||
| } | ||||
|  | ||||
| // NewMockClient : Constructs a new Mock Client implementing piperhttp.Sender | ||||
| @@ -32,52 +33,53 @@ func NewMockClient() MockClient { | ||||
| } | ||||
|  | ||||
| // AddResponse : adds a response object to the mock lib | ||||
| func (mc *MockClient) AddResponse(method, url string, response http.Response) { | ||||
| 	responseList, ok := mc.Data[method+url] | ||||
| func (mc *MockClient) AddResponse(Method, Url string, response http.Response) { | ||||
| 	responseList, ok := mc.Data[Method+Url] | ||||
| 	if !ok { | ||||
| 		responseList = make([]http.Response, 0) | ||||
| 	} | ||||
| 	responseList = append(responseList, response) | ||||
|  | ||||
| 	mc.Data[method+url] = responseList | ||||
| 	mc.Data[Method+Url] = responseList | ||||
| } | ||||
|  | ||||
| // Add : adds a response with the given body and statusOK to the mock lib | ||||
| func (mc *MockClient) Add(method, url, body string) { | ||||
| 	mc.AddResponse(method, url, http.Response{ | ||||
| // Add : adds a response with the given Body and statusOK to the mock lib | ||||
| func (mc *MockClient) Add(Method, Url, Body string) { | ||||
| 	mc.AddResponse(Method, Url, http.Response{ | ||||
| 		StatusCode: http.StatusOK, | ||||
| 		Header:     http.Header{}, | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(body))), | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(Body))), | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| // AddBody : adds a response with the given data to the mock lib | ||||
| func (mc *MockClient) AddBody(method, url, body string, statusCode int, header http.Header) { | ||||
| 	mc.AddResponse(method, url, http.Response{ | ||||
| 		StatusCode: statusCode, | ||||
| func (mc *MockClient) AddBody(Method, Url, Body string, StatusCode int, header http.Header) { | ||||
| 	mc.AddResponse(Method, Url, http.Response{ | ||||
| 		StatusCode: StatusCode, | ||||
| 		Header:     header, | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(body))), | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(Body))), | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (mc *MockClient) addData(data mockData) { | ||||
| 	mc.AddResponse(data.method, data.url, http.Response{ | ||||
| 		StatusCode: data.statusCode, | ||||
| 		Header:     data.header, | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(data.body))), | ||||
| // AddData : add the mock Data as response to the mock lib | ||||
| func (mc *MockClient) AddData(data MockData) { | ||||
| 	mc.AddResponse(data.Method, data.Url, http.Response{ | ||||
| 		StatusCode: data.StatusCode, | ||||
| 		Header:     data.Header, | ||||
| 		Body:       ioutil.NopCloser(bytes.NewReader([]byte(data.Body))), | ||||
| 	}) | ||||
| } | ||||
|  | ||||
| func (mc *MockClient) getResponse(method, url string) (http.Response, bool) { | ||||
| 	responseList, ok := mc.Data[method+url] | ||||
| func (mc *MockClient) getResponse(Method, Url string) (http.Response, bool) { | ||||
| 	responseList, ok := mc.Data[Method+Url] | ||||
| 	if !ok { | ||||
| 		return http.Response{}, false | ||||
| 	} | ||||
| 	response := responseList[0] | ||||
| 	if len(responseList) > 1 { | ||||
| 		mc.Data[method+url] = responseList[1:] | ||||
| 		mc.Data[Method+Url] = responseList[1:] | ||||
| 	} else { | ||||
| 		delete(mc.Data, method+url) | ||||
| 		delete(mc.Data, Method+Url) | ||||
| 	} | ||||
|  | ||||
| 	return response, true | ||||
| @@ -87,17 +89,17 @@ func (mc *MockClient) getResponse(method, url string) (http.Response, bool) { | ||||
| func (mc *MockClient) SetOptions(opts piperhttp.ClientOptions) {} | ||||
|  | ||||
| // SendRequest sets a HTTP response for a client mock | ||||
| func (mc *MockClient) SendRequest(method, url string, bdy io.Reader, hdr http.Header, cookies []*http.Cookie) (*http.Response, error) { | ||||
| 	response, ok := mc.getResponse(method, url) | ||||
| func (mc *MockClient) SendRequest(Method, Url string, bdy io.Reader, hdr http.Header, cookies []*http.Cookie) (*http.Response, error) { | ||||
| 	response, ok := mc.getResponse(Method, Url) | ||||
| 	if !ok { | ||||
| 		//return nil, errors.New("No Mock data for given Method+URL") | ||||
| 		return nil, fmt.Errorf("No Mock data for %s", method+url) | ||||
| 		//return nil, errors.New("No Mock data for given Method+Url") | ||||
| 		return nil, fmt.Errorf("No Mock data for %s", Method+Url) | ||||
| 	} | ||||
| 	return &response, nil | ||||
| } | ||||
|  | ||||
| // DownloadFile : Empty file download | ||||
| func (mc *MockClient) DownloadFile(url, filename string, header http.Header, cookies []*http.Cookie) error { | ||||
| func (mc *MockClient) DownloadFile(Url, filename string, header http.Header, cookies []*http.Cookie) error { | ||||
| 	return nil | ||||
| } | ||||
|  | ||||
| @@ -109,55 +111,55 @@ func (mc *MockClient) DownloadFile(url, filename string, header http.Header, coo | ||||
| func GetBuildMockClient() MockClient { | ||||
| 	mc := NewMockClient() | ||||
|  | ||||
| 	mc.addData(buildHead) | ||||
| 	mc.addData(buildPost) | ||||
| 	mc.addData(buildGet1) | ||||
| 	mc.addData(buildGet2) | ||||
| 	mc.addData(buildGetTasks) | ||||
| 	mc.addData(buildGetTask0Logs) | ||||
| 	mc.addData(buildGetTask1Logs) | ||||
| 	mc.addData(buildGetTask2Logs) | ||||
| 	mc.addData(buildGetTask3Logs) | ||||
| 	mc.addData(buildGetTask4Logs) | ||||
| 	mc.addData(buildGetTask5Logs) | ||||
| 	mc.addData(buildGetTask6Logs) | ||||
| 	mc.addData(buildGetTask7Logs) | ||||
| 	mc.addData(buildGetTask8Logs) | ||||
| 	mc.addData(buildGetTask9Logs) | ||||
| 	mc.addData(buildGetTask10Logs) | ||||
| 	mc.addData(buildGetTask11Logs) | ||||
| 	mc.addData(buildGetTask12Logs) | ||||
| 	mc.addData(buildGetTask0Result) | ||||
| 	mc.addData(buildGetTask1Result) | ||||
| 	mc.addData(buildGetTask2Result) | ||||
| 	mc.addData(buildGetTask3Result) | ||||
| 	mc.addData(buildGetTask4Result) | ||||
| 	mc.addData(buildGetTask5Result) | ||||
| 	mc.addData(buildGetTask6Result) | ||||
| 	mc.addData(buildGetTask7Result) | ||||
| 	mc.addData(buildGetTask8Result) | ||||
| 	mc.addData(buildGetTask9Result) | ||||
| 	mc.addData(buildGetTask10Result) | ||||
| 	mc.addData(buildGetTask11Result) | ||||
| 	mc.addData(buildGetTask12Result) | ||||
| 	mc.addData(buildGetTask11ResultMedia) | ||||
| 	mc.AddData(buildHead) | ||||
| 	mc.AddData(buildPost) | ||||
| 	mc.AddData(buildGet1) | ||||
| 	mc.AddData(buildGet2) | ||||
| 	mc.AddData(buildGetTasks) | ||||
| 	mc.AddData(buildGetTask0Logs) | ||||
| 	mc.AddData(buildGetTask1Logs) | ||||
| 	mc.AddData(buildGetTask2Logs) | ||||
| 	mc.AddData(buildGetTask3Logs) | ||||
| 	mc.AddData(buildGetTask4Logs) | ||||
| 	mc.AddData(buildGetTask5Logs) | ||||
| 	mc.AddData(buildGetTask6Logs) | ||||
| 	mc.AddData(buildGetTask7Logs) | ||||
| 	mc.AddData(buildGetTask8Logs) | ||||
| 	mc.AddData(buildGetTask9Logs) | ||||
| 	mc.AddData(buildGetTask10Logs) | ||||
| 	mc.AddData(buildGetTask11Logs) | ||||
| 	mc.AddData(buildGetTask12Logs) | ||||
| 	mc.AddData(buildGetTask0Result) | ||||
| 	mc.AddData(buildGetTask1Result) | ||||
| 	mc.AddData(buildGetTask2Result) | ||||
| 	mc.AddData(buildGetTask3Result) | ||||
| 	mc.AddData(buildGetTask4Result) | ||||
| 	mc.AddData(buildGetTask5Result) | ||||
| 	mc.AddData(buildGetTask6Result) | ||||
| 	mc.AddData(buildGetTask7Result) | ||||
| 	mc.AddData(buildGetTask8Result) | ||||
| 	mc.AddData(buildGetTask9Result) | ||||
| 	mc.AddData(buildGetTask10Result) | ||||
| 	mc.AddData(buildGetTask11Result) | ||||
| 	mc.AddData(buildGetTask12Result) | ||||
| 	mc.AddData(buildGetTask11ResultMedia) | ||||
|  | ||||
| 	return mc | ||||
| } | ||||
|  | ||||
| var buildHead = mockData{ | ||||
| 	method: `HEAD`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV`, | ||||
| 	body: `<?xml version="1.0"?> | ||||
| 	<HTTP_BODY/>`, | ||||
| 	statusCode: 200, | ||||
| 	header:     http.Header{"x-csrf-token": {"HRfJP0OhB9C9mHs2RRqUzw=="}}, | ||||
| var buildHead = MockData{ | ||||
| 	Method: `HEAD`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV`, | ||||
| 	Body: `<?xml version="1.0"?> | ||||
| 	<HTTP_Body/>`, | ||||
| 	StatusCode: 200, | ||||
| 	Header:     http.Header{"x-csrf-token": {"HRfJP0OhB9C9mHs2RRqUzw=="}}, | ||||
| } | ||||
|  | ||||
| var buildPost = mockData{ | ||||
| 	method: `POST`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/builds`, | ||||
| 	body: `{ | ||||
| var buildPost = MockData{ | ||||
| 	Method: `POST`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/builds`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"__metadata" : { | ||||
| 			"id" : "https://7aa9d1a3-a876-464e-b59a-f26104452461.abap.stagingaws.hanavlab.ondemand.com/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')", | ||||
| @@ -183,13 +185,13 @@ var buildPost = mockData{ | ||||
| 		} | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 201, | ||||
| 	StatusCode: 201, | ||||
| } | ||||
|  | ||||
| var buildGet1 = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')`, | ||||
| 	body: `{ | ||||
| var buildGet1 = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"__metadata" : { | ||||
| 			"id" : "https://7aa9d1a3-a876-464e-b59a-f26104452461.abap.stagingaws.hanavlab.ondemand.com/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')", | ||||
| @@ -216,13 +218,13 @@ var buildGet1 = mockData{ | ||||
| 		} | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGet2 = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')`, | ||||
| 	body: `{ | ||||
| var buildGet2 = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"__metadata" : { | ||||
| 			"id" : "https://7aa9d1a3-a876-464e-b59a-f26104452461.abap.stagingaws.hanavlab.ondemand.com/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')", | ||||
| @@ -249,13 +251,13 @@ var buildGet2 = mockData{ | ||||
| 		} | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTasks = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')/tasks`, | ||||
| 	body: `{ | ||||
| var buildGetTasks = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/builds('AKO22FYOFYPOXHOBVKXUTX3A3Q')/tasks`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 		{ | ||||
| @@ -573,13 +575,13 @@ var buildGetTasks = mockData{ | ||||
| 	] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask0Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=0)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask0Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=0)/logs`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			{ | ||||
| @@ -907,13 +909,13 @@ var buildGetTask0Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask1Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=1)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask1Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=1)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -933,25 +935,25 @@ var buildGetTask1Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask2Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=2)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask2Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=2)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask3Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=3)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask3Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=3)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -971,13 +973,13 @@ var buildGetTask3Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask4Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=4)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask4Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=4)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1053,13 +1055,13 @@ var buildGetTask4Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask5Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=5)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask5Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=5)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1093,13 +1095,13 @@ var buildGetTask5Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask6Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=6)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask6Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=6)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 			"results" : [ | ||||
| 			{ | ||||
| @@ -1133,13 +1135,13 @@ var buildGetTask6Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask7Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=7)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask7Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=7)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1159,13 +1161,13 @@ var buildGetTask7Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask8Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=8)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask8Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=8)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1185,13 +1187,13 @@ var buildGetTask8Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask9Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=9)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask9Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=9)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1211,13 +1213,13 @@ var buildGetTask9Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask10Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=10)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask10Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=10)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1251,13 +1253,13 @@ var buildGetTask10Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask11Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask11Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1277,13 +1279,13 @@ var buildGetTask11Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask12Logs = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/logs`, | ||||
| 	body: `{ | ||||
| var buildGetTask12Logs = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/logs`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1303,134 +1305,134 @@ var buildGetTask12Logs = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask0Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=0)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask0Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=0)/results`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask1Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=1)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask1Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=1)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask2Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=2)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask2Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=2)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask3Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=3)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask3Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=3)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask4Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=4)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask4Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=4)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask5Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=5)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask5Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=5)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask6Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=6)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask6Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=6)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask7Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=7)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask7Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=7)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask8Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=8)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask8Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=8)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask9Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=9)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask9Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=9)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask10Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=10)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask10Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=10)/results`, | ||||
| 	Body: `{ | ||||
| 		"d" : { | ||||
| 			"results" : [ | ||||
| 			] | ||||
| 		} | ||||
| 	}`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask11Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask11Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11)/results`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1450,12 +1452,12 @@ var buildGetTask11Result = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
| var buildGetTask12Result = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask12Result = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/results`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1475,13 +1477,13 @@ var buildGetTask12Result = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask12ResultOrig = mockData{ | ||||
| 	method: `GET`, | ||||
| 	url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/results`, | ||||
| 	body: `{ | ||||
| var buildGetTask12ResultOrig = MockData{ | ||||
| 	Method: `GET`, | ||||
| 	Url:    `/sap/opu/odata/BUILD/CORE_SRV/tasks(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=12)/results`, | ||||
| 	Body: `{ | ||||
| 	"d" : { | ||||
| 		"results" : [ | ||||
| 			{ | ||||
| @@ -1501,19 +1503,19 @@ var buildGetTask12ResultOrig = mockData{ | ||||
| 		] | ||||
| 	} | ||||
| }`, | ||||
| 	statusCode: 200, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var buildGetTask11ResultMedia = mockData{ | ||||
| 	method:     `GET`, | ||||
| 	url:        `/sap/opu/odata/BUILD/CORE_SRV/results(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11,name='SAR_XML')/$value`, | ||||
| 	body:       ``, | ||||
| 	statusCode: 200, | ||||
| var buildGetTask11ResultMedia = MockData{ | ||||
| 	Method:     `GET`, | ||||
| 	Url:        `/sap/opu/odata/BUILD/CORE_SRV/results(build_id='AKO22FYOFYPOXHOBVKXUTX3A3Q',task_id=11,name='SAR_XML')/$value`, | ||||
| 	Body:       ``, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|  | ||||
| var template = mockData{ | ||||
| 	method:     `GET`, | ||||
| 	url:        ``, | ||||
| 	body:       ``, | ||||
| 	statusCode: 200, | ||||
| var template = MockData{ | ||||
| 	Method:     `GET`, | ||||
| 	Url:        ``, | ||||
| 	Body:       ``, | ||||
| 	StatusCode: 200, | ||||
| } | ||||
|   | ||||
| @@ -50,6 +50,24 @@ spec: | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|         default: T | ||||
|       - name: maxRuntimeInMinutes | ||||
|         type: int | ||||
|         description: Maximum runtime for status polling in minutes | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|           - GENERAL | ||||
|         default: 5 | ||||
|       - name: pollingIntervalInSeconds | ||||
|         type: int | ||||
|         description: Wait time in seconds between polling calls | ||||
|         scope: | ||||
|           - PARAMETERS | ||||
|           - STAGES | ||||
|           - STEPS | ||||
|           - GENERAL | ||||
|         default: 30 | ||||
|       - name: addonDescriptor | ||||
|         type: string | ||||
|         description: Structure in the commonPipelineEnvironment containing information about the Product Version and corresponding Software Component Versions | ||||
|   | ||||
		Reference in New Issue
	
	Block a user