|  | 
| 1 | 1 | 
 | 
| 2 | 2 | locals { | 
|  | 3 | +  tmp_dir           = "${path.cwd}/.tmp" | 
|  | 4 | +  zone_count        = 3 | 
|  | 5 | +  vpc_zone_names    = [ for index in range(local.zone_count): "${var.region}-${(index % local.zone_count) + 1}" ] | 
| 3 | 6 |   prefix_name       = var.name_prefix != "" ? var.name_prefix : var.resource_group_name | 
| 4 | 7 |   vpc_name          = lower(replace(var.name != "" ? var.name : "${local.prefix_name}-vpc", "_", "-")) | 
| 5 | 8 |   vpc_id            = data.ibm_is_vpc.vpc.id | 
| 6 | 9 |   security_group_id = data.ibm_is_vpc.vpc.default_security_group | 
| 7 | 10 |   acl_id            = data.ibm_is_vpc.vpc.default_network_acl | 
| 8 | 11 |   crn               = data.ibm_is_vpc.vpc.resource_crn | 
|  | 12 | +  ipv4_cidr_provided = length(var.address_prefixes) >= var.address_prefix_count | 
|  | 13 | +  ipv4_cidr_block    = local.ipv4_cidr_provided ? var.address_prefixes : [ for val in range(var.address_prefix_count): "" ] | 
|  | 14 | +  address_prefix_management = local.ipv4_cidr_provided ? "manual" : "auto" | 
|  | 15 | +  provision_cidr     = var.provision && local.ipv4_cidr_provided | 
|  | 16 | +} | 
|  | 17 | + | 
|  | 18 | +resource null_resource print_values { | 
|  | 19 | +  provisioner "local-exec" { | 
|  | 20 | +    command = "echo 'Bucket name: ${var.flow_log_cos_bucket_name != null ? var.flow_log_cos_bucket_name : ""}'" | 
|  | 21 | +  } | 
|  | 22 | +  provisioner "local-exec" { | 
|  | 23 | +    command = "echo 'Auth policy id: ${var.auth_id}'" | 
|  | 24 | +  } | 
|  | 25 | +} | 
|  | 26 | + | 
|  | 27 | +resource ibm_is_vpc_address_prefix cidr_prefix { | 
|  | 28 | +  count = local.provision_cidr ? var.address_prefix_count : 0 | 
|  | 29 | + | 
|  | 30 | +  name  = "${local.vpc_name}-cidr-${format("%02s", count.index)}" | 
|  | 31 | +  zone  = local.vpc_zone_names[count.index] | 
|  | 32 | +  vpc   = data.ibm_is_vpc.vpc.id | 
|  | 33 | +  cidr  = local.ipv4_cidr_block[count.index] | 
| 9 | 34 | } | 
| 10 | 35 | 
 | 
| 11 | 36 | resource ibm_is_vpc vpc { | 
| 12 | 37 |   count = var.provision ? 1 : 0 | 
| 13 | 38 | 
 | 
| 14 | 39 |   name                        = local.vpc_name | 
| 15 | 40 |   resource_group              = var.resource_group_id | 
|  | 41 | +  address_prefix_management   = local.address_prefix_management | 
| 16 | 42 |   default_security_group_name = "${local.vpc_name}-security-group" | 
| 17 | 43 |   default_network_acl_name    = "${local.vpc_name}-acl" | 
| 18 | 44 |   default_routing_table_name  = "${local.vpc_name}-routing" | 
| 19 | 45 | } | 
| 20 | 46 | 
 | 
