Infra: Vault
[csit.git] / fdio.infra.terraform / 2n_aws_c5n / deploy / main.tf
1 data "vault_aws_access_credentials" "creds" {
2   backend         = "${var.vault-name}-path"
3   role            = "${var.vault-name}-role"
4 }
5
6 resource "aws_vpc" "CSITVPC" {
7   cidr_block = var.vpc_cidr_mgmt
8
9   tags            = {
10     "Name"        = "${var.resources_name_prefix}_${var.testbed_name}-vpc"
11     "Environment" = var.environment_name
12   }
13 }
14
15 resource "aws_security_group" "CSITSG" {
16   name        = "${var.resources_name_prefix}_${var.testbed_name}-sg"
17   description = "Allow inbound traffic"
18   vpc_id      = aws_vpc.CSITVPC.id
19   depends_on  = [aws_vpc.CSITVPC]
20
21   ingress {
22     from_port   = 22
23     to_port     = 22
24     protocol    = "tcp"
25     cidr_blocks = ["0.0.0.0/0"]
26   }
27
28   ingress {
29     from_port = 0
30     to_port   = 0
31     protocol  = -1
32     self      = true
33   }
34
35   egress {
36     from_port   = 0
37     to_port     = 0
38     protocol    = "-1"
39     cidr_blocks = ["0.0.0.0/0"]
40   }
41
42   tags = {
43     "Name"        = "${var.resources_name_prefix}_${var.testbed_name}-sg"
44     "Environment" = var.environment_name
45   }
46 }
47
48 resource "aws_vpc_ipv4_cidr_block_association" "b" {
49   vpc_id     = aws_vpc.CSITVPC.id
50   cidr_block = var.vpc_cidr_b
51   depends_on = [aws_vpc.CSITVPC]
52 }
53 resource "aws_vpc_ipv4_cidr_block_association" "c" {
54   vpc_id     = aws_vpc.CSITVPC.id
55   cidr_block = var.vpc_cidr_c
56   depends_on = [aws_vpc.CSITVPC]
57 }
58 resource "aws_vpc_ipv4_cidr_block_association" "d" {
59   vpc_id     = aws_vpc.CSITVPC.id
60   cidr_block = var.vpc_cidr_d
61   depends_on = [aws_vpc.CSITVPC]
62 }
63
64 # Subnets
65 resource "aws_subnet" "mgmt" {
66   vpc_id            = aws_vpc.CSITVPC.id
67   cidr_block        = var.vpc_cidr_mgmt
68   availability_zone = var.avail_zone
69   depends_on        = [aws_vpc.CSITVPC]
70
71   tags = {
72     "Environment" = var.environment_name
73   }
74 }
75 resource "aws_subnet" "b" {
76   vpc_id            = aws_vpc.CSITVPC.id
77   cidr_block        = var.vpc_cidr_b
78   availability_zone = var.avail_zone
79   depends_on        = [aws_vpc.CSITVPC, aws_vpc_ipv4_cidr_block_association.b]
80
81   tags = {
82     "Environment" = var.environment_name
83   }
84 }
85 resource "aws_subnet" "c" {
86   vpc_id            = aws_vpc.CSITVPC.id
87   cidr_block        = var.vpc_cidr_c
88   availability_zone = var.avail_zone
89   depends_on        = [aws_vpc.CSITVPC, aws_vpc_ipv4_cidr_block_association.c]
90
91   tags = {
92     "Environment" = var.environment_name
93   }
94 }
95 resource "aws_subnet" "d" {
96   vpc_id            = aws_vpc.CSITVPC.id
97   cidr_block        = var.vpc_cidr_d
98   availability_zone = var.avail_zone
99   depends_on        = [aws_vpc.CSITVPC, aws_vpc_ipv4_cidr_block_association.d]
100
101   tags = {
102     "Environment" = var.environment_name
103   }
104 }
105
106 resource "aws_internet_gateway" "CSITGW" {
107   vpc_id     = aws_vpc.CSITVPC.id
108   depends_on = [aws_vpc.CSITVPC]
109
110   tags = {
111     "Environment" = var.environment_name
112   }
113 }
114
115 # SSH keypair
116 # Temporary key for provisioning only
117 resource "tls_private_key" "CSITTLS" {
118   algorithm = "RSA"
119   rsa_bits  = 4096
120 }
121 resource "aws_key_pair" "CSITKP" {
122   key_name   = "${var.resources_name_prefix}_${var.testbed_name}-key"
123   public_key = tls_private_key.CSITTLS.public_key_openssh
124 }
125
126 resource "aws_placement_group" "CSITPG" {
127   name     = "${var.resources_name_prefix}_${var.testbed_name}-pg"
128   strategy = "cluster"
129 }
130
131 # NICs
132 resource "aws_network_interface" "dut1_if1" {
133   subnet_id         = aws_subnet.b.id
134   source_dest_check = false
135   private_ip        = var.dut1_if1_ip
136   private_ips       = [var.dut1_if1_ip]
137   security_groups   = [aws_security_group.CSITSG.id]
138   depends_on        = [aws_vpc.CSITVPC, aws_subnet.b, aws_instance.dut1]
139
140   attachment {
141     instance     = aws_instance.dut1.id
142     device_index = 1
143   }
144
145   tags = {
146     "Environment" = var.environment_name
147   }
148 }
149
150 resource "aws_network_interface" "dut1_if2" {
151   subnet_id         = aws_subnet.d.id
152   source_dest_check = false
153   private_ip        = var.dut1_if2_ip
154   private_ips       = [var.dut1_if2_ip]
155   security_groups   = [aws_security_group.CSITSG.id]
156   depends_on        = [aws_vpc.CSITVPC, aws_subnet.d, aws_instance.dut1]
157
158   attachment {
159     instance     = aws_instance.dut1.id
160     device_index = 2
161   }
162
163   tags = {
164     "Environment" = var.environment_name
165   }
166 }
167
168 resource "aws_network_interface" "tg_if1" {
169   subnet_id         = aws_subnet.b.id
170   source_dest_check = false
171   private_ip        = var.tg_if1_ip
172   private_ips       = [var.tg_if1_ip]
173   security_groups   = [aws_security_group.CSITSG.id]
174   depends_on        = [aws_vpc.CSITVPC, aws_subnet.b, aws_instance.tg]
175
176   attachment {
177     instance     = aws_instance.tg.id
178     device_index = 1
179   }
180
181   tags = {
182     "Environment" = var.environment_name
183   }
184 }
185
186 resource "aws_network_interface" "tg_if2" {
187   subnet_id         = aws_subnet.d.id
188   source_dest_check = false
189   private_ip        = var.tg_if2_ip
190   private_ips       = [var.tg_if2_ip]
191   security_groups   = [aws_security_group.CSITSG.id]
192   depends_on        = [aws_vpc.CSITVPC, aws_subnet.d, aws_instance.tg]
193
194   attachment {
195     instance     = aws_instance.tg.id
196     device_index = 2
197   }
198
199   tags = {
200     "Environment" = var.environment_name
201   }
202 }
203
204 data "aws_network_interface" "dut1_if1" {
205   id = aws_network_interface.dut1_if1.id
206 }
207
208 data "aws_network_interface" "dut1_if2" {
209   id = aws_network_interface.dut1_if2.id
210 }
211
212 data "aws_network_interface" "tg_if1" {
213   id = aws_network_interface.tg_if1.id
214 }
215
216 data "aws_network_interface" "tg_if2" {
217   id = aws_network_interface.tg_if2.id
218 }
219
220 # Instances
221 resource "aws_instance" "tg" {
222   depends_on                  = [aws_vpc.CSITVPC, aws_placement_group.CSITPG]
223   ami                         = var.ami_image
224   availability_zone           = var.avail_zone
225   instance_type               = var.instance_type
226   key_name                    = aws_key_pair.CSITKP.key_name
227   associate_public_ip_address = true
228   subnet_id                   = aws_subnet.mgmt.id
229   private_ip                  = var.tg_mgmt_ip
230   vpc_security_group_ids      = [aws_security_group.CSITSG.id]
231   placement_group             = aws_placement_group.CSITPG.id
232   source_dest_check           = false
233   # host_id                   = "1"
234
235   root_block_device {
236     volume_size = 50
237   }
238
239   tags = {
240     "Name"        = "${var.resources_name_prefix}_${var.testbed_name}-tg"
241     "Environment" = var.environment_name
242   }
243 }
244
245 resource "aws_instance" "dut1" {
246   depends_on                  = [aws_vpc.CSITVPC, aws_placement_group.CSITPG, aws_instance.tg]
247   ami                         = var.ami_image
248   availability_zone           = var.avail_zone
249   instance_type               = var.instance_type
250   key_name                    = aws_key_pair.CSITKP.key_name
251   associate_public_ip_address = true
252   subnet_id                   = aws_subnet.mgmt.id
253   private_ip                  = var.dut1_mgmt_ip
254   vpc_security_group_ids      = [aws_security_group.CSITSG.id]
255   placement_group             = aws_placement_group.CSITPG.id
256   source_dest_check           = false
257   # host_id                   = "2"
258
259   root_block_device {
260     volume_size = 50
261   }
262
263   tags = {
264     "Name"        = "${var.resources_name_prefix}_${var.testbed_name}-dut1"
265     "Environment" = var.environment_name
266   }
267 }
268
269 # Routes
270 resource "aws_route" "CSIT-igw" {
271   route_table_id         = aws_vpc.CSITVPC.main_route_table_id
272   gateway_id             = aws_internet_gateway.CSITGW.id
273   destination_cidr_block = "0.0.0.0/0"
274   depends_on             = [aws_vpc.CSITVPC, aws_internet_gateway.CSITGW]
275 }
276
277 resource "aws_route" "dummy-trex-port-0" {
278   route_table_id         = aws_vpc.CSITVPC.main_route_table_id
279   network_interface_id   = aws_instance.tg.primary_network_interface_id
280   destination_cidr_block = var.trex_dummy_cidr_port_0
281   depends_on             = [aws_vpc.CSITVPC, aws_instance.dut1]
282 }
283
284 resource "aws_route" "dummy-trex-port-1" {
285   route_table_id         = aws_vpc.CSITVPC.main_route_table_id
286   network_interface_id   = aws_instance.tg.primary_network_interface_id
287   destination_cidr_block = var.trex_dummy_cidr_port_1
288   depends_on             = [aws_vpc.CSITVPC, aws_instance.dut1]
289 }
290
291 # Deployment/Ansible
292 resource "null_resource" "deploy_tg" {
293   depends_on = [
294     aws_instance.tg,
295     aws_network_interface.tg_if1,
296     aws_network_interface.tg_if2,
297     aws_instance.dut1,
298     aws_network_interface.dut1_if1,
299     aws_network_interface.dut1_if2
300   ]
301
302   connection {
303     user        = "ubuntu"
304     host        = aws_instance.tg.public_ip
305     private_key = tls_private_key.CSITTLS.private_key_pem
306   }
307
308   provisioner "remote-exec" {
309     inline = var.first_run_commands
310   }
311
312   provisioner "ansible" {
313     plays {
314       playbook {
315         file_path      = var.ansible_file_path
316         force_handlers = true
317       }
318       hosts      = ["tg_aws"]
319       extra_vars = {
320         ansible_ssh_pass           = var.ansible_provision_pwd
321         ansible_python_interpreter = var.ansible_python_executable
322         aws                        = true
323       }
324     }
325   }
326
327   provisioner "remote-exec" {
328     on_failure = continue
329     inline = ["sudo reboot"]
330   }
331 }
332
333 resource "null_resource" "deploy_dut1" {
334   depends_on = [
335     aws_instance.tg,
336     aws_network_interface.tg_if1,
337     aws_network_interface.tg_if2,
338     aws_instance.dut1,
339     aws_network_interface.dut1_if1,
340     aws_network_interface.dut1_if2
341   ]
342
343   connection {
344     user        = "ubuntu"
345     host        = aws_instance.dut1.public_ip
346     private_key = tls_private_key.CSITTLS.private_key_pem
347   }
348
349   provisioner "remote-exec" {
350     inline = var.first_run_commands
351   }
352
353   provisioner "ansible" {
354     plays {
355       playbook {
356         file_path      = var.ansible_file_path
357         force_handlers = true
358       }
359       hosts      = ["sut_aws"]
360       extra_vars = {
361         ansible_ssh_pass           = var.ansible_provision_pwd
362         ansible_python_interpreter = var.ansible_python_executable
363         aws                        = true
364       }
365     }
366   }
367
368   provisioner "remote-exec" {
369     on_failure = continue
370     inline = ["sudo reboot"]
371   }
372 }
373
374 resource "null_resource" "deploy_topology" {
375   depends_on = [ aws_instance.tg, aws_instance.dut1 ]
376
377   provisioner "ansible" {
378     plays {
379       playbook {
380         file_path = var.ansible_topology_path
381       }
382       hosts      = ["local"]
383       extra_vars = {
384         ansible_python_interpreter = var.ansible_python_executable
385         testbed_name               = var.testbed_name
386         cloud_topology             = var.topology_name
387         tg_if1_mac                 = data.aws_network_interface.tg_if1.mac_address
388         tg_if2_mac                 = data.aws_network_interface.tg_if2.mac_address
389         dut1_if1_mac               = data.aws_network_interface.dut1_if1.mac_address
390         dut1_if2_mac               = data.aws_network_interface.dut1_if2.mac_address
391         tg_public_ip               = aws_instance.tg.public_ip
392         dut1_public_ip             = aws_instance.dut1.public_ip
393         public_ip_list             = "${aws_instance.tg.public_ip},${aws_instance.dut1.public_ip}"
394       }
395     }
396   }
397 }