예제 #1
0
 private async Task ProcessStateAsync(Cluster cluster, k8s.Models.V1NodeList clusterNodes)
 {
     try
     {
         foreach (var clusterNode in clusterNodes.Items)
         {
             logger.LogInformation($"Node => {JsonSerializer.Serialize(clusterNode)}");
             if (clusterNode.Metadata.Name.Contains("master"))
             {
                 cluster.State = clusterNode.Status.Conditions.FirstOrDefault(c => c.Reason == "KubeletReady")?.Type;
                 var _ = await clusterRepository.UpdateAsync(cluster);
             }
             else
             {
                 var node = cluster.Nodes.FirstOrDefault(n => n.Name == clusterNode.Metadata.Name);
                 if (node != null)
                 {
                     node.State = clusterNode.Status.Conditions.FirstOrDefault(c => c.Reason == "KubeletReady")?.Type;
                     var __ = await clusterNodeRepository.UpdateAsync(node);
                 }
             }
         }
     }
     catch (Exception e)
     {
         logger.LogError(e, "Error on processing state");
     }
 }
예제 #2
0
        public async Task StartQueueListener()
        {
            await queueService.OnQueueMessageInit(async (message) =>
            {
                logger.LogInformation(message);

                var clusterResult = JsonSerializer.Deserialize <ClusterCreationResultMessage>(message);
                var cluster       = await clusterRepository.ReadAsync(c => c.OrderId == clusterResult.Data.OrderId);

                if (cluster != null && clusterResult.Pattern == "success")
                {
                    cluster.KubeConfig     = clusterResult.Data.KubeConfig.Replace($"server: https://{cluster.Ip}:6443", $"server: https://{cluster.Name}.{cluster.Domain}:6443");
                    cluster.KubeConfigJson = clusterResult.Data.KubeConfigAsJson;

                    if ((await clusterRepository.UpdateAsync(cluster)) > 0)
                    {
                        await hubContext.Clients.All.NotificationReceived("Cluster ready", "Cluster created and ready to use.", "success");
                    }
                }
            });

            await queueService.OnQueueDeleteMessageInit(async (message) =>
            {
                logger.LogInformation(message);

                var cluster = JsonSerializer.Deserialize <Cluster>(message);
                await StartCleanClusterQueueListener(cluster);
            });
        }
예제 #3
0
        public async Task <(bool found, bool update)> DeleteClusterAsync(string id)
        {
            var cluster = await clusterRepository.ReadAsync(c => c.Id == id);

            if (cluster == null)
            {
                return(false, false);
            }

            cluster.DeleteAt = DateTime.UtcNow;

            if ((await clusterRepository.UpdateAsync(cluster)) > 0)
            {
                await traefikRouterService.DeleteClusterRules(cluster);

                var selectedSshKey = await sshKeyRepository.ReadAsync(cluster.SshKeyId);

                var selectedNode = await datacenterRepository.ReadAsync(f => f.Id == cluster.ProxmoxNodeId);

                var nodes = await clusterNodeRepository.ReadsAsync(c => c.ClusterId == cluster.Id && c.DeleteAt == null);

                var qemuClient = new QemuClient();

                foreach (var node in nodes)
                {
                    node.DeleteAt = DateTime.UtcNow;
                    await clusterNodeRepository.UpdateAsync(node);
                }

                var message = GenerateDeleteQueueMessage(cluster, selectedSshKey, selectedNode, int.Parse(cluster.Ip.Split(".").Last()), cluster.ProxmoxNodeId);

                queueService.QueueClusterDelete(message);

                return(true, true);
            }

            return(true, false);
        }