github.com/SAP/jenkins-library@v1.362.0/cmd/abapAddonAssemblyKitReserveNextPackages_test.go (about)

     1  //go:build unit
     2  // +build unit
     3  
     4  package cmd
     5  
     6  import (
     7  	"encoding/json"
     8  	"testing"
     9  	"time"
    10  
    11  	"github.com/SAP/jenkins-library/pkg/abap/aakaas"
    12  	abapbuild "github.com/SAP/jenkins-library/pkg/abap/build"
    13  	"github.com/SAP/jenkins-library/pkg/abaputils"
    14  	"github.com/pkg/errors"
    15  	"github.com/stretchr/testify/assert"
    16  )
    17  
    18  func arrangeConfig(addonDescriptor abaputils.AddonDescriptor) abapAddonAssemblyKitReserveNextPackagesOptions {
    19  	var config abapAddonAssemblyKitReserveNextPackagesOptions
    20  	config.Username = "dummy"
    21  	config.Password = "dummy"
    22  	adoDesc, _ := json.Marshal(addonDescriptor)
    23  	config.AddonDescriptor = string(adoDesc)
    24  	return config
    25  }
    26  
    27  func TestReserveNextPackagesStep(t *testing.T) {
    28  	var cpe abapAddonAssemblyKitReserveNextPackagesCommonPipelineEnvironment
    29  	bundle := aakaas.NewAakBundleMock()
    30  	utils := bundle.GetUtils()
    31  	t.Run("step success tag", func(t *testing.T) {
    32  		config := arrangeConfig(abaputils.AddonDescriptor{
    33  			Repositories: []abaputils.Repository{
    34  				{
    35  					Name:        "/DRNMSPC/COMP01",
    36  					VersionYAML: "1.0.0.",
    37  					Tag:         "myTestTagv1.0",
    38  				},
    39  				{
    40  					Name:        "/DRNMSPC/COMP02",
    41  					VersionYAML: "1.0.0.",
    42  					Tag:         "myTestTagv1.0",
    43  				},
    44  			},
    45  		})
    46  		bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"}
    47  		bundle.SetBodyList(bodyList)
    48  		err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe)
    49  		assert.NoError(t, err, "Did not expect error")
    50  		var addonDescriptorFinal abaputils.AddonDescriptor
    51  		err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal)
    52  		assert.NoError(t, err)
    53  		assert.Equal(t, "P", addonDescriptorFinal.Repositories[0].Status)
    54  		assert.Equal(t, "R", addonDescriptorFinal.Repositories[1].Status)
    55  	})
    56  
    57  	t.Run("step success", func(t *testing.T) {
    58  		config := arrangeConfig(abaputils.AddonDescriptor{
    59  			Repositories: []abaputils.Repository{
    60  				{
    61  					Name:        "/DRNMSPC/COMP01",
    62  					VersionYAML: "1.0.0.",
    63  					CommitID:    "hugo",
    64  				},
    65  				{
    66  					Name:        "/DRNMSPC/COMP02",
    67  					VersionYAML: "1.0.0.",
    68  					CommitID:    "something40charslongxxxxxxxxxxxxxxxxxxxx",
    69  				},
    70  			},
    71  		})
    72  		bodyList := []string{responseReserveNextPackageReleased, responseReserveNextPackagePlanned, responseReserveNextPackagePostReleased, "myToken", responseReserveNextPackagePostPlanned, "myToken"}
    73  		bundle.SetBodyList(bodyList)
    74  		err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe)
    75  		assert.NoError(t, err, "Did not expect error")
    76  		var addonDescriptorFinal abaputils.AddonDescriptor
    77  		err = json.Unmarshal([]byte(cpe.abap.addonDescriptor), &addonDescriptorFinal)
    78  		assert.NoError(t, err)
    79  		assert.Equal(t, "P", addonDescriptorFinal.Repositories[0].Status)
    80  		assert.Equal(t, "R", addonDescriptorFinal.Repositories[1].Status)
    81  	})
    82  	t.Run("step error - invalid input", func(t *testing.T) {
    83  		config := arrangeConfig(abaputils.AddonDescriptor{
    84  			Repositories: []abaputils.Repository{
    85  				{
    86  					Name: "/DRNMSPC/COMP01",
    87  				},
    88  			},
    89  		})
    90  		err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe)
    91  		assert.Error(t, err, "Did expect error")
    92  	})
    93  	t.Run("step error - timeout", func(t *testing.T) {
    94  		config := arrangeConfig(abaputils.AddonDescriptor{
    95  			Repositories: []abaputils.Repository{
    96  				{
    97  					Name:        "/DRNMSPC/COMP01",
    98  					VersionYAML: "1.0.0.",
    99  				},
   100  			},
   101  		})
   102  		bodyList := []string{responseReserveNextPackageCreationTriggered, responseReserveNextPackagePostPlanned, "myToken"}
   103  		bundle.SetBodyList(bodyList)
   104  		bundle.SetMaxRuntime(time.Duration(1 * time.Microsecond))
   105  		err := runAbapAddonAssemblyKitReserveNextPackages(&config, nil, &utils, &cpe)
   106  		assert.Error(t, err, "Did expect error")
   107  	})
   108  }
   109  
   110  // ********************* Test init *******************
   111  func TestInitPackage(t *testing.T) {
   112  	t.Run("test init", func(t *testing.T) {
   113  		conn := new(abapbuild.Connector)
   114  		conn.Client = &abaputils.ClientMock{}
   115  		repo := abaputils.Repository{
   116  			Name:        "/DRNMSPC/COMP01",
   117  			VersionYAML: "1.0.0",
   118  		}
   119  		var p aakaas.Package
   120  		p.InitPackage(repo, *conn)
   121  		assert.Equal(t, "/DRNMSPC/COMP01", p.ComponentName)
   122  		assert.Equal(t, "1.0.0", p.VersionYAML)
   123  	})
   124  }
   125  
   126  // ********************* Test copyFieldsToRepositories *******************
   127  func TestCopyFieldsToRepositoriesPackage(t *testing.T) {
   128  	pckgWR := []aakaas.PackageWithRepository{
   129  		{
   130  			Package: aakaas.Package{
   131  				ComponentName: "/DRNMSPC/COMP01",
   132  				VersionYAML:   "1.0.0",
   133  				PackageName:   "SAPK-001AAINDRNMSPC",
   134  				Type:          "AOI",
   135  				Namespace:     "/DRNMSPC/",
   136  			},
   137  			Repo: abaputils.Repository{
   138  				Name:        "/DRNMSPC/COMP01",
   139  				VersionYAML: "1.0.0",
   140  			},
   141  		},
   142  	}
   143  
   144  	t.Run("test copyFieldsToRepositories Planned success w/o predecessorcommitID", func(t *testing.T) {
   145  		pckgWR[0].Package.Status = aakaas.PackageStatusPlanned
   146  		pckgWR[0].Package.PredecessorCommitID = ""
   147  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   148  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   149  		repos, err := checkAndCopyFieldsToRepositories(pckgWR)
   150  		assert.Equal(t, "SAPK-001AAINDRNMSPC", repos[0].PackageName)
   151  		assert.Equal(t, "AOI", repos[0].PackageType)
   152  		assert.Equal(t, string(aakaas.PackageStatusPlanned), repos[0].Status)
   153  		assert.Equal(t, "/DRNMSPC/", repos[0].Namespace)
   154  		assert.NoError(t, err)
   155  	})
   156  
   157  	t.Run("test copyFieldsToRepositories Planned success with predecessorcommitID", func(t *testing.T) {
   158  		pckgWR[0].Package.Status = aakaas.PackageStatusPlanned
   159  		pckgWR[0].Package.PredecessorCommitID = "something40charslongPREDECESSORyyyyyyyyy"
   160  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   161  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   162  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   163  		assert.NoError(t, err)
   164  	})
   165  
   166  	t.Run("test copyFieldsToRepositories Planned success with predecessorcommitI short AAKaaS", func(t *testing.T) {
   167  		pckgWR[0].Package.Status = aakaas.PackageStatusPlanned
   168  		pckgWR[0].Package.PredecessorCommitID = "predecessor"
   169  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   170  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   171  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   172  		assert.NoError(t, err)
   173  	})
   174  
   175  	t.Run("test copyFieldsToRepositories Planned success with predecessorcommitID short addon.yml", func(t *testing.T) {
   176  		pckgWR[0].Package.Status = aakaas.PackageStatusPlanned
   177  		pckgWR[0].Package.PredecessorCommitID = "predecessor"
   178  		pckgWR[0].Repo.CommitID = "successor"
   179  		pckgWR[0].Package.CommitID = "successorANDsomemore"
   180  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   181  		assert.NoError(t, err)
   182  	})
   183  
   184  	t.Run("test copyFieldsToRepositories Planned error with predecessorcommitID same as commitID", func(t *testing.T) {
   185  		pckgWR[0].Package.Status = aakaas.PackageStatusPlanned
   186  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   187  		pckgWR[0].Package.PredecessorCommitID = pckgWR[0].Repo.CommitID
   188  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   189  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   190  		assert.Error(t, err)
   191  	})
   192  
   193  	t.Run("test copyFieldsToRepositories Released success", func(t *testing.T) {
   194  		pckgWR[0].Package.Status = aakaas.PackageStatusReleased
   195  		pckgWR[0].Package.PredecessorCommitID = "" //released packages do not have this attribute
   196  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   197  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   198  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   199  		assert.NoError(t, err)
   200  	})
   201  
   202  	t.Run("test copyFieldsToRepositories Released error, different commitIDs", func(t *testing.T) {
   203  		pckgWR[0].Package.Status = aakaas.PackageStatusReleased
   204  		pckgWR[0].Package.PredecessorCommitID = "" //released packages do not have this attribute
   205  		pckgWR[0].Repo.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxx"
   206  		pckgWR[0].Package.CommitID = "something40charslongxxxxxxxxxxxxxxxxxxxO"
   207  		_, err := checkAndCopyFieldsToRepositories(pckgWR)
   208  		assert.Error(t, err)
   209  	})
   210  }
   211  
   212  // ********************* Test reserveNext *******************
   213  func TestReserveNextPackage(t *testing.T) {
   214  	t.Run("test reserveNext - success", func(t *testing.T) {
   215  		client := abaputils.ClientMock{
   216  			Body: responseReserveNextPackagePostPlanned,
   217  		}
   218  		p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client)
   219  
   220  		err := p.ReserveNext()
   221  		assert.NoError(t, err)
   222  		assert.Equal(t, "SAPK-001AAINDRNMSPC", p.PackageName)
   223  		assert.Equal(t, "AOI", p.Type)
   224  		assert.Equal(t, aakaas.PackageStatusPlanned, p.Status)
   225  	})
   226  	t.Run("test reserveNext - missing versionYAML", func(t *testing.T) {
   227  		client := abaputils.ClientMock{}
   228  		p := testPackageSetup("/DRNMSPC/COMP01", "", client)
   229  		err := p.ReserveNext()
   230  		assert.Error(t, err)
   231  		assert.Equal(t, "", p.PackageName)
   232  		assert.Equal(t, "", p.Type)
   233  		assert.Equal(t, aakaas.PackageStatus(""), p.Status)
   234  	})
   235  	t.Run("test reserveNext - error from call", func(t *testing.T) {
   236  		client := abaputils.ClientMock{
   237  			Body:  "ErrorBody",
   238  			Error: errors.New("Failure during reserve next"),
   239  		}
   240  		p := testPackageSetup("/DRNMSPC/COMP01", "1.0.0", client)
   241  		err := p.ReserveNext()
   242  		assert.Error(t, err)
   243  		assert.Equal(t, "", p.PackageName)
   244  		assert.Equal(t, "", p.Type)
   245  		assert.Equal(t, aakaas.PackageStatus(""), p.Status)
   246  	})
   247  }
   248  
   249  // ********************* Test reservePackages *******************
   250  
   251  func TestReservePackages(t *testing.T) {
   252  	t.Run("test reservePackages - success", func(t *testing.T) {
   253  		client := abaputils.ClientMock{
   254  			Body: responseReserveNextPackagePostPlanned,
   255  		}
   256  		repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client)
   257  		repos, err := reservePackages(repositories, conn)
   258  		assert.NoError(t, err)
   259  		assert.Equal(t, "/DRNMSPC/COMP01", repos[0].Package.ComponentName)
   260  		assert.Equal(t, "1.0.0", repos[0].Package.VersionYAML)
   261  		assert.Equal(t, aakaas.PackageStatusPlanned, repos[0].Package.Status)
   262  	})
   263  	t.Run("test reservePackages - error from call", func(t *testing.T) {
   264  		client := abaputils.ClientMock{
   265  			Body:  "ErrorBody",
   266  			Error: errors.New("Failure during reserve next"),
   267  		}
   268  		repositories, conn := testRepositoriesSetup("/DRNMSPC/COMP01", "1.0.0", client)
   269  		_, err := reservePackages(repositories, conn)
   270  		assert.Error(t, err)
   271  	})
   272  }
   273  
   274  // ********************* Test pollReserveNextPackages *******************
   275  
   276  func TestPollReserveNextPackages(t *testing.T) {
   277  	bundle := aakaas.NewAakBundleMock()
   278  	utils := bundle.GetUtils()
   279  	t.Run("test pollReserveNextPackages - testing loop", func(t *testing.T) {
   280  		bodyList := []string{responseReserveNextPackagePlanned, responseReserveNextPackageCreationTriggered}
   281  		bundle.SetBodyList(bodyList)
   282  		pckgWR := testPollPackagesSetup(&utils)
   283  		err := pollReserveNextPackages(pckgWR, &utils)
   284  		assert.NoError(t, err)
   285  		assert.Equal(t, aakaas.PackageStatusPlanned, pckgWR[0].Package.Status)
   286  		assert.Equal(t, "/DRNMSPC/", pckgWR[0].Package.Namespace)
   287  	})
   288  	t.Run("test pollReserveNextPackages - status locked", func(t *testing.T) {
   289  		bundle.SetBody(responseReserveNextPackageLocked)
   290  		pckgWR := testPollPackagesSetup(&utils)
   291  		err := pollReserveNextPackages(pckgWR, &utils)
   292  		assert.Error(t, err)
   293  		assert.Equal(t, aakaas.PackageStatusLocked, pckgWR[0].Package.Status)
   294  	})
   295  	t.Run("test pollReserveNextPackages - status released", func(t *testing.T) {
   296  		bundle.SetBody(responseReserveNextPackageReleased)
   297  		pckgWR := testPollPackagesSetup(&utils)
   298  		err := pollReserveNextPackages(pckgWR, &utils)
   299  		assert.NoError(t, err)
   300  		assert.Equal(t, aakaas.PackageStatusReleased, pckgWR[0].Package.Status)
   301  	})
   302  	t.Run("test pollReserveNextPackages - unknow status", func(t *testing.T) {
   303  		bundle.SetBody(responseReserveNextPackageUnknownState)
   304  		pckgWR := testPollPackagesSetup(&utils)
   305  		err := pollReserveNextPackages(pckgWR, &utils)
   306  		assert.Error(t, err)
   307  		assert.Equal(t, aakaas.PackageStatus("X"), pckgWR[0].Package.Status)
   308  	})
   309  	t.Run("test pollReserveNextPackages - timeout", func(t *testing.T) {
   310  		bundle.SetBody(responseReserveNextPackageUnknownState)
   311  		bundle.SetError("Failure during reserve next")
   312  		bundle.SetMaxRuntime(time.Duration(1 * time.Microsecond))
   313  		pckgWR := testPollPackagesSetup(&utils)
   314  		err := pollReserveNextPackages(pckgWR, &utils)
   315  		assert.Error(t, err)
   316  	})
   317  }
   318  
   319  // ********************* Setup functions *******************
   320  
   321  func testPollPackagesSetup(utils *aakaas.AakUtils) []aakaas.PackageWithRepository {
   322  	conn := new(abapbuild.Connector)
   323  	conn.Client = *utils
   324  	conn.Header = make(map[string][]string)
   325  	pckgWR := []aakaas.PackageWithRepository{
   326  		{
   327  			Package: aakaas.Package{
   328  				Connector:     *conn,
   329  				ComponentName: "/DRNMSPC/COMP01",
   330  				VersionYAML:   "1.0.0",
   331  				PackageName:   "SAPK-001AAINDRNMSPC",
   332  				Type:          "AOI",
   333  			},
   334  			Repo: abaputils.Repository{},
   335  		},
   336  	}
   337  	return pckgWR
   338  }
   339  
   340  func testRepositoriesSetup(componentName string, versionYAML string, client abaputils.ClientMock) ([]abaputils.Repository, abapbuild.Connector) {
   341  	conn := new(abapbuild.Connector)
   342  	conn.Client = &client
   343  	conn.Header = make(map[string][]string)
   344  	repositories := []abaputils.Repository{
   345  		{
   346  			Name:        componentName,
   347  			VersionYAML: versionYAML,
   348  		},
   349  	}
   350  	return repositories, *conn
   351  }
   352  
   353  func testPackageSetup(componentName string, versionYAML string, client abaputils.ClientMock) aakaas.Package {
   354  	conn := new(abapbuild.Connector)
   355  	conn.Client = &client
   356  	conn.Header = make(map[string][]string)
   357  	p := aakaas.Package{
   358  		Connector:     *conn,
   359  		ComponentName: componentName,
   360  		VersionYAML:   versionYAML,
   361  	}
   362  	return p
   363  }
   364  
   365  // ********************* Testdata *******************
   366  
   367  var responseReserveNextPackagePostPlanned = `{
   368      "d": {
   369          "DeterminePackageForScv": {
   370              "__metadata": {
   371                  "type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended"
   372              },
   373              "Name": "SAPK-001AAINDRNMSPC",
   374              "Type": "AOI",
   375              "ScName": "/DRNMSPC/COMP01",
   376              "ScVersion": "0001",
   377              "SpLevel": "0000",
   378              "PatchLevel": "0000",
   379              "Predecessor": "",
   380              "PredecessorCommitId": "",
   381              "Status": "P"
   382          }
   383      }
   384  }`
   385  
   386  var responseReserveNextPackagePostReleased = `{
   387      "d": {
   388          "DeterminePackageForScv": {
   389              "__metadata": {
   390                  "type": "SSDA.AAS_ODATA_PACKAGE_SRV.PackageExtended"
   391              },
   392              "Name": "SAPK-001AAINDRNMSPC",
   393              "Type": "AOI",
   394              "ScName": "/DRNMSPC/COMP02",
   395              "ScVersion": "0001",
   396              "SpLevel": "0000",
   397              "PatchLevel": "0000",
   398              "Predecessor": "",
   399              "PredecessorCommitId": "",
   400  			"CommitId": "something40charslongxxxxxxxxxxxxxxxxxxxx",
   401              "Status": "R"
   402          }
   403      }
   404  }`
   405  
   406  var responseReserveNextPackageCreationTriggered = `{
   407      "d": {
   408          "__metadata": {
   409              "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   410              "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   411              "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
   412          },
   413          "Name": "SAPK-001AAINDRNMSPC",
   414          "Type": "AOI",
   415          "Component": "/DRNMSPC/COMP01",
   416          "Release": "0001",
   417          "Level": "0000",
   418          "Status": "C",
   419          "Operation": "",
   420          "Namespace": "/DRNMSPC/",
   421          "Vendorid": "0000203069"
   422      }
   423  }`
   424  
   425  var responseReserveNextPackageLocked = `{
   426      "d": {
   427          "__metadata": {
   428              "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   429              "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   430              "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
   431          },
   432          "Name": "SAPK-001AAINDRNMSPC",
   433          "Type": "AOI",
   434          "Component": "/DRNMSPC/COMP01",
   435          "Release": "0001",
   436          "Level": "0000",
   437          "Status": "L",
   438          "Operation": "",
   439          "Namespace": "/DRNMSPC/",
   440          "Vendorid": "0000203069"
   441      }
   442  }`
   443  
   444  var responseReserveNextPackagePlanned = `{
   445      "d": {
   446          "__metadata": {
   447              "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   448              "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   449              "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
   450          },
   451          "Name": "SAPK-001AAINDRNMSPC",
   452          "Type": "AOI",
   453          "Component": "/DRNMSPC/COMP01",
   454          "Release": "0001",
   455          "Level": "0000",
   456          "Status": "P",
   457          "Operation": "",
   458          "Namespace": "/DRNMSPC/",
   459          "Vendorid": "0000203069"
   460      }
   461  }`
   462  
   463  var responseReserveNextPackageReleased = `{
   464      "d": {
   465          "__metadata": {
   466              "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   467              "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   468              "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
   469          },
   470          "Name": "SAPK-001AAINDRNMSPC",
   471          "Type": "AOI",
   472          "Component": "/DRNMSPC/COMP01",
   473          "Release": "0001",
   474          "Level": "0000",
   475          "Status": "R",
   476          "Operation": "",
   477          "Namespace": "/DRNMSPC/",
   478          "Vendorid": "0000203069"
   479      }
   480  }`
   481  
   482  var responseReserveNextPackageUnknownState = `{
   483      "d": {
   484          "__metadata": {
   485              "id": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   486              "uri": "https://W7Q.DMZWDF.SAP.CORP:443/odata/aas_ocs_package/OcsPackageSet('SAPK-001AAINDRNMSPC')",
   487              "type": "SSDA.AAS_ODATA_PACKAGE_SRV.OcsPackage"
   488          },
   489          "Name": "SAPK-001AAINDRNMSPC",
   490          "Type": "AOI",
   491          "Component": "/DRNMSPC/COMP01",
   492          "Release": "0001",
   493          "Level": "0000",
   494          "Status": "X",
   495          "Operation": "",
   496          "Namespace": "/DRNMSPC/",
   497          "Vendorid": "0000203069"
   498      }
   499  }`