private async Task CreateContainerGroup()

in src/ccf/virtual-ccf-provider/aci/AciNodeProvider.cs [334:453]


    private async Task<ContainerGroupData> CreateContainerGroup(
        string networkName,
        string nodeName,
        string containerGroupName,
        JsonObject providerConfig,
        string tgzConfigData,
        string dnsNameLabel)
    {
        var client = new ArmClient(new DefaultAzureCredential());
        string location = providerConfig["location"]!.ToString();
        string subscriptionId = providerConfig["subscriptionId"]!.ToString();
        string resourceGroupName = providerConfig["resourceGroupName"]!.ToString();
        ResourceIdentifier resourceGroupResourceId =
            ResourceGroupResource.CreateResourceIdentifier(subscriptionId, resourceGroupName);
        ResourceGroupResource resourceGroupResource =
            client.GetResourceGroupResource(resourceGroupResourceId);

        ContainerGroupCollection collection = resourceGroupResource.GetContainerGroups();

        ContainerGroupData data = CreateContainerGroupData(
            location,
            networkName,
            nodeName,
            dnsNameLabel,
            tgzConfigData);

        this.logger.LogInformation(
            $"Starting container group creation for node: {containerGroupName}");

        ArmOperation<ContainerGroupResource> lro = await collection.CreateOrUpdateAsync(
            WaitUntil.Completed,
            containerGroupName,
            data);
        ContainerGroupResource result = lro.Value;

        // The variable result is a resource, you could call other operations on this instance as
        // well.
        ContainerGroupData resourceData = result.Data;

        this.logger.LogInformation(
            $"container group creation succeeded. " +
            $"id: {resourceData.Id}, IP address: {resourceData.IPAddress.IP}, " +
            $"fqdn: {resourceData.IPAddress.Fqdn}");
        return resourceData;

        static ContainerGroupData CreateContainerGroupData(
            string location,
            string networkName,
            string nodeName,
            string dnsNameLabel,
            string tgzConfigData)
        {
            return new ContainerGroupData(
                new AzureLocation(location),
                new ContainerInstanceContainer[]
                {
                    new(
                        AciConstants.ContainerName.CcHost,
                        $"{ImageUtils.CcfRunJsAppVirtualImage()}:" +
                        $"{ImageUtils.CcfRunJsAppVirtualTag()}",
                        new ContainerResourceRequirements(
                            new ContainerResourceRequestsContent(1.5, 1)))
                    {
                        Ports =
                        {
                            new ContainerPort(Ports.RpcMainPort),
                            new ContainerPort(Ports.RpcDebugPort),
                            new ContainerPort(Ports.NodeToNodePort)
                        },
                        EnvironmentVariables =
                        {
                            new ContainerEnvironmentVariable("CONFIG_DATA_TGZ")
                            {
                                Value = tgzConfigData
                            }
                        }
                    }
                },
                ContainerInstanceOperatingSystemType.Linux)
            {
                RestartPolicy = ContainerGroupRestartPolicy.Never,
                Tags =
                {
                    {
                        AciConstants.CcfNetworkNameTag,
                        networkName
                    },
                    {
                        AciConstants.CcfNetworkTypeTag,
                        "node"
                    },
                    {
                        AciConstants.CcfNetworkResourceNameTag,
                        nodeName
                    }
                },
                IPAddress = new ContainerGroupIPAddress(
                    new ContainerGroupPort[]
                    {
                        new(Ports.RpcMainPort)
                        {
                            Protocol = ContainerGroupNetworkProtocol.Tcp,
                        },
                        new(Ports.NodeToNodePort)
                        {
                            Protocol = ContainerGroupNetworkProtocol.Tcp,
                        },
                        new(Ports.RpcDebugPort)
                        {
                            Protocol = ContainerGroupNetworkProtocol.Tcp
                        }
                    },
                    ContainerGroupIPAddressType.Public)
                {
                    DnsNameLabel = dnsNameLabel,
                    AutoGeneratedDomainNameLabelScope = DnsNameLabelReusePolicy.Unsecure
                },
            };
        }
    }