internal static void MapCustomUIPaths(this V1Container container, HealthCheckResource resource, OperatorDiagnostics diagnostics)
        {
            var uiPath = resource.Spec.UiPath ?? Constants.DEFAULT_UI_PATH;

            container.Env.Add(new V1EnvVar("ui_path", uiPath));
            diagnostics.UiPathConfigured(nameof(resource.Spec.UiPath), uiPath);

            if (!string.IsNullOrEmpty(resource.Spec.UiApiPath))
            {
                container.Env.Add(new V1EnvVar("ui_api_path", resource.Spec.UiApiPath));
                diagnostics.UiPathConfigured(nameof(resource.Spec.UiApiPath), resource.Spec.UiApiPath);
            }

            if (!string.IsNullOrEmpty(resource.Spec.UiResourcesPath))
            {
                container.Env.Add(new V1EnvVar("ui_resources_path", resource.Spec.UiResourcesPath));
                diagnostics.UiPathConfigured(nameof(resource.Spec.UiResourcesPath), resource.Spec.UiResourcesPath);
            }

            if (!string.IsNullOrEmpty(resource.Spec.UiWebhooksPath))
            {
                container.Env.Add(new V1EnvVar("ui_webhooks_path", resource.Spec.UiWebhooksPath));
                diagnostics.UiPathConfigured(nameof(resource.Spec.UiWebhooksPath), resource.Spec.UiWebhooksPath);
            }

            if (resource.Spec.UiNoRelativePaths.HasValue)
            {
                var noRelativePaths = resource.Spec.UiNoRelativePaths.Value.ToString();
                container.Env.Add(new V1EnvVar("ui_no_relative_paths", noRelativePaths));
                diagnostics.UiPathConfigured(nameof(resource.Spec.UiNoRelativePaths), noRelativePaths);
            }
        }
Exemplo n.º 2
0
 void ThrowIfNoCommandIsSetForStepContainer(V1Container subStep)
 {
     if (subStep.Command == null ||  subStep.Command.Count < 1)
     {
         throw new StepContainerMustHaveCommand();
     }
 }
Exemplo n.º 3
0
        public static bool ImageEquals(this V1PodSpec self, V1PodSpec other)
        {
            if (ReferenceEquals(null, other))
            {
                return(false);
            }

            if (ReferenceEquals(self, other))
            {
                return(true);
            }

            List <V1Container> otherList = other.Containers.ToList();

            foreach (V1Container selfContainer in self.Containers)
            {
                if (otherList.Exists(c => string.Equals(c.Name, selfContainer.Name)))
                {
                    V1Container otherContainer = otherList.Find(c => string.Equals(c.Name, selfContainer.Name));
                    if (!string.Equals(selfContainer.Image, otherContainer.Image))
                    {
                        // Container has a new image name.
                        return(false);
                    }
                }
                else
                {
                    // container names don't match
                    return(false);
                }
            }

            return(true);
        }
        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);
        }
Exemplo n.º 5
0
        private void SetImageTag(string tag, V1Container container)
        {
            var image = container?.Image?.Split(":")[0];

            _logger.LogDebug("Found container {Container} having image {Image}.", container?.Name, image);
            _logger.LogDebug("Setting image tag to {Tag}.", tag);
            if (!string.IsNullOrWhiteSpace(image))
            {
                image           = $"{image}:{tag}";
                container.Image = image;
                _logger.LogDebug("New image name is {Image}", container?.Image);
            }
        }
Exemplo n.º 6
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);
        }
