Esempio n. 1
0
        public async Task <IActionResult> GetResourceByNode([FromServices] INodeRepository nodeRepository)
        {
            var nodes     = nodeRepository.GetAll();
            var nodeInfos = (await clusterManagementLogic.GetAllNodesAsync())?.ToList(); //Removeできるように、Listにしておく

            if (nodeInfos == null)
            {
                return(JsonError(HttpStatusCode.ServiceUnavailable, string.Join("\n", "Fetching nodes is failed.")));
            }
            var result = new Dictionary <string, NodeResourceOutputModel>();

            //DBから探索
            foreach (var node in nodes)
            {
                var info = nodeInfos.FirstOrDefault(i => i.Name == node.Name);
                if (info == null)
                {
                    result.Add(node.Name, new NodeResourceOutputModel(node));
                }
                else
                {
                    result.Add(node.Name, new NodeResourceOutputModel(node, info));
                    nodeInfos.Remove(info);
                }
            }
            //k8sにしかないノードを追加
            foreach (var info in nodeInfos)
            {
                result.Add(info.Name, new NodeResourceOutputModel(info));
            }

            var response = await clusterManagementLogic.GetAllContainerDetailsInfosAsync();

            if (response.IsSuccess)
            {
                foreach (var container in response.Value)
                {
                    if (string.IsNullOrEmpty(container.NodeName))
                    {
                        //ノード名がNULL=まだ未割当
                        if (result.ContainsKey("*Unassigned*") == false)
                        {
                            result.Add("*Unassigned*", new NodeResourceOutputModel());
                        }
                        result["*Unassigned*"].Add(CreateContainerDetailsOutputModel(container));
                    }
                    else if (result.ContainsKey(container.NodeName))
                    {
                        result[container.NodeName].Add(CreateContainerDetailsOutputModel(container));
                    }
                    else
                    {
                        //nodeInfoから必要な情報を取って、結果に含める
                        var nodeInfo = nodeInfos.Find(n => n.Name == container.NodeName);
                        if (nodeInfo == null)
                        {
                            //ノード一覧にないコンテナなので、あり得ない。ログだけ出して、無視。
                            JsonError(HttpStatusCode.ServiceUnavailable, $"The container {container.Name} is in the unknown node {container.NodeName}.");
                            continue;
                        }
                        var model = new NodeResourceOutputModel(nodeInfo);
                        model.Add(CreateContainerDetailsOutputModel(container));
                        result.Add(container.NodeName, model);
                    }
                }
                return(JsonOK(result.Values));
            }
            else
            {
                return(JsonError(HttpStatusCode.ServiceUnavailable, string.Join("\n", "Fetching container resource is failed.", response.Error)));
            }
        }
Esempio n. 2
0
        public async Task <IActionResult> SyncNodeFromCluster(
            [FromServices] Microsoft.Extensions.Options.IOptions <ContainerManageOptions> options)
        {
            //Cluster側の情報を取得
            var clusterNodes = (await clusterManagementLogic.GetAllNodesAsync())?.ToList();

            if (clusterNodes == null)
            {
                return(JsonConflict($"Failed to access cluster system. Please contact your server administrator."));
            }

            //DB側の情報を取得
            var registeredNodes = nodeRepository.GetAll();

            //まずはDBベースで突合
            foreach (Node registeredNode in registeredNodes)
            {
                NodeInfo nodeInfo = clusterNodes.FirstOrDefault(n => n.Name == registeredNode.Name);
                if (nodeInfo == null)
                {
                    //DBにあるノードがクラスタにない=取り外されている
                    if (registeredNode.AccessLevel != NodeAccessLevel.Disabled)
                    {
                        registeredNode.AccessLevel = NodeAccessLevel.Disabled;
                    }
                }
                else
                {
                    //DBにもk8sにもノードがある
                    //ラベル情報だけ同期させる

                    //パーティション
                    string partition = null;
                    if (nodeInfo.Labels.ContainsKey(options.Value.ContainerLabelPartition))
                    {
                        partition = nodeInfo.Labels[options.Value.ContainerLabelPartition];
                    }
                    if (registeredNode.Partition != partition)
                    {
                        registeredNode.Partition = partition;
                    }

                    //TensorBoard
                    if (nodeInfo.Labels.ContainsKey(options.Value.ContainerLabelTensorBoardEnabled) &&
                        nodeInfo.Labels[options.Value.ContainerLabelTensorBoardEnabled] == "true")
                    {
                        //k8s側にTensorBoard実行可のラベルがある
                        if (registeredNode.TensorBoardEnabled == false)
                        {
                            registeredNode.TensorBoardEnabled = true;
                        }
                    }
                    else
                    {
                        //k8s側にTensorBard実行可のラベルがない
                        if (registeredNode.TensorBoardEnabled)
                        {
                            registeredNode.TensorBoardEnabled = false;
                        }
                    }

                    //Notebook
                    if (nodeInfo.Labels.ContainsKey(options.Value.ContainerLabelNotebookEnabled) &&
                        nodeInfo.Labels[options.Value.ContainerLabelNotebookEnabled] == "true")
                    {
                        //k8s側にNotebook実行可のラベルがある
                        if (registeredNode.NotebookEnabled == false)
                        {
                            registeredNode.NotebookEnabled = true;
                        }
                    }
                    else
                    {
                        //k8s側にNotebook実行可のラベルがない
                        if (registeredNode.NotebookEnabled)
                        {
                            registeredNode.NotebookEnabled = false;
                        }
                    }
                    //リストから除外
                    clusterNodes.Remove(nodeInfo);
                }
            }

            //残っているもの(=DBにないもの)を登録する
            foreach (var clusterNode in clusterNodes)
            {
                //知らないノードがクラスタに登録されている=追加する
                Node newNode = new Node()
                {
                    Name        = clusterNode.Name,
                    AccessLevel = NodeAccessLevel.Disabled,
                    Memo        = $"Sync from cluster"
                };
                if (clusterNode.Labels.ContainsKey(options.Value.ContainerLabelPartition))
                {
                    newNode.Partition = clusterNode.Labels[options.Value.ContainerLabelPartition];
                }
                nodeRepository.Add(newNode);
            }
            unitOfWork.Commit();

            //更新結果を改めて取得
            var nodes = nodeRepository.GetAllWithOrderby(n => n.Name, true);

            return(JsonOK(nodes.Select(n => new IndexOutputModel(n))));
        }