Skip to content

[CN-1274] Update client configs to use public IP addresses (#18) #52

[CN-1274] Update client configs to use public IP addresses (#18)

[CN-1274] Update client configs to use public IP addresses (#18) #52

name: Test on GKE
on:
push:
paths-ignore:
- 'docs/**'
env:
GCP_PROJECT_ID: ${{ secrets.GKE_PROJECT }}
GKE_ZONE: europe-west1-b
GCP_NETWORK: tutorial-test-network
jobs:
create-gke-cluster:
name: Create GKE cluster
runs-on: ubuntu-latest
outputs:
CLUSTER_NAME: ${{ steps.cluster.outputs.CLUSTER_NAME }}
steps:
- name: Authenticate to GCP
uses: 'google-github-actions/[email protected]'
with:
credentials_json: ${{ secrets.GKE_SA_KEY }}
- name: Set up Cloud SDK
uses: google-github-actions/[email protected]
with:
project_id: ${{ env.GCP_PROJECT_ID }}
- name: Create GKE cluster
id: cluster
run: |-
CLUSTER_NAME="hpo-ex-ex-$GITHUB_RUN_NUMBER"
echo "CLUSTER_NAME=$CLUSTER_NAME" >> $GITHUB_ENV
echo "::set-output name=CLUSTER_NAME::${CLUSTER_NAME}"
gcloud container clusters create $CLUSTER_NAME \
--zone=${{ env.GKE_ZONE }} \
--project=${{ env.GCP_PROJECT_ID }} \
--network=${{ env.GCP_NETWORK }} \
--machine-type=n1-standard-2 \
--num-nodes=2
sleep 30
- name: Connect to the GKE cluster
run: |
gcloud container clusters get-credentials ${{ env.CLUSTER_NAME }} \
--zone ${{ env.GKE_ZONE }} \
--project ${{ env.GCP_PROJECT_ID }}
- name: Install Kubectl
run: |-
gcloud components install kubectl
- name: Deploy operator
run: |-
helm repo add hazelcast https://hazelcast-charts.s3.amazonaws.com/
helm repo update
helm install operator hazelcast/hazelcast-platform-operator --set installCRDs=true,phoneHomeEnabled=false
run-tests:
name: Run Integration tests on GKE
runs-on: ubuntu-latest
needs: create-gke-cluster
env:
CLUSTER_NAME: ${{ needs.create-gke-cluster.outputs.CLUSTER_NAME }}
strategy:
max-parallel: 1
fail-fast: false
matrix:
include:
- type: smart
suffix: ""
- type: unisocket
suffix: "-unisocket"
steps:
- name: Checkout
uses: actions/checkout@v2
- name: Set up JDK 1.8
uses: actions/setup-java@v2
with:
java-version: 8
distribution: 'adopt'
cache: 'maven'
- name: Set up Node.js
uses: actions/setup-node@v2
with:
node-version: '14'
cache: 'npm'
cache-dependency-path: '**/package-lock.json'
- name: Set up Golang
uses: actions/setup-go@v2
with:
go-version: '^1.17.2'
- name: Setup Python
uses: actions/setup-python@v2
with:
python-version: 3.9
cache: 'pip'
- name: Authenticate to GCP
uses: 'google-github-actions/[email protected]'
with:
credentials_json: ${{ secrets.GKE_SA_KEY }}
- name: Set up Cloud SDK
uses: google-github-actions/[email protected]
with:
project_id: ${{ env.GCP_PROJECT_ID }}
- name: Install Kubectl
run: |-
gcloud components install kubectl
- name: Connect to the GKE cluster
run: |
gcloud container clusters get-credentials ${{ env.CLUSTER_NAME }} \
--zone ${{ env.GKE_ZONE }} \
--project ${{ env.GCP_PROJECT_ID }}
- name: Deploy Hazelcast cluster
run: |-
kubectl apply -f hazelcast${{matrix.suffix}}.yaml
- name: Wait for external IP to get assigned
timeout-minutes: 5
run: |-
serviceType=$(kubectl get svc my-hazelcast${{matrix.suffix}} --output="jsonpath={.spec.type}")
if [ "$serviceType" != "LoadBalancer" ]; then
exit 1
fi
EXTERNAL_IP=$(kubectl get svc my-hazelcast${{matrix.suffix}} --output="jsonpath={.status.loadBalancer.ingress[0].ip}")
while [ "$EXTERNAL_IP" == "" ]; do
sleep 10
EXTERNAL_IP=$(kubectl get svc my-hazelcast${{matrix.suffix}} --output="jsonpath={.status.loadBalancer.ingress[0].ip}")
done
echo "EXTERNAL_IP=${EXTERNAL_IP}" >> $GITHUB_ENV
- name: Wait for Smart type member IPs to get assigned
if: matrix.type == 'smart'
timeout-minutes: 5
run: |-
for i in {0..2}; do
SVC_NAME="my-hazelcast${{matrix.suffix}}-${i}"
SVC_EXTERNAL_IP=$(kubectl get svc "${SVC_NAME}" --output="jsonpath={.status.loadBalancer.ingress[0].ip}")
while [ "$SVC_EXTERNAL_IP" == "" ]; do
sleep 10
SVC_EXTERNAL_IP=$(kubectl get svc "${SVC_NAME}" --output="jsonpath={.status.loadBalancer.ingress[0].ip}")
done
done
- name: Wait for Hazelcast pods
run: |-
kubectl wait --for=condition=ready pod/my-hazelcast${{matrix.suffix}}-0 --timeout=5m
kubectl wait --for=condition=ready pod/my-hazelcast${{matrix.suffix}}-1 --timeout=150s
kubectl wait --for=condition=ready pod/my-hazelcast${{matrix.suffix}}-2 --timeout=150s
- name: Test Java Client
run: |-
EXTERNAL_IP="${{ env.EXTERNAL_IP }}"
cd java${{matrix.suffix}}
sed -i "s/<EXTERNAL-IP>/$EXTERNAL_IP/g" src/main/java/com/hazelcast/Main.java
mvn package
java -jar target/*jar-with-dependencies*.jar >> output-java.txt &
PID=$!
sleep 30
kill $PID
cat output-java.txt | grep 'Successful connection!' -q
- name: Test Node.js Client
run: |-
EXTERNAL_IP="${{ env.EXTERNAL_IP }}"
cd nodejs${{matrix.suffix}}
sed -i "s/<EXTERNAL-IP>/$EXTERNAL_IP/g" client.js
npm install
npm start >> output-nodejs.txt &
PID=$!
sleep 30
kill $PID
cat output-nodejs.txt | grep 'Successful connection!' -q
- name: Test Go Client
run: |-
EXTERNAL_IP="${{ env.EXTERNAL_IP }}"
cd go${{matrix.suffix}}
sed -i "s/<EXTERNAL-IP>/$EXTERNAL_IP/g" main.go
go run main.go >> output-go.txt &
PID=$!
sleep 30
kill $PID
cat output-go.txt | grep 'Successful connection!' -q
- name: Test Python Client
run: |-
EXTERNAL_IP="${{ env.EXTERNAL_IP }}"
cd python${{matrix.suffix}}
sed -i "s/<EXTERNAL-IP>/$EXTERNAL_IP/g" main.py
pip install -r requirements.txt
python main.py >> output-python.txt &
PID=$!
sleep 30
kill $PID
cat output-python.txt | grep 'Successful connection!' -q
- name: Clean up
if: ${{ always() }}
run: |-
kubectl delete hazelcast my-hazelcast${{matrix.suffix}}
kubectl wait --for=delete pod/my-hazelcast${{matrix.suffix}}-0 --timeout=2m
kubectl get svc my-hazelcast${{matrix.suffix}} || exit 0
kubectl wait --for=delete svc/my-hazelcast${{matrix.suffix}} --timeout=5m
- name: Clean up Smart services
if: ${{ always() && matrix.type == 'smart' }}
run: |-
kubectl get svc my-hazelcast${{matrix.suffix}}-0 || exit 0
kubectl wait --for=delete svc/my-hazelcast${{matrix.suffix}}-0 --timeout=5m
clean-up:
name: Clean up GKE cluster
runs-on: ubuntu-latest
needs: [run-tests, create-gke-cluster]
if: ${{ always() }}
env:
CLUSTER_NAME: ${{ needs.create-gke-cluster.outputs.CLUSTER_NAME }}
steps:
- name: Authenticate to GCP
uses: 'google-github-actions/[email protected]'
with:
credentials_json: ${{ secrets.GKE_SA_KEY }}
- name: Set up Cloud SDK
uses: google-github-actions/[email protected]
with:
project_id: ${{ env.GCP_PROJECT_ID }}
# Clean up
- name: Delete cluster
run: |-
gcloud container clusters delete "$CLUSTER_NAME" --zone="$GKE_ZONE" --quiet