cloud-foundation-fabric/modules/cloud-config-container/simple-nva
simonebruzzechesse fd07c444cb
Extended simple-nva module to manage BGP service running on FR routing docker container (#1195)
2023-03-08 09:43:13 +01:00
..
files Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
README.md Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
cloud-config.yaml Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
main.tf Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
outputs.tf Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
variables.tf Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00
versions.tf Extended simple-nva module to manage BGP service running on FR routing docker container (#1195) 2023-03-08 09:43:13 +01:00

README.md

Google Simple NVA Module

This module allows for the creation of a NVA (Network Virtual Appliance) to be used for experiments and as a stub for future appliances deployment.

This NVA can be used to interconnect up to 8 VPCs.

Examples

Simple example

locals {
  network_interfaces = [
    {
      addresses  = null
      name       = "dev"
      nat        = false
      network    = "dev_vpc_self_link"
      routes     = ["10.128.0.0/9"]
      subnetwork = "dev_vpc_nva_subnet_self_link"
    },
    {
      addresses  = null
      name       = "prod"
      nat        = false
      network    = "prod_vpc_self_link"
      routes     = ["10.0.0.0/9"]
      subnetwork = "prod_vpc_nva_subnet_self_link"
    }
  ]
}

module "cos-nva" {
  source               = "./fabric/modules/cloud-config-container/simple-nva"
  enable_health_checks = true
  network_interfaces   = local.network_interfaces
  # files = {
  #   "/var/lib/cloud/scripts/per-boot/firewall-rules.sh" = {
  #     content     = file("./your_path/to/firewall-rules.sh")
  #     owner       = "root"
  #     permissions = 0700
  #   }
  # }
}

module "vm" {
  source             = "./fabric/modules/compute-vm"
  project_id         = "my-project"
  zone               = "europe-west8-b"
  name               = "cos-nva"
  network_interfaces = local.network_interfaces
  metadata = {
    user-data              = module.cos-nva.cloud_config
    google-logging-enabled = true
  }
  boot_disk = {
    image = "projects/cos-cloud/global/images/family/cos-stable"
    type  = "pd-ssd"
    size  = 10
  }
  tags = ["nva", "ssh"]
}
# tftest modules=1 resources=1

Example with advanced routing capabilities

Find below a sample terraform example for bootstrapping a simple NVA powered by COS and running FRRouting container. Please find below a sample frr.conf file based on the documentation available here for hosting a BGP service with ASN 65001 on FRR container establishing a BGP session with a remote neighbor with IP address 10.128.0.2 and ASN 65002.

# tftest-file id=frr_conf path=./frr.conf
# Example frr.conmf file

log syslog informational
no ipv6 forwarding
router bgp 65001
 neighbor 10.128.0.2 remote-as 65002
line vty

Following code assumes a file in the same folder named frr.conf exists.

locals {
  network_interfaces = [
    {
      addresses           = null
      name                = "dev"
      nat                 = false
      network             = "dev_vpc_self_link"
      routes              = ["10.128.0.0/9"]
      subnetwork          = "dev_vpc_nva_subnet_self_link"
      enable_masquerading = true
      non_masq_cidrs      = ["10.0.0.0/8"]
    },
    {
      addresses  = null
      name       = "prod"
      nat        = false
      network    = "prod_vpc_self_link"
      routes     = ["10.0.0.0/9"]
      subnetwork = "prod_vpc_nva_subnet_self_link"
    }
  ]
}

module "cos-nva" {
  source               = "./fabric/modules/cloud-config-container/simple-nva"
  enable_health_checks = true
  network_interfaces   = local.network_interfaces
  frr_config           = { config_file = "./frr.conf", daemons_enabled = ["bgpd"] }
  optional_run_cmds    = ["ls -l"]
}

module "vm" {
  source             = "./fabric/modules/compute-vm"
  project_id         = "my-project"
  zone               = "europe-west8-b"
  name               = "cos-nva"
  network_interfaces = local.network_interfaces
  metadata = {
    user-data              = module.cos-nva.cloud_config
    google-logging-enabled = true
  }
  boot_disk = {
    image = "projects/cos-cloud/global/images/family/cos-stable"
    type  = "pd-ssd"
    size  = 10
  }
  tags = ["nva", "ssh"]
}
# tftest modules=1 resources=1 files=frr_conf

Variables

name description type required default
network_interfaces Network interfaces configuration. list(object({…}))
cloud_config Cloud config template path. If null default will be used. string null
enable_health_checks Configures routing to enable responses to health check probes. bool false
files Map of extra files to create on the instance, path as key. Owner and permissions will use defaults if null. map(object({…})) {}
frr_config FRR configuration for container running on the NVA. object({…}) null
optional_run_cmds Optional Cloud Init run commands to execute. list(string) []

Outputs

name description sensitive
cloud_config Rendered cloud-config file to be passed as user-data instance metadata.