public async static Task RenameContainer(RenameContainerParameter parameters, IProducer <Null, string> p)
        {
            try {
                CancellationToken cancellation = new CancellationToken();
                await client.Containers.RenameContainerAsync(parameters.ContainerId, new ContainerRenameParameters {
                    NewName = parameters.NewName
                }, cancellation);

                // Updating the containers with the new configurations right away and sending it out
                var updatedContainers = await DockerUpdater.FetchOverviewData();

                var overviewContainerUpdate = DockerUpdater.CreateOverViewData(updatedContainers);
                await KafkaHelpers.SendMessageAsync(DockerUpdater.OverviewTopic, overviewContainerUpdate, p);

                // Send response
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 200,
                    Message            = ResponseMessageContracts.CONTAINER_RENAMED,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            } catch (DockerApiException ex) {
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 400,
                    Message            = ex.Message,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            }
        }
 public async void RefetchStatsData(string serverRequestTopic)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic, new ContainerRequest
     {
         Action = ContainerActionType.REFETCH_STATS
     });
 }
 public async void RefetchOverviewData(string serverRequestTopic)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic, new ContainerRequest
     {
         Action = ContainerActionType.REFETCH_OVERVIEW
     });
 }
        public async static Task InspectContainer(InspectContainerParameters parameters, IProducer <Null, string> p)
        {
            try {
                CancellationToken cancellation = new CancellationToken();
                var inspectResponse            = await client.Containers.InspectContainerAsync(parameters.ContainerId, cancellation);

                var containerId        = inspectResponse.ID.Substring(0, 10);
                var inspectResponseStr = JsonConvert.SerializeObject(inspectResponse, Formatting.Indented);

                var inspectContainerResponse = new InspectContainerResponse
                {
                    ServerName  = KafkaHelpers.Servername,
                    ContainerId = containerId,
                    RawData     = inspectResponseStr
                };

                await KafkaHelpers.SendMessageAsync(DockerUpdater.InspectTopic, inspectContainerResponse, p);

                // Send response
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 200,
                    Message            = ResponseMessageContracts.CONTAINER_INSPECTED,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            } catch (DockerApiException ex) {
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 400,
                    Message            = ex.Message,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            }
        }
        public async static Task RefetchOverviewData(IProducer <Null, string> p)
        {
            var updatedContainers = await DockerUpdater.FetchOverviewData();

            var overviewContainerUpdate = DockerUpdater.CreateOverViewData(updatedContainers);
            await KafkaHelpers.SendMessageAsync(DockerUpdater.OverviewTopic, overviewContainerUpdate, p);

            // Send response
            await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                ResponseStatusCode = 200,
                Message            = ResponseMessageContracts.OVERVIEW_DATA_REFETCHED,
                ContainerIds       = updatedContainers.Select(container => container.Id).ToArray()
            }, p);
        }
Beispiel #6
0
        public async Task FetchData(ForecastSubscription subscription)
        {
            try
            {
                using var scope = _services.CreateScope();
                var wundergroundService = scope.ServiceProvider.GetRequiredService <IWundergroundService>();
                var data = await wundergroundService.Get5DayForecast(subscription.GeoCode);

                await KafkaHelpers.SendMessageAsync(KafkaHelpers.WeatherDataTopic, data, _producer);
            }
            catch (HttpRequestException e)
            {
                _logger.LogError($"Fetch for GeoCode={subscription.GeoCode} threw an error: {e.Message}");
            }
        }
        public async static Task RefetchStatsData(IProducer <Null, string> p)
        {
            // Updating the containers with the new configurations right away and sending it out
            var updatedContainers = await DockerUpdater.FetchStatsData();

            var overviewContainerUpdate = DockerUpdater.CreateStatsData(updatedContainers);
            await KafkaHelpers.SendMessageAsync(DockerUpdater.StatsTopic, overviewContainerUpdate, p);

            // Send response
            await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                ResponseStatusCode = 200,
                Message            = ResponseMessageContracts.STATS_DATA_REFETCHED,
                ContainerIds       = updatedContainers.Select(container => container.Id).ToArray()
            }, p);
        }
