Files
smom-dbis-138/terraform/modules/vm-deployment/main.tf
defiQUG 1fb7266469 Add Oracle Aggregator and CCIP Integration
- Introduced Aggregator.sol for Chainlink-compatible oracle functionality, including round-based updates and access control.
- Added OracleWithCCIP.sol to extend Aggregator with CCIP cross-chain messaging capabilities.
- Created .gitmodules to include OpenZeppelin contracts as a submodule.
- Developed a comprehensive deployment guide in NEXT_STEPS_COMPLETE_GUIDE.md for Phase 2 and smart contract deployment.
- Implemented Vite configuration for the orchestration portal, supporting both Vue and React frameworks.
- Added server-side logic for the Multi-Cloud Orchestration Portal, including API endpoints for environment management and monitoring.
- Created scripts for resource import and usage validation across non-US regions.
- Added tests for CCIP error handling and integration to ensure robust functionality.
- Included various new files and directories for the orchestration portal and deployment scripts.
2025-12-12 14:57:48 -08:00

189 lines
5.8 KiB
HCL

# VM Deployment Module for Besu Network
# Deploys Besu nodes on Virtual Machines or VM Scale Sets with Docker Engine
# Variables are defined in variables.tf
# Network Interface
resource "azurerm_network_interface" "besu_node" {
count = var.use_scale_set ? 0 : var.node_count
name = "${var.cluster_name}-${var.node_type}-nic-${count.index}"
location = var.location
resource_group_name = var.resource_group_name
ip_configuration {
name = "internal"
subnet_id = var.subnet_id
private_ip_address_allocation = "Dynamic"
# Only sentry and RPC nodes get public IPs; besu-node uses private IPs only
public_ip_address_id = (var.node_type == "sentry" || var.node_type == "rpc") ? azurerm_public_ip.besu_node[count.index].id : null
}
tags = merge(var.tags, {
NodeType = var.node_type
NodeIndex = count.index
})
}
# Associate NSG with NIC
resource "azurerm_network_interface_security_group_association" "besu_node" {
count = var.use_scale_set ? 0 : var.node_count
network_interface_id = azurerm_network_interface.besu_node[count.index].id
network_security_group_id = var.network_security_group_id
}
# Public IP for sentry and RPC nodes only (besu-node uses private IPs only)
# Note: Phase 1 backend VMs use private IPs only; Nginx proxy connects via Cloudflare Tunnel
resource "azurerm_public_ip" "besu_node" {
count = var.use_scale_set ? 0 : (var.node_type == "sentry" || var.node_type == "rpc" ? var.node_count : 0)
name = "${var.cluster_name}-${var.node_type}-ip-${count.index}"
location = var.location
resource_group_name = var.resource_group_name
allocation_method = "Static"
sku = "Standard"
tags = merge(var.tags, {
NodeType = var.node_type
NodeIndex = count.index
})
}
# Virtual Machine
resource "azurerm_linux_virtual_machine" "besu_node" {
count = var.use_scale_set ? 0 : var.node_count
name = "${var.cluster_name}-${var.node_type}-${count.index}"
location = var.location
resource_group_name = var.resource_group_name
size = var.vm_size
admin_username = var.admin_username
network_interface_ids = [azurerm_network_interface.besu_node[count.index].id]
admin_ssh_key {
username = var.admin_username
public_key = var.ssh_public_key
}
os_disk {
name = "${var.cluster_name}-${var.node_type}-disk-${count.index}"
caching = "ReadWrite"
storage_account_type = var.storage_account_type
disk_size_gb = var.disk_size_gb
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
dynamic "boot_diagnostics" {
for_each = var.vm_enable_boot_diagnostics && var.storage_account_name != "" ? [1] : []
content {
storage_account_uri = var.storage_account_name != "" ? "https://${var.storage_account_name}.blob.core.windows.net/" : null
}
}
dynamic "identity" {
for_each = var.vm_enable_managed_identity ? [1] : []
content {
type = "SystemAssigned"
}
}
custom_data = base64encode(templatefile(
var.use_phase1_cloud_init ? "${path.module}/cloud-init-phase1.yaml" : "${path.module}/cloud-init.yaml",
{
node_type = var.node_type
node_index = count.index
cluster_name = var.cluster_name
key_vault_id = var.key_vault_id
genesis_file_path = var.genesis_file_path
admin_username = var.admin_username
}
))
tags = merge(var.tags, {
NodeType = var.node_type
NodeIndex = count.index
})
depends_on = [azurerm_network_interface.besu_node]
}
# VM Scale Set (alternative to individual VMs)
resource "azurerm_linux_virtual_machine_scale_set" "besu_node" {
count = var.use_scale_set ? 1 : 0
name = "${var.cluster_name}-${var.node_type}-vmss"
location = var.location
resource_group_name = var.resource_group_name
sku = var.vm_size
instances = var.node_count
admin_username = var.admin_username
admin_ssh_key {
username = var.admin_username
public_key = var.ssh_public_key
}
source_image_reference {
publisher = "Canonical"
offer = "0001-com-ubuntu-server-jammy"
sku = "22_04-lts-gen2"
version = "latest"
}
os_disk {
storage_account_type = var.storage_account_type
caching = "ReadWrite"
disk_size_gb = var.disk_size_gb
}
network_interface {
name = "${var.cluster_name}-${var.node_type}-nic"
primary = true
ip_configuration {
name = "internal"
primary = true
subnet_id = var.subnet_id
# Only sentry and RPC nodes get public IPs; besu-node uses private IPs only
# Match the logic used for individual VMs
dynamic "public_ip_address" {
for_each = (var.node_type == "sentry" || var.node_type == "rpc") ? [1] : []
content {
name = "${var.cluster_name}-${var.node_type}-public-ip"
}
}
}
}
dynamic "identity" {
for_each = var.vm_enable_managed_identity ? [1] : []
content {
type = "SystemAssigned"
}
}
custom_data = base64encode(templatefile(
var.use_phase1_cloud_init ? "${path.module}/cloud-init-phase1.yaml" : "${path.module}/cloud-init.yaml",
{
node_type = var.node_type
node_index = 0
cluster_name = var.cluster_name
key_vault_id = var.key_vault_id
genesis_file_path = var.genesis_file_path
admin_username = var.admin_username
}
))
upgrade_mode = "Manual"
tags = merge(var.tags, {
NodeType = var.node_type
})
}
# Outputs are defined in outputs.tf