refactor(terraform): 3n_aws_c5n
[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 resource "tls_private_key" "private_key" {
63   algorithm   = var.private_key_algorithm
64   ecdsa_curve = var.private_key_ecdsa_curve
65   rsa_bits    = var.private_key_rsa_bits
66 }
67
68 # Create Key Pair
69 resource "aws_key_pair" "key_pair" {
70   depends_on = [
71     tls_private_key.private_key
72   ]
73   key_name   = local.key_pair_key_name
74   public_key = tls_private_key.private_key.public_key_openssh
75 }
76
77 # Create Placement Group
78 resource "aws_placement_group" "placement_group" {
79   name     = local.placement_group_name
80   strategy = var.placement_group_strategy
81 }
82
83 # Create Instance
84 resource "aws_instance" "tg" {
85   depends_on = [
86     module.vpc,
87     aws_placement_group.placement_group
88   ]
89   ami                                  = var.tg_ami
90   availability_zone                    = local.availability_zone
91   associate_public_ip_address          = var.tg_associate_public_ip_address
92   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
93   instance_type                        = var.tg_instance_type
94   key_name                             = aws_key_pair.key_pair.key_name
95   placement_group                      = aws_placement_group.placement_group.id
96   private_ip                           = var.tg_private_ip
97   source_dest_check                    = var.tg_source_dest_check
98   subnet_id                            = module.vpc.vpc_subnet_id
99   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
100   # host_id                            = "1"
101
102   root_block_device {
103     delete_on_termination = true
104     volume_size           = 50
105   }
106
107   tags = {
108     "Name"        = local.tg_name
109     "Environment" = local.environment
110   }
111 }
112
113 resource "aws_network_interface" "tg_if1" {
114   depends_on = [
115     module.subnet_b,
116     aws_instance.tg
117   ]
118   private_ip        = var.tg_if1_private_ip
119   private_ips       = [var.tg_if1_private_ip]
120   security_groups   = [module.vpc.vpc_security_group_id]
121   source_dest_check = var.tg_source_dest_check
122   subnet_id         = module.subnet_b.subnet_id
123
124   attachment {
125     instance     = aws_instance.tg.id
126     device_index = 1
127   }
128
129   tags = {
130     "Name"        = local.tg_name
131     "Environment" = local.environment
132   }
133 }
134
135 resource "aws_network_interface" "tg_if2" {
136   depends_on = [
137     module.subnet_d,
138     aws_instance.tg
139   ]
140   private_ips       = [var.tg_if2_private_ip]
141   security_groups   = [module.vpc.vpc_security_group_id]
142   source_dest_check = var.tg_source_dest_check
143   subnet_id         = module.subnet_d.subnet_id
144
145   attachment {
146     instance     = aws_instance.tg.id
147     device_index = 2
148   }
149
150   tags = {
151     "Name"        = local.tg_name
152     "Environment" = local.environment
153   }
154 }
155
156 data "aws_network_interface" "tg_if1" {
157   id = aws_network_interface.tg_if1.id
158 }
159
160 data "aws_network_interface" "tg_if2" {
161   id = aws_network_interface.tg_if2.id
162 }
163
164 resource "aws_route" "route_tg_if1" {
165   depends_on = [
166     aws_instance.tg
167   ]
168   destination_cidr_block = var.destination_cidr_block_tg_if1
169   network_interface_id   = aws_instance.tg.primary_network_interface_id
170   route_table_id         = module.vpc.vpc_main_route_table_id
171 }
172
173 resource "aws_route" "route_tg_if2" {
174   depends_on = [
175     aws_instance.tg
176   ]
177   destination_cidr_block = var.destination_cidr_block_tg_if2
178   network_interface_id   = aws_instance.tg.primary_network_interface_id
179   route_table_id         = module.vpc.vpc_main_route_table_id
180 }
181
182 resource "aws_instance" "sut1" {
183   depends_on = [
184     module.vpc,
185     aws_placement_group.placement_group
186   ]
187   ami                                  = var.sut1_ami
188   availability_zone                    = local.availability_zone
189   associate_public_ip_address          = var.sut1_associate_public_ip_address
190   instance_initiated_shutdown_behavior = var.sut1_instance_initiated_shutdown_behavior
191   instance_type                        = var.sut1_instance_type
192   key_name                             = aws_key_pair.key_pair.key_name
193   placement_group                      = aws_placement_group.placement_group.id
194   private_ip                           = var.sut1_private_ip
195   source_dest_check                    = var.sut1_source_dest_check
196   subnet_id                            = module.vpc.vpc_subnet_id
197   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
198   # host_id                            = "2"
199
200   root_block_device {
201     delete_on_termination = true
202     volume_size           = 50
203   }
204
205   tags = {
206     "Name"        = local.sut1_name
207     "Environment" = local.environment
208   }
209 }
210
211 resource "aws_network_interface" "sut1_if1" {
212   depends_on = [
213     module.subnet_b,
214     aws_instance.sut1
215   ]
216   private_ips       = [var.sut1_if1_private_ip]
217   security_groups   = [module.vpc.vpc_security_group_id]
218   source_dest_check = var.sut1_source_dest_check
219   subnet_id         = module.subnet_b.subnet_id
220
221   attachment {
222     instance     = aws_instance.sut1.id
223     device_index = 1
224   }
225
226   tags = {
227     "Name"        = local.sut1_name
228     "Environment" = local.environment
229   }
230 }
231
232 resource "aws_network_interface" "sut1_if2" {
233   depends_on = [
234     module.subnet_c,
235     aws_instance.sut1
236   ]
237   private_ips       = [var.sut1_if2_private_ip]
238   security_groups   = [module.vpc.vpc_security_group_id]
239   source_dest_check = var.sut1_source_dest_check
240   subnet_id         = module.subnet_c.subnet_id
241
242   attachment {
243     instance     = aws_instance.sut1.id
244     device_index = 2
245   }
246
247   tags = {
248     "Name"        = local.sut1_name
249     "Environment" = local.environment
250   }
251 }
252
253 data "aws_network_interface" "sut1_if1" {
254   id = aws_network_interface.sut1_if1.id
255 }
256
257 data "aws_network_interface" "sut1_if2" {
258   id = aws_network_interface.sut1_if2.id
259 }
260
261 resource "aws_instance" "sut2" {
262   depends_on = [
263     module.vpc,
264     aws_placement_group.placement_group
265   ]
266   ami                                  = var.sut2_ami
267   availability_zone                    = local.availability_zone
268   associate_public_ip_address          = var.sut2_associate_public_ip_address
269   instance_initiated_shutdown_behavior = var.sut2_instance_initiated_shutdown_behavior
270   instance_type                        = var.sut2_instance_type
271   key_name                             = aws_key_pair.key_pair.key_name
272   placement_group                      = aws_placement_group.placement_group.id
273   private_ip                           = var.sut2_private_ip
274   source_dest_check                    = var.sut2_source_dest_check
275   subnet_id                            = module.vpc.vpc_subnet_id
276   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
277   # host_id                            = "2"
278
279   root_block_device {
280     delete_on_termination = true
281     volume_size           = 50
282   }
283
284   tags = {
285     "Name"        = local.sut2_name
286     "Environment" = local.environment
287   }
288 }
289
290 resource "aws_network_interface" "sut2_if1" {
291   depends_on = [
292     module.subnet_c,
293     aws_instance.sut2
294   ]
295   private_ips       = [var.sut2_if1_private_ip]
296   security_groups   = [module.vpc.vpc_security_group_id]
297   source_dest_check = var.sut2_source_dest_check
298   subnet_id         = module.subnet_c.subnet_id
299
300   attachment {
301     instance     = aws_instance.sut2.id
302     device_index = 1
303   }
304
305   tags = {
306     "Name"        = local.sut2_name
307     "Environment" = local.environment
308   }
309 }
310
311 resource "aws_network_interface" "sut2_if2" {
312   depends_on = [
313     module.subnet_d,
314     aws_instance.sut2
315   ]
316   private_ips       = [var.sut2_if2_private_ip]
317   security_groups   = [module.vpc.vpc_security_group_id]
318   source_dest_check = var.sut2_source_dest_check
319   subnet_id         = module.subnet_d.subnet_id
320
321   attachment {
322     instance     = aws_instance.sut2.id
323     device_index = 2
324   }
325
326   tags = {
327     "Name"        = local.sut2_name
328     "Environment" = local.environment
329   }
330 }
331
332 data "aws_network_interface" "sut2_if1" {
333   id = aws_network_interface.sut2_if1.id
334 }
335
336 data "aws_network_interface" "sut2_if2" {
337   id = aws_network_interface.sut2_if2.id
338 }
339
340 resource "null_resource" "deploy_tg" {
341   depends_on = [
342     aws_instance.tg,
343     aws_network_interface.tg_if1,
344     aws_network_interface.tg_if2,
345     aws_instance.sut1,
346     aws_network_interface.sut1_if1,
347     aws_network_interface.sut1_if2,
348     aws_instance.sut2,
349     aws_network_interface.sut2_if1,
350     aws_network_interface.sut2_if2
351   ]
352
353   connection {
354     user        = "ubuntu"
355     host        = aws_instance.tg.public_ip
356     private_key = tls_private_key.private_key.private_key_pem
357   }
358
359   provisioner "remote-exec" {
360     inline = var.first_run_commands
361   }
362 }
363
364 resource "null_resource" "deploy_sut1" {
365   depends_on = [
366     aws_instance.tg,
367     aws_network_interface.tg_if1,
368     aws_network_interface.tg_if2,
369     aws_instance.sut1,
370     aws_network_interface.sut1_if1,
371     aws_network_interface.sut1_if2,
372     aws_instance.sut2,
373     aws_network_interface.sut2_if1,
374     aws_network_interface.sut2_if2
375   ]
376
377   connection {
378     user        = "ubuntu"
379     host        = aws_instance.sut1.public_ip
380     private_key = tls_private_key.private_key.private_key_pem
381   }
382
383   provisioner "remote-exec" {
384     inline = var.first_run_commands
385   }
386 }
387
388 resource "null_resource" "deploy_sut2" {
389   depends_on = [
390     aws_instance.tg,
391     aws_network_interface.tg_if1,
392     aws_network_interface.tg_if2,
393     aws_instance.sut1,
394     aws_network_interface.sut1_if1,
395     aws_network_interface.sut1_if2,
396     aws_instance.sut2,
397     aws_network_interface.sut2_if1,
398     aws_network_interface.sut2_if2
399   ]
400
401   connection {
402     user        = "ubuntu"
403     host        = aws_instance.sut2.public_ip
404     private_key = tls_private_key.private_key.private_key_pem
405   }
406
407   provisioner "remote-exec" {
408     inline = var.first_run_commands
409   }
410 }
411
412 resource "null_resource" "deploy_topology" {
413   depends_on = [
414     aws_instance.tg,
415     aws_instance.sut1,
416     aws_instance.sut2
417   ]
418
419   provisioner "ansible" {
420     plays {
421       playbook {
422         file_path = var.ansible_topology_path
423       }
424       hosts = ["local"]
425       extra_vars = {
426         ansible_python_interpreter = local.ansible_python_executable
427         testbed_name               = local.testbed_name
428         cloud_topology             = local.topology_name
429         tg_if1_mac                 = data.aws_network_interface.tg_if1.mac_address
430         tg_if2_mac                 = data.aws_network_interface.tg_if2.mac_address
431         dut1_if1_mac               = data.aws_network_interface.sut1_if1.mac_address
432         dut1_if2_mac               = data.aws_network_interface.sut1_if2.mac_address
433         dut2_if1_mac               = data.aws_network_interface.sut2_if1.mac_address
434         dut2_if2_mac               = data.aws_network_interface.sut2_if2.mac_address
435         tg_public_ip               = aws_instance.tg.public_ip
436         dut1_public_ip             = aws_instance.sut1.public_ip
437         dut2_public_ip             = aws_instance.sut2.public_ip
438         public_ip_list             = "${aws_instance.tg.public_ip},${aws_instance.sut1.public_ip},${aws_instance.sut2.public_ip}"
439       }
440     }
441   }
442 }