Beispiel #8
0
        public static async void Start(CancellationTokenSource cts)
        {
            var consumerConfig = new ConsumerConfig {
                GroupId          = "command-server" + KafkaHelpers.Servername,
                BootstrapServers = KafkaHelpers.BootstrapServers,
                AutoOffsetReset  = AutoOffsetReset.Latest,
            };

            KafkaHelpers.SetKafkaConfigKerberos(consumerConfig);

            using (var c = new ConsumerBuilder <Ignore, string>(consumerConfig).Build()) {
                c.Subscribe(KafkaHelpers.RequestTopic);

                Console.WriteLine($"Listening for commands on topic {KafkaHelpers.RequestTopic}");
                try {
                    var producerConfig = new ProducerConfig {
                        BootstrapServers = KafkaHelpers.BootstrapServers, Acks = Acks.Leader
                    };
                    KafkaHelpers.SetKafkaConfigKerberos(producerConfig);

                    using (var p = new ProducerBuilder <Null, string>(producerConfig).Build()) {
                        while (true)
                        {
                            try {
                                var consumeResult = c.Consume(cts.Token); // Polling for new messages, waiting here until message recieved

                                var messageJsonString = consumeResult.Message.Value;

                                ContainerRequest request = JsonConvert.DeserializeObject <ContainerRequest>(messageJsonString);
                                await CallAction(request.Action, messageJsonString, p);
                            } catch (ConsumeException ex) {
                                Console.Error.WriteLine(ex.Error);
                            } catch (Newtonsoft.Json.JsonException ex) {
                                await KafkaHelpers.SendMessageAsync(KafkaHelpers.ResponseTopic, new ContainerResponse {
                                    ResponseStatusCode = 400,
                                    Message            = ex.Message
                                }, p);
                            }
                        }
                    }
                } catch (OperationCanceledException) { } finally {
                    // Ensure the consumer leaves the group cleanly and final offsets are committed.
                    c.Close();
                }
            }
        }
        public async void CreateNewContainer(string serverRequestTopic, string parametersSerialized)
        {
            try
            {
                // Check that all parameters is present and is correct by deserializing
                if (parametersSerialized == null)// TODO: client error
                {
                    return;
                }

                var parameters = JsonConvert.DeserializeObject <RunNewContainerParameters>(parametersSerialized);
                parameters.Action = ContainerActionType.RUN_NEW;
                await KafkaHelpers.SendMessageAsync(serverRequestTopic, parameters);
            }
            catch (Newtonsoft.Json.JsonException ex)
            {
                Console.WriteLine(parametersSerialized);
                Console.WriteLine("ERROR! : " + ex.Message);
                // TODO: client error
            }
        }
