# *****************************************************************************
#
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License.  You may obtain a copy of the License at
#
#   http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied.  See the License for the
# specific language governing permissions and limitations
# under the License.
#
# ******************************************************************************

locals {
  vpc_id                = "${var.service_base_name}-${var.endpoint_id}-vpc"
  subnet_name           = "${var.service_base_name}-${var.endpoint_id}-subnet"
  firewall_ingress_name = "${var.service_base_name}-${var.endpoint_id}-ingress-sg"
  firewall_egress_name  = "${var.service_base_name}-${var.endpoint_id}-egress-sg"
}

resource "google_compute_network" "endpoint_vpc" {
  count = var.vpc_id == "" ? 1 : 0
  name                    = local.vpc_id
  auto_create_subnetworks = false
}

data "google_compute_network" "endpoint_vpc_data" {
  name = var.vpc_id == "" ? google_compute_network.endpoint_vpc.0.name : var.vpc_id
}

resource "google_compute_subnetwork" "endpoint_subnet" {
  count         = var.subnet_id == "" ? 1 : 0
  name          = local.subnet_name
  ip_cidr_range = var.subnet_cidr
  region        = var.region
  network       = data.google_compute_network.endpoint_vpc_data.id
}

data "google_compute_subnetwork" "endpoint_subnet_data" {
  name = var.subnet_id == "" ? google_compute_subnetwork.endpoint_subnet.0.name : var.subnet_id
}

resource "google_compute_firewall" "firewall-ingress" {
  name    = local.firewall_ingress_name
  network = data.google_compute_network.endpoint_vpc_data.name
  allow {
    protocol = "tcp"
    ports    = ["22", "8084", "8085", "4822"]
  }
  target_tags   = ["${var.service_base_name}-${var.endpoint_id}-endpoint"]
  source_ranges = [var.firewall_ing_cidr_range]

}

resource "google_compute_firewall" "firewall-egress" {
  name      = local.firewall_egress_name
  network   = data.google_compute_network.endpoint_vpc_data.name
  direction = "EGRESS"
  allow {
    protocol = "all"
  }
  target_tags        = ["${var.service_base_name}-${var.endpoint_id}-endpoint"]
  destination_ranges = [var.firewall_eg_cidr_range]
}