Exemplo n.º 7
0
        /// <summary>
        /// Creates a new <see cref="V1Deployment"/> for the specified <see cref="Resources.Channel"/>
        /// </summary>
        /// <param name="channel">The <see cref="Resources.Channel"/> to deploy</param>
        /// <returns>A new awaitable <see cref="Task"/></returns>
        protected virtual async Task CreateChannelDeploymentAsync(Resources.Channel channel)
        {
            V1Deployment deployment;

            try
            {
                this.Logger.LogInformation("Creating a new deployment for the channel with name '{resourceName}'...", channel.Name());
                V1PodSpec   podSpec   = new V1PodSpec();
                V1Container container = channel.Spec.Container;
                container.Env.Add(new V1EnvVar("SINK", $"http://gateway.{channel.Namespace()}.svc.cluster.local/events/"));
                podSpec.Containers = new List <V1Container>()
                {
                    container
                };
                V1ObjectMeta podMetadata = new V1ObjectMeta();
                podMetadata.Annotations = new Dictionary <string, string>()
                {
                    { "sidecar.istio.io/inject", "true" }
                };
                V1PodTemplateSpec podTemplateSpec = new V1PodTemplateSpec(podMetadata, podSpec);
                podTemplateSpec.Metadata.Labels = new Dictionary <string, string>()
                {
                    { "app", channel.Name() },
                    { "version", "1.0" }
                };
                V1DeploymentSpec deploymentSpec = new V1DeploymentSpec(new V1LabelSelector(), podTemplateSpec);
                deploymentSpec.Selector.MatchLabels = new Dictionary <string, string>()
                {
                    { "app", channel.Name() },
                    { "version", "1.0" }
                };
                V1ObjectMeta deploymentMetadata = new V1ObjectMeta(namespaceProperty: channel.Namespace(), name: channel.Name());
                deploymentMetadata.Labels = new Dictionary <string, string>()
                {
                    { "type", EventingDefaults.Labels.Channel }
                };
                deploymentMetadata.Name = channel.Name();
                deploymentMetadata.NamespaceProperty = channel.Namespace();
                deployment = new V1Deployment(KubernetesDefaults.ApiVersions.AppsV1, KubernetesDefaults.Kinds.Deployment, deploymentMetadata, deploymentSpec);
                await this.KubernetesClient.CreateNamespacedDeploymentAsync(deployment, channel.Namespace());

                this.Logger.LogInformation("A new deployment for the channel with name '{resourceName}' has been successfully created.", channel.Name());
            }
            catch (HttpOperationException ex)
            {
                this.Logger.LogError($"An error occured while creating the deployment for the channel with name '{{resourceName}}': the server responded with a non-success status code '{{statusCode}}'.{Environment.NewLine}Details: {{responseContent}}", channel.Name(), ex.Response.StatusCode, ex.Response.Content);
                throw;
            }
        }
Exemplo n.º 8
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);
        }
Exemplo n.º 9
0
        public V1JobStatus CreateK8sJob(dynamic messageBody)
        {
            var job = new V1Job();

            var container = new V1Container();

            container.Image   = kubernetesJob.ImageName;
            container.Name    = kubernetesJob.KubernetesNamespace;
            container.Command = new List <string>();

            // container entry point
            container.Command.Add("dotnet");
            container.Command.Add(kubernetesJob.EntryPoint);

            // job arguments
            container.Command.Add(messageBody);

            job.Kind          = "Job";
            job.ApiVersion    = "batch/v1";
            job.Metadata      = new V1ObjectMeta();
            job.Metadata.Name = $"{kubernetesJob.JobName.ToLower()}-{DateTime.Now.Ticks.ToString()}";
            job.Metadata.NamespaceProperty = kubernetesJob.KubernetesNamespace;
            job.Spec                          = new V1JobSpec();
            job.Spec.Template                 = new V1PodTemplateSpec();
            job.Spec.Template.Spec            = new V1PodSpec();
            job.Spec.Template.Spec.Containers = new List <V1Container>();
            job.Spec.Template.Spec.Containers.Add(container);
            job.Spec.Template.Spec.RestartPolicy = "Never";
            job.Validate();

            var config = KubernetesClientConfiguration.BuildDefaultConfig();

            Console.WriteLine(config);
            IKubernetes client     = new Kubernetes(config);
            var         createdJob = client.CreateNamespacedJob(job, kubernetesJob.KubernetesNamespace);

            return(createdJob.Status);
        }
