diff --git a/client.go b/client.go index b3c73e5..9d9a957 100644 --- a/client.go +++ b/client.go @@ -127,6 +127,7 @@ type Client interface { UploadLicenseFile(metroCode, deviceTypeCode, deviceManagementMode, licenseMode, fileName string, reader io.Reader) (*string, error) UploadFile(metroCode, deviceTypeCode, processType, deviceManagementMode, licenseMode, fileName string, reader io.Reader) (*string, error) + GetFile(uuid string) (*File, error) GetDeviceLinkGroups() ([]DeviceLinkGroup, error) GetDeviceLinkGroup(uuid string) (*DeviceLinkGroup, error) @@ -458,3 +459,13 @@ type ClusterNode struct { // Deprecated: Use ClusterNodeDetail instead AdminPassword *string VendorConfiguration map[string]string } + +//File describes Network Edge uploaded file +type File struct { + UUID *string + FileName *string + MetroCode *string + DeviceTypeCode *string + ProcessType *string + Status *string +} diff --git a/internal/api/file.go b/internal/api/file.go index 327ba5a..91b51f2 100644 --- a/internal/api/file.go +++ b/internal/api/file.go @@ -1,5 +1,15 @@ package api +//File describes Network Edge uploaded file +type File struct { + UUID *string `json:"uuid,omitempty"` + FileName *string `json:"fileName,omitempty"` + MetroCode *string `json:"metroCode,omitempty"` + DeviceTypeCode *string `json:"deviceTypeCode,omitempty"` + ProcessType *string `json:"processType,omitempty"` + Status *string `json:"status,omitempty"` +} + //FileUploadResponse describes response to file upload request type FileUploadResponse struct { FileUUID *string `json:"fileUuid,omitempty"` diff --git a/rest_file.go b/rest_file.go index 5a1ba2c..ceed775 100644 --- a/rest_file.go +++ b/rest_file.go @@ -4,6 +4,7 @@ import ( "github.com/equinix/ne-go/internal/api" "io" "net/http" + "net/url" ) const ( @@ -34,3 +35,26 @@ func (c RestClient) UploadFile(metroCode, deviceTypeCode, processType, deviceMan } return respBody.FileUUID, nil } + +//GetFile retrieves file metadata with a given UUID +func (c RestClient) GetFile(uuid string) (*File, error) { + path := "/ne/v1/files/" + url.PathEscape(uuid) + respBody := api.File{} + req := c.R().SetResult(&respBody) + if err := c.Execute(req, http.MethodGet, path); err != nil { + return nil, err + } + file := mapFileAPIToDomain(respBody) + return &file, nil +} + +func mapFileAPIToDomain(apiFile api.File) File { + return File{ + UUID: apiFile.UUID, + FileName: apiFile.FileName, + MetroCode: apiFile.MetroCode, + DeviceTypeCode: apiFile.DeviceTypeCode, + ProcessType: apiFile.ProcessType, + Status: apiFile.Status, + } +} diff --git a/rest_file_test.go b/rest_file_test.go index 7d34d50..a29761b 100644 --- a/rest_file_test.go +++ b/rest_file_test.go @@ -55,3 +55,32 @@ func TestUploadFile(t *testing.T) { assert.Nil(t, err, "Error is not returned") assert.Equal(t, resp.FileUUID, id, "File identifier matches") } + +func TestGetFile(t *testing.T) { + //given + resp := api.File{} + if err := readJSONData("./test-fixtures/ne_file_get_resp.json", &resp); err != nil { + assert.Fail(t, "Cannot read test response") + } + fileID := "26728391-2706-4135-87f2-19822bcb4721" + testHc := setupMockedClient("GET", fmt.Sprintf("%s/ne/v1/files/%s", baseURL, fileID), 200, resp) + defer httpmock.DeactivateAndReset() + + //when + c := NewClient(context.Background(), baseURL, testHc) + file, err := c.GetFile(fileID) + + //then + assert.NotNil(t, file, "Returned file is not nil") + assert.Nil(t, err, "Error is not returned") + verifyFile(t, resp, *file) +} + +func verifyFile(t *testing.T, apiFile api.File, file File) { + assert.Equal(t, apiFile.UUID, file.UUID, "UUID matches") + assert.Equal(t, apiFile.FileName, file.FileName, "FileName matches") + assert.Equal(t, apiFile.MetroCode, file.MetroCode, "MetroCode matches") + assert.Equal(t, apiFile.DeviceTypeCode, file.DeviceTypeCode, "DeviceTypeCode matches") + assert.Equal(t, apiFile.ProcessType, file.ProcessType, "ProcessType matches") + assert.Equal(t, apiFile.Status, file.Status, "Status matches") +} diff --git a/test-fixtures/ne_file_get_resp.json b/test-fixtures/ne_file_get_resp.json new file mode 100644 index 0000000..d70383f --- /dev/null +++ b/test-fixtures/ne_file_get_resp.json @@ -0,0 +1,8 @@ +{ + "uuid": "26728391-2706-4135-87f2-19822bcb4721", + "fileName": "test", + "metroCode": "SV", + "deviceTypeCode": "AVIATRIX_EDGE", + "processType": "CLOUD_INIT", + "status": "UPLOADED" +}