Beispiel #10
0
        private static async Task SendOverViewData(IProducer <Null, string> p)
        {
            var latestRead = CreateOverViewData();

            var latestSendTime = DateTime.Now;

            while (true)
            {
                new Task(async() => {
                    var containerData = await FetchOverviewData();
                    if (ContainerHelpers.OverviewContainersAreDifferent(latestRead.Containers, containerData) ||
                        latestSendTime.AddMinutes(_sendInterval) < DateTime.Now)
                    {
                        latestRead.Containers = containerData;
                        latestSendTime        = DateTime.Now;
                        await KafkaHelpers.SendMessageAsync(OverviewTopic, latestRead, p);
                    }
                }).Start();

                await Task.Delay(TimeSpan.FromSeconds(_checkInterval));
            }
        }
        public async static Task UpdateConfigContainer(UpdateConfigContainerParameters parameters, IProducer <Null, string> p)
        {
            try {
                CancellationToken cancellation = new CancellationToken();

                await client.Containers.UpdateContainerAsync(parameters.ContainerId, new ContainerUpdateParameters {
                    BlkioWeight       = parameters.BlkioWeight,
                    Memory            = parameters.MemoryLimit,
                    MemoryReservation = parameters.MemoryParameters,
                    MemorySwap        = parameters.MemorySwapLimit,
                    KernelMemory      = parameters.KernelMemory,
                    // RestartPolicy = parameters.RestartPolicy, TODO:
                    CPUShares  = parameters.CPUShares,
                    CPUPeriod  = parameters.CPUPeriod,
                    CpusetCpus = parameters.CPUSetCPUs,
                    CpusetMems = parameters.CPUSetMems
                }, cancellation);

                // Updating the containers with the new configurations right away and sending it out
                var updatedContainers = await DockerUpdater.FetchStatsData();

                var overviewContainerUpdate = DockerUpdater.CreateStatsData(updatedContainers);
                await KafkaHelpers.SendMessageAsync(DockerUpdater.StatsTopic, overviewContainerUpdate, p);

                // Send response
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 200,
                    Message            = ResponseMessageContracts.CONTAINER_CONFIGURATION_UPDATED,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            } catch (DockerApiException ex) {
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 400,
                    Message            = ex.Message,
                    ContainerIds       = new string[] { parameters.ContainerId }
                }, p);
            }
        }
 public async void UpdateContainerConfiguration(string serverRequestTopic, string containerId)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic,
                                         new UpdateConfigContainerParameters { ContainerId = containerId, }); // TODO:
 }
