Exemplo n.º 1
0
        public async Task <IActionResult> RunTensorBoard(long id, [FromBody] TensorBoardInputModel model)
        {
            //データの存在チェック
            var trainingHistory = await trainingHistoryRepository.GetByIdAsync(id);

            if (trainingHistory == null)
            {
                return(JsonNotFound($"Training ID {id} is not found."));
            }

            //学習履歴IDとテナントIDが等しく、Disable状態じゃないコンテナを取得する
            TensorBoardContainer container = tensorBoardContainerRepository.GetAvailableContainer(id);

            // 当該レコードが存在する場合、時間差で他の人が立てたとみなし、何もしない
            if (container != null)
            {
                var status = ContainerStatus.Convert(container.Status);
                return(JsonOK(new TensorBoardOutputModel(container, status, containerOptions.WebEndPoint)));
            }

            // コンテナ生存期間
            int expiresIn = 0; // 無期限だが、DeleteTensorBoardContainerTimerの動作タイミングで削除する

            if (model.ExpiresIn.HasValue)
            {
                // 値が存在する場合、その期間起動させる
                expiresIn = model.ExpiresIn.Value;
            }

            //新規にTensorBoardコンテナを起動する。
            var result = await clusterManagementLogic.RunTensorBoardContainerAsync(trainingHistory, expiresIn, model.selectedHistoryIds);

            if (result == null || result.Status.Succeed() == false)
            {
                //起動に失敗した場合、ステータス Failed で返す。
                return(JsonError(HttpStatusCode.ServiceUnavailable, $"Failed to run tensorboard container: {result.Status}"));
            }

            container = new TensorBoardContainer()
            {
                Name                         = result.Name,
                StartedAt                    = DateTime.Now,
                Status                       = result.Status.Name,
                TenantId                     = CurrentUserInfo.SelectedTenant.Id,
                TrainingHistoryId            = id,
                Host                         = result.Host,
                PortNo                       = result.Port,
                ExpiresIn                    = expiresIn,
                MountedTrainingHistoryIdList = model.selectedHistoryIds
            };

            // コンテナテーブルにInsertする
            tensorBoardContainerRepository.Add(container);

            unitOfWork.Commit();

            return(JsonOK(new TensorBoardOutputModel(container, result.Status, containerOptions.WebEndPoint)));
        }
Exemplo n.º 2
0
        public async Task <IActionResult> RunTensorBoard(long id, [FromServices] IOptions <ContainerManageOptions> options)
        {
            //データの存在チェック
            var trainingHistory = await trainingHistoryRepository.GetByIdAsync(id);

            if (trainingHistory == null)
            {
                return(JsonNotFound($"Training ID {id} is not found."));
            }

            //学習履歴IDとテナントIDが等しく、Disable状態じゃないコンテナを取得する
            TensorBoardContainer container = tensorBoardContainerRepository.GetAvailableContainer(id);

            // 当該レコードが存在する場合、時間差で他の人が立てたとみなし、何もしない
            if (container != null)
            {
                var status = ContainerStatus.Convert(container.Status);
                return(JsonOK(new TensorBoardOutputModel(container, status, options.Value.WebEndPoint)));
            }

            //新規にTensorBoardコンテナを起動する。
            var result = await clusterManagementLogic.RunTensorBoardContainerAsync(trainingHistory);

            if (result == null || result.Status.Succeed() == false)
            {
                //起動に失敗した場合、ステータス Failed で返す。
                return(JsonError(System.Net.HttpStatusCode.ServiceUnavailable, $"Failed to run tensorboard container: {result.Status}"));
            }

            container = new TensorBoardContainer()
            {
                Name              = result.Name,
                StartedAt         = DateTime.Now,
                Status            = result.Status.Name,
                TenantId          = CurrentUserInfo.SelectedTenant.Id,
                TrainingHistoryId = id,
                Host              = result.Host,
                PortNo            = result.Port
            };

            // コンテナテーブルにInsertする
            tensorBoardContainerRepository.Add(container);
            unitOfWork.Commit();

            return(JsonOK(new TensorBoardOutputModel(container, result.Status, options.Value.WebEndPoint)));
        }