[WIFI-7996] Make deploy-sdk-docker-compose and deploy-virtual-ap-instance more resilient (#563)

* Get instance ID from API response after creation and set timeouts when waiting for instance readiness

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>

* Use built-in timeout command

Signed-off-by: Johann Hoffmann <johann.hoffmann@mailbox.org>
This commit is contained in:
Johann Hoffmann
2022-05-23 12:57:24 +02:00
committed by GitHub
parent 8f5b18f151
commit 686469b5ff
2 changed files with 37 additions and 36 deletions

View File

@@ -1,4 +1,5 @@
name: Deploy SDK with Docker Compose on EC2
name: Deploy cloud SDK instance with Docker Compose
description: Create EC2 instance and run Docker Compose cloud SDK deployment
inputs:
deployment_version:
@@ -54,9 +55,9 @@ outputs:
instance_id:
value: ${{ steps.ec2_instance.outputs.instance_id }}
instance_name:
value: ${{ steps.ec2_facts.outputs.instance_name }}
value: ${{ steps.set_outputs.outputs.instance_name }}
instance_public_ip:
value: ${{ steps.ec2_instance.outputs.instance_public_ip }}
value: ${{ steps.get_instance_public_ip.outputs.ip }}
runs:
using: "composite"
@@ -65,15 +66,10 @@ runs:
shell: bash
id: set_outputs
run: |
echo "::set-output name=gateway_url::ow-docker-compose-${{ github.run_number }}.wlan.local"
echo "::set-output name=sec_url::ow-docker-compose-${{ github.run_number }}.wlan.local"
- name: Set EC2 facts
shell: bash
id: ec2_facts
run: |
echo "::set-output name=gateway_url::ow-docker-compose-${{ github.run_id }}.wlan.local"
echo "::set-output name=sec_url::ow-docker-compose-${{ github.run_id }}.wlan.local"
AMI=$(aws ec2 describe-images --filters '[{"Name":"description","Values":["Canonical, Ubuntu, 20.04 LTS, amd64*"]},{"Name":"owner-id","Values":["099720109477"]}]' --query 'sort_by(Images, &CreationDate)[-1].ImageId' --output text)
INSTANCE_NAME=ow-docker-compose-${{ github.run_number }}
INSTANCE_NAME=ow-docker-compose-${{ github.run_id }}
echo "::set-output name=ami::${AMI}"
echo "::set-output name=instance_name::${INSTANCE_NAME}"
@@ -87,11 +83,19 @@ runs:
shell: bash
id: ec2_instance
run: |
aws ec2 run-instances --key-name $EC2_KEY_NAME --subnet-id $VPC_SUBNET_ID --security-group-ids $EC2_SECURITY_GROUP_ID --instance-type $EC2_INSTANCE_TYPE --image-id ${{ steps.ec2_facts.outputs.ami }} --tag-specifications "ResourceType=instance,Tags=[{Key=Name,Value=${{ steps.ec2_facts.outputs.instance_name }}},{Key=Owner,Value=gha-wlan-testing}]" --output text
INSTANCE_PUBLIC_IP=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=${{ steps.ec2_facts.outputs.instance_name }}" --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)
INSTANCE_ID=$(aws ec2 describe-instances --filters "Name=tag:Name,Values=${{ steps.ec2_facts.outputs.instance_name }}" --query 'Reservations[*].Instances[*].InstanceId' --output text)
echo "::set-output name=instance_public_ip::${INSTANCE_PUBLIC_IP}"
echo "::set-output name=instance_id::${INSTANCE_ID}"
echo ::set-output name=instance_id::"$(aws ec2 run-instances --key-name $EC2_KEY_NAME --subnet-id $VPC_SUBNET_ID --security-group-ids $EC2_SECURITY_GROUP_ID --instance-type $EC2_INSTANCE_TYPE --image-id ${{ steps.set_outputs.outputs.ami }} --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=${{ steps.set_outputs.outputs.instance_name }}},{Key=Owner,Value=gha-wlan-testing}]' | jq -r '.Instances[].InstanceId')"
- name: Wait for cloud SDK instance to get ready
shell: bash
run: |
INSTANCE_STATE=$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].State.Name' --output text)
timeout 10m bash -c 'until [[ "$INSTANCE_STATE" == "running" ]]; do echo "Cloud SDK instance state is $INSTANCE_STATE, waiting for the instance to get ready"; sleep 5; INSTANCE_STATE=$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].State.Name' --output text); done'
- name: Get cloud SDK instance public IP
shell: bash
id: get_instance_public_ip
run: |
echo ::set-output name=ip::"$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)"
# Deploy target CloudSDK into EC2 instance
- name: Save SSH key for access to EC2 instance
@@ -105,10 +109,9 @@ runs:
- name: Try connecting to EC2 instance and install Docker
shell: bash
run: |
until ssh -o "StrictHostKeyChecking accept-new" -i ssh_key.pem ubuntu@${{ steps.ec2_instance.outputs.instance_public_ip }}; do
sleep 5
done
ssh -i ssh_key.pem ubuntu@${{ steps.ec2_instance.outputs.instance_public_ip }} << EOF
timeout 10m bash -c 'until ssh -o "StrictHostKeyChecking accept-new" -i ssh_key.pem ubuntu@${{ steps.get_instance_public_ip.outputs.ip }}; do sleep 5; done'
ssh -i ssh_key.pem ubuntu@${{ steps.get_instance_public_ip.outputs.ip }} << EOF
sudo -i;
apt-get update && apt-get install -y ca-certificates curl gnupg lsb-release python3-pip jq git;
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg;
@@ -121,7 +124,7 @@ runs:
"log-driver": "syslog",
"log-opts": {
"syslog-address": "tcp://k8s-monitori-logstash-fdd0ff34dd-2abb6df4e49f3d1a.elb.us-east-2.amazonaws.com:514",
"tag": "{{.Name}}/ow-docker-compose-${{ github.run_number }}"
"tag": "{{.Name}}/ow-docker-compose-${{ github.run_id }}"
}
}
EOT
@@ -131,7 +134,7 @@ runs:
- name: Deploy target CloudSDK in EC2
shell: bash
run: |
ssh -i ssh_key.pem ubuntu@${{ steps.ec2_instance.outputs.instance_public_ip }} << EOF
ssh -i ssh_key.pem ubuntu@${{ steps.get_instance_public_ip.outputs.ip }} << EOF
sudo -i;
git clone https://github.com/Telecominfraproject/wlan-cloud-ucentral-deploy.git;
cd wlan-cloud-ucentral-deploy;
@@ -179,5 +182,5 @@ runs:
-e OWSEC_NEW_PASSWORD \
-e CHECK_RETRIES \
-e FLAGS \
--add-host ow-docker-compose-${{ github.run_number }}.wlan.local:${{ steps.ec2_instance.outputs.instance_public_ip }} \
--add-host ${{ steps.set_outputs.outputs.instance_name }}.wlan.local:${{ steps.get_instance_public_ip.outputs.ip }} \
tip-tip-wlan-cloud-ucentral.jfrog.io/clustersysteminfo:main