Exemplo n.º 10
0
        public PodBuilder AddContainer(string _Name, string _Image, string _ImagePullPolicy = null, int[] _Ports = null, IDictionary <string, string> EnvVars = null, Dictionary <string, List <string> > Command = null)
        {
            if (Pod.Spec == null)
            {
                Pod.Spec = new V1PodSpec();
            }

            if (Pod.Spec.Containers == null)
            {
                Pod.Spec.Containers = new List <V1Container>();
            }

            V1Container Container = new V1Container();

            Container.Name            = _Name;
            Container.Image           = _Image;
            Container.ImagePullPolicy = _ImagePullPolicy;

            if (_Ports != null && _Ports.Length > 0)
            {
                if (Container.Ports == null)
                {
                    Container.Ports = new List <V1ContainerPort>();
                }

                for (int i = 0; i < _Ports.Length; ++i)
                {
                    V1ContainerPort CurrentPort = new V1ContainerPort(_Ports[i]);
                    Container.Ports.Add(CurrentPort);
                }
            }

            if (EnvVars != null)
            {
                if (Container.Env == null)
                {
                    Container.Env = new List <V1EnvVar>();
                }

                foreach (string CurrentKey in EnvVars.Keys)
                {
                    Container.Env.Add(new V1EnvVar(CurrentKey, EnvVars[CurrentKey]));
                }
            }

            if (Command != null)
            {
                if (Container.Command == null)
                {
                    Container.Command = new List <string>();
                }

                foreach (string key in Command.Keys)
                {
                    Container.Command.Add(key);

                    IList <string> Args = Command[key];

                    if (Args != null)
                    {
                        if (Container.Args == null)
                        {
                            Container.Args = new List <string>();
                        }

                        for (int i = 0; i < Args.Count; ++i)
                        {
                            Container.Args.Add(Args[i]);
                        }
                    }
                }
            }

            Pod.Spec.Containers.Add(Container);

            return(this);
        }
        public V1Deployment Build(HealthCheckResource resource)
        {
            var metadata = new V1ObjectMeta
            {
                OwnerReferences = new List <V1OwnerReference> {
                    resource.CreateOwnerReference()
                },
                Annotations = new Dictionary <string, string>(),
                Labels      = new Dictionary <string, string>
                {
                    ["app"] = resource.Spec.Name
                },
                Name = $"{resource.Spec.Name}-deploy",
                NamespaceProperty = resource.Metadata.NamespaceProperty
            };

            var uiContainer = new V1Container
            {
                ImagePullPolicy = resource.Spec.ImagePullPolicy ?? Constants.DEFAULT_PULL_POLICY,
                Name            = Constants.POD_NAME,
                Image           = resource.Spec.Image ?? Constants.IMAGE_NAME,
                Ports           = new List <V1ContainerPort>
                {
                    new V1ContainerPort(80)
                },
                Env = new List <V1EnvVar>
                {
                    new V1EnvVar("enable_push_endpoint", "true"),
                    new V1EnvVar("push_endpoint_secret", valueFrom: new V1EnvVarSource(secretKeyRef: new V1SecretKeySelector("key", $"{resource.Spec.Name}-secret"))),
                    new V1EnvVar("Logging__LogLevel__Default", "Debug"),
                    new V1EnvVar("Logging__LogLevel__Microsoft", "Warning"),
                    new V1EnvVar("Logging__LogLevel__System", "Warning"),
                    new V1EnvVar("Logging__LogLevel__HealthChecks", "Information")
                }
            };

            uiContainer.MapCustomUIPaths(resource, _operatorDiagnostics);

            var spec = new V1DeploymentSpec
            {
                Selector = new V1LabelSelector
                {
                    MatchLabels = new Dictionary <string, string>
                    {
                        ["app"] = resource.Spec.Name
                    }
                },
                Replicas = 1,
                Template = new V1PodTemplateSpec
                {
                    Metadata = new V1ObjectMeta
                    {
                        Labels = new Dictionary <string, string>
                        {
                            ["app"] = resource.Spec.Name
                        },
                    },
                    Spec = new V1PodSpec
                    {
                        Containers = new List <V1Container>
                        {
                            uiContainer
                        }
                    }
                }
            };

            foreach (var annotation in resource.Spec.DeploymentAnnotations)
            {
                _logger.LogInformation("Adding annotation {Annotation} to ui deployment with value {AnnotationValue}", annotation.Name, annotation.Value);
                metadata.Annotations.Add(annotation.Name, annotation.Value);
            }

            var specification = spec.Template.Spec;
            var container     = specification.Containers.First();

            for (int i = 0; i < resource.Spec.Webhooks.Count; i++)
            {
                var webhook = resource.Spec.Webhooks[i];
                _logger.LogInformation("Adding webhook configuration for webhook {Webhook}", webhook.Name);

                container.Env.Add(new V1EnvVar($"HealthChecksUI__Webhooks__{i}__Name", webhook.Name));
                container.Env.Add(new V1EnvVar($"HealthChecksUI__Webhooks__{i}__Uri", webhook.Uri));
                container.Env.Add(new V1EnvVar($"HealthChecksUI__Webhooks__{i}__Payload", webhook.Payload));
                container.Env.Add(new V1EnvVar($"HealthChecksUI__Webhooks__{i}__RestoredPayload", webhook.RestoredPayload));
            }

            if (resource.HasBrandingConfigured())
            {
                const string volumeName = "healthchecks-volume";

                if (specification.Volumes == null)
                {
                    specification.Volumes = new List <V1Volume>();
                }
                if (container.VolumeMounts == null)
                {
                    container.VolumeMounts = new List <V1VolumeMount>();
                }

                specification.Volumes.Add(new V1Volume(name: volumeName,
                                                       configMap: new V1ConfigMapVolumeSource(name: $"{resource.Spec.Name}-config")));

                container.Env.Add(new V1EnvVar("ui_stylesheet", $"{Constants.STYLES_PATH}/{Constants.STYLE_SHEET_NAME}"));
                container.VolumeMounts.Add(new V1VolumeMount($"/app/{Constants.STYLES_PATH}", volumeName));
            }

            return(new V1Deployment(metadata: metadata, spec: spec));
        }
Exemplo n.º 12
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);
        }
Exemplo n.º 13
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);
        }