예제 #1
0
        /// <summary>
        /// 指定されたIDのデータを削除する。
        /// まずDBのレコードを削除して、その後オブジェクトストレージから上記のデータを削除する。
        /// コミットは行わないので、呼び出し側で実行すること。(基本的には結果に関わらずコミットする)
        /// </summary>
        /// <param name="dataId">データID</param>
        public async Task <bool> DeleteDataAsync(long dataId)
        {
            var dataSetRepository = CommonDiLogic.DynamicDi <IDataSetRepository>();

            // データセットエントリを削除
            dataSetRepository.RemoveDataFromDataSet(dataId);

            // データとファイルを削除
            var data = await dataRepository.GetDataIncludeAllAsync(dataId);

            dataRepository.DeleteData(data);

            foreach (var file in data.DataProperties)
            {
                if (file.DataFile != null)
                {
                    await storageLogic.AddFileToDeleteListAsync(ResourceType.Data, file.DataFile.StoredPath);
                }
            }

            // タグマップを削除
            tagLogic.Delete(dataId);

            // オブジェクトストレージからファイルを削除
            return(await storageLogic.DeleteFilesInDeleteListAsync());
        }
예제 #2
0
 /// <summary>
 /// 現在のテナントに紐付くGitサービスインスタンスを取得する
 /// </summary>
 private IGitService GetGitService(Git git)
 {
     if (git != null)
     {
         if (git.ServiceType == GitServiceType.GitLab)
         {
             return(CommonDiLogic.DynamicDi <GitLabService>());
         }
         else if (git.ServiceType == GitServiceType.GitHub)
         {
             return(CommonDiLogic.DynamicDi <GitHubService>());
         }
     }
     return(null);
 }
예제 #3
0
 /// <summary>
 /// 現在のテナントに紐付くレジストリ情報を取得する
 /// </summary>
 /// <returns></returns>
 private IRegistryService GetRegistryService(Registry registry)
 {
     if (registry != null)
     {
         if (registry.ServiceType == RegistryServiceType.DockerHub)
         {
             return(CommonDiLogic.DynamicDi <DockerHubRegistryService>());
         }
         else if (registry.ServiceType == RegistryServiceType.GitLab)
         {
             return(CommonDiLogic.DynamicDi <GitLabRegistryService>());
         }
         else if (registry.ServiceType == RegistryServiceType.PrivateDockerRegistry)
         {
             return(CommonDiLogic.DynamicDi <PrivateDockerRegistryService>());
         }
     }
     return(null);
 }
        /// <summary>
        /// ブラウザとのWebSocket接続および、KubernetesとのWebSocket接続を確立する。
        /// そしてブラウザからのメッセージを待機し、メッセージを受信した際にはその内容をKubernetesに送信する。
        /// </summary>
        public async Task ConnectKubernetesWebSocketAsync(HttpContext context)
        {
            // ブラウザとのWebSocket接続を確立
            WebSocket browserWebSocket = await context.WebSockets.AcceptWebSocketAsync();


            // リクエストから、job名、tenant名を取得
            string jobName    = context.Request.Query["jobName"];
            string tenantName = context.Request.Query["tenantName"];

            var containerOptions = CommonDiLogic.DynamicDi <IOptions <ContainerManageOptions> >();
            var token            = containerOptions.Value.ResourceManageKey; // 全テナントにアクセス可能な状態。CurrentUserInfoがnullであるため(Claim情報が無いため)、GetUserAccessTokenAsync()が使えない

            // KubernetesとのWebSocket接続を確立
            var kubernetesService = CommonDiLogic.DynamicDi <Services.Interfaces.IClusterManagementService>();
            var result            = await kubernetesService.ConnectWebSocketAsync(jobName, tenantName, token);

            // 確立に失敗した場合は、ブラウザとの接続を切断
            if (result.Error != null)
            {
                var buff = new List <byte>(System.Text.Encoding.ASCII.GetBytes("\"" + jobName + "\" not found.\r\nConnection Closed."));
                await browserWebSocket.SendAsync(buff.ToArray(), WebSocketMessageType.Text, true, CancellationToken.None);

                await browserWebSocket.CloseOutputAsync(WebSocketCloseStatus.InternalServerError, "Kubernetes error", CancellationToken.None);;
                return;
            }
            ClientWebSocket kubernetesWebSocket = result.Value;

            // Kubernetesの情報を中継する処理を、別スレッドで起動。
            var task = CommunicateKubernetesAsync(kubernetesWebSocket, browserWebSocket);

            // ブラウザからの入力を中継
            while (browserWebSocket.State == WebSocketState.Open)
            {
                try
                {
                    // ブラウザからメッセージ待受(通常入力時は、ブラウザ上コンソールから1文字単位で送られてくる。ペーストした場合は一度に複数文字送られてくる)
                    var buff = new ArraySegment <byte>(new byte[1024]);
                    var ret  = await browserWebSocket.ReceiveAsync(buff, System.Threading.CancellationToken.None);

                    var sendK8sBuffer = new List <byte>();
                    sendK8sBuffer.Insert(0, 0); // stdin prefix(0x00)を追加

                    for (int i = 0; i < ret.Count; i++)
                    {
                        sendK8sBuffer.Add(buff[i]);
                    }
                    await kubernetesWebSocket.SendAsync(sendK8sBuffer.ToArray(), WebSocketMessageType.Binary, true, CancellationToken.None);
                }
                catch
                {
                    // ブラウザが異常終了した場合、Kubernetes側との接続が切れた場合
                    browserWebSocket.Dispose();
                    kubernetesWebSocket.Dispose();
                    return;
                }
            }

            // ブラウザが、切断要求を行った場合、
            await browserWebSocket.CloseOutputAsync(browserWebSocket.CloseStatus.Value, browserWebSocket.CloseStatusDescription, CancellationToken.None);

            await kubernetesWebSocket.CloseOutputAsync(browserWebSocket.CloseStatus.Value, browserWebSocket.CloseStatusDescription, CancellationToken.None);

            browserWebSocket.Dispose();
            kubernetesWebSocket.Dispose();
            return;
        }