Revert "fix(jobspec): Delete ipsec nfv density tests"
[csit.git] / fdio.infra.terraform / terraform-aws-3n-aws-c5n / main.tf
1 data "vault_aws_access_credentials" "creds" {
2   backend = "${var.vault-name}-path"
3   role    = "${var.vault-name}-role"
4 }
5
6 locals {
7   ansible_python_executable = "/usr/bin/python3"
8   availability_zone         = "eu-central-1a"
9   name                      = "csit-vpc"
10   environment               = "csit-vpc-environment"
11   key_pair_key_name         = "${var.resource_prefix}-${var.testbed_name}-pk"
12   placement_group_name      = "${var.resource_prefix}-${var.testbed_name}-pg"
13   security_group_name       = "${var.resource_prefix}-${var.testbed_name}-sg"
14   testbed_name              = "testbed1"
15   topology_name             = "3n-aws-c5n"
16   tg_name                   = "${var.resource_prefix}-${var.testbed_name}-tg"
17   sut1_name                 = "${var.resource_prefix}-${var.testbed_name}-sut1"
18   sut2_name                 = "${var.resource_prefix}-${var.testbed_name}-sut2"
19 }
20
21 # Create VPC
22 module "vpc" {
23   source                   = "../terraform-aws-vpc"
24   security_group_name      = local.security_group_name
25   subnet_availability_zone = local.availability_zone
26   tags_name                = local.name
27   tags_environment         = local.environment
28 }
29
30 # Create Subnet
31 module "subnet_b" {
32   source                   = "../terraform-aws-subnet"
33   subnet_cidr_block        = "192.168.10.0/24"
34   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 2)
35   subnet_availability_zone = local.availability_zone
36   tags_name                = local.name
37   tags_environment         = local.environment
38   subnet_vpc_id            = module.vpc.vpc_id
39 }
40
41 module "subnet_c" {
42   source                   = "../terraform-aws-subnet"
43   subnet_cidr_block        = "200.0.0.0/24"
44   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 3)
45   subnet_availability_zone = local.availability_zone
46   tags_name                = local.name
47   tags_environment         = local.environment
48   subnet_vpc_id            = module.vpc.vpc_id
49 }
50
51 module "subnet_d" {
52   source                   = "../terraform-aws-subnet"
53   subnet_cidr_block        = "192.168.20.0/24"
54   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 4)
55   subnet_availability_zone = local.availability_zone
56   tags_name                = local.name
57   tags_environment         = local.environment
58   subnet_vpc_id            = module.vpc.vpc_id
59 }
60
61 # Create Private Key
62 module "private_key" {
63   source  = "pmikus/private-key/tls"
64   version = "4.0.4"
65
66   private_key_algorithm = var.private_key_algorithm
67 }
68
69 # Create Key Pair
70 module "key_pair" {
71   source  = "pmikus/key-pair/aws"
72   version = "5.7.0"
73
74   key_pair_key_name   = local.key_pair_key_name
75   key_pair_public_key = module.private_key.public_key_openssh
76
77   key_pair_tags = {
78     "Environment" = local.environment
79   }
80 }
81
82 # Create Placement Group
83 resource "aws_placement_group" "placement_group" {
84   name     = local.placement_group_name
85   strategy = var.placement_group_strategy
86 }
87
88 # Create Instance
89 resource "aws_instance" "tg" {
90   depends_on = [
91     module.vpc,
92     aws_placement_group.placement_group
93   ]
94   ami                                  = var.tg_ami
95   availability_zone                    = local.availability_zone
96   associate_public_ip_address          = var.tg_associate_public_ip_address
97   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
98   instance_type                        = var.tg_instance_type
99   key_name                             = module.key_pair.key_pair_key_name
100   placement_group                      = aws_placement_group.placement_group.id
101   private_ip                           = var.tg_private_ip
102   source_dest_check                    = var.tg_source_dest_check
103   subnet_id                            = module.vpc.vpc_subnet_id
104   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
105   # host_id                            = "1"
106
107   root_block_device {
108     delete_on_termination = true
109     volume_size           = 50
110   }
111
112   tags = {
113     "Name"        = local.tg_name
114     "Environment" = local.environment
115   }
116 }
117
118 resource "aws_network_interface" "tg_if1" {
119   depends_on = [
120     module.subnet_b,
121     aws_instance.tg
122   ]
123   private_ip        = var.tg_if1_private_ip
124   private_ips       = [var.tg_if1_private_ip]
125   security_groups   = [module.vpc.vpc_security_group_id]
126   source_dest_check = var.tg_source_dest_check
127   subnet_id         = module.subnet_b.subnet_id
128
129   attachment {
130     instance     = aws_instance.tg.id
131     device_index = 1
132   }
133
134   tags = {
135     "Name"        = local.tg_name
136     "Environment" = local.environment
137   }
138 }
139
140 resource "aws_network_interface" "tg_if2" {
141   depends_on = [
142     module.subnet_d,
143     aws_instance.tg
144   ]
145   private_ips       = [var.tg_if2_private_ip]
146   security_groups   = [module.vpc.vpc_security_group_id]
147   source_dest_check = var.tg_source_dest_check
148   subnet_id         = module.subnet_d.subnet_id
149
150   attachment {
151     instance     = aws_instance.tg.id
152     device_index = 2
153   }
154
155   tags = {
156     "Name"        = local.tg_name
157     "Environment" = local.environment
158   }
159 }
160
161 data "aws_network_interface" "tg_if1" {
162   id = aws_network_interface.tg_if1.id
163 }
164
165 data "aws_network_interface" "tg_if2" {
166   id = aws_network_interface.tg_if2.id
167 }
168
169 resource "aws_route" "route_tg_if1" {
170   depends_on = [
171     aws_instance.tg
172   ]
173   destination_cidr_block = var.destination_cidr_block_tg_if1
174   network_interface_id   = aws_instance.tg.primary_network_interface_id
175   route_table_id         = module.vpc.vpc_main_route_table_id
176 }
177
178 resource "aws_route" "route_tg_if2" {
179   depends_on = [
180     aws_instance.tg
181   ]
182   destination_cidr_block = var.destination_cidr_block_tg_if2
183   network_interface_id   = aws_instance.tg.primary_network_interface_id
184   route_table_id         = module.vpc.vpc_main_route_table_id
185 }
186
187 resource "aws_instance" "sut1" {
188   depends_on = [
189     module.vpc,
190     aws_placement_group.placement_group
191   ]
192   ami                                  = var.sut1_ami
193   availability_zone                    = local.availability_zone
194   associate_public_ip_address          = var.sut1_associate_public_ip_address
195   instance_initiated_shutdown_behavior = var.sut1_instance_initiated_shutdown_behavior
196   instance_type                        = var.sut1_instance_type
197   key_name                             = module.key_pair.key_pair_key_name
198   placement_group                      = aws_placement_group.placement_group.id
199   private_ip                           = var.sut1_private_ip
200   source_dest_check                    = var.sut1_source_dest_check
201   subnet_id                            = module.vpc.vpc_subnet_id
202   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
203   # host_id                            = "2"
204
205   root_block_device {
206     delete_on_termination = true
207     volume_size           = 50
208   }
209
210   tags = {
211     "Name"        = local.sut1_name
212     "Environment" = local.environment
213   }
214 }
215
216 resource "aws_network_interface" "sut1_if1" {
217   depends_on = [
218     module.subnet_b,
219     aws_instance.sut1
220   ]
221   private_ips       = [var.sut1_if1_private_ip]
222   security_groups   = [module.vpc.vpc_security_group_id]
223   source_dest_check = var.sut1_source_dest_check
224   subnet_id         = module.subnet_b.subnet_id
225
226   attachment {
227     instance     = aws_instance.sut1.id
228     device_index = 1
229   }
230
231   tags = {
232     "Name"        = local.sut1_name
233     "Environment" = local.environment
234   }
235 }
236
237 resource "aws_network_interface" "sut1_if2" {
238   depends_on = [
239     module.subnet_c,
240     aws_instance.sut1
241   ]
242   private_ips       = [var.sut1_if2_private_ip]
243   security_groups   = [module.vpc.vpc_security_group_id]
244   source_dest_check = var.sut1_source_dest_check
245   subnet_id         = module.subnet_c.subnet_id
246
247   attachment {
248     instance     = aws_instance.sut1.id
249     device_index = 2
250   }
251
252   tags = {
253     "Name"        = local.sut1_name
254     "Environment" = local.environment
255   }
256 }
257
258 data "aws_network_interface" "sut1_if1" {
259   id = aws_network_interface.sut1_if1.id
260 }
261
262 data "aws_network_interface" "sut1_if2" {
263   id = aws_network_interface.sut1_if2.id
264 }
265
266 resource "aws_instance" "sut2" {
267   depends_on = [
268     module.vpc,
269     aws_placement_group.placement_group
270   ]
271   ami                                  = var.sut2_ami
272   availability_zone                    = local.availability_zone
273   associate_public_ip_address          = var.sut2_associate_public_ip_address
274   instance_initiated_shutdown_behavior = var.sut2_instance_initiated_shutdown_behavior
275   instance_type                        = var.sut2_instance_type
276   key_name                             = module.key_pair.key_pair_key_name
277   placement_group                      = aws_placement_group.placement_group.id
278   private_ip                           = var.sut2_private_ip
279   source_dest_check                    = var.sut2_source_dest_check
280   subnet_id                            = module.vpc.vpc_subnet_id
281   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
282   # host_id                            = "2"
283
284   root_block_device {
285     delete_on_termination = true
286     volume_size           = 50
287   }
288
289   tags = {
290     "Name"        = local.sut2_name
291     "Environment" = local.environment
292   }
293 }
294
295 resource "aws_network_interface" "sut2_if1" {
296   depends_on = [
297     module.subnet_c,
298     aws_instance.sut2
299   ]
300   private_ips       = [var.sut2_if1_private_ip]
301   security_groups   = [module.vpc.vpc_security_group_id]
302   source_dest_check = var.sut2_source_dest_check
303   subnet_id         = module.subnet_c.subnet_id
304
305   attachment {
306     instance     = aws_instance.sut2.id
307     device_index = 1
308   }
309
310   tags = {
311     "Name"        = local.sut2_name
312     "Environment" = local.environment
313   }
314 }
315
316 resource "aws_network_interface" "sut2_if2" {
317   depends_on = [
318     module.subnet_d,
319     aws_instance.sut2
320   ]
321   private_ips       = [var.sut2_if2_private_ip]
322   security_groups   = [module.vpc.vpc_security_group_id]
323   source_dest_check = var.sut2_source_dest_check
324   subnet_id         = module.subnet_d.subnet_id
325
326   attachment {
327     instance     = aws_instance.sut2.id
328     device_index = 2
329   }
330
331   tags = {
332     "Name"        = local.sut2_name
333     "Environment" = local.environment
334   }
335 }
336
337 data "aws_network_interface" "sut2_if1" {
338   id = aws_network_interface.sut2_if1.id
339 }
340
341 data "aws_network_interface" "sut2_if2" {
342   id = aws_network_interface.sut2_if2.id
343 }
344
345 resource "null_resource" "deploy_tg" {
346   depends_on = [
347     aws_instance.tg,
348     aws_network_interface.tg_if1,
349     aws_network_interface.tg_if2,
350     aws_instance.sut1,
351     aws_network_interface.sut1_if1,
352     aws_network_interface.sut1_if2,
353     aws_instance.sut2,
354     aws_network_interface.sut2_if1,
355     aws_network_interface.sut2_if2
356   ]
357
358   connection {
359     user        = "ubuntu"
360     host        = aws_instance.tg.public_ip
361     private_key = module.private_key.private_key_pem
362   }
363
364   provisioner "remote-exec" {
365     inline = var.first_run_commands
366   }
367 }
368
369 resource "null_resource" "deploy_sut1" {
370   depends_on = [
371     aws_instance.tg,
372     aws_network_interface.tg_if1,
373     aws_network_interface.tg_if2,
374     aws_instance.sut1,
375     aws_network_interface.sut1_if1,
376     aws_network_interface.sut1_if2,
377     aws_instance.sut2,
378     aws_network_interface.sut2_if1,
379     aws_network_interface.sut2_if2
380   ]
381
382   connection {
383     user        = "ubuntu"
384     host        = aws_instance.sut1.public_ip
385     private_key = module.private_key.private_key_pem
386   }
387
388   provisioner "remote-exec" {
389     inline = var.first_run_commands
390   }
391 }
392
393 resource "null_resource" "deploy_sut2" {
394   depends_on = [
395     aws_instance.tg,
396     aws_network_interface.tg_if1,
397     aws_network_interface.tg_if2,
398     aws_instance.sut1,
399     aws_network_interface.sut1_if1,
400     aws_network_interface.sut1_if2,
401     aws_instance.sut2,
402     aws_network_interface.sut2_if1,
403     aws_network_interface.sut2_if2
404   ]
405
406   connection {
407     user        = "ubuntu"
408     host        = aws_instance.sut2.public_ip
409     private_key = module.private_key.private_key_pem
410   }
411
412   provisioner "remote-exec" {
413     inline = var.first_run_commands
414   }
415 }
416
417 resource "local_file" "topology_file" {
418   depends_on = [
419     aws_instance.tg,
420     aws_instance.sut1,
421     aws_instance.sut2
422   ]
423
424   content = templatefile(
425     "${path.module}/topology-${local.topology_name}.tftpl",
426     {
427       tg_if1_mac     = data.aws_network_interface.tg_if1.mac_address
428       tg_if2_mac     = data.aws_network_interface.tg_if2.mac_address
429       dut1_if1_mac   = data.aws_network_interface.sut1_if1.mac_address
430       dut1_if2_mac   = data.aws_network_interface.sut1_if2.mac_address
431       dut2_if1_mac   = data.aws_network_interface.sut2_if1.mac_address
432       dut2_if2_mac   = data.aws_network_interface.sut2_if2.mac_address
433       tg_public_ip   = aws_instance.tg.public_ip
434       dut1_public_ip = aws_instance.sut1.public_ip
435       dut2_public_ip = aws_instance.sut2.public_ip
436     }
437   )
438   filename = "${path.module}/../../topologies/available/${local.topology_name}-${local.testbed_name}.yaml"
439 }
440
441 resource "local_file" "hosts" {
442   depends_on = [
443     aws_instance.tg,
444     aws_instance.sut1,
445     aws_instance.sut2
446   ]
447
448   content = templatefile(
449     "${path.module}/hosts.tftpl",
450     {
451       tg_public_ip   = aws_instance.tg.public_ip
452       dut1_public_ip = aws_instance.sut1.public_ip
453       dut2_public_ip = aws_instance.sut2.public_ip
454     }
455   )
456   filename = "${path.module}/../../fdio.infra.ansible/inventories/cloud_inventory/hosts.yaml"
457 }