1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2025-09-16 09:26:22 +02:00

Revert "Fix deployment failure with CF if password contains special char (#5197)" (#5215)

This reverts commit 8205624a22.

Co-authored-by: Valentin Uchkunev <valentin.uchkunev@sap.com>
This commit is contained in:
Valentin
2024-12-23 13:33:12 +02:00
committed by GitHub
parent aa1e67547a
commit 93c4ea61aa
22 changed files with 158 additions and 234 deletions

View File

@@ -32,7 +32,7 @@ func TestRunAbapEnvironmentCreateSystem(t *testing.T) {
err := runAbapEnvironmentCreateSystem(&config, nil, cf, u)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service", config.CfService, config.CfServicePlan, config.CfServiceInstance, "-c", "{\"is_development_allowed\":false}", "--wait"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -79,7 +79,7 @@ func TestRunAbapEnvironmentCreateSystem(t *testing.T) {
err = runAbapEnvironmentCreateSystem(&config, nil, cf, u)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service-push", "--no-push", "--service-manifest", "customManifest.yml"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)

View File

@@ -28,8 +28,8 @@ func TestFetchXcsrfTokenFromHead(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchXcsrfTokenFromHead(con, client)
if err == nil {
token, error := fetchXcsrfTokenFromHead(con, client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})
@@ -46,8 +46,8 @@ func TestFetchXcsrfTokenFromHead(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchXcsrfTokenFromHead(con, client)
if err == nil {
token, error := fetchXcsrfTokenFromHead(con, client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})
@@ -77,39 +77,39 @@ func TestHandleHttpResponse(t *testing.T) {
--B772E21DAA42B9571C778276B829D6C20
Content-Type: multipart/mixed; boundary=B772E21DAA42B9571C778276B829D6C21
Content-Length: 1973
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 646
content-transfer-encoding: binary
content-id: 1
HTTP/1.1 200 OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 465
odata-version: 4.0
cache-control: no-cache, no-store, must-revalidate
{"@odata.context":"$metadata#configuration/$entity","@odata.metadataEtag":"W/\"20220211135922\"","root_id":"1","conf_id":"aef8f52b-fe16-1edc-a3fe-27a1e0226c7b","conf_name":"Z_CONFIG_VIA_PIPELINE_STEP","checkvariant":"ABAP_CLOUD_DEVELOPMENT_DEFAULT","pseudo_comment_policy":"SP","last_changed_by":"CC0000000017","last_changed_at":"2022-03-02T11:16:51.336172Z","block_findings":"0","inform_findings":"1","transport_check_policy":"C","check_tasks":true,"check_requests":false,"check_tocs":true,"is_default":false,"is_proxy_variant":false,"SAP__Messages":[]}
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 428
content-transfer-encoding: binary
content-id: 2
HTTP/1.1 200 OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 247
odata-version: 4.0
cache-control: no-cache, no-store, must-revalidate
{"@odata.context":"$metadata#priority/$entity","@odata.metadataEtag":"W/\"20220211135922\"","root_id":"1","conf_id":"aef8f52b-fe16-1edc-a3fe-27a1e0226c7b","test":"CL_CI_ARS_COMPATIBILITY_CHECK","message_id":"010","default_priority":1,"priority":2}
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 428
content-transfer-encoding: binary
content-id: 3
HTTP/1.1 4** OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 247
@@ -118,7 +118,7 @@ cache-control: no-cache, no-store, must-revalidate
{"Some Error Messages possible in here!"}
--B772E21DAA42B9571C778276B829D6C21--
--B772E21DAA42B9571C778276B829D6C20--`
client := &abaputils.ClientMock{
@@ -150,39 +150,39 @@ cache-control: no-cache, no-store, must-revalidate
--B772E21DAA42B9571C778276B829D6C20
Content-Type: multipart/mixed; boundary=B772E21DAA42B9571C778276B829D6C21
Content-Length: 1973
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 646
content-transfer-encoding: binary
content-id: 1
HTTP/1.1 200 OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 465
odata-version: 4.0
cache-control: no-cache, no-store, must-revalidate
{"@odata.context":"$metadata#configuration/$entity","@odata.metadataEtag":"W/\"20220211135922\"","root_id":"1","conf_id":"aef8f52b-fe16-1edc-a3fe-27a1e0226c7b","conf_name":"Z_CONFIG_VIA_PIPELINE_STEP","checkvariant":"ABAP_CLOUD_DEVELOPMENT_DEFAULT","pseudo_comment_policy":"SP","last_changed_by":"CC0000000017","last_changed_at":"2022-03-02T11:16:51.336172Z","block_findings":"0","inform_findings":"1","transport_check_policy":"C","check_tasks":true,"check_requests":false,"check_tocs":true,"is_default":false,"is_proxy_variant":false,"SAP__Messages":[]}
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 428
content-transfer-encoding: binary
content-id: 2
HTTP/1.1 200 OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 247
odata-version: 4.0
cache-control: no-cache, no-store, must-revalidate
{"@odata.context":"$metadata#priority/$entity","@odata.metadataEtag":"W/\"20220211135922\"","root_id":"1","conf_id":"aef8f52b-fe16-1edc-a3fe-27a1e0226c7b","test":"CL_CI_ARS_COMPATIBILITY_CHECK","message_id":"010","default_priority":1,"priority":2}
--B772E21DAA42B9571C778276B829D6C21
Content-Type: application/http
Content-Length: 428
content-transfer-encoding: binary
content-id: 3
HTTP/1.1 200 OK
Content-Type: application/json;odata.metadata=minimal;charset=utf-8
Content-Length: 247
@@ -191,7 +191,7 @@ cache-control: no-cache, no-store, must-revalidate
{"@odata.context":"$metadata#priority/$entity","@odata.metadataEtag":"W/\"20220211135922\"","root_id":"1","conf_id":"aef8f52b-fe16-1edc-a3fe-27a1e0226c7b","test":"CL_CI_ARS_COMPATIBILITY_CHECK","message_id":"011","default_priority":2,"priority":1}
--B772E21DAA42B9571C778276B829D6C21--
--B772E21DAA42B9571C778276B829D6C20--`
client := &abaputils.ClientMock{
@@ -328,7 +328,7 @@ Content-Type: application/json
"transport_check_policy": "C",
"check_tasks": true,
"check_requests": false,
"check_tocs": true,
"check_tocs": true,
"_priorities": [
{
"test": "CL_CI_TEST_AMDP_HDB_MIGRATION",

View File

@@ -29,9 +29,9 @@ func TestHostConfig(t *testing.T) {
Exec: execRunner,
}
var con abaputils.ConnectionDetailsHTTP
con, err := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "")
con, error := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "")
if err == nil {
if error == nil {
assert.Equal(t, "testUser", con.User)
assert.Equal(t, "testPassword", con.Password)
assert.Equal(t, "https://api.endpoint.com", con.URL)
@@ -82,8 +82,8 @@ func TestHostConfig(t *testing.T) {
Exec: execRunner,
}
var con abaputils.ConnectionDetailsHTTP
con, err := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "")
if err == nil {
con, error := autils.GetAbapCommunicationArrangementInfo(options.AbapEnvOptions, "")
if error == nil {
assert.Equal(t, "", con.User)
assert.Equal(t, "", con.Password)
assert.Equal(t, "", con.URL)
@@ -106,8 +106,8 @@ func TestATCTrigger(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
resp, err := runATC("GET", con, []byte(client.Body), client)
if err == nil {
resp, error := runATC("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, resp.Header["X-Csrf-Token"][0])
assert.Equal(t, int64(0), resp.ContentLength)
assert.Equal(t, []string([]string(nil)), resp.Header["Location"])
@@ -129,8 +129,8 @@ func TestFetchXcsrfToken(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if err == nil {
token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})
@@ -147,8 +147,8 @@ func TestFetchXcsrfToken(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if err == nil {
token, error := fetchXcsrfToken("GET", con, []byte(client.Body), client)
if error == nil {
assert.Equal(t, tokenExpected, token)
}
})

View File

@@ -582,8 +582,8 @@ func TestRunAbapEnvironmentRunAUnitTest(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, err) {
token, error := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, error) {
assert.Equal(t, tokenExpected, token)
}
})
@@ -603,8 +603,8 @@ func TestRunAbapEnvironmentRunAUnitTest(t *testing.T) {
Password: "Test",
URL: "https://api.endpoint.com/Entity/",
}
token, err := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, err) {
token, error := fetchAUnitXcsrfToken("GET", con, []byte(client.Body), client)
if assert.Equal(t, nil, error) {
assert.Equal(t, tokenExpected, token)
}
})

View File

@@ -1,5 +1,3 @@
//go:build unit
package cmd
import (

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cmd
@@ -29,8 +30,8 @@ func TestCloudFoundryCreateServiceKey(t *testing.T) {
cfUtilsMock := cloudfoundry.CfUtilsMock{}
defer cfUtilsMock.Cleanup()
err := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
if err == nil {
error := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
if error == nil {
assert.Equal(t, "cf", execRunner.Calls[0].Exec)
assert.Equal(t, []string{"create-service-key", "testInstance", "testKey"}, execRunner.Calls[0].Params)
}
@@ -51,7 +52,8 @@ func TestCloudFoundryCreateServiceKey(t *testing.T) {
cfUtilsMock := cloudfoundry.CfUtilsMock{}
defer cfUtilsMock.Cleanup()
if err := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock); err == nil {
error := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
if error == nil {
assert.Equal(t, "cf", execRunner.Calls[0].Exec)
assert.Equal(t, []string{"create-service-key", "testInstance", "testKey", "-c", "testconfig.yml"}, execRunner.Calls[0].Params)
}
@@ -72,7 +74,8 @@ func TestCloudFoundryCreateServiceKey(t *testing.T) {
cfUtilsMock := cloudfoundry.CfUtilsMock{}
defer cfUtilsMock.Cleanup()
if err := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock); err == nil {
error := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
if error == nil {
assert.Equal(t, "cf", execRunner.Calls[0].Exec)
assert.Equal(t, []string{"create-service-key", "testInstance", "testKey", "-c", "{\"scenario_id\":\"SAP_COM_0510\",\"type\":\"basic\"}", cfCliSynchronousRequestFlag}, execRunner.Calls[0].Params)
}
@@ -100,8 +103,8 @@ func TestCloudFoundryCreateServiceKeyErrorMessages(t *testing.T) {
}
defer cfUtilsMock.Cleanup()
err := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
assert.Equal(t, err.Error(), "Error while logging in occurred: "+errorMessage, "Wrong error message")
error := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
assert.Equal(t, error.Error(), "Error while logging in occurred: "+errorMessage, "Wrong error message")
})
t.Run("CF Logout Error", func(t *testing.T) {
@@ -149,7 +152,7 @@ func TestCloudFoundryCreateServiceKeyErrorMessages(t *testing.T) {
}
defer cfUtilsMock.Cleanup()
err := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
assert.Equal(t, err.Error(), "Failed to Create Service Key: "+errorMessage, "Wrong error message")
error := runCloudFoundryCreateServiceKey(&config, &telemetryData, &execRunner, &cfUtilsMock)
assert.Equal(t, error.Error(), "Failed to Create Service Key: "+errorMessage, "Wrong error message")
})
}

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cmd
@@ -37,9 +38,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
CfServicePlan: "testPlan",
CfAsync: false,
}
err := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service", "testService", "testPlan", "testName", "--wait"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -60,9 +61,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
CfServiceTags: "testTag, testTag2",
CfAsync: true,
}
err := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service", "testService", "testPlan", "testName", "-t", "testTag, testTag2"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -82,9 +83,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
CfServiceBroker: "testBroker",
CfAsync: true,
}
err := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service", "testService", "testPlan", "testName", "-b", "testBroker"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -104,9 +105,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
CfCreateServiceConfig: "testConfig.json",
CfAsync: true,
}
err := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service", "testService", "testPlan", "testName", "-c", "testConfig.json"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -116,8 +117,8 @@ func TestCloudFoundryCreateService(t *testing.T) {
t.Run("Create service: failure, no config", func(t *testing.T) {
defer cfMockCleanup(m)
config := cloudFoundryCreateServiceOptions{}
err := runCloudFoundryCreateService(&config, &telemetryData, cf)
assert.EqualError(t, err, "Error while logging in: Failed to login to Cloud Foundry: Parameters missing. Please provide the Cloud Foundry Endpoint, Org, Space, Username and Password")
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
assert.EqualError(t, error, "Error while logging in: Failed to login to Cloud Foundry: Parameters missing. Please provide the Cloud Foundry Endpoint, Org, Space, Username and Password")
})
t.Run("Create service: variable substitution in-line", func(t *testing.T) {
@@ -162,9 +163,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
ManifestVariables: manifestVariables,
CfAsync: false, // should be ignored
}
err = runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service-push", "--no-push", "--service-manifest", "manifestTest.yml", "--var", "name1=Test1", "--var", "name2=Test2"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)
@@ -219,9 +220,9 @@ func TestCloudFoundryCreateService(t *testing.T) {
ManifestVariablesFiles: manifestVariablesFiles,
ManifestVariables: []string{"a=b", "x=y"},
}
err = runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, err) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "'testUser'", "-p", "'testPassword'"}},
error := runCloudFoundryCreateService(&config, &telemetryData, cf)
if assert.NoError(t, error) {
assert.Equal(t, []mock.ExecCall{{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"login", "-a", "https://api.endpoint.com", "-o", "testOrg", "-s", "testSpace", "-u", "testUser", "-p", "testPassword"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"create-service-push", "--no-push", "--service-manifest", "manifestTest.yml", "--vars-file", "varsTest.yml", "--vars-file", "varsTest2.yml", "--var", "a=b", "--var", "x=y"}},
{Execution: (*mock.Execution)(nil), Async: false, Exec: "cf", Params: []string{"logout"}}},
m.Calls)

View File

@@ -1,5 +1,3 @@
//go:build unit
package cmd
import (

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cmd
@@ -208,9 +209,9 @@ func (c *httpMockCpis) SendRequest(method string, url string, r io.Reader, heade
}
if c.CPIFunction == "" {
c.CPIFunction = cpi.GetCPIFunctionNameByURLCheck(url, method, c.TestType)
resp, err := cpi.GetCPIFunctionMockResponse(c.CPIFunction, c.TestType)
resp, error := cpi.GetCPIFunctionMockResponse(c.CPIFunction, c.TestType)
c.CPIFunction = ""
return resp, err
return resp, error
}
return cpi.GetCPIFunctionMockResponse(c.CPIFunction, c.TestType)

View File

@@ -76,7 +76,8 @@ func CreateIntegrationArtifactTransportRequest(config *integrationArtifactTransp
processId := jsonResponse.Path("processId").Data().(string)
if processId != "" {
return pollTransportStatus(processId, retryCount, config, httpClient, apistruct.Host)
error := pollTransportStatus(processId, retryCount, config, httpClient, apistruct.Host)
return error
}
return errors.New("Invalid process id")
}

View File

@@ -77,9 +77,9 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
SHA256: "96ca802fbd54d31903f1115a1d95590c685160637d9262bd340ab30d0f817e85",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.NoError(t, err)
assert.NoError(t, error)
})
t.Run("Malware detected in file", func(t *testing.T) {
@@ -92,8 +92,8 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
Finding: "Win.Test.EICAR_HDB-1",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, err, "Malware scan failed for file 'target/myFile'. Malware detected: true, encrypted content detected: false, finding: Win.Test.EICAR_HDB-1")
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, error, "Malware scan failed for file 'target/myFile'. Malware detected: true, encrypted content detected: false, finding: Win.Test.EICAR_HDB-1")
})
t.Run("Encrypted content detected in file", func(t *testing.T) {
@@ -105,8 +105,8 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
SHA256: "96ca802fbd54d31903f1115a1d95590c685160637d9262bd340ab30d0f817e85",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, err, "Malware scan failed for file 'target/myFile'. Malware detected: false, encrypted content detected: true, finding: ")
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, error, "Malware scan failed for file 'target/myFile'. Malware detected: false, encrypted content detected: true, finding: ")
})
t.Run("Malware and encrypted content detected in file", func(t *testing.T) {
@@ -119,8 +119,8 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
Finding: "Win.Test.EICAR_HDB-1",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, err, "Malware scan failed for file 'target/myFile'. Malware detected: true, encrypted content detected: true, finding: Win.Test.EICAR_HDB-1")
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, error, "Malware scan failed for file 'target/myFile'. Malware detected: true, encrypted content detected: true, finding: Win.Test.EICAR_HDB-1")
})
t.Run("No file and no buildtool specified", func(t *testing.T) {
@@ -131,8 +131,8 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
Timeout: "60",
}
err := runMalwareScan(&malwareScanConfig, nil, nil)
assert.EqualError(t, err, "Please specify a file to be scanned")
error := runMalwareScan(&malwareScanConfig, nil, nil)
assert.EqualError(t, error, "Please specify a file to be scanned")
})
t.Run("File to be scanned, can't be found", func(t *testing.T) {
@@ -146,8 +146,8 @@ func TestMalwareScanWithNoBuildtool(t *testing.T) {
ScanFile: "target/fileWhichDoesntExist",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, err, "the file 'target/fileWhichDoesntExist' does not exist: file does not exist")
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, error, "the file 'target/fileWhichDoesntExist' does not exist: file does not exist")
})
}
@@ -177,9 +177,9 @@ func TestMalwareScanWithDockerAsBuildtoolTests(t *testing.T) {
ScanImage: "dockerimagename:latest",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.NoError(t, err)
assert.NoError(t, error)
})
t.Run("No file and no buildtool specified", func(t *testing.T) {
@@ -190,8 +190,8 @@ func TestMalwareScanWithDockerAsBuildtoolTests(t *testing.T) {
Timeout: "60",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, err, "Please specify a file to be scanned")
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.EqualError(t, error, "Please specify a file to be scanned")
})
}
@@ -221,9 +221,9 @@ func TestMalwareScanWithOtherBuildtoolTests(t *testing.T) {
ScanImage: "dockerimagename:latest",
}
err := runMalwareScan(&malwareScanConfig, nil, &utils)
error := runMalwareScan(&malwareScanConfig, nil, &utils)
assert.NoError(t, err)
assert.NoError(t, error)
})
}

View File

@@ -1,5 +1,3 @@
//go:build unit
package cmd
import (

View File

@@ -38,44 +38,42 @@ type Communication interface {
func (abaputils *AbapUtils) GetAbapCommunicationArrangementInfo(options AbapEnvironmentOptions, oDataURL string) (ConnectionDetailsHTTP, error) {
c := abaputils.Exec
var connectionDetails ConnectionDetailsHTTP
var err error
var error error
if options.Host == "" {
if options.Host != "" {
// Host, User and Password are directly provided -> check for host schema (double https)
match, err := regexp.MatchString(`^(https|HTTPS):\/\/.*`, options.Host)
if err != nil {
log.SetErrorCategory(log.ErrorConfiguration)
return connectionDetails, errors.Wrap(err, "Schema validation for host parameter failed. Check for https.")
}
var hostOdataURL = options.Host + oDataURL
if match {
connectionDetails.URL = hostOdataURL
connectionDetails.Host = options.Host
} else {
connectionDetails.URL = "https://" + hostOdataURL
connectionDetails.Host = "https://" + options.Host
}
connectionDetails.User = options.Username
connectionDetails.Password = options.Password
} else {
if options.CfAPIEndpoint == "" || options.CfOrg == "" || options.CfSpace == "" || options.CfServiceInstance == "" || options.CfServiceKeyName == "" {
var err = errors.New("Parameters missing. Please provide EITHER the Host of the ABAP server OR the Cloud Foundry API Endpoint, Organization, Space, Service Instance and Service Key")
log.SetErrorCategory(log.ErrorConfiguration)
return connectionDetails, err
}
// Url, User and Password should be read from a cf service key
var abapServiceKey, err = ReadServiceKeyAbapEnvironment(options, c)
if err != nil {
return connectionDetails, errors.Wrap(err, "Read service key failed")
var abapServiceKey, error = ReadServiceKeyAbapEnvironment(options, c)
if error != nil {
return connectionDetails, errors.Wrap(error, "Read service key failed")
}
connectionDetails.Host = abapServiceKey.URL
connectionDetails.URL = abapServiceKey.URL + oDataURL
connectionDetails.User = abapServiceKey.Abap.Username
connectionDetails.Password = abapServiceKey.Abap.Password
return connectionDetails, err
}
// Host, User and Password are directly provided -> check for host schema (double https)
match, err := regexp.MatchString(`^(https|HTTPS):\/\/.*`, options.Host)
if err != nil {
log.SetErrorCategory(log.ErrorConfiguration)
return connectionDetails, errors.Wrap(err, "Schema validation for host parameter failed. Check for https.")
}
var hostOdataURL = options.Host + oDataURL
if match {
connectionDetails.URL = hostOdataURL
connectionDetails.Host = options.Host
} else {
connectionDetails.URL = "https://" + hostOdataURL
connectionDetails.Host = "https://" + options.Host
}
connectionDetails.User = options.Username
connectionDetails.Password = options.Password
return connectionDetails, err
return connectionDetails, error
}
// ReadServiceKeyAbapEnvironment from Cloud Foundry and returns it. Depending on user/developer requirements if he wants to perform further Cloud Foundry actions

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package abaputils
@@ -72,7 +73,6 @@ func TestCloudFoundryGetAbapCommunicationInfo(t *testing.T) {
assert.Equal(t, "", connectionDetails.Password)
assert.Equal(t, "", connectionDetails.XCsrfToken)
assert.Error(t, err)
assert.EqualError(t, err, "Read service key failed: Parsing the service key failed for all supported formats. Service key is empty")
})
t.Run("CF GetAbapCommunicationArrangementInfo - Success V8", func(t *testing.T) {

View File

@@ -396,8 +396,8 @@ func (api *SAP_COM_0510) getLogProtocolQuery(page int) string {
// ConvertTime formats an ABAP timestamp string from format /Date(1585576807000+0000)/ into a UNIX timestamp and returns it
func (api *SAP_COM_0510) ConvertTime(logTimeStamp string) time.Time {
seconds := strings.TrimPrefix(strings.TrimSuffix(logTimeStamp, "000+0000)/"), "/Date(")
n, err := strconv.ParseInt(seconds, 10, 64)
if err != nil {
n, error := strconv.ParseInt(seconds, 10, 64)
if error != nil {
return time.Unix(0, 0).UTC()
}
t := time.Unix(n, 0).UTC()

View File

@@ -452,8 +452,8 @@ func (api *SAP_COM_0948) getLogProtocolQuery(page int) string {
// ConvertTime formats an ISO 8601 timestamp string from format 2024-05-02T09:25:40Z into a UNIX timestamp and returns it
func (api *SAP_COM_0948) ConvertTime(logTimeStamp string) time.Time {
t, err := time.Parse(time.RFC3339, logTimeStamp)
if err != nil {
t, error := time.Parse(time.RFC3339, logTimeStamp)
if error != nil {
return time.Unix(0, 0).UTC()
}
return t

View File

@@ -3,8 +3,6 @@ package cloudfoundry
import (
"errors"
"fmt"
"runtime"
"strings"
"github.com/SAP/jenkins-library/pkg/command"
"github.com/SAP/jenkins-library/pkg/log"
@@ -13,13 +11,14 @@ import (
// LoginCheck checks if user is logged in to Cloud Foundry with the receiver provided
// to the function call.
func (cf *CFUtils) LoginCheck(options LoginOptions) (bool, error) {
// TODO: options are not used ?
return cf.loggedIn, nil
}
// Login logs user in to Cloud Foundry via cf cli.
// Checks if user is logged in first, if not perform 'cf login' command with appropriate parameters
func (cf *CFUtils) Login(options LoginOptions) error {
var err error
_c := cf.Exec
if _c == nil {
@@ -30,29 +29,31 @@ func (cf *CFUtils) Login(options LoginOptions) error {
return fmt.Errorf("Failed to login to Cloud Foundry: %w", errors.New("Parameters missing. Please provide the Cloud Foundry Endpoint, Org, Space, Username and Password"))
}
if cf.loggedIn {
return nil
var loggedIn bool
loggedIn, err = cf.LoginCheck(options)
if loggedIn == true {
return err
}
log.Entry().Info("Logging in to Cloud Foundry")
if err == nil {
log.Entry().Info("Logging in to Cloud Foundry")
escapedUsername := escapeValuesForCLI(options.Username, getGOOS)
escapedPassword := escapeValuesForCLI(options.Password, getGOOS)
var cfLoginScript = append([]string{
"login",
"-a", options.CfAPIEndpoint,
"-o", options.CfOrg,
"-s", options.CfSpace,
"-u", options.Username,
"-p", options.Password,
}, options.CfLoginOpts...)
cfLoginScript := []string{
"login",
"-a", options.CfAPIEndpoint,
"-o", options.CfOrg,
"-s", options.CfSpace,
"-u", escapedUsername,
"-p", escapedPassword,
log.Entry().WithField("cfAPI:", options.CfAPIEndpoint).WithField("cfOrg", options.CfOrg).WithField("space", options.CfSpace).Info("Logging into Cloud Foundry..")
err = _c.RunExecutable("cf", cfLoginScript...)
}
cfLoginScript = append(cfLoginScript, options.CfLoginOpts...)
log.Entry().WithField("cfAPI:", options.CfAPIEndpoint).WithField("cfOrg", options.CfOrg).WithField("space", options.CfSpace).Info("Logging into Cloud Foundry..")
err := _c.RunExecutable("cf", cfLoginScript...)
if err != nil {
return fmt.Errorf("Failed to login to Cloud Foundry: %w", err)
}
@@ -61,17 +62,6 @@ func (cf *CFUtils) Login(options LoginOptions) error {
return nil
}
func escapeValuesForCLI(password string, getGOOS func() string) string {
switch getGOOS() {
case "windows":
return fmt.Sprintf("'%s'", strings.ReplaceAll(password, "'", `''`))
case "linux", "darwin":
return fmt.Sprintf("'%s'", strings.ReplaceAll(password, "'", `'\''`))
default:
return fmt.Sprintf("'%s'", strings.ReplaceAll(password, "'", `'\''`))
}
}
// Logout logs User out of Cloud Foundry
// Logout can be perforned via 'cf logout' command regardless if user is logged in or not
func (cf *CFUtils) Logout() error {
@@ -143,7 +133,3 @@ func (cf *CfUtilsMock) Cleanup() {
cf.LoginError = nil
cf.LogoutError = nil
}
func getGOOS() string {
return runtime.GOOS
}

View File

@@ -1,63 +0,0 @@
//go:build unit
package cloudfoundry
import (
"fmt"
"testing"
"github.com/stretchr/testify/assert"
)
func Test_escapeValuesForCLI(t *testing.T) {
tests := []struct {
name string
os string
input string
expected string
}{
{
name: "Windows password without quotes",
os: "windows",
input: `mypassword`,
expected: `'mypassword'`,
},
{
name: "Windows password with quotes",
os: "windows",
input: `my\"password`,
expected: `'my\"password'`,
},
{
name: "Non-Windows password without single quotes",
os: "linux",
input: "mypassword",
expected: "'mypassword'",
},
{
name: "Non-Windows password with single quotes",
os: "darwin",
input: `my'password`,
expected: `'my'\''password'`,
},
{
name: "Linux password with all special characters",
os: "linux",
input: "~!@#$%^&*()_+{`}|:\"<>?-=[]\\;',./",
expected: "'~!@#$%^&*()_+{`}|:\"<>?-=[]\\;'\\'',./'",
},
{
name: "Windows password with all special characters",
os: "windows",
input: "~!@#$%^&*()_+{`}|:\"<>?-=[]\\;',./",
expected: "'~!@#$%^&*()_+{`}|:\"<>?-=[]\\;'',./'",
},
}
for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
result := escapeValuesForCLI(tt.input, func() string { return tt.os })
assert.Equal(t, tt.expected, result, fmt.Sprintf("Failed for OS: %s and password: %s", tt.os, tt.input))
})
}
}

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cloudfoundry
@@ -86,8 +87,8 @@ func TestCloudFoundryLogin(t *testing.T) {
"-a", "https://api.endpoint.com",
"-o", "testOrg",
"-s", "testSpace",
"-u", "'testUser'",
"-p", "'testPassword'",
"-u", "testUser",
"-p", "testPassword",
}},
}, m.Calls)
}
@@ -116,8 +117,8 @@ func TestCloudFoundryLogin(t *testing.T) {
"-a", "https://api.endpoint.com",
"-o", "testOrg",
"-s", "testSpace",
"-u", "'testUser'",
"-p", "'testPassword'",
"-u", "testUser",
"-p", "testPassword",
}},
}, m.Calls)
}
@@ -149,8 +150,8 @@ func TestCloudFoundryLogin(t *testing.T) {
"-a", "https://api.endpoint.com",
"-o", "testOrg",
"-s", "testSpace",
"-u", "'testUser'",
"-p", "'testPassword'",
"-u", "testUser",
"-p", "testPassword",
"--skip-ssl-validation",
"--origin", "ldap",
}},
@@ -183,7 +184,7 @@ func TestCloudFoundryReadServiceKeyAbapEnvironment(t *testing.T) {
const password = "test_password"
const serviceKey = `
cf comment test \n\n
{"sap.cloud.service":"com.sap.cloud.abap","url": "` + testURL + `" ,"systemid":"H01","abap":{"username":"'` + username + `'","password":"'` + password + `'","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}`
{"sap.cloud.service":"com.sap.cloud.abap","url": "` + testURL + `" ,"systemid":"H01","abap":{"username":"` + username + `","password":"` + password + `","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}`
m.StdoutReturn = map[string]string{"cf service-key testInstance testServiceKeyName": serviceKey}
@@ -212,13 +213,13 @@ func TestCloudFoundryReadServiceKeyAbapEnvironment(t *testing.T) {
"-a", "https://api.endpoint.com",
"-o", "testOrg",
"-s", "testSpace",
"-u", "'testUser'",
"-p", "'testPassword'",
"-u", "testUser",
"-p", "testPassword",
}},
{Exec: "cf", Params: []string{"service-key", "testInstance", "testServiceKeyName"}},
{Exec: "cf", Params: []string{"logout"}},
}, m.Calls)
}
assert.Equal(t, ` {"sap.cloud.service":"com.sap.cloud.abap","url": "`+testURL+`" ,"systemid":"H01","abap":{"username":"'`+username+`'","password":"'`+password+`'","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}`, abapServiceKey)
assert.Equal(t, ` {"sap.cloud.service":"com.sap.cloud.abap","url": "`+testURL+`" ,"systemid":"H01","abap":{"username":"`+username+`","password":"`+password+`","communication_scenario_id": "SAP_COM_0510","communication_arrangement_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_system_id": "SK_I6CBIRFZPPJDKYNATQA32W","communication_inbound_user_id": "CC0000000001","communication_inbound_user_auth_mode": "2"},"binding":{"env": "cf","version": "0.0.1.1","type": "basic","id": "i6cBiRfZppJdKynaTqa32W"},"preserve_host_header": true}`, abapServiceKey)
})
}

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cloudfoundry

View File

@@ -1,4 +1,5 @@
//go:build unit
// +build unit
package cloudfoundry

View File

@@ -309,9 +309,9 @@ func IntegrationDesigntimeArtifactUpdateMockResponse(testType string) (*http.Res
// GetMockResponseByTestTypeAndMockFunctionName - Get mock response by testtype and mock function name
func GetMockResponseByTestTypeAndMockFunctionName(mockFuntionName, testType string) (*http.Response, error) {
response, err := GetPositiveCaseResponseByTestType(testType)
response, error := GetPositiveCaseResponseByTestType(testType)
if response == nil && err == nil {
if response == nil && error == nil {
switch mockFuntionName {
@@ -355,7 +355,7 @@ func GetMockResponseByTestTypeAndMockFunctionName(mockFuntionName, testType stri
return &res, errors.New("Unable to get integration artifact deploy error status, Response Status code:400")
}
}
return response, err
return response, error
}
// NegtiveResForIntegrationArtifactGenericCommandMockResponse -Nagative Case http response body
@@ -377,9 +377,9 @@ func NegtiveResForIntegrationArtifactGenericCommandMockResponse(message string)
// UpdateIntegrationDesigntimeArtifactMockResponse -Provide http respose body
func UpdateIntegrationDesigntimeArtifactMockResponse(testType string) (*http.Response, error) {
response, err := GetRespBodyHTTPStatusCreated()
response, error := GetRespBodyHTTPStatusCreated()
if response == nil && err == nil {
if response == nil && error == nil {
res := http.Response{
StatusCode: 400,
@@ -393,7 +393,7 @@ func UpdateIntegrationDesigntimeArtifactMockResponse(testType string) (*http.Res
}
return &res, errors.New("Unable to get status of integration artifact, Response Status code:400")
}
return response, err
return response, error
}
// IntegrationArtifactDownloadCommandMockResponsePositiveCaseRespBody -Provide http respose body for positive case