provider "aws" {
  region  = var.region
  profile = var.profile
}

module "vpc" {
  source         = "git::http://gogs.mague.com/chris/tfmodule-aws-2tier-vpc.git"
  region         = var.region
  profile        = var.profile
  vpc-name       = var.vpc-name
  vpc-cidr       = var.vpc-cidr
  vpc-azs        = var.vpc-azs
  enable-private = false
  common-tags = {
    "Owner" = "maguec"
  }
}

module "nodes" {
  source           = "github.com/Redislabs-Solution-Architects/tfmodule-aws-redis-enterprise"
  region           = var.region
  profile          = var.profile
  open-nets        = ["76.14.80.208/32"]
  data-node-count  = 3
  enable-volumes   = false
  re-instance-type = "c5a.4xlarge"
  vpc-cidr         = var.vpc-cidr
  vpc-azs          = var.vpc-azs
  vpc-name         = var.vpc-name
  vpc-id           = module.vpc.vpc-id
  vpc-subnets      = module.vpc.subnets-public
  allow-public-ssh = 1
  enable-flash     = false
  common-tags = {
    "Owner"   = "maguec"
    "Project" = "AWS Testing Environment"
  }
}

module "tmux" {
  source       = "github.com/shokunin/tfmodule-cloud-tmux"
  session-name = "cpredis"
  ssh-key      = "${var.vpc-name}.pem"
  user         = "ubuntu"
  nodes        = concat(module.nodes.node-ips, [aws_eip.re-eip.public_ip])
  outpath      = "${path.module}"
}


# Start CP Redis Testernode

resource "aws_instance" "re" {
  ami                    = data.aws_ami.re-ami.id
  instance_type          = "m5a.xlarge"
  availability_zone      = element(var.vpc-azs, 1)
  subnet_id              = element(module.vpc.subnets-public, 1)
  vpc_security_group_ids = [module.nodes.re-security-group]
  source_dest_check      = false
  key_name               = var.vpc-name
  tags                   = merge({ Name = "Tester-${var.vpc-name}-1" }, var.common-tags)

}

resource "aws_eip" "re-eip" {
  vpc  = true
  tags = merge({ Name = "${var.vpc-name}-node-eip-1" }, var.common-tags)
}

resource "aws_eip_association" "re-eip-assoc" {
  instance_id   = element(aws_instance.re.*.id, 1)
  allocation_id = element(aws_eip.re-eip.*.id, 1)
  depends_on    = [aws_instance.re, aws_eip.re-eip]
}


resource "null_resource" "remote-config" {
  provisioner "remote-exec" {
    connection {
      user        = "ubuntu"
      host        = aws_eip.re-eip.public_ip
      private_key = file("~/.ssh/${var.vpc-name}.pem")
      agent       = true
    }
    #inline = ["sudo apt update > /dev/null  && sudo apt install -y python-pip > /dev/null"]
    inline = ["sudo apt update > /dev/null"]
  }
  depends_on = [aws_instance.re, aws_eip_association.re-eip-assoc]
}

data "template_file" "raft_group_setup" {
  template = file("${path.module}/raft_group_setup.tpl")
  vars = {
    node1 = module.nodes.node-internal-ips[0]
    node2 = module.nodes.node-internal-ips[1]
    node3 = module.nodes.node-internal-ips[2]
  }
}

resource "null_resource" "raft_group_setup" {
  provisioner "local-exec" {
    command = "echo \"${data.template_file.raft_group_setup.rendered}\" > ${path.module}/ansible/raft_group_setup"
  }
  depends_on = [data.template_file.raft_group_setup]
}

resource "local_file" "inventory" {
  content = templatefile("${path.module}/inventories/inventory.ctmpl",
    {
      nodes  = module.nodes.node-ips
      tester = aws_eip.re-eip.public_ip
      path   = abspath(path.module)
    }
  )
  filename        = "${path.module}/inventories/inventory.ini"
  file_permission = "0644"
}


resource "local_file" "ssh_config" {
  content = templatefile("${path.module}/inventories/ssh.ctmpl",
    {
      ssh-key  = "${var.vpc-name}.pem"
      ssh-user = "ubuntu"
    }
  )
  filename        = "${path.module}/inventories/ssh.cfg"
  file_permission = "0644"
}

output "tmux" {
  value = "run ./cloud-tmux to enable tmux connections"
}

output "ansible1" {
  value = "Setup Tester Node\n\t\tansible-playbook -i inventories/inventory.ini  ansible/tester.yml"
}

output "ansible2" {
  value = "Setup CP Redis Nodes\n\t\tansible-playbook -i inventories/inventory.ini  ansible/nodes.yml -e 'NODE_IPS=${join(",", module.nodes.node-internal-ips)}'"
}

output "cluster-setup" {
  value = "To set up the cluster run /usr/local/bin/setup-raft-cluster from any one of the nodes"
}

output "insight" {
  value = "http://${aws_eip.re-eip.public_ip}:8001"
}

output "cpredisnodes" {
  value = module.nodes.node-internal-ips
}

