Пример #1
0
        PatchDeploymentAsync(Kubernetes k8sClient, MTADeployModel patchModel)
        {
            var namespaceParams = PrepareNamespaceParams(_groupName);
            var deployParams    = PrepareDeployParams(_deployName);

            var existingDeployment = await k8sClient.ReadNamespacedDeploymentAsync
                                         (deployParams.Item1, namespaceParams);

            existingDeployment.Spec.Template.Spec.Containers[0].Image = patchModel.Image;

            existingDeployment.Spec.Template.Spec.Containers[0].ImagePullPolicy =
                patchModel.ImagePullPolicy;

            existingDeployment.Spec.Replicas = patchModel.Replicas;

            var container = existingDeployment.Spec.Template.Spec.Containers[0];

            container.Name = deployParams.Item3;

            if (patchModel.Env.Count > 0)
            {
                var v1EnvList = new List <V1EnvVar>();
                foreach (var env in patchModel.Env)
                {
                    var v1Env = new V1EnvVar(env["name"], env["value"]);
                    v1EnvList.Add(v1Env);
                }
                container.Env = v1EnvList;
            }

            if (patchModel.Ports.Count > 0)
            {
                var containerPorts = new List <V1ContainerPort>();
                foreach (var port in patchModel.Ports)
                {
                    var v1ContainerPort = new V1ContainerPort(port);
                    containerPorts.Add(v1ContainerPort);
                }
                container.Ports = containerPorts;
            }

            try
            {
                var v1Patch      = new V1Patch(existingDeployment, V1Patch.PatchType.MergePatch);
                var v1Deployment = await k8sClient.PatchNamespacedDeploymentAsync
                                       (v1Patch, deployParams.Item1, namespaceParams);

                var deployModel = new MTADeployModel(v1Deployment);
                return(new Tuple <MTADeployModel, MTAErrorModel>(deployModel, null));
            }
            catch (HttpOperationException ex)
            {
                var errorModel = new MTAErrorModel(ex);
                return(new Tuple <MTADeployModel, MTAErrorModel>(null, errorModel));
            }
            catch (Exception)
            {
                throw;
            }
        }
        private V1Pod Pod(string name)
        {
            V1Pod pod = new V1Pod();

            pod.Kind       = "Pod";
            pod.ApiVersion = "v1";
            pod.Metadata   = new V1ObjectMeta()
            {
                Name = name, Labels = new Dictionary <string, string>()
            };
            pod.Metadata.Labels.Add("run", name);

            pod.Spec = new V1PodSpec()
            {
                Containers = new List <V1Container>(),
            };
            var env1 = new V1EnvVar()
            {
                Name = "EULA", Value = "TRUE"
            };

            var port1 = new V1ContainerPort(25565);
            var port2 = new V1ContainerPort(25575);

            V1VolumeMount v1mount = new V1VolumeMount("/data", "volume");

            V1Container container = new V1Container()
            {
                Name         = name, Image = "openhack/minecraft-server:2.0",
                Env          = new List <V1EnvVar>(),
                Ports        = new List <V1ContainerPort>(),
                VolumeMounts = new List <V1VolumeMount>()
            };

            container.Ports.Add(port1);
            container.Ports.Add(port2);

            container.VolumeMounts.Add(v1mount);

            container.Env.Add(env1);
            pod.Spec.Containers.Add(container);

            V1Volume v1Volume = new V1Volume()
            {
                Name = "volume", PersistentVolumeClaim = new V1PersistentVolumeClaimVolumeSource()
                {
                    ClaimName = "volume-minecraft"
                }
            };

            pod.Spec.Volumes = new List <V1Volume>();
            pod.Spec.Volumes.Add(v1Volume);

            return(pod);
        }
Пример #3
0
        /// <summary>
        /// Removes the environment variable with the specified name
        /// </summary>
        /// <param name="config">The extended <see cref="V1Container"/></param>
        /// <param name="variable">The  environment variable to remove</param>
        /// <returns>A boolean indicating whether or not the specified environment variable has been removed</returns>
        public static bool RemoveEnvironmentVariable(this V1Container config, V1EnvVar variable)
        {
            if (config.Env == null)
            {
                return(false);
            }
            var existingVariable = config.Env.FirstOrDefault(e => e.Name.Equals(variable.Name, StringComparison.OrdinalIgnoreCase));

            if (existingVariable != null)
            {
                return(config.Env.Remove(existingVariable));
            }
            return(false);
        }
