feat(bootstrap): Add ability to load external NODE_FLAVOR
[csit.git] / fdio.infra.terraform / terraform-openstack-2n / main.tf
1 locals {
2   image_name       = "Ubuntu 22.04.2 LTS"
3   image_source_url = "http://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img"
4   resource_prefix  = "csit-2n"
5   testbed_name     = "xu6n"
6   topology_name    = "2n"
7 }
8
9 # Create Cloud-Init config for TG.
10 data "template_cloudinit_config" "cloudinit_config_tg1" {
11   gzip          = false
12   base64_encode = false
13
14   part {
15     content_type = "text/cloud-config"
16     content = templatefile(
17       "${path.module}/user-data-tg1", {}
18     )
19   }
20 }
21
22 # Create Cloud-Init config for SUT1.
23 data "template_cloudinit_config" "cloudinit_config_sut1" {
24   gzip          = false
25   base64_encode = false
26
27   part {
28     content_type = "text/cloud-config"
29     content = templatefile(
30       "${path.module}/user-data-sut1", {}
31     )
32   }
33 }
34
35 # Create OpenStack Image.
36 module "openstack_images_image_v2" {
37   source  = "pmikus/images-image-v2/openstack"
38   version = "1.54.1"
39
40   image_source_url = local.image_source_url
41   name             = local.image_name
42 }
43
44 # Create OpenStack Keypair.
45 module "openstack_compute_keypair_v2" {
46   source  = "pmikus/compute-keypair-v2/openstack"
47   version = "1.54.1"
48
49   name = "${local.resource_prefix}-keypair"
50 }
51
52
53 # Create management port in dedicated subnet.
54 resource "openstack_networking_port_v2" "port_tg1_mgmt" {
55   admin_state_up = true
56   fixed_ip {
57     ip_address = "10.21.152.2"
58     subnet_id  = "b1f9573d-4c2e-45da-bbac-cb3f191ab0f5"
59   }
60   name                  = "${local.resource_prefix}-tg1-mgmt-port"
61   network_id            = var.network_id_mgmt
62   port_security_enabled = false
63
64   binding {
65     vnic_type = "normal"
66   }
67 }
68
69 # Create data port in dedicated subnet.
70 resource "openstack_networking_port_v2" "port_tg1_data1" {
71   admin_state_up        = false
72   name                  = "${local.resource_prefix}-tg1-data1-port"
73   network_id            = var.network_id_data
74   port_security_enabled = false
75
76   binding {
77     vnic_type = "direct"
78   }
79 }
80
81 # Create data port in dedicated subnet.
82 resource "openstack_networking_port_v2" "port_tg1_data2" {
83   admin_state_up        = false
84   name                  = "${local.resource_prefix}-tg1-data2-port"
85   network_id            = var.network_id_data
86   port_security_enabled = false
87
88   binding {
89     vnic_type = "direct"
90   }
91 }
92
93 # Create TG instance.
94 module "tg1" {
95   depends_on = [
96     module.openstack_compute_keypair_v2,
97     module.openstack_images_image_v2
98   ]
99
100   source  = "pmikus/compute-instance-v2/openstack"
101   version = "1.54.1"
102
103   flavour_name = var.flavour_name
104   image_id     = module.openstack_images_image_v2.id
105   key_pair     = module.openstack_compute_keypair_v2.name
106   name         = "${local.resource_prefix}-tg1"
107   networks = {
108     "platform-shared-port"  = openstack_networking_port_v2.port_tg1_mgmt.id
109     "data-playground-port1" = openstack_networking_port_v2.port_tg1_data1.id
110     "data-playground-port2" = openstack_networking_port_v2.port_tg1_data2.id
111   }
112   user_data = data.template_cloudinit_config.cloudinit_config_tg1.rendered
113 }
114
115 # Create management port in dedicated subnet.
116 resource "openstack_networking_port_v2" "port_sut1_mgmt" {
117   admin_state_up = true
118   fixed_ip {
119     ip_address = "10.21.152.3"
120     subnet_id  = "b1f9573d-4c2e-45da-bbac-cb3f191ab0f5"
121   }
122   name                  = "${local.resource_prefix}-sut1-mgmt-port"
123   network_id            = var.network_id_mgmt
124   port_security_enabled = false
125
126   binding {
127     vnic_type = "normal"
128   }
129 }
130
131 # Create data port in dedicated subnet.
132 resource "openstack_networking_port_v2" "port_sut1_data1" {
133   admin_state_up        = false
134   name                  = "${local.resource_prefix}-sut1-data1-port"
135   network_id            = var.network_id_data
136   port_security_enabled = false
137
138   binding {
139     vnic_type = "direct"
140   }
141 }
142
143 # Create data port in dedicated subnet.
144 resource "openstack_networking_port_v2" "port_sut1_data2" {
145   admin_state_up        = false
146   name                  = "${local.resource_prefix}-sut1-data2-port"
147   network_id            = var.network_id_data
148   port_security_enabled = false
149
150   binding {
151     vnic_type = "direct"
152   }
153 }
154
155 # Create SUT instance.
156 module "sut1" {
157   depends_on = [
158     module.openstack_compute_keypair_v2,
159     module.openstack_images_image_v2
160   ]
161
162   source  = "pmikus/compute-instance-v2/openstack"
163   version = "1.54.1"
164
165   flavour_name = var.flavour_name
166   image_id     = module.openstack_images_image_v2.id
167   key_pair     = module.openstack_compute_keypair_v2.name
168   name         = "${local.resource_prefix}-sut1"
169   networks = {
170     "platform-shared-port"  = openstack_networking_port_v2.port_sut1_mgmt.id
171     "data-playground-port1" = openstack_networking_port_v2.port_sut1_data1.id
172     "data-playground-port2" = openstack_networking_port_v2.port_sut1_data2.id
173   }
174   user_data = data.template_cloudinit_config.cloudinit_config_sut1.rendered
175 }
176
177 resource "local_file" "topology_file" {
178   depends_on = [
179     module.tg1,
180     module.sut1
181   ]
182
183   content = templatefile(
184     "${path.module}/topology-${local.topology_name}.tftpl",
185     {
186       tg_if1_mac     = openstack_networking_port_v2.port_tg1_data1.mac_address
187       tg_if2_mac     = openstack_networking_port_v2.port_tg1_data2.mac_address
188       dut1_if1_mac   = openstack_networking_port_v2.port_sut1_data1.mac_address
189       dut1_if2_mac   = openstack_networking_port_v2.port_sut1_data2.mac_address
190       tg_public_ip   = openstack_networking_port_v2.port_tg1_mgmt.fixed_ip[0].ip_address
191       dut1_public_ip = openstack_networking_port_v2.port_sut1_mgmt.fixed_ip[0].ip_address
192     }
193   )
194   filename = "${path.module}/${local.topology_name}-x-${local.testbed_name}.yaml"
195 }
196
197 resource "local_file" "hosts" {
198   depends_on = [
199     module.tg1,
200     module.sut1
201   ]
202
203   content = templatefile(
204     "${path.module}/hosts.tftpl",
205     {
206       tg_public_ip   = openstack_networking_port_v2.port_tg1_mgmt.fixed_ip[0].ip_address
207       dut1_public_ip = openstack_networking_port_v2.port_sut1_mgmt.fixed_ip[0].ip_address
208     }
209   )
210   filename = "${path.module}/hosts.yaml"
211 }