Exemplo n.º 1
0
        public async Task CanGetExistingFolderId()
        {
            var          config                = serviceProvider.GetRequiredService <IConfigurationStore>();
            var          dataOceanBaseUrl      = config.GetValueString("DATA_OCEAN_URL");
            var          dataOceanRootFolderId = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            const string folderName            = "unittest";
            var          expectedFolderResult  = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            var browseUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true&parent_id={dataOceanRootFolderId}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock.Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedBrowseResult));

            serviceCollection.AddTransient(g => gracefulMock.Object);
            var serviceProvider2 = serviceCollection.BuildServiceProvider();
            var client           = serviceProvider2.GetRequiredService <IDataOceanClient>();
            var Id = await client.GetFolderId($"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}", null);

            Assert.Equal(expectedFolderResult.Id, Id);
        }
Exemplo n.º 2
0
        public async Task CanGenerateGeoTiffTilesFailToCreateExecution()
        {
            //Set up DataOcean stuff
            var expectedTopFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = topLevelFolderName
            };
            var expectedFileResult = new DataOceanFile {
                Id = Guid.NewGuid(), Name = geoTiffFileName, ParentId = expectedTopFolderResult.Id
            };

            var subFolderPath = new DataOceanFileUtil(geoTiffFullName).GeneratedTilesFolder;

            var dataOceanMock = new Mock <IDataOceanClient>();

            dataOceanMock.Setup(d => d.GetFileId(geoTiffFullName, null)).ReturnsAsync(expectedFileResult.Id);
            dataOceanMock.Setup(d => d.MakeFolder(subFolderPath, null)).ReturnsAsync(true);
            dataOceanMock.Setup(d => d.GetFolderId($"{DataOceanUtil.PathSeparator}{topLevelFolderName}", null)).ReturnsAsync(expectedTopFolderResult.Id);

            //Set up Pegasus stuff
            var config             = serviceProvider.GetRequiredService <Common.Abstractions.Configuration.IConfigurationStore>();
            var pegasusBaseUrl     = config.GetValueString("PEGASUS_URL");
            var baseRoute          = "/api/executions";
            var createExecutionUrl = $"{pegasusBaseUrl}{baseRoute}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <PegasusExecutionResult>(createExecutionUrl, It.IsAny <MemoryStream>(), null, HttpMethod.Post, null, 0,
                                                                  false)).ReturnsAsync((PegasusExecutionResult)null);

            await ProcessWithFailure(gracefulMock, dataOceanMock,
                                     $"Failed to create execution for {geoTiffFullName}", false);
        }