Пример #4
0
        /// <summary>
        /// Adds the specified environment variable
        /// </summary>
        /// <param name="config">The extended <see cref="V1Container"/></param>
        /// <param name="variable">The environment variable to set</param>
        public static void AddOrUpdateEnvironmentVariable(this V1Container config, V1EnvVar variable)
        {
            if (variable == null)
            {
                throw new ArgumentNullException(nameof(variable));
            }
            if (config.Env == null)
            {
                config.Env = new List <V1EnvVar>();
            }
            var existingVariable = config.Env.FirstOrDefault(e => e.Name.Equals(variable.Name, StringComparison.OrdinalIgnoreCase));

            if (existingVariable != null)
            {
                config.Env.Remove(existingVariable);
            }
            config.Env.Add(variable);
        }
Пример #5
0
        CreateDeploymentAsync(Kubernetes k8sClient, V1Deployment yamlModel,
                              MTADeployModel deployModel)
        {
            try
            {
                var namespaceParams = PrepareNamespaceParams(_groupName);
                var deployParams    = PrepareDeployParams(_deployName);

                yamlModel.Metadata.Name = deployParams.Item1;
                yamlModel.Metadata.NamespaceProperty = namespaceParams;

                if (deployModel.Annotations != null)
                {
                    yamlModel.Metadata.Annotations = deployModel.Annotations;
                }

                if (deployModel.Labels != null)
                {
                    yamlModel.Metadata.Labels = deployModel.Labels;
                }

                yamlModel.Spec.Replicas = deployModel.Replicas;
                yamlModel.Spec.Selector.MatchLabels["app"]     = deployParams.Item2;
                yamlModel.Spec.Template.Metadata.Labels["app"] = deployParams.Item2;

                var container = yamlModel.Spec.Template.Spec.Containers[0];
                container.Name            = deployParams.Item3;
                container.Image           = deployModel.Image;
                container.ImagePullPolicy = deployModel.ImagePullPolicy;

                if (deployModel.Resources != null)
                {
                    if (deployModel.Resources.Requests != null)
                    {
                        var cpu = new ResourceQuantity(deployModel.Resources.Requests.CPU);
                        container.Resources.Requests["cpu"] = cpu;

                        var memory = new ResourceQuantity(deployModel.Resources.Requests.Memory);
                        container.Resources.Requests["memory"] = memory;
                    }

                    if (deployModel.Resources.Limits != null)
                    {
                        var cpu = new ResourceQuantity(deployModel.Resources.Limits.CPU);
                        container.Resources.Limits["cpu"] = cpu;

                        var memory = new ResourceQuantity(deployModel.Resources.Limits.Memory);
                        container.Resources.Limits["memory"] = memory;
                    }
                }

                if (deployModel.Env != null)
                {
                    var v1EnvList = new List <V1EnvVar>();
                    foreach (var env in deployModel.Env)
                    {
                        var v1Env = new V1EnvVar(env["name"], env["value"]);
                        v1EnvList.Add(v1Env);
                    }
                    container.Env = v1EnvList;
                }

                var containerPorts = new List <V1ContainerPort>();
                foreach (var port in deployModel.Ports)
                {
                    var v1ContainerPort = new V1ContainerPort(port);
                    containerPorts.Add(v1ContainerPort);
                }
                container.Ports = containerPorts;

                var v1Deployment = await k8sClient.CreateNamespacedDeploymentAsync
                                       (yamlModel, namespaceParams);

                deployModel = new MTADeployModel(v1Deployment);
                return(new Tuple <MTADeployModel, MTAErrorModel>(deployModel, null));
            }
            catch (HttpOperationException ex)
            {
                var errorModel = new MTAErrorModel(ex);
                return(new Tuple <MTADeployModel, MTAErrorModel>(null, errorModel));
            }
            catch (Exception)
            {
                throw;
            }
        }
