Exemplo n.º 1
0
        public async static Task InitializeContainerEndpoint(TraceWriter log)
        {
            var token = await AuthUtil.GetToken();

            var client = new ContainerInstanceManagementClient(new TokenCredentials(token));

            client.SubscriptionId = Environment.GetEnvironmentVariable("SUBSCRIPTION_ID");

            if (string.IsNullOrEmpty(client.SubscriptionId))
            {
                throw new InvalidOperationException("Environment variale 'SUBSCRIPTION_ID' not set.");
            }

            var containers = await client.ContainerGroups.ListByResourceGroupAsync(ResourceGroupName);

            var container = containers.Where(c => c.Name == ImageProcessor.ContainerGroupName).FirstOrDefault();

            if (container == null || container.IpAddress == null || container.IpAddress.Ip == null)
            {
                log.Warning("Container not found, going to create...");

                var spec = new ContainerGroup
                {
                    Location      = "East US",
                    OsType        = "Linux",
                    RestartPolicy = "Always",
                    IpAddress     = new IpAddress
                    {
                        Ports = new[] { new Port(9000) }
                    },
                    Containers = new[] {
                        new Container
                        {
                            Name      = "imaginary",
                            Image     = "h2non/imaginary",
                            Ports     = new [] { new ContainerPort(9000) },
                            Resources = new ResourceRequirements
                            {
                                Requests = new ResourceRequests(memoryInGB: 1.5, cpu: 1)
                            }
                        }
                    }
                };

                await client.ContainerGroups.CreateOrUpdateAsync(
                    resourceGroupName : ImageProcessor.ResourceGroupName,
                    containerGroupName : ImageProcessor.ContainerGroupName,
                    containerGroup : spec);
            }
            else
            {
                log.Info("Container IP: " + container.IpAddress.Ip);
                log.Info("Container port: " + container.IpAddress.Ports.FirstOrDefault().PortProperty);

                ImageProcessor.ApiEndpoint = "http://" + container.IpAddress.Ip + ":" + container.IpAddress.Ports.FirstOrDefault().PortProperty;
            }
        }
Exemplo n.º 2
0
        static async Task MainAsync()
        {
            // Getting client using fluent interface.
            var credentials = SdkContext.AzureCredentialsFactory.FromServicePrincipal(clientId, clientSecret, tenantId, AzureEnvironment.AzureGlobalCloud);
            var client      = new ContainerInstanceManagementClient(credentials);

            client.SubscriptionId = subsctiptionId;


            // Creating 1000 containers
            // We can only 20 instances at the same time. Then we need to wait for 1.5 min.
            // Microsoft.Rest.Azure.CloudException: 'Number of requests for action 'ContainerGroupCreation' exceeded the limit of '20' for time interval '00:05:00'. Please try again after '1.25' minutes.'
            // Microsoft.Rest.Azure.CloudException: 'Resource type 'Microsoft.ContainerInstance/containerGroups' container group quota '20' exceeded in region 'East US'.'
            // I send a support request for change the quota. https://docs.microsoft.com/en-us/azure/container-instances/container-instances-quotas
            var loop      = Enumerable.Range(0, 2);                            // upto 3
            var locations = new string[] { "EastUS", "WestUS", "WestEurope" }; // Currently available only three resion.


            var containerGroupNumberRange = Enumerable.Range(0, 10); // upto 20


            //  Create clients
            foreach (var i in containerGroupNumberRange)
            {
                await Create10Instances(client, $"containerGroup0-{i}", "EastUS", 0, $"container-{1}");
            }

            // wait for the all Client has been created.
            await Task.Delay(TimeSpan.FromMinutes(1));


            foreach (var i in containerGroupNumberRange)
            {
                await Create10Instances(client, $"containerGroup1-{i}", "EastUS", 1, $"container-{i}");
            }

            Console.WriteLine("Done. Press button");
            Console.ReadLine(); // Please click after finish the test.

            // 1000 concurrent request now for 1 min
            // await Task.Delay(TimeSpan.FromMinutes(1));
            // Delete 1000 containers
            foreach (var y in loop)
            {
                foreach (var x in containerGroupNumberRange)
                {
                    await DeleteInstance(client, $"containerGroup{y}-{x}");
                }
            }

            Console.WriteLine("Done. Deleted");
            Console.ReadLine();
        }
