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; } }
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(); }
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; }
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); }
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}"); }
private static async Task DeleteInstance(ContainerInstanceManagementClient client, string containerGroup) { await client.ContainerGroups.DeleteAsync(resourceGroup, containerGroup); }