Пример #6
0
        private static V1Pod CreatePodDefinition()
        {
            Guid   podIdentifier       = Guid.NewGuid();
            var    podidentifierstring = podIdentifier.ToString();
            string podName             = "pod" + podidentifierstring;
            string containerPortName   = "containerport";
            string containerName       = "container";


            V1ObjectMeta meta = new V1ObjectMeta();

            meta.Name = podName;

            V1EnvVar addr = new V1EnvVar();

            addr.Name  = "ACTIVITY_PARTITION_NAME";
            addr.Value = "bam_EnrichedFPAttributesV2_Instances";

            //V1EnvVar port = new V1EnvVar();
            //addr.name("var2");
            //addr.value("value2");

            //V1ResourceRequirements res = new V1ResourceRequirements();
            //Map<String, String> limits = new HashMap<>();
            //limits.put("cpu", "300m");
            //limits.put("memory", "500Mi");
            //res.limits(limits);

            V1ContainerPort port = new V1ContainerPort();

            port.Name          = containerPortName;
            port.ContainerPort = 8080;

            V1Container container = new V1Container();

            container.Name  = containerName;
            container.Image = "bamreplacementwebapp:dev";
            //container.Image = "nbsbamreplacementmigrationservice:dev";
            //container.Image = "migrationservice:dev";
            container.Ports = new List <V1ContainerPort>();
            container.Ports.Add(port);
            container.Env = new List <V1EnvVar>();
            container.Env.Add(addr);
            //container.Args = new List<string>();
            //container.Args.Add("bam_EnrichedFPAttributesV2_Instances");
            // container.Args.Add("bar");

            // container.env(Arrays.asList(addr, port));
            //container.resources(res);

            V1PodSpec spec = new V1PodSpec();

            spec.Containers = new List <V1Container>();
            spec.Containers.Add(container);

            V1Pod podBody = new V1Pod();

            podBody.ApiVersion = "v1";
            podBody.Kind       = "Pod";
            podBody.Metadata   = meta;
            podBody.Spec       = spec;

            return(podBody);
        }
Пример #7
0
        private static V1Deployment CreateDeploymentDefinition()
        {
            Guid   podIdentifier       = Guid.NewGuid();
            var    podidentifierstring = podIdentifier.ToString();
            string podName             = "pod-" + podidentifierstring;
            string containerPortName   = "containerport";
            string containerName       = "container";
            string deploymentName      = "poddeployment-" + podIdentifier;

            V1ObjectMeta deplMetadata = new V1ObjectMeta();

            deplMetadata.Name   = deploymentName;
            deplMetadata.Labels = new Dictionary <string, string>();
            deplMetadata.Labels.Add("component", "migrationservice");

            V1DeploymentSpec deplSpec = new V1DeploymentSpec();

            deplSpec.Selector             = new V1LabelSelector();
            deplSpec.Selector.MatchLabels = new Dictionary <string, string>();
            deplSpec.Selector.MatchLabels.Add("app", "bamreplacement");
            deplSpec.Replicas = 3; // to be tokenized

            deplSpec.Strategy                              = new V1DeploymentStrategy();
            deplSpec.Strategy.Type                         = "RollingUpdate";
            deplSpec.Strategy.RollingUpdate                = new V1RollingUpdateDeployment();
            deplSpec.Strategy.RollingUpdate.MaxSurge       = 1;
            deplSpec.Strategy.RollingUpdate.MaxUnavailable = 0;

            V1ObjectMeta podMetadata = new V1ObjectMeta();

            podMetadata.Name   = podName;
            podMetadata.Labels = new Dictionary <string, string>();
            podMetadata.Labels.Add("app", "bamreplacement");

            V1ContainerPort port = new V1ContainerPort();

            port.Name          = containerPortName;
            port.ContainerPort = 8080;

            V1EnvVar addr = new V1EnvVar();

            addr.Name  = "ACTIVITY_PARTITION_NAME";
            addr.Value = "bam_EnrichedFPAttributesV2_Instances";

            V1Container container = new V1Container();

            container.Name = containerName;
            // container.Image = "abhishekagg24/stableapp:v1";
            //container.Image = "nbsbamreplacementmigrationservice:dev";
            container.Image = "bamreplacementwebapp:dev";
            container.Ports = new List <V1ContainerPort>();
            container.Ports.Add(port);
            container.Env = new List <V1EnvVar>();
            container.Env.Add(addr);



            V1PodSpec podSpec = new V1PodSpec();

            podSpec.Containers = new List <V1Container>();
            podSpec.Containers.Add(container);

            deplSpec.Template          = new V1PodTemplateSpec();
            deplSpec.Template.Metadata = podMetadata;
            deplSpec.Template.Spec     = podSpec;


            V1Deployment deployment = new V1Deployment();

            deployment.ApiVersion = "apps/v1";
            deployment.Kind       = "Deployment";
            deployment.Metadata   = deplMetadata;
            deployment.Spec       = deplSpec;

            return(deployment);
        }