terraform {
  required_providers {
    digitalocean = {
      source  = "digitalocean/digitalocean"
      version = "~> 2.0"
    }
  }
}

variable "network_name" {
}

variable "fleet_name" {
}

variable "id" {
  type = string
}

variable "server_name" {
  type    = string
  default = "cloud-media"
}

variable "digitalocean_region" {
  type    = string
  default = "sfo2"
}

variable "digitalocean_token" {
  type = string
}

variable "digitalocean_ssh_key_name" {
  type = string
}

variable "digitalocean_ssh_private_key_file" {
  type = string
}

locals {
  server_name        = "${var.server_name}${var.id}"
  network_fleet_name = "${var.network_name}-${var.fleet_name}"
  tag_name           = var.server_name
}

provider "digitalocean" {
  token = var.digitalocean_token
}

data "digitalocean_ssh_key" "terraform" {
  name = var.digitalocean_ssh_key_name
}

#data "digitalocean_image" "media_server" {
#    name = "digitalocean-media-server-July2023"
#}

resource "digitalocean_droplet" "cloud_media_server" {
  # image = data.digitalocean_image.media_server.id
  image  = "ubuntu-22-04-x64"
  name   = local.server_name
  region = var.digitalocean_region
  size   = "c-8-intel"
  ssh_keys = [
    data.digitalocean_ssh_key.terraform.id
  ]
  tags = [
    local.tag_name
  ]

  connection {
    host        = self.ipv4_address
    user        = "root"
    type        = "ssh"
    private_key = file(var.digitalocean_ssh_private_key_file)
    timeout     = "2m"
  }

  provisioner "file" {
    source      = "/home/ubuntu/networks/${var.network_name}/${var.fleet_name}/config/${var.network_name}_${var.fleet_name}_media_server.sysctl.conf"
    destination = "/etc/sysctl.conf"
  }

  provisioner "file" {
    source      = "./bootstrap.sh"
    destination = "/root/bootstrap.sh"
  }
}

resource "digitalocean_firewall" "cloud_media_server" {
  name = local.server_name
  droplet_ids = [
    digitalocean_droplet.cloud_media_server.id
  ]

  inbound_rule {
    protocol         = "udp"
    port_range       = "10000-65535"
    source_addresses = ["0.0.0.0/0", "::/0"]
  }

  # SSH access from Jenkins server
  inbound_rule {
    protocol         = "tcp"
    port_range       = "22"
    source_addresses = ["34.217.118.93/32", "35.165.77.91/32"]
  }

  outbound_rule {
    protocol              = "icmp"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "udp"
    port_range            = "10000-65535"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }

  outbound_rule {
    protocol              = "tcp"
    port_range            = "1-65535"
    destination_addresses = ["0.0.0.0/0", "::/0"]
  }
}
