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