Exemplo n.º 3
0
        private Task <TileMetadata> CanGenerateDxfTiles(string status)
        {
            //Set up DataOcean stuff
            var expectedTopFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = topLevelFolderName
            };
            var expectedDcFileResult = new DataOceanFile {
                Id = Guid.NewGuid(), Name = dcFileName, ParentId = expectedTopFolderResult.Id
            };
            var expectedDxfFileResult = new DataOceanFile {
                Id = Guid.NewGuid(), Name = dxfFileName, ParentId = expectedTopFolderResult.Id
            };

            var subFolderPath = new DataOceanFileUtil(dxfFullName).GeneratedTilesFolder;
            var parts         = subFolderPath.Split(DataOceanUtil.PathSeparator);
            var subFolderName = parts[parts.Length - 1];

            var dataOceanMock = new Mock <IDataOceanClient>();

            dataOceanMock.Setup(d => d.GetFileId(dcFullName, null)).ReturnsAsync(expectedDcFileResult.Id);
            dataOceanMock.Setup(d => d.GetFileId(dxfFullName, null)).ReturnsAsync(expectedDxfFileResult.Id);
            dataOceanMock.Setup(d => d.MakeFolder(subFolderPath, null)).ReturnsAsync(true);
            dataOceanMock.Setup(d => d.GetFolderId($"{DataOceanUtil.PathSeparator}{topLevelFolderName}", null)).ReturnsAsync(expectedTopFolderResult.Id);

            //Set up Pegasus stuff
            var units             = DxfUnitsType.UsSurveyFeet.ToString();
            var expectedExecution =
                NewDxfPegasusExecution(expectedDcFileResult, expectedDxfFileResult, subFolderName, units, status);
            var expectedExecutionResult = new PegasusExecutionResult {
                Execution = expectedExecution
            };
            var expectedExecutionAttemptResult = new PegasusExecutionAttemptResult
            {
                ExecutionAttempt = new PegasusExecutionAttempt {
                    Id = Guid.NewGuid(), Status = ExecutionStatus.EXECUTING
                }
            };

            var config             = serviceProvider.GetRequiredService <Common.Abstractions.Configuration.IConfigurationStore>();
            var pegasusBaseUrl     = config.GetValueString("PEGASUS_URL");
            var baseRoute          = "/api/executions";
            var createExecutionUrl = $"{pegasusBaseUrl}{baseRoute}";
            var startExecutionUrl  = $"{pegasusBaseUrl}{baseRoute}/{expectedExecution.Id}/start";
            var executionStatusUrl = $"{pegasusBaseUrl}{baseRoute}/{expectedExecution.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <PegasusExecutionResult>(createExecutionUrl, It.IsAny <MemoryStream>(), null, HttpMethod.Post, null, 0,
                                                                  false)).ReturnsAsync(expectedExecutionResult);
            gracefulMock
            .Setup(g => g.ExecuteRequest <PegasusExecutionAttemptResult>(startExecutionUrl, null, null, HttpMethod.Post, null, 0,
                                                                         false)).ReturnsAsync(expectedExecutionAttemptResult);
            gracefulMock
            .Setup(g => g.ExecuteRequest <PegasusExecutionResult>(executionStatusUrl, null, null, HttpMethod.Get, null, 0,
                                                                  false)).ReturnsAsync(expectedExecutionResult);

            return(ProcessWithSuccess(gracefulMock, dataOceanMock, subFolderPath, true));
        }
Exemplo n.º 4
0
        public async Task BadTileResponseNullHasNoCache()
        {
            var fileName               = $"{DataOceanUtil.PathSeparator}tiles{DataOceanUtil.PathSeparator}tiles.json";
            var downloadUrl            = TestConstants.DownloadUrl;
            var substitutedDownloadUrl = downloadUrl.Replace("{path}", fileName.Substring(1));

            var          config                = ServiceProvider.GetRequiredService <IConfigurationStore>();
            var          dataOceanBaseUrl      = config.GetValueString("DATA_OCEAN_URL");
            var          dataOceanRootFolderId = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            const string folderName            = "unittest";
            var          expectedFolderResult  = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedFolderBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            const string multiFileName            = "dummy.dxf_Tiles$";
            var          expectedFileBrowseResult = SetupExpectedMutipleFileVersionsResult(Guid.NewGuid(), multiFileName, expectedFolderResult.Id, downloadUrl);

            var browseFolderUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true&parent_id={dataOceanRootFolderId}";
            var browseFileUrl   = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={multiFileName}&owner=true&parent_id={expectedFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseFolderUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFolderBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequestAsStreamContent(substitutedDownloadUrl, HttpMethod.Get, null, null, null, 0, false))
            .ReturnsAsync((HttpContent)null);

            ServiceCollection.AddTransient(g => gracefulMock.Object);
            ServiceProvider = ServiceCollection.BuildServiceProvider();

            var client = ServiceProvider.GetRequiredService <IDataOceanClient>();

            client.GetTileCache().GetCache().CacheKeys.Count.Should().Be(0);

            var fullFileName = $"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}{DataOceanUtil.PathSeparator}{multiFileName}{fileName}";
            var resultStream = await client.GetFile(fullFileName, null);

            resultStream.Should().BeNull();
        }
Exemplo n.º 5
0
        public async Task CanGenerateGeoTiffTilesMissingGeoTiffFile()
        {
            var expectedTopFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = topLevelFolderName
            };

            _ = new DataOceanFile {
                Id = Guid.NewGuid(), Name = geoTiffFileName, ParentId = expectedTopFolderResult.Id
            };

            var dataOceanMock = new Mock <IDataOceanClient>();

            dataOceanMock.Setup(d => d.GetFileId(geoTiffFullName, null)).ReturnsAsync((Guid?)null);

            var gracefulMock = new Mock <IWebRequest>();

            await ProcessWithFailure(gracefulMock, dataOceanMock,
                                     $"Failed to find GeoTIFF file {geoTiffFullName}. Has it been uploaded successfully?", false);
        }