|  | 47 | +# Set the address prefixes as the default.  This will allow us to specify the number of ips required | 
|  | 48 | +# in each subnet, instead of figuring out specific cidrs. | 
|  | 49 | +# Note the "split" function call - this is because the id returned from creating the address | 
|  | 50 | +# comes back as <vpc_id>/<address_range_id> and the update call wants these passed as separate | 
|  | 51 | +# arguments.  I suspect this is actually a defect in what is returned from ibm_is_vpc_address_prefix | 
|  | 52 | +# and it may one day be fixed and trip up this code. | 
|  | 53 | +resource null_resource post_vpc_address_pfx_default { | 
|  | 54 | +  count = local.provision_cidr ? var.address_prefix_count : 0 | 
|  | 55 | +  depends_on = [ibm_is_vpc_address_prefix.cidr_prefix] | 
|  | 56 | + | 
|  | 57 | +  provisioner "local-exec" { | 
|  | 58 | +    command = <<COMMAND | 
|  | 59 | +      ibmcloud login --apikey ${var.ibmcloud_api_key} -r ${var.region} -g ${var.resource_group_name} --quiet ; \ | 
|  | 60 | +      ibmcloud is vpc-address-prefix-update '${local.provision_cidr ? ibm_is_vpc.vpc[0].id : ""}' '${split("/", local.provision_cidr ? ibm_is_vpc_address_prefix.cidr_prefix[0].id : "/")[1]}' --default true ; \ | 
|  | 61 | +      ibmcloud is vpc-address-prefix-update '${local.provision_cidr ? ibm_is_vpc.vpc[0].id : ""}' '${split("/", local.provision_cidr ? ibm_is_vpc_address_prefix.cidr_prefix[1].id : "/")[1]}' --default true ; \ | 
|  | 62 | +      ibmcloud is vpc-address-prefix-update '${local.provision_cidr ? ibm_is_vpc.vpc[0].id : ""}' '${split("/", local.provision_cidr ? ibm_is_vpc_address_prefix.cidr_prefix[2].id : "/")[1]}' --default true ; \ | 
|  | 63 | +     COMMAND | 
|  | 64 | +  } | 
|  | 65 | +} | 
|  | 66 | + | 
| 21 | 67 | data ibm_is_vpc vpc { | 
| 22 | 68 |   depends_on = [ibm_is_vpc.vpc] | 
| 23 | 69 | 
 | 
| 24 | 70 |   name = local.vpc_name | 
| 25 | 71 | } | 
| 26 | 72 | 
 | 
| 27 |  | -resource ibm_is_network_acl network_acl { | 
| 28 |  | -  count      = var.provision ? 1 : 0 | 
| 29 |  | - | 
| 30 |  | -  name           = "${local.vpc_name}-acl2" | 
| 31 |  | -  resource_group = var.resource_group_id | 
| 32 |  | -  vpc            = data.ibm_is_vpc.vpc.id | 
| 33 |  | - | 
| 34 |  | -  rules { | 
| 35 |  | -    name        = "egress" | 
| 36 |  | -    action      = "allow" | 
| 37 |  | -    source      = "0.0.0.0/0" | 
| 38 |  | -    destination = "0.0.0.0/0" | 
| 39 |  | -    direction   = "outbound" | 
| 40 |  | -  } | 
| 41 |  | -  rules { | 
| 42 |  | -    name        = "ingress" | 
| 43 |  | -    action      = "allow" | 
| 44 |  | -    source      = "0.0.0.0/0" | 
| 45 |  | -    destination = "0.0.0.0/0" | 
| 46 |  | -    direction   = "inbound" | 
| 47 |  | -  } | 
| 48 |  | -} | 
| 49 |  | - | 
| 50 | 73 | resource ibm_is_security_group_rule rule_icmp_ping { | 
| 51 | 74 |   count = var.provision ? 1 : 0 | 
| 52 | 75 | 
 | 
| @@ -109,7 +132,8 @@ resource ibm_is_security_group_rule private_dns_2 { | 
| 109 | 132 | 
 | 
| 110 | 133 | resource ibm_is_flow_log flowlog_instance { | 
| 111 | 134 |   count = length(var.flow_log_cos_bucket_name) > 0 ? 1 : 0 | 
| 112 |  | -  depends_on = [ibm_is_vpc.vpc] | 
|  | 135 | +  depends_on = [ibm_is_vpc.vpc, null_resource.print_values] | 
|  | 136 | + | 
| 113 | 137 |   name = "${local.vpc_name}-flowlog" | 
| 114 | 138 |   active = true | 
| 115 | 139 |   //target can be VPC or Virtual Server Instance or Subnet or Primary Network Interface or Secondary Network Interface  | 
|  | 
0 commit comments