fix(terraform): AWS alignments
[csit.git] / fdio.infra.terraform / terraform-aws-2n-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             = "2n-aws-c5n"
16   tg_name                   = "${var.resource_prefix}-${var.testbed_name}-tg"
17   sut1_name                 = "${var.resource_prefix}-${var.testbed_name}-sut1"
18 }
19
20 # Create VPC
21 module "vpc" {
22   source                   = "../terraform-aws-vpc"
23   security_group_name      = local.security_group_name
24   subnet_availability_zone = local.availability_zone
25   tags_name                = local.name
26   tags_environment         = local.environment
27   vpc_enable_dns_hostnames = false
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_d" {
42   source                   = "../terraform-aws-subnet"
43   subnet_cidr_block        = "192.168.20.0/24"
44   subnet_ipv6_cidr_block   = cidrsubnet(module.vpc.vpc_ipv6_cidr_block, 8, 4)
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 # Create Private Key
52 resource "tls_private_key" "private_key" {
53   algorithm   = var.private_key_algorithm
54   ecdsa_curve = var.private_key_ecdsa_curve
55   rsa_bits    = var.private_key_rsa_bits
56 }
57
58 # Create Key Pair
59 resource "aws_key_pair" "key_pair" {
60   depends_on = [
61     tls_private_key.private_key
62   ]
63   key_name   = local.key_pair_key_name
64   public_key = tls_private_key.private_key.public_key_openssh
65 }
66
67 # Create Placement Group
68 resource "aws_placement_group" "placement_group" {
69   name     = local.placement_group_name
70   strategy = var.placement_group_strategy
71 }
72
73 # Create Instance
74 resource "aws_instance" "tg" {
75   depends_on = [
76     module.vpc,
77     aws_placement_group.placement_group
78   ]
79   ami                                  = var.tg_ami
80   availability_zone                    = local.availability_zone
81   associate_public_ip_address          = var.tg_associate_public_ip_address
82   instance_initiated_shutdown_behavior = var.tg_instance_initiated_shutdown_behavior
83   instance_type                        = var.tg_instance_type
84   key_name                             = aws_key_pair.key_pair.key_name
85   placement_group                      = aws_placement_group.placement_group.id
86   private_ip                           = var.tg_private_ip
87   source_dest_check                    = var.tg_source_dest_check
88   subnet_id                            = module.vpc.vpc_subnet_id
89   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
90   # host_id                            = "1"
91
92   root_block_device {
93     delete_on_termination = true
94     volume_size           = 50
95   }
96
97   tags = {
98     "Name"        = local.tg_name
99     "Environment" = local.environment
100   }
101 }
102
103 resource "aws_network_interface" "tg_if1" {
104   depends_on = [
105     module.subnet_b,
106     aws_instance.tg
107   ]
108   private_ip        = var.tg_if1_private_ip
109   private_ips       = [var.tg_if1_private_ip]
110   security_groups   = [module.vpc.vpc_security_group_id]
111   source_dest_check = var.tg_source_dest_check
112   subnet_id         = module.subnet_b.subnet_id
113
114   attachment {
115     instance     = aws_instance.tg.id
116     device_index = 1
117   }
118
119   tags = {
120     "Name"        = local.tg_name
121     "Environment" = local.environment
122   }
123 }
124
125 resource "aws_network_interface" "tg_if2" {
126   depends_on = [
127     module.subnet_d,
128     aws_instance.tg
129   ]
130   private_ip        = var.tg_if2_private_ip
131   private_ips       = [var.tg_if2_private_ip]
132   security_groups   = [module.vpc.vpc_security_group_id]
133   source_dest_check = var.tg_source_dest_check
134   subnet_id         = module.subnet_d.subnet_id
135
136   attachment {
137     instance     = aws_instance.tg.id
138     device_index = 2
139   }
140
141   tags = {
142     "Name"        = local.tg_name
143     "Environment" = local.environment
144   }
145 }
146
147 data "aws_network_interface" "tg_if1" {
148   id = aws_network_interface.tg_if1.id
149 }
150
151 data "aws_network_interface" "tg_if2" {
152   id = aws_network_interface.tg_if2.id
153 }
154
155 resource "aws_route" "route_tg_if1" {
156   depends_on = [
157     aws_instance.tg
158   ]
159   destination_cidr_block = var.destination_cidr_block_tg_if1
160   network_interface_id   = aws_instance.tg.primary_network_interface_id
161   route_table_id         = module.vpc.vpc_main_route_table_id
162 }
163
164 resource "aws_route" "route_tg_if2" {
165   depends_on = [
166     aws_instance.tg
167   ]
168   destination_cidr_block = var.destination_cidr_block_tg_if2
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_instance" "sut1" {
174   depends_on = [
175     module.vpc,
176     aws_placement_group.placement_group
177   ]
178   ami                                  = var.sut1_ami
179   availability_zone                    = local.availability_zone
180   associate_public_ip_address          = var.sut1_associate_public_ip_address
181   instance_initiated_shutdown_behavior = var.sut1_instance_initiated_shutdown_behavior
182   instance_type                        = var.sut1_instance_type
183   key_name                             = aws_key_pair.key_pair.key_name
184   placement_group                      = aws_placement_group.placement_group.id
185   private_ip                           = var.sut1_private_ip
186   source_dest_check                    = var.sut1_source_dest_check
187   subnet_id                            = module.vpc.vpc_subnet_id
188   vpc_security_group_ids               = [module.vpc.vpc_security_group_id]
189   # host_id                            = "2"
190
191   root_block_device {
192     delete_on_termination = true
193     volume_size           = 50
194   }
195
196   tags = {
197     "Name"        = local.sut1_name
198     "Environment" = local.environment
199   }
200 }
201
202 resource "aws_network_interface" "sut1_if1" {
203   depends_on = [
204     module.subnet_b,
205     aws_instance.sut1
206   ]
207   private_ip        = var.sut1_if1_private_ip
208   private_ips       = [var.sut1_if1_private_ip]
209   security_groups   = [module.vpc.vpc_security_group_id]
210   source_dest_check = var.sut1_source_dest_check
211   subnet_id         = module.subnet_b.subnet_id
212
213   attachment {
214     instance     = aws_instance.sut1.id
215     device_index = 1
216   }
217
218   tags = {
219     "Name"        = local.sut1_name
220     "Environment" = local.environment
221   }
222 }
223
224 resource "aws_network_interface" "sut1_if2" {
225   depends_on = [
226     module.subnet_d,
227     aws_instance.sut1
228   ]
229   private_ip        = var.sut1_if2_private_ip
230   private_ips       = [var.sut1_if2_private_ip]
231   security_groups   = [module.vpc.vpc_security_group_id]
232   source_dest_check = var.sut1_source_dest_check
233   subnet_id         = module.subnet_d.subnet_id
234
235   attachment {
236     instance     = aws_instance.sut1.id
237     device_index = 2
238   }
239
240   tags = {
241     "Name"        = local.sut1_name
242     "Environment" = local.environment
243   }
244 }
245
246 data "aws_network_interface" "sut1_if1" {
247   id = aws_network_interface.sut1_if1.id
248 }
249
250 data "aws_network_interface" "sut1_if2" {
251   id = aws_network_interface.sut1_if2.id
252 }
253
254 resource "null_resource" "deploy_tg" {
255   depends_on = [
256     aws_instance.tg,
257     aws_network_interface.tg_if1,
258     aws_network_interface.tg_if2,
259     aws_instance.sut1,
260     aws_network_interface.sut1_if1,
261     aws_network_interface.sut1_if2
262   ]
263
264   connection {
265     user        = "ubuntu"
266     host        = aws_instance.tg.public_ip
267     private_key = tls_private_key.private_key.private_key_pem
268   }
269
270   provisioner "remote-exec" {
271     inline = var.first_run_commands
272   }
273 }
274
275 resource "null_resource" "deploy_sut1" {
276   depends_on = [
277     aws_instance.tg,
278     aws_network_interface.tg_if1,
279     aws_network_interface.tg_if2,
280     aws_instance.sut1,
281     aws_network_interface.sut1_if1,
282     aws_network_interface.sut1_if2
283   ]
284
285   connection {
286     user        = "ubuntu"
287     host        = aws_instance.sut1.public_ip
288     private_key = tls_private_key.private_key.private_key_pem
289   }
290
291   provisioner "remote-exec" {
292     inline = var.first_run_commands
293   }
294 }
295
296 resource "null_resource" "deploy_topology" {
297   depends_on = [
298     aws_instance.tg,
299     aws_instance.sut1
300   ]
301
302   provisioner "ansible" {
303     plays {
304       playbook {
305         file_path = var.ansible_topology_path
306       }
307       hosts = ["local"]
308       extra_vars = {
309         ansible_python_interpreter = local.ansible_python_executable
310         testbed_name               = local.testbed_name
311         cloud_topology             = local.topology_name
312         tg_if1_mac                 = data.aws_network_interface.tg_if1.mac_address
313         tg_if2_mac                 = data.aws_network_interface.tg_if2.mac_address
314         dut1_if1_mac               = data.aws_network_interface.sut1_if1.mac_address
315         dut1_if2_mac               = data.aws_network_interface.sut1_if2.mac_address
316         tg_public_ip               = aws_instance.tg.public_ip
317         dut1_public_ip             = aws_instance.sut1.public_ip
318         public_ip_list             = "${aws_instance.tg.public_ip},${aws_instance.sut1.public_ip}"
319       }
320     }
321   }
322 }