Exemplo n.º 6
0
        public async Task CanGenerateDxfTilesMissingDcFile()
        {
            var expectedTopFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = topLevelFolderName
            };
            var expectedDxfFileResult = new DataOceanFile {
                Id = Guid.NewGuid(), Name = dxfFileName, ParentId = expectedTopFolderResult.Id
            };

            var dataOceanMock = new Mock <IDataOceanClient>();

            dataOceanMock.Setup(d => d.GetFileId(dxfFullName, null)).ReturnsAsync(expectedDxfFileResult.Id);
            dataOceanMock.Setup(d => d.GetFileId(dcFullName, null)).ReturnsAsync((Guid?)null);

            var gracefulMock = new Mock <IWebRequest>();

            await ProcessWithFailure(gracefulMock, dataOceanMock,
                                     $"Failed to find coordinate system file {dcFullName}. Has it been uploaded successfully?", true);
        }
Exemplo n.º 7
0
        public async Task CanCreateTopLevelFolder()
        {
            var          config                = serviceProvider.GetRequiredService <IConfigurationStore>();
            var          dataOceanBaseUrl      = config.GetValueString("DATA_OCEAN_URL");
            var          dataOceanRootFolderId = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            const string folderName            = "unittest";
            var          expectedFolderResult  = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedBrowseResult = new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory>()
            };

            var browseUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true&parent_id={dataOceanRootFolderId}";
            var createUrl = $"{dataOceanBaseUrl}/api/directories";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock.Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <DataOceanDirectoryResult>(createUrl, It.IsAny <MemoryStream>(), null, HttpMethod.Post, null, 0,
                                                                    false)).ReturnsAsync(new DataOceanDirectoryResult {
                Directory = expectedFolderResult
            });

            serviceCollection.AddTransient(g => gracefulMock.Object);
            var serviceProvider2 = serviceCollection.BuildServiceProvider();
            var client           = serviceProvider2.GetRequiredService <IDataOceanClient>();
            var success          = await client.MakeFolder($"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}", null);

            Assert.True(success);

            //Check it also succeeds when the folder already exists
            expectedBrowseResult.Directories = new List <DataOceanDirectory> {
                expectedFolderResult
            };
            success = await client.MakeFolder($"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}", null);

            Assert.True(success);
        }
Exemplo n.º 8
0
        public async Task CanGetNonExistingSingleFile()
        {
            const string folderName           = "unittest";
            var          expectedFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName
            };
            var expectedFolderBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            const string fileName = "dummy.dxf";
            var          expectedFileBrowseResult = new BrowseFilesResult {
                Files = new List <DataOceanFile>()
            };

            var config           = serviceProvider.GetRequiredService <IConfigurationStore>();
            var dataOceanBaseUrl = config.GetValueString("DATA_OCEAN_URL");
            var browseFolderUrl  = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true";
            var browseFileUrl    = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={fileName}&owner=true&parent_id={expectedFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseFolderUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFolderBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));

            serviceCollection.AddTransient(g => gracefulMock.Object);
            var serviceProvider2 = serviceCollection.BuildServiceProvider();
            var client           = serviceProvider2.GetRequiredService <IDataOceanClient>();

            var resultStream = await client.GetFile($"{DataOceanUtil.PathSeparator}{folderName}{DataOceanUtil.PathSeparator}{fileName}", null);

            Assert.Null(resultStream);
        }
