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
},
};
}
}