Beispiel #13
0
        private async static Task CallAction(ContainerActionType action, string jsonParameterString, IProducer <Null, String> p)
        {
            switch (action)
            {
            case ContainerActionType.RUN_NEW:
                var runNewParam = JsonConvert.DeserializeObject <RunNewContainerParameters>(jsonParameterString);
                await ContainerAction.RunNewContainer(runNewParam, p);

                break;

            case ContainerActionType.START:
                var startParam = JsonConvert.DeserializeObject <StartContainerParameters>(jsonParameterString);
                await ContainerAction.StartContainer(startParam, p);

                break;

            case ContainerActionType.STOP:
                var stopParam = JsonConvert.DeserializeObject <StopContainerParameters>(jsonParameterString);
                await ContainerAction.StopContainer(stopParam, p);

                break;

            case ContainerActionType.REMOVE:
                var removeParam = JsonConvert.DeserializeObject <RemoveContainerParameters>(jsonParameterString);
                await ContainerAction.RemoveContainer(removeParam, p);

                break;

            case ContainerActionType.RESTART:
                var restartParam = JsonConvert.DeserializeObject <RestartContainerParameters>(jsonParameterString);
                await ContainerAction.RestartContainer(restartParam, p);

                break;

            case ContainerActionType.RENAME:
                var parameters = JsonConvert.DeserializeObject <RenameContainerParameter>(jsonParameterString);
                await ContainerAction.RenameContainer(parameters, p);

                break;

            case ContainerActionType.UPDATE_CONFIGURATION:
                var updateParam = JsonConvert.DeserializeObject <UpdateConfigContainerParameters>(jsonParameterString);
                await ContainerAction.UpdateConfigContainer(updateParam, p);

                break;

            case ContainerActionType.REFETCH_OVERVIEW:
                await ContainerAction.RefetchOverviewData(p);

                break;

            case ContainerActionType.REFETCH_STATS:
                await ContainerAction.RefetchStatsData(p);

                break;

            case ContainerActionType.INSPECT:
                var inspectParam = JsonConvert.DeserializeObject <InspectContainerParameters>(jsonParameterString);
                await ContainerAction.InspectContainer(inspectParam, p);

                break;

            default:
                await KafkaHelpers.SendMessageAsync(KafkaHelpers.ResponseTopic, new ContainerResponse { ResponseStatusCode = 404, Message = ResponseMessageContracts.METHOD_CALL_NOT_VIABLE }, p);

                break;
            }
        }
 public async void RenameContainer(string serverRequestTopic, string containerId, string newContainerName)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic,
                                         new RenameContainerParameter { ContainerId = containerId, NewName = newContainerName });
 }
 public async void RestartContainer(string serverRequestTopic, string containerId)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic,
                                         new RestartContainerParameters { ContainerId = containerId });
 }
        public async static Task RunNewContainer(RunNewContainerParameters parameters, IProducer <Null, string> p)
        {
            try {
                var exposedPorts     = new Dictionary <string, EmptyStruct>();
                var hostPortBindings = new Dictionary <string, IList <PortBinding> >();

                if (parameters.Ports != null)
                {
                    foreach (var portBinding in parameters.Ports)
                    {
                        exposedPorts.Add(portBinding.HostPort, default(EmptyStruct));
                        hostPortBindings.Add(portBinding.ContainerPort, new List <PortBinding> {
                            new PortBinding {
                                HostPort = portBinding.HostPort
                            }
                        });
                    }
                }

                RestartPolicy restartPolicy = new RestartPolicy {
                    Name = RestartPolicyKind.No
                };
                if (parameters.RestartPolicy != null)
                {
                    restartPolicy.MaximumRetryCount = parameters.RestartPolicy.MaximumRetryCount ?? 0;
                    switch (parameters.RestartPolicy.RestartPolicy)
                    {
                    case ContainerRestartPolicy.Always:
                        restartPolicy.Name = RestartPolicyKind.Always;
                        break;

                    case ContainerRestartPolicy.OnFailure:
                        restartPolicy.Name = RestartPolicyKind.OnFailure;
                        break;

                    case ContainerRestartPolicy.UnlessStopped:
                        restartPolicy.Name = RestartPolicyKind.UnlessStopped;
                        break;
                    }
                }
                var environment = new List <string>();
                if (parameters.Environment != null)
                {
                    foreach (var environmentEntry in parameters.Environment)
                    {
                        environment.Add(environmentEntry.Key + "=" + environmentEntry.Value);
                    }
                }
                var volumes = new List <string>();
                if (parameters.Volumes != null)
                {
                    foreach (var volumeEntry in parameters.Volumes)
                    {
                        volumes.Add(volumeEntry.HostPath + ":" + volumeEntry.ContainerPath);
                    }
                }
                var dockerResponse = await client.Containers.CreateContainerAsync(new CreateContainerParameters {
                    Image        = parameters.Image,
                    Cmd          = parameters.Command == null ? null : parameters.Command.Split(" "),
                    Name         = parameters.Name,
                    ExposedPorts = exposedPorts,
                    HostConfig   = new HostConfig {
                        PortBindings    = hostPortBindings,
                        PublishAllPorts = true,
                        RestartPolicy   = restartPolicy,
                        VolumesFrom     = parameters.VolumesFrom,
                        Binds           = volumes,
                        NetworkMode     = parameters.NetworkMode,
                    },
                    Env = environment,
                });

                // Update general info as quickly as possible and send it out so clients can see the newly created container quickly
                var updatedContainers = await DockerUpdater.FetchOverviewData();

                var overviewContainerUpdate = DockerUpdater.CreateOverViewData(updatedContainers);
                await KafkaHelpers.SendMessageAsync(DockerUpdater.OverviewTopic, overviewContainerUpdate, p);

                // Send response
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 201,
                    Message            = ResponseMessageContracts.CONTAINER_CREATED,
                    ContainerIds       = new string[] { dockerResponse.ID }
                }, p);

                await StartContainer(new StartContainerParameters { ContainerId = dockerResponse.ID }, p);
            } catch (DockerApiException ex) {
                await KafkaHelpers.SendMessageAsync(_responseTopic, new ContainerResponse {
                    ResponseStatusCode = 400,
                    Message            = ex.Message,
                    ContainerIds       = null
                }, p); // TODO: create contract for these error messages
            }
        }
 public async void RemoveContainer(string serverRequestTopic, string containerId, bool removeVolumes)
 {
     await KafkaHelpers.SendMessageAsync(serverRequestTopic,
                                         new RemoveContainerParameters { ContainerId = containerId, RemoveVolumes = removeVolumes });
 }