Exemplo n.º 9
0
        public async Task CanGetNonExistingMultiFile()
        {
            var fileName               = $"{DataOceanUtil.PathSeparator}tiles{DataOceanUtil.PathSeparator}15{DataOceanUtil.PathSeparator}18756{DataOceanUtil.PathSeparator}2834.png";
            var downloadUrl            = TestConstants.DownloadUrl;
            var substitutedDownloadUrl = downloadUrl.Replace("{path}", fileName.Substring(1));

            const string folderName           = "unittest";
            var          expectedFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName
            };
            var expectedFolderBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            const string multiFileName      = "dummy.dxf_Tiles$";
            var          expectedFileResult = new DataOceanFile
            {
                Id                = Guid.NewGuid(),
                Name              = multiFileName,
                ParentId          = expectedFolderResult.Id,
                Multifile         = true,
                RegionPreferences = new List <string> {
                    "us1"
                },
                Status            = "AVAILABLE",
                DataOceanDownload = new DataOceanTransfer {
                    Url = downloadUrl
                }
            };
            var expectedFileBrowseResult = new BrowseFilesResult {
                Files = new List <DataOceanFile> {
                    expectedFileResult
                }
            };

            var config           = serviceProvider.GetRequiredService <IConfigurationStore>();
            var dataOceanBaseUrl = config.GetValueString("DATA_OCEAN_URL");
            var browseFolderUrl  = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true";
            var browseFileUrl    = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={multiFileName}&owner=true&parent_id={expectedFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseFolderUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFolderBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequestAsStreamContent(substitutedDownloadUrl, HttpMethod.Get, null, null, null, 0, false))
            .ReturnsAsync((HttpContent)null);

            serviceCollection.AddTransient(g => gracefulMock.Object);
            var serviceProvider2 = serviceCollection.BuildServiceProvider();
            var client           = serviceProvider2.GetRequiredService <IDataOceanClient>();

            var fullFileName = $"{DataOceanUtil.PathSeparator}{folderName}{DataOceanUtil.PathSeparator}{multiFileName}{fileName}";
            var resultStream = await client.GetFile(fullFileName, null);

            Assert.Null(resultStream);
        }
Exemplo n.º 10
0
        public async Task CanGetExistingMultiFile()
        {
            var fileName               = $"{DataOceanUtil.PathSeparator}tiles{DataOceanUtil.PathSeparator}tiles.json";
            var downloadUrl            = TestConstants.DownloadUrl;
            var substitutedDownloadUrl = downloadUrl.Replace("{path}", fileName.Substring(1));
            var expectedResult         = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 };
            var stream = new MemoryStream(expectedResult);
            var expectedDownloadResult = new StreamContent(stream);

            var          config                = serviceProvider.GetRequiredService <IConfigurationStore>();
            var          dataOceanBaseUrl      = config.GetValueString("DATA_OCEAN_URL");
            var          dataOceanRootFolderId = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            const string folderName            = "unittest";
            var          expectedFolderResult  = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedFolderBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            const string multiFileName      = "dummy.dxf_Tiles$";
            var          fileUid            = Guid.NewGuid();
            var          updatedAt          = DateTime.UtcNow.AddHours(-2);
            var          expectedFileResult = new DataOceanFile
            {
                Id                = fileUid,
                Name              = multiFileName,
                ParentId          = expectedFolderResult.Id,
                Multifile         = true,
                RegionPreferences = new List <string> {
                    "us1"
                },
                Status            = "AVAILABLE",
                DataOceanDownload = new DataOceanTransfer {
                    Url = downloadUrl
                },
                UpdatedAt = updatedAt
            };
            var otherFileResult = new DataOceanFile
            {
                Id                = fileUid,
                Name              = multiFileName,
                ParentId          = expectedFolderResult.Id,
                Multifile         = true,
                RegionPreferences = new List <string> {
                    "us1"
                },
                Status            = "AVAILABLE",
                DataOceanDownload = new DataOceanTransfer {
                    Url = downloadUrl
                },
                UpdatedAt = updatedAt.AddHours(-5)
            };
            var expectedFileBrowseResult = new BrowseFilesResult {
                Files = new List <DataOceanFile> {
                    expectedFileResult, otherFileResult
                }
            };

            var browseFolderUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true&parent_id={dataOceanRootFolderId}";
            var browseFileUrl   = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={multiFileName}&owner=true&parent_id={expectedFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseFolderUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFolderBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequestAsStreamContent(substitutedDownloadUrl, HttpMethod.Get, null, null, null, 0, false))
            .ReturnsAsync(expectedDownloadResult);

            serviceCollection.AddTransient(g => gracefulMock.Object);
            var serviceProvider2 = serviceCollection.BuildServiceProvider();
            var client           = serviceProvider2.GetRequiredService <IDataOceanClient>();

            var fullFileName = $"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}{DataOceanUtil.PathSeparator}{multiFileName}{fileName}";
            var resultStream = await client.GetFile(fullFileName, null);

            using (var ms = new MemoryStream())
            {
                resultStream.CopyTo(ms);
                var result = ms.ToArray();
                Assert.Equal(expectedResult, result);
            }
        }
