#!/bin/bash

usage () {
  echo "Usage: $0 <spotify|apple>"
  exit 1
}


die () {
  echo "$1 FAILED at `date`!"
  exit 1
}


svc_tgt_id=()

get_svc_tgt_id_by_url () {

local svc=$1
local svc_url=$2
local svc_aws_profile=$3


echo "${svc}_url = \"$svc_url\""

local svc_host=`echo $svc_url | sed -re 's/^https:\/\///' -e 's/:[1-9][0-9]*$//'`
echo "${svc}_host = \"$svc_host\""

local svc_port
if `echo $svc_url | grep -q ':[1-9][0-9]*$'`; then
  svc_port=`echo $svc_url | sed -re 's/^(.+):([1-9][0-9]*)$/\2/'`
else
  svc_port='443'
fi
echo "${svc}_port = \"$svc_port\""


local svc_zone=`echo $svc_host | sed -re 's/^(.+\.)*([^.]+\.[^.]+)$/\2/'`
echo "${svc}_zone = \"$svc_zone\""


local svc_zone_id=`aws --profile sme-dev route53 list-hosted-zones-by-name --dns-name $svc_zone. | jq ".HostedZones[] | select(.Name == \"$svc_zone.\") | .Id" | sed -e 's/"//g'`
echo "${svc}_zone_id = \"$svc_zone_id\""


local svc_lb_name=`aws --profile sme-dev route53 list-resource-record-sets --hosted-zone-id $svc_zone_id | jq ".ResourceRecordSets[] | select(.Name == \"$svc_host.\" and .Type == \"A\") | .AliasTarget.DNSName" | sed -re 's/^"dualstack\.(.+)(-[0-9]{8,10}\..+)$/\1/'`
echo "${svc}_lb_name = \"$svc_lb_name\""


local svc_lb_arn=`aws --profile $svc_aws_profile elbv2 describe-load-balancers | jq ".LoadBalancers[] | select(.LoadBalancerName == \"$svc_lb_name\") | .LoadBalancerArn" | sed -e 's/"//g'`
echo "${svc}_lb_arn = \"$svc_lb_arn\""


local svc_lb_https_listener_arn=`aws --profile $svc_aws_profile elbv2 describe-listeners --load-balancer-arn $svc_lb_arn | jq ".Listeners[] | select(.Protocol == \"HTTPS\" and .Port == $svc_port) | .ListenerArn" | sed -e 's/"//g'`
echo "${svc}_lb_https_listener_arn = \"$svc_lb_https_listener_arn\""


if [[ ! $svc =~ "consumeranalytics" ]]; then
  svc_lb_rule_tg_jq_expr=".Rules[] | select(.Conditions[].Field == \"host-header\" and .Conditions[].Values[] == \"$svc_host\") | .Actions[].TargetGroupArn"
elif [[ $ldb == "spotify" ]]; then
  svc_lb_rule_tg_jq_expr=".Rules[] | select(.Conditions[].Values[] | contains(\"$ldb\")) | .Actions[].TargetGroupArn"
else
  svc_lb_rule_tg_jq_expr=".Rules[] | select(.Conditions | length == 0) | .Actions[].TargetGroupArn"
fi

local svc_lb_rule_tg_arn=`aws --profile $svc_aws_profile elbv2 describe-rules --listener-arn $svc_lb_https_listener_arn | jq "$svc_lb_rule_tg_jq_expr" | sed -e 's/"//g'`
echo "${svc}_lb_rule_tg_arn = \"$svc_lb_rule_tg_arn\""


svc_tgt_id=(`aws --profile $svc_aws_profile elbv2 describe-target-health --target-group-arn $svc_lb_rule_tg_arn | jq '.TargetHealthDescriptions[] | select(.TargetHealth.State == "healthy") | .Target.Id' | sed -e 's/"//g'`)
echo "${svc}_tgt_id = \"${svc_tgt_id[@]}\""

}


