/// <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()); }
/// <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); }
/// <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; }