Exemplo n.º 11
0
        /// <summary>
        /// Gets the lowest level folder metadata in the path. Creates it unless it this is purely a query and therefore must exist.
        ///       //NOTE: DataOcean requires / regardless of OS. However we construct the path and split using DataOceanUtil.PathSeparator.
        ///   This is merely a convenience as DataOcean doesn't use paths but a hierarchy of folders above the file, linked using parent_id.
        ///   We traverse this hierarchy. The only place it matters is the multi-file structure for tiles. This is contained in the multi-file
        ///   download url so we don't have to worry about it.
        /// </summary>
        private async Task <DataOceanDirectory> GetFolderMetadata(string path, bool mustExist, IHeaderDictionary customHeaders)
        {
            _log.LogDebug($"{nameof(GetFolderMetadata)}: path: {path}, mustExist: {mustExist}");

            // part1 is dataOcean root folder, 1 more level is required
            var parts = path.Split(DataOceanUtil.PathSeparator);

            parts = parts.Where(p => !string.IsNullOrEmpty(p)).ToArray();
            if (parts.Length < 2)
            {
                _log.LogError($"{nameof(GetFolderMetadata)} Not enough parts in folder path. path {path}");
                return(null);
            }

            DataOceanDirectory folder = null;
            var parentId     = parts[0];
            var creatingPath = false;
            var currentDataOceanFolderPath = _dataOceanFolderCache.GetRootFolder(parentId);

            if (currentDataOceanFolderPath == null)
            {
                _log.LogError($"{nameof(GetFolderMetadata)} Unable to retrieve root cache. dataOceanRootFolderId {parts[0]}");
                return(null);
            }

            for (var i = 1; i < parts.Length; i++)
            {
                if (currentDataOceanFolderPath.Nodes.TryGetValue(parts[i], out var retrievedCurrentDataOceanFolderPath))
                {
                    currentDataOceanFolderPath = retrievedCurrentDataOceanFolderPath;
                    folder = new DataOceanDirectory()
                    {
                        Id = Guid.Parse(currentDataOceanFolderPath.DataOceanFolderId), Name = parts[i], ParentId = Guid.Parse(parentId)
                    };
                    _log.LogDebug($"{nameof(GetFolderMetadata)}: found cached folder. parts[i]: {parts[i]}, Id: {currentDataOceanFolderPath.DataOceanFolderId}, ParentId: {parentId}");
                    parentId = currentDataOceanFolderPath.DataOceanFolderId;
                }
                else
                {
                    int?directoriesCount = 0;
                    if (!creatingPath)
                    {
                        var result = await BrowseFolder(parts[i], Guid.Parse(parentId), customHeaders);

                        directoriesCount = result?.Directories?.Count;

                        if (directoriesCount == 1)
                        {
                            folder   = result.Directories[0];
                            parentId = folder.Id.ToString();
                            currentDataOceanFolderPath = currentDataOceanFolderPath.CreateNode(parentId, parts[i]);
                            _log.LogDebug($"{nameof(GetFolderMetadata)}: create cache for existing folder. parts[i]: {parts[i]}, Id: {currentDataOceanFolderPath.DataOceanFolderId}");
                        }
                    }

                    if (directoriesCount == 0)
                    {
                        if (mustExist)
                        {
                            return(null);
                        }

                        folder   = (await CreateDirectory(parts[i], Guid.Parse(parentId), customHeaders)).Directory;
                        parentId = folder.Id.ToString();
                        currentDataOceanFolderPath = currentDataOceanFolderPath.CreateNode(parentId, parts[i]);
                        _log.LogDebug($"{nameof(GetFolderMetadata)}: create cache for created folder. parts[i]: {parts[i]}, Id: {currentDataOceanFolderPath.DataOceanFolderId}, ParentId: {parentId}");
                        creatingPath = true;
                    }
                    else if (directoriesCount > 1)
                    {
                        _log.LogWarning($"{nameof(GetFolderMetadata)} Duplicate folders {parts[i]} in path {path}");
                        return(null);
                    }
                }
            }

            //Folders in path already exist or have been created successfully
            return(folder);
        }