View File

@@ -1,5 +1,5 @@
name: Deploy virtual AP instance
description: create EC2 instance running latest wlan-ap release and connect to gateway
description: Create EC2 instance running latest wlan-ap release and connect to gateway
inputs:
virtual_ap_password:
@@ -27,38 +27,36 @@ outputs:
value: ${{ steps.get_virtual_ap_facts.outputs.serial_number }}
instance_id:
description: ID of the created virtual AP EC2 instance
value: ${{ steps.get_virtual_ap_facts.outputs.instance_id }}
value: ${{ steps.ec2_instance.outputs.instance_id }}
runs:
using: "composite"
steps:
- name: Get AMI ID of most recent x64_vmware firmware image
shell: bash
id: get_ami_id
id: set_outputs
run: |
echo ::set-output name=id::"$(aws ec2 describe-images --owners self --filters 'Name=name,Values=*-x64_vmware-*' --query 'sort_by(Images, &CreationDate)[-1].ImageId' --output text)"
echo ::set-output name=ami::"$(aws ec2 describe-images --owners self --filters 'Name=name,Values=*-x64_vmware-*' --query 'sort_by(Images, &CreationDate)[-1].ImageId' --output text)"
echo ::set-output name=instance_name::openwifi-virtual-ap-${{ github.run_id }}
- name: Create openwifi-virtual-ap EC2 instance
shell: bash
id: ec2_instance
run: |
aws ec2 run-instances --key-name openwifi-virtual-ap --security-groups openwifi-virtual-ap --instance-type t2.nano --image-id ${{ steps.get_ami_id.outputs.id }} --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=openwifi-virtual-ap-${{ github.run_number }}},{Key=Owner,Value=gha-wlan-testing}]'
echo ::set-output name=instance_id::"$(aws ec2 run-instances --key-name openwifi-virtual-ap --security-groups openwifi-virtual-ap --instance-type t2.nano --image-id ${{ steps.set_outputs.outputs.ami }} --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=${{ steps.set_outputs.outputs.instance_name }}},{Key=Owner,Value=gha-wlan-testing}]' | jq -r '.Instances[].InstanceId')"
- name: Wait for virtual AP instance to get ready
shell: bash
run: |
INSTANCE_STATE=$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=openwifi-virtual-ap-${{ github.run_number }}' --query 'Reservations[*].Instances[*].State.Name' --output text)
until [[ "$INSTANCE_STATE" == "running" ]]; do
echo "Virtual AP instance state is $INSTANCE_STATE, waiting for the instance to get ready."
INSTANCE_STATE=$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=openwifi-virtual-ap-${{ github.run_number }}' --query 'Reservations[*].Instances[*].State.Name' --output text)
done
INSTANCE_STATE=$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].State.Name' --output text)
timeout 10m bash -c 'until [[ "$INSTANCE_STATE" == "running" ]]; do echo "Virtual AP instance state is $INSTANCE_STATE, waiting for the instance to get ready"; sleep 5; INSTANCE_STATE=$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].State.Name' --output text); done'
- name: Get virtual AP instance facts
shell: bash
id: get_virtual_ap_facts
run: |
echo ::set-output name=public_ip::"$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=openwifi-virtual-ap-${{ github.run_number }}' --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)"
echo ::set-output name=serial_number::"$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=openwifi-virtual-ap-${{ github.run_number }}' --query 'Reservations[*].Instances[*].NetworkInterfaces[*].MacAddress' --output text | sed 's/://g')"
echo ::set-output name=instance_id::"$(aws ec2 describe-instances --filters 'Name=tag:Name,Values=openwifi-virtual-ap-${{ github.run_number }}' --query 'Reservations[*].Instances[*].InstanceId' --output text)"
echo ::set-output name=public_ip::"$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].PublicIpAddress' --output text)"
echo ::set-output name=serial_number::"$(aws ec2 describe-instances --instance-id ${{ steps.ec2_instance.outputs.instance_id }} --query 'Reservations[*].Instances[*].NetworkInterfaces[*].MacAddress' --output text | sed 's/://g')"
- name: Upload AP certificate, key and dev-id to instance
env: