From e5e59f6d8cc5889cdfcb0515521dad5e348eed97 Mon Sep 17 00:00:00 2001 From: Artem Bannikov <62880541+artembannikov@users.noreply.github.com> Date: Fri, 13 Oct 2023 15:51:21 +0200 Subject: [PATCH] [tmsUpload, tmsExport] Provide additional log message on successful upload and export to node (#4624) * Provide additional log message on successful upload and export to node --------- Co-authored-by: Oliver Feldmann --- cmd/tmsExport.go | 4 ++-- cmd/tmsExport_test.go | 3 ++- cmd/tmsUpload.go | 4 ++-- cmd/tmsUpload_test.go | 3 ++- pkg/tms/tmsClient.go | 24 ++++++++++++++++-------- pkg/tms/tmsClient_test.go | 11 ++++++----- pkg/tms/tmsUtils.go | 16 ++++++++-------- 7 files changed, 38 insertions(+), 27 deletions(-) diff --git a/cmd/tmsExport.go b/cmd/tmsExport.go index 1def2705b0..5b448edd7d 100644 --- a/cmd/tmsExport.go +++ b/cmd/tmsExport.go @@ -28,7 +28,7 @@ func tmsExport(exportConfig tmsExportOptions, telemetryData *telemetry.CustomDat func runTmsExport(exportConfig tmsExportOptions, communicationInstance tms.CommunicationInterface, utils tms.TmsUtils) error { config := convertExportOptions(exportConfig) - fileId, errUploadFile := tms.UploadFile(config, communicationInstance, utils) + fileInfo, errUploadFile := tms.UploadFile(config, communicationInstance, utils) if errUploadFile != nil { return errUploadFile } @@ -38,7 +38,7 @@ func runTmsExport(exportConfig tmsExportOptions, communicationInstance tms.Commu return errUploadDescriptors } - _, errExportFileToNode := communicationInstance.ExportFileToNode(config.NodeName, fileId, config.CustomDescription, config.NamedUser) + _, errExportFileToNode := communicationInstance.ExportFileToNode(fileInfo, config.NodeName, config.CustomDescription, config.NamedUser) if errExportFileToNode != nil { log.SetErrorCategory(log.ErrorService) return fmt.Errorf("failed to export file to node: %w", errExportFileToNode) diff --git a/cmd/tmsExport_test.go b/cmd/tmsExport_test.go index 76a759637b..39e34e8c38 100644 --- a/cmd/tmsExport_test.go +++ b/cmd/tmsExport_test.go @@ -27,7 +27,8 @@ func newTmsExportTestsUtils() tmsExportMockUtils { return utils } -func (cim *communicationInstanceMock) ExportFileToNode(nodeName, fileId, description, namedUser string) (tms.NodeUploadResponseEntity, error) { +func (cim *communicationInstanceMock) ExportFileToNode(fileInfo tms.FileInfo, nodeName, description, namedUser string) (tms.NodeUploadResponseEntity, error) { + fileId := strconv.FormatInt(fileInfo.Id, 10) var nodeUploadResponseEntity tms.NodeUploadResponseEntity if description != CUSTOM_DESCRIPTION || nodeName != NODE_NAME || fileId != strconv.FormatInt(FILE_ID, 10) || namedUser != NAMED_USER { return nodeUploadResponseEntity, errors.New(INVALID_INPUT_MSG) diff --git a/cmd/tmsUpload.go b/cmd/tmsUpload.go index 3fc053dac3..0462326646 100644 --- a/cmd/tmsUpload.go +++ b/cmd/tmsUpload.go @@ -21,7 +21,7 @@ func tmsUpload(uploadConfig tmsUploadOptions, telemetryData *telemetry.CustomDat func runTmsUpload(uploadConfig tmsUploadOptions, communicationInstance tms.CommunicationInterface, utils tms.TmsUtils) error { config := convertUploadOptions(uploadConfig) - fileId, errUploadFile := tms.UploadFile(config, communicationInstance, utils) + fileInfo, errUploadFile := tms.UploadFile(config, communicationInstance, utils) if errUploadFile != nil { return errUploadFile } @@ -31,7 +31,7 @@ func runTmsUpload(uploadConfig tmsUploadOptions, communicationInstance tms.Commu return errUploadDescriptors } - _, errUploadFileToNode := communicationInstance.UploadFileToNode(config.NodeName, fileId, config.CustomDescription, config.NamedUser) + _, errUploadFileToNode := communicationInstance.UploadFileToNode(fileInfo, config.NodeName, config.CustomDescription, config.NamedUser) if errUploadFileToNode != nil { log.SetErrorCategory(log.ErrorService) return fmt.Errorf("failed to upload file to node: %w", errUploadFileToNode) diff --git a/cmd/tmsUpload_test.go b/cmd/tmsUpload_test.go index d263db4538..a322c868f5 100644 --- a/cmd/tmsUpload_test.go +++ b/cmd/tmsUpload_test.go @@ -134,7 +134,8 @@ func (cim *communicationInstanceMock) UploadFile(file, namedUser string) (tms.Fi } } -func (cim *communicationInstanceMock) UploadFileToNode(nodeName, fileId, description, namedUser string) (tms.NodeUploadResponseEntity, error) { +func (cim *communicationInstanceMock) UploadFileToNode(fileInfo tms.FileInfo, nodeName, description, namedUser string) (tms.NodeUploadResponseEntity, error) { + fileId := strconv.FormatInt(fileInfo.Id, 10) var nodeUploadResponseEntity tms.NodeUploadResponseEntity if description != CUSTOM_DESCRIPTION || nodeName != NODE_NAME || fileId != strconv.FormatInt(FILE_ID, 10) || namedUser != NAMED_USER { return nodeUploadResponseEntity, errors.New(INVALID_INPUT_MSG) diff --git a/pkg/tms/tmsClient.go b/pkg/tms/tmsClient.go index 43842d07d3..e56002edbb 100644 --- a/pkg/tms/tmsClient.go +++ b/pkg/tms/tmsClient.go @@ -9,6 +9,7 @@ import ( "net/http" "net/url" "os" + "strconv" "strings" piperHttp "github.com/SAP/jenkins-library/pkg/http" @@ -177,7 +178,9 @@ func (communicationInstance *CommunicationInstance) GetMtaExtDescriptor(nodeId i } -func (communicationInstance *CommunicationInstance) UploadFileToNode(nodeName, fileId, description, namedUser string) (NodeUploadResponseEntity, error) { +func (communicationInstance *CommunicationInstance) UploadFileToNode(fileInfo FileInfo, nodeName, description, namedUser string) (NodeUploadResponseEntity, error) { + fileId := strconv.FormatInt(fileInfo.Id, 10) + if communicationInstance.isVerbose { communicationInstance.logger.Info("Node upload started") communicationInstance.logger.Infof("tmsUrl: %v, nodeName: %v, fileId: %v, description: %v, namedUser: %v", communicationInstance.tmsUrl, nodeName, fileId, description, namedUser) @@ -200,14 +203,18 @@ func (communicationInstance *CommunicationInstance) UploadFileToNode(nodeName, f } json.Unmarshal(data, &nodeUploadResponseEntity) - if communicationInstance.isVerbose { - communicationInstance.logger.Info("Node upload executed successfully") - } + communicationInstance.logger.Info("Node upload executed successfully") + + // Important: there are Customers, who might rely on format of this log message to parse transport request id + communicationInstance.logger.Infof("nodeName: %v, nodeId: %v, uploadedFile: %v, createdTransportRequestDescription: %v, createdTransportRequestId: %v", nodeUploadResponseEntity.QueueEntries[0].NodeName, nodeUploadResponseEntity.QueueEntries[0].NodeId, fileInfo.Name, nodeUploadResponseEntity.TransportRequestDescription, nodeUploadResponseEntity.TransportRequestId) + return nodeUploadResponseEntity, nil } -func (communicationInstance *CommunicationInstance) ExportFileToNode(nodeName, fileId, description, namedUser string) (NodeUploadResponseEntity, error) { +func (communicationInstance *CommunicationInstance) ExportFileToNode(fileInfo FileInfo, nodeName, description, namedUser string) (NodeUploadResponseEntity, error) { + fileId := strconv.FormatInt(fileInfo.Id, 10) + if communicationInstance.isVerbose { communicationInstance.logger.Info("Node export started") communicationInstance.logger.Infof("tmsUrl: %v, nodeName: %v, fileId: %v, description: %v, namedUser: %v", communicationInstance.tmsUrl, nodeName, fileId, description, namedUser) @@ -230,9 +237,10 @@ func (communicationInstance *CommunicationInstance) ExportFileToNode(nodeName, f } json.Unmarshal(data, &nodeUploadResponseEntity) - if communicationInstance.isVerbose { - communicationInstance.logger.Info("Node export executed successfully") - } + communicationInstance.logger.Info("Node export executed successfully") + + // Important: there are Customers, who might rely on format of this log message to parse transport request id + communicationInstance.logger.Infof("nodeName: %v, nodeId: %v, uploadedFile: %v, createdTransportRequestDescription: %v, createdTransportRequestId: %v", nodeUploadResponseEntity.QueueEntries[0].NodeName, nodeUploadResponseEntity.QueueEntries[0].NodeId, fileInfo.Name, nodeUploadResponseEntity.TransportRequestDescription, nodeUploadResponseEntity.TransportRequestId) return nodeUploadResponseEntity, nil } diff --git a/pkg/tms/tmsClient_test.go b/pkg/tms/tmsClient_test.go index b80f8f10da..2848930f76 100644 --- a/pkg/tms/tmsClient_test.go +++ b/pkg/tms/tmsClient_test.go @@ -11,6 +11,7 @@ import ( "net/http" "net/url" "os" + "strconv" "strings" "testing" @@ -469,16 +470,16 @@ func TestUploadFileToNode(t *testing.T) { communicationInstance := CommunicationInstance{tmsUrl: "https://tms.dummy.sap.com", httpClient: &uploaderMock, logger: logger, isVerbose: false} - fileId := "111" + fileInfo := FileInfo{Id: 111, Name: "test.mtar"} namedUser := "testUser" - nodeUploadResponseEntity, err := communicationInstance.UploadFileToNode(nodeName, fileId, transportRequestDescription, namedUser) + nodeUploadResponseEntity, err := communicationInstance.UploadFileToNode(fileInfo, nodeName, transportRequestDescription, namedUser) assert.NoError(t, err, "Error occurred, but none expected") assert.Equal(t, "https://tms.dummy.sap.com/v2/nodes/upload", uploaderMock.urlCalled, "Called url incorrect") assert.Equal(t, http.MethodPost, uploaderMock.httpMethod, "Http method incorrect") assert.Equal(t, []string{"application/json"}, uploaderMock.header[http.CanonicalHeaderKey("content-type")], "Content-Type header incorrect") - entryString := fmt.Sprintf(`{"uri":"%v"}`, fileId) + entryString := fmt.Sprintf(`{"uri":"%v"}`, strconv.FormatInt(fileInfo.Id, 10)) assert.Equal(t, fmt.Sprintf(`{"contentType":"MTA","storageType":"FILE","nodeName":"%v","description":"%v","namedUser":"%v","entries":[%v]}`, nodeName, transportRequestDescription, namedUser, entryString), uploaderMock.requestBody, "Request body incorrect") assert.Equal(t, transportRequestId, nodeUploadResponseEntity.TransportRequestId, "TransportRequestId field of node upload response incorrect") @@ -493,11 +494,11 @@ func TestUploadFileToNode(t *testing.T) { uploaderMock := uploaderMock{responseBody: `Bad request provided`, httpStatusCode: http.StatusBadRequest} communicationInstance := CommunicationInstance{tmsUrl: "https://tms.dummy.sap.com", httpClient: &uploaderMock, logger: logger, isVerbose: false} + fileInfo := FileInfo{Id: 111, Name: "test.mtar"} nodeName := "TEST_NODE" - fileId := "111" transportRequestDescription := "This is a test description" namedUser := "testUser" - _, err := communicationInstance.UploadFileToNode(nodeName, fileId, transportRequestDescription, namedUser) + _, err := communicationInstance.UploadFileToNode(fileInfo, nodeName, transportRequestDescription, namedUser) assert.Error(t, err, "Error expected, but none occurred") assert.Equal(t, "https://tms.dummy.sap.com/v2/nodes/upload", uploaderMock.urlCalled, "Called url incorrect") diff --git a/pkg/tms/tmsUtils.go b/pkg/tms/tmsUtils.go index a270d78af3..91c828dc0b 100644 --- a/pkg/tms/tmsUtils.go +++ b/pkg/tms/tmsUtils.go @@ -5,7 +5,6 @@ import ( "fmt" "net/url" "sort" - "strconv" "github.com/SAP/jenkins-library/pkg/command" piperHttp "github.com/SAP/jenkins-library/pkg/http" @@ -101,8 +100,8 @@ type CommunicationInterface interface { UpdateMtaExtDescriptor(nodeId, idOfMtaExtDescriptor int64, file, mtaVersion, description, namedUser string) (MtaExtDescriptor, error) UploadMtaExtDescriptorToNode(nodeId int64, file, mtaVersion, description, namedUser string) (MtaExtDescriptor, error) UploadFile(file, namedUser string) (FileInfo, error) - UploadFileToNode(nodeName, fileId, description, namedUser string) (NodeUploadResponseEntity, error) - ExportFileToNode(nodeName, fileId, description, namedUser string) (NodeUploadResponseEntity, error) + UploadFileToNode(fileInfo FileInfo, nodeName, description, namedUser string) (NodeUploadResponseEntity, error) + ExportFileToNode(fileInfo FileInfo, nodeName, description, namedUser string) (NodeUploadResponseEntity, error) } type Options struct { @@ -339,20 +338,21 @@ func UploadDescriptors(config Options, communicationInstance CommunicationInterf return nil } -func UploadFile(config Options, communicationInstance CommunicationInterface, utils TmsUtils) (string, error) { +func UploadFile(config Options, communicationInstance CommunicationInterface, utils TmsUtils) (FileInfo, error) { + var fileInfo FileInfo + mtaPath := config.MtaPath exists, _ := utils.FileExists(mtaPath) if !exists { log.SetErrorCategory(log.ErrorConfiguration) - return "", fmt.Errorf("mta file %s not found", mtaPath) + return fileInfo, fmt.Errorf("mta file %s not found", mtaPath) } fileInfo, errUploadFile := communicationInstance.UploadFile(mtaPath, config.NamedUser) if errUploadFile != nil { log.SetErrorCategory(log.ErrorService) - return "", fmt.Errorf("failed to upload file: %w", errUploadFile) + return fileInfo, fmt.Errorf("failed to upload file: %w", errUploadFile) } - fileId := strconv.FormatInt(fileInfo.Id, 10) - return fileId, nil + return fileInfo, nil }