Exemplo n.º 12
0
        public async Task GoodTileNoCache()
        {
            var fileName               = $"{DataOceanUtil.PathSeparator}tiles{DataOceanUtil.PathSeparator}tiles.json";
            var downloadUrl            = TestConstants.DownloadUrl;
            var substitutedDownloadUrl = downloadUrl.Replace("{path}", fileName.Substring(1));
            var expectedResult         = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3 };
            var stream = new MemoryStream(expectedResult);
            var expectedDownloadResult = new StreamContent(stream);

            var          config                = ServiceProvider.GetRequiredService <IConfigurationStore>();
            var          dataOceanBaseUrl      = config.GetValueString("DATA_OCEAN_URL");
            var          dataOceanRootFolderId = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            const string folderName            = "unittest";
            var          expectedFolderResult  = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = folderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedFolderBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedFolderResult
                }
            };

            const string multiFileName            = "dummy.dxf_Tiles$";
            var          expectedFileBrowseResult = SetupExpectedMutipleFileVersionsResult(Guid.NewGuid(), multiFileName, expectedFolderResult.Id, downloadUrl);

            var browseFolderUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={folderName}&owner=true&parent_id={dataOceanRootFolderId}";
            var browseFileUrl   = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={multiFileName}&owner=true&parent_id={expectedFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseFolderUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFolderBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequestAsStreamContent(substitutedDownloadUrl, HttpMethod.Get, null, null, null, 0, false))
            .ReturnsAsync(expectedDownloadResult);

            ServiceCollection.AddTransient(g => gracefulMock.Object);
            ServiceProvider = ServiceCollection.BuildServiceProvider();

            var client = ServiceProvider.GetRequiredService <IDataOceanClient>();

            client.GetTileCache().GetCache().CacheKeys.Count.Should().Be(0);

            var fullFileName = $"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{folderName}{DataOceanUtil.PathSeparator}{multiFileName}{fileName}";
            var resultStream = await client.GetFile(fullFileName, null);

            resultStream.Should().NotBeNull();

            client.GetTileCache().GetCache().CacheKeys.Count.Should().Be(0);

            // Generate an event, that will trigger a call to project repo for the file
            var rasterTileNotificationParameters = new RasterTileNotificationParameters {
                FileUid = Guid.Parse("ED279023-6A51-45B7-B4D0-2A5BF1ECA60C")
            };
            var notificationHub = ServiceProvider.GetService <INotificationHubClient>() as NotificationHubClient;

            Assert.NotNull(notificationHub);
            var tasks = notificationHub.ProcessNotificationAsTasks(new ProjectFileRasterTilesGeneratedNotification(rasterTileNotificationParameters));

            Task.WaitAll(tasks.ToArray());

            client.GetTileCache().GetCache().CacheKeys.Count.Should().Be(0);
        }