get_svc_secret_arn_by_ip () {

local svc=$1
local svc_ip=$2
local svc_secret=$3
local svc_aws_profile=$4


local svc_clus=()
svc_clus=(`aws --profile $svc_aws_profile ecs list-clusters | jq '.clusterArns[]' | sed -re 's/"//g' -e 's/^arn:.+:cluster\///' | sort | tr '\n' ' '`)
#echo "${svc}_clus = \"${svc_clus[@]}\""
#echo ${#svc_clus[@]}

local i
for (( i=0; i < ${#svc_clus[@]}; i++ )); do

echo "curr_${svc}_clu = \"${svc_clus[$i]}\""

local svc_clu_task_ids=`aws --profile $svc_aws_profile ecs list-tasks --cluster ${svc_clus[$i]} | jq '.taskArns[]' | sed -re 's/arn:.+task\///g' -e 's/"//g' | tr '\n' ' '`
#echo "${svc}_clu_task_ids = $svc_clu_task_ids"

if [[ -z $svc_clu_task_ids ]]; then
  continue
fi

local svc_tdef_arn=`aws --profile $svc_aws_profile ecs describe-tasks --cluster ${svc_clus[$i]} --tasks $svc_clu_task_ids | jq ".tasks[] | select(.containers[].networkInterfaces[].privateIpv4Address == \"$svc_ip\") | .taskDefinitionArn" | sed -e 's/"//g'`
echo "${svc}_tdef_arn = \"$svc_tdef_arn\""

if [[ -n $svc_tdef_arn ]]; then
  break
fi

done

# SECRET

svc_secret_arn=`aws --profile $svc_aws_profile ecs describe-task-definition --task-definition $svc_tdef_arn | jq ".taskDefinition.containerDefinitions[].secrets[] | select(.name == \"$svc_secret\") | .valueFrom" | sed -e 's/"//g'`

echo "$svc_secret arn = \"$svc_secret_arn\""

}

#

if [[ -z $1 ]]
then
  usage
fi


prod_nodes=()

case $1 in
spotify)
  ldb='spotify'
  prod_nodes+=('spotify-consumer-analytics-1')
  prod_nodes+=('spotify-consumer-analytics-2')
  dev_node='dev-apollo-leveldb-spotify'
  tmp_prod_ldb_vol_size='750'
  ;;
apple)
  ldb='apple'
  prod_nodes+=('apple-consumer-analytics-1')
  prod_nodes+=('apple-consumer-analytics-2')
  dev_node='dev-apollo-leveldb-apple'
  tmp_prod_ldb_vol_size='650'
  ;;
*)
  echo "INCORRECT INPUT!"
  usage
  ;;
esac


DATEE=`date +%Y%m%d-%H%M%S`
pid=$$

echo "pid = \"$pid\""
echo "ldb = \"$ldb\""

# NEW PROD APOLLOAPP

new_prod_apolloapp_url='https://apollo.stream'
#echo "new_prod_apolloapp_url = \"$new_prod_apolloapp_url\""

get_svc_tgt_id_by_url "new-prod-apolloapp" $new_prod_apolloapp_url "sme-prod"

new_prod_apolloapp_svc_ip=${svc_tgt_id[0]}
echo "new_prod_apolloapp_svc_ip = \"$new_prod_apolloapp_svc_ip\""

get_svc_secret_arn_by_ip "new-prod-apolloapp" $new_prod_apolloapp_svc_ip "PRIVATEAPI_URI" "sme-prod"

# NEW PROD PRIVATEAPI

new_prod_privateapi_secret_arn=$svc_secret_arn
echo "new_prod_privateapi_secret_arn = \"$new_prod_privateapi_secret_arn\""

new_prod_privateapi_url=`aws --profile sme-prod secretsmanager get-secret-value --secret-id $new_prod_privateapi_secret_arn | jq '.SecretString' | sed -e 's/"//g'`
#echo "new_prod_privateapi_url = \"$new_prod_privateapi_url\""

get_svc_tgt_id_by_url "new-prod-privateapi" $new_prod_privateapi_url "sme-prod"

new_prod_privateapi_svc_ip=${svc_tgt_id[0]}
echo "new_prod_privateapi_svc_ip = \"$new_prod_privateapi_svc_ip\""

get_svc_secret_arn_by_ip "new-prod-privateapi" $new_prod_privateapi_svc_ip "CONSUMER_ANALYTICS_API_HOSTNAME" "sme-prod"

# OLD PROD CONSUMER ANALYTICS

old_prod_consumeranalytics_secret_arn=$svc_secret_arn
echo "old_prod_consumeranalytics_secret_arn = \"$old_prod_consumeranalytics_secret_arn\""

old_prod_consumeranalytics_url=`aws --profile sme-prod secretsmanager get-secret-value --secret-id $old_prod_consumeranalytics_secret_arn | jq '.SecretString' | sed -e 's/"//g'`
#echo "old_prod_consumeranalytics_url = \"$old_prod_consumeranalytics_url\""

get_svc_tgt_id_by_url "old-prod-consumeranalytics" $old_prod_consumeranalytics_url "sme-dev-old-prod"

old_prod_consumeranalytics_node_ids=()
old_prod_consumeranalytics_node_ids=$svc_tgt_id
echo "old_prod_consumeranalytics_node_ids = \"${old_prod_consumeranalytics_node_ids[@]}\""

old_prod_consumeranalytics_active_nodes=()
old_prod_consumeranalytics_active_nodes=(`aws --profile sme-dev-old-prod ec2 describe-instances --instance-ids ${old_prod_consumeranalytics_node_ids[@]} | jq '.Reservations[].Instances[].Tags[] | select(.Key == "Name") | .Value' | sed -e 's/"//g'`)
echo "old_prod_consumeranalytics_active_nodes = \"${old_prod_consumeranalytics_active_nodes[@]}\""