Exemplo n.º 3
0
        public async Task <string> ExecuteStepAsync(ExpressionParser parser, string[] arguments, JToken part, IDictionary <string, JObject> volumes, CancellationToken cancellationToken)
        {
            var token = await adal.AcquireTokenAsync("https://management.azure.com/", Options.ClientCredentials);

            var client = new ContainerInstanceManagementClient(new TokenCredentials(token.AccessToken), new Test());

            client.SubscriptionId = Options.SubscriptionId;


            var cn = await client.ContainerGroups.CreateOrUpdateAsync(Options.ResourceGroup, Options.ContainerGroupName, new ContainerGroupInner
            {
                Containers = new[]
                {
                    new Container
                    {
                        Name      = part.SelectToken("$.name").ToString(),
                        Image     = part.SelectToken("$.image").ToString(),
                        Resources = new ResourceRequirements {
                            Requests = new ResourceRequests {
                                Cpu = Options.Cpu, MemoryInGB = Options.MemoryInGB
                            }
                        },
                        VolumeMounts = volumes.Select(v =>
                                                      new VolumeMount {
                            Name      = v.Key,
                            MountPath = v.Value.SelectToken("$.mountedAt").ToString()
                        }).ToArray(),
                        Command = arguments
                    }
                },
                ImageRegistryCredentials =
                    parser.Document.SelectToken("$.imageRegistryCredentials").ToObject <ImageRegistryCredential[]>(),
                Location      = Options.Location,
                OsType        = Options.OsType,
                RestartPolicy = "Never",
                Volumes       =
                    volumes.Select(v => new Volume(v.Key, v.Value.SelectToken("$.azureFileShare").ToObject <AzureFileVolume>())).ToArray()
            });

            while (cn.ProvisioningState == "Creating" || !cn.Containers[0].InstanceView.CurrentState.State.Equals("Terminated", StringComparison.OrdinalIgnoreCase))
            {
                await Task.Delay(30000);

                cn = await client.ContainerGroups.GetAsync(Options.ResourceGroup, Options.ContainerGroupName);
            }

            //    var log = await client.ContainerLogs.ListAsync(Options.ResourceGroup, part.SelectToken("$.name").ToString(), Options.ContainerGroupName);

            await client.ContainerGroups.DeleteAsync(Options.ResourceGroup, Options.ContainerGroupName, cancellationToken);

            return("");// log.Content;
        }
Exemplo n.º 4
0
        public async static Task DeleteContainer(TraceWriter log)
        {
            var token = await AuthUtil.GetToken();

            var client = new ContainerInstanceManagementClient(new TokenCredentials(token));

            client.SubscriptionId = Environment.GetEnvironmentVariable("SUBSCRIPTION_ID");

            if (string.IsNullOrEmpty(client.SubscriptionId))
            {
                throw new InvalidOperationException("Environment variale 'SUBSCRIPTION_ID' not set.");
            }

            log.Info($"Deleting container '{ImageProcessor.ContainerGroupName}'");
            await client.ContainerGroups.DeleteAsync(ResourceGroupName, ImageProcessor.ContainerGroupName);
        }
Exemplo n.º 5
0
        private static async Task Create10Instances(ContainerInstanceManagementClient client, string containerGroup, string location, int flag, string guid)
        {
            var resources = new ResourceRequirements();
            var request   = new ResourceRequests();

            request.Cpu        = 0.2;
            request.MemoryInGB = 0.3; // once I tried 0.1 it cause a long execution time.

            resources.Requests = request;

            var list = new List <Container>();

            for (int i = 0; i < 5; i++)
            {
                if (flag == 0)
                {
                    list.Add(CreateClientContainer("DOCKERHUB_NAME/client", i, resources, $"{guid}-{i}"));
                }
                else
                {
                    list.Add(CreateSpamerContainer("DOCKERHUB_NAME/spamer", i, resources, $"{guid}-{i}"));
                }
            }


            await client.ContainerGroups.CreateOrUpdateAsync(resourceGroup, containerGroup,
                                                             new ContainerGroup()
            {
                Containers    = list,
                Location      = location,
                OsType        = "Linux",
                RestartPolicy = "Never"       // try not to emit the message by restarting
            }
                                                             );

            Console.WriteLine($"Done for {containerGroup}");
        }
Exemplo n.º 6
0
 private static async Task DeleteInstance(ContainerInstanceManagementClient client, string containerGroup)
 {
     await client.ContainerGroups.DeleteAsync(resourceGroup, containerGroup);
 }