Exemplo n.º 13
0
        public async Task FileUpdateNotificationClearTileCache()
        {
            var fileUid                = Guid.NewGuid();
            var multiFileName          = $"{fileUid}_Tiles$";
            var tileIdentifier         = $"tiles{DataOceanUtil.PathSeparator}xyz{DataOceanUtil.PathSeparator}21{DataOceanUtil.PathSeparator}822028{DataOceanUtil.PathSeparator}378508.png";
            var tileDetail             = $"{multiFileName}{DataOceanUtil.PathSeparator}{tileIdentifier}";
            var downloadUrl            = TestConstants.DownloadUrl;
            var substitutedDownloadUrl = downloadUrl.Replace("{path}", tileIdentifier);

            var config                       = ServiceProvider.GetRequiredService <IConfigurationStore>();
            var dataOceanBaseUrl             = config.GetValueString("DATA_OCEAN_URL");
            var dataOceanRootFolderId        = config.GetValueString("DATA_OCEAN_ROOT_FOLDER_ID");
            var customerFolderName           = "customerFolderName";
            var projectFolderName            = "projectFolderName";
            var expectedCustomerFolderResult = new DataOceanDirectory {
                Id = Guid.NewGuid(), Name = customerFolderName, ParentId = Guid.Parse(dataOceanRootFolderId)
            };
            var expectedCustomerBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedCustomerFolderResult
                }
            };
            var expectedProjectFolderResult = new DataOceanDirectory
            {
                Id       = Guid.NewGuid(),
                Name     = projectFolderName,
                ParentId = expectedCustomerFolderResult.Id
            };
            var expectedProjectBrowseResult =
                new BrowseDirectoriesResult {
                Directories = new List <DataOceanDirectory> {
                    expectedProjectFolderResult
                }
            };

            var browseCustomerUrl = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={customerFolderName}&owner=true&parent_id={dataOceanRootFolderId}";
            var browseProjectUrl  = $"{dataOceanBaseUrl}/api/browse/keyset_directories?name={projectFolderName}&owner=true&parent_id={expectedCustomerFolderResult.Id}";

            var expectedFileBrowseResult = SetupExpectedSingleFileVersionResult(fileUid, multiFileName, expectedProjectFolderResult.Id, downloadUrl);

            // got this "http://nowhere.in.particular/api/browse/keyset_files?name=f68e8360-eefb-4269-b456-37aa0a3f86b5_Tiles$&owner=true&parent_id=b39967e6-5733-4f8b-9d0c-31bfbad5c2c9"
            var browseFileUrl = $"{dataOceanBaseUrl}/api/browse/keyset_files?name={multiFileName}&owner=true&parent_id={expectedProjectFolderResult.Id}";

            var gracefulMock = new Mock <IWebRequest>();

            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseCustomerUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedCustomerBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseDirectoriesResult>(browseProjectUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedProjectBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequest <BrowseFilesResult>(browseFileUrl, null, null, HttpMethod.Get, null, 0, false))
            .Returns(Task.FromResult(expectedFileBrowseResult));
            gracefulMock
            .Setup(g => g.ExecuteRequestAsStreamContent(substitutedDownloadUrl, HttpMethod.Get, null, null, null, 0, false))
            .ThrowsAsync(new HttpRequestException(HttpStatusCode.Forbidden.ToString()));
            ServiceCollection.AddTransient(g => gracefulMock.Object);
            ServiceProvider = ServiceCollection.BuildServiceProvider();

            var client = ServiceProvider.GetRequiredService <IDataOceanClient>();

            (await client.GetTileCache().IsTileKnownToBeMissing(tileDetail)).Should().BeFalse();

            // "/a3f51fdf-69e4-4d80-b734-e72e4f9b36d9/customerFolderName/projectFolderName/cb44d207-0bec-46ad-8bb3-4388137eae53_Tiles$/tiles/xyz/21/822028/378508.png"
            var fullFileName = $"{DataOceanUtil.PathSeparator}{dataOceanRootFolderId}{DataOceanUtil.PathSeparator}{customerFolderName}{DataOceanUtil.PathSeparator}{projectFolderName}{DataOceanUtil.PathSeparator}{tileDetail}";
            var resultStream = await client.GetFile(fullFileName, null);

            resultStream.Should().BeNull();
            (await client.GetTileCache().IsTileKnownToBeMissing(tileDetail)).Should().BeTrue();

            // Generate an event, that will trigger a call to DataOceanClient for the file
            var rasterTileNotificationParameters = new RasterTileNotificationParameters {
                FileUid = fileUid
            };
            var notificationHub = ServiceProvider.GetService <INotificationHubClient>() as NotificationHubClient;
            var tasks           = notificationHub.ProcessNotificationAsTasks(new ProjectFileRasterTilesGeneratedNotification(rasterTileNotificationParameters));

            Task.WaitAll(tasks.ToArray());

            (await client.GetTileCache().IsTileKnownToBeMissing(tileDetail)).Should().BeFalse();
        }