#

for ((j=0; j < ${#prod_nodes[@]}; j++)); do
        if [[ ! ${old_prod_consumeranalytics_active_nodes[@]} =~ $(echo "\<${prod_nodes[$j]}\>") ]]; then
    prod_node=${prod_nodes[$j]}
    break
  fi
done

echo "prod_node = \"$prod_node\""
echo "dev_node = \"$dev_node\""


aws --profile sme-dev secretsmanager get-secret-value --secret-id infra/administration/ssh/leveldb | jq '.SecretString' | sed -e 's/"//g' -e 's/\\n/\n/g' > sshkey-$pid
chmod 600 sshkey-$pid


x=`aws --profile sme-dev-old-prod ec2 describe-instances --filters Name=tag:Name,Values=$prod_node`

prod_node_ip=`echo $x | jq '.Reservations[].Instances[].PublicIpAddress' | sed -e 's/"//g'`
echo "prod_node_ip = \"$prod_node_ip\""

prod_node_id=`echo $x | jq '.Reservations[].Instances[].InstanceId' | sed -e 's/"//g'`
echo "prod_node_id = \"$prod_node_id\""

prod_node_az=`echo $x | jq '.Reservations[].Instances[].Placement.AvailabilityZone' | sed -e 's/"//g'`
echo "prod_node_az = \"$prod_node_az\""


echo "prod LevelDB temp volume create started at `date` ..."

echo "tmp_prod_ldb_vol_size = \"$tmp_prod_ldb_vol_size\""

aws --profile sme-dev-old-prod ec2 create-volume --availability-zone $prod_node_az --size $tmp_prod_ldb_vol_size --volume-type io1 --iops 25000 --tag-specifications "ResourceType=volume,Tags=[{Key=Name,Value=$1-leveldb-$DATEE}]" || die "prod LevelDB temp volume create"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev-old-prod ec2 describe-volumes --filters Name=tag:Name,Values=$1-leveldb-$DATEE | grep -q '"State": "available"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


echo "prod LevelDB temp volume attach started at `date` ..."

tmp_prod_ldb_vol=`aws --profile sme-dev-old-prod ec2 describe-volumes --filters Name=tag:Name,Values=$1-leveldb-$DATEE | jq '.Volumes[].VolumeId' | sed -e 's/"//g'`
echo "tmp_prod_ldb_vol = \"$tmp_prod_ldb_vol\""

aws --profile sme-dev-old-prod ec2 attach-volume --instance-id $prod_node_id --device /dev/sdg --volume-id $tmp_prod_ldb_vol || die "prod LevelDB temp volume attach"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev-old-prod ec2 describe-volumes --volume-ids $tmp_prod_ldb_vol | grep -q '"State": "attached"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


echo "prod LevelDB stop/copy started at `date` ..."
ssh -i sshkey-$pid ec2-user@$prod_node_ip 'sudo /root/ldb-prod1.sh' || die "prod LevelDB stop/copy"
echo -e "done at `date`\n"


echo  "prod LevelDB start at `date` ..."
ssh -i sshkey-$pid ec2-user@$prod_node_ip 'sudo /root/ldb-prod2.sh' || die "prod LevelDB start"
echo -e "done at `date`\n"


echo "prod LevelDB snapshot create started at `date` ..."

aws --profile sme-dev-old-prod ec2 create-snapshot --volume-id $tmp_prod_ldb_vol --description $1-leveldb-ssht-$DATEE --tag-specifications "ResourceType=snapshot,Tags=[{Key=Name,Value=$1-leveldb-ssht-$DATEE}]" || die "prod LevelDB snapshot create"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev-old-prod ec2 describe-snapshots --filters Name=description,Values=$1-leveldb-ssht-$DATEE | grep -q '"State": "completed"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


prod_ssht_id=`aws --profile sme-dev-old-prod ec2 describe-snapshots --filters Name=description,Values=$1-leveldb-ssht-$DATEE | sed -e 's/"//g' | awk '/SnapshotId/ { print $2 }'`
echo "prod_ssht_id = \"$prod_ssht_id\""


echo "prod LevelDB snapshot copy started at `date` ..."

aws --profile sme-dev ec2 copy-snapshot --source-snapshot-id $prod_ssht_id --description $1-leveldb-ssht-$DATEE --source-region eu-west-1 || die "prod LevelDB snapshot copy"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev ec2 describe-snapshots --filters Name=description,Values=$1-leveldb-ssht-$DATEE | grep -q '"State": "completed"'
  x=$?
  sleep 15
done

echo -e "done at `date`\n"


dev_ssht_id=`aws --profile sme-dev ec2 describe-snapshots --filters Name=description,Values=$1-leveldb-ssht-$DATEE | sed -e 's/"//g' | awk '/SnapshotId/ { print $2 }'`
echo "dev_ssht_id = \"$dev_ssht_id\""


x=`aws --profile sme-dev ec2 describe-instances --filters Name=tag:Name,Values=$dev_node`

dev_node_ip=`echo $x | jq '.Reservations[].Instances[].PrivateIpAddress' | sed -e 's/"//g'`
echo "dev_node_ip = \"$dev_node_ip\""

dev_node_id=`echo $x | jq '.Reservations[].Instances[].InstanceId' | sed -e 's/"//g'`
echo "dev_node_id = \"$dev_node_id\""

dev_node_az=`echo $x | jq '.Reservations[].Instances[].Placement.AvailabilityZone' | sed -e 's/"//g'`
echo "dev_node_az = \"$dev_node_az\""


echo "dev LevelDB volume create started at `date` ..."

aws --profile sme-dev ec2 create-volume --availability-zone $dev_node_az --volume-type gp2 --snapshot-id $dev_ssht_id --tag-specifications "ResourceType=volume,Tags=[{Key=Name,Value=$1-leveldb-$DATEE}]" || die "dev LevelDB volume create"


x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev ec2 describe-volumes --filters Name=snapshot-id,Values=$dev_ssht_id | grep -q '"State": "available"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


echo "dev LevelDB stop/umount started at `date` ..."
ssh -i sshkey-$pid ec2-user@$dev_node_ip 'sudo /root/ldb-dev1.sh' || die "dev LevelDB stop/umount"
echo -e "done at `date`\n"


curr_dev_ldb_vol=`aws --profile sme-dev ec2 describe-volumes --filters "Name=attachment.instance-id,Values=$dev_node_id" "Name=attachment.device,Values=/dev/sdg" | jq '.Volumes[].Attachments[].VolumeId' | sed -e 's/"//g'`
echo "curr_dev_ldb_vol = \"$curr_dev_ldb_vol\""


if [ ! -z $curr_dev_ldb_vol ]; then

echo "old dev LevelDB volume detach started at `date` ..."

aws --profile sme-dev ec2 detach-volume --instance-id $dev_node_id --volume-id $curr_dev_ldb_vol || die "old dev LevelDB volume detach"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev ec2 describe-volumes --volume-ids $curr_dev_ldb_vol | grep -q '"State": "available"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"

fi


new_dev_ldb_vol=`aws --profile sme-dev ec2 describe-volumes --filters Name=snapshot-id,Values=$dev_ssht_id | sed -e 's/[",]//g' | awk '/VolumeId/ { print $2 }'`
echo "new_dev_ldb_vol = \"$new_dev_ldb_vol\""

echo "new dev LevelDB volume attach started at `date` ..."

aws --profile sme-dev ec2 attach-volume --instance-id $dev_node_id --device /dev/sdg --volume-id $new_dev_ldb_vol || die "new dev LevelDB volume attach"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev ec2 describe-volumes --volume-ids $new_dev_ldb_vol | grep -q '"State": "attached"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


echo "dev LevelDB mount/start at `date` ..."
ssh -i sshkey-$pid ec2-user@$dev_node_ip 'sudo /root/ldb-dev2.sh' || die "dev LevelDB mount/start"
echo -e "done at `date`\n"


echo "prod LevelDB temp volume detach started at `date` ..."

aws --profile sme-dev-old-prod ec2 detach-volume --instance-id $prod_node_id --volume-id $tmp_prod_ldb_vol || die "prod LevelDB temp volume detach"

x=255

until [ $x -eq 0 ]; do
  aws --profile sme-dev-old-prod ec2 describe-volumes --volume-ids $tmp_prod_ldb_vol | grep -q '"State": "available"'
  x=$?
  sleep 5
done

echo -e "done at `date`\n"


echo "prod LevelDB temp volume delete started at `date` ..."
aws --profile sme-dev-old-prod ec2 delete-volume --volume-id $tmp_prod_ldb_vol || die "prod LevelDB temp volume delete"
echo -e "done at `date`\n"


echo "prod LevelDB snapshot delete started at `date` ..."
aws --profile sme-dev-old-prod ec2 delete-snapshot --snapshot-id $prod_ssht_id || die "prod LevelDB snapshot delete"
echo -e "done at `date`\n"


echo "dev LevelDB snapshot delete started at `date` ..."
aws --profile sme-dev ec2 delete-snapshot --snapshot-id $dev_ssht_id || die "dev LevelDB snapshot delete"
echo -e "done at `date`\n"


rm -v sshkey-$pid
