1+ # # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
2+ # # SPDX-License-Identifier: Apache-2.0
3+
4+ # This is a reusable workflow for running the Enablement test for App Signals.
5+ # It is meant to be called from another workflow.
6+ # Read more about reusable workflows: https://docs.github.com/en/actions/using-workflows/reusing-workflows#overview
7+ name : Java EKS OTLP/OCB Use Case
8+ on :
9+ workflow_call :
10+ inputs :
11+ aws-region :
12+ required : true
13+ type : string
14+ test-cluster-name :
15+ required : true
16+ type : string
17+ caller-workflow-name :
18+ required : true
19+ type : string
20+ java-version :
21+ description : " Currently support version 8, 11, 17, 21, 22"
22+ required : false
23+ type : string
24+ default : ' 11'
25+ adot-image-name :
26+ required : false
27+ type : string
28+ cw-agent-operator-tag :
29+ required : false
30+ type : string
31+ outputs :
32+ job-started :
33+ value : ${{ jobs.metric-limiter.outputs.job-started }}
34+ validation-result :
35+ value : ${{ jobs.metric-limiter.outputs.validation-result }}
36+
37+ permissions :
38+ id-token : write
39+ contents : read
40+
41+ env :
42+ # The precense of this env var is required for use by terraform and AWS CLI commands
43+ # It is not redundant
44+ E2E_TEST_AWS_REGION : ${{ inputs.aws-region }}
45+ CLUSTER_NAME : ${{ inputs.test-cluster-name }}
46+ CALLER_WORKFLOW_NAME : ${{ inputs.caller-workflow-name }}
47+ JAVA_VERSION : ${{ inputs.java-version }}
48+ ADOT_IMAGE_NAME : ${{ inputs.adot-image-name }}
49+ CW_AGENT_OPERATOR_TAG : ${{ inputs.cw-agent-operator-tag }}
50+ E2E_TEST_ACCOUNT_ID : ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ACCOUNT_ID }}
51+ E2E_TEST_ROLE_NAME : ${{ secrets.APPLICATION_SIGNALS_E2E_TEST_ROLE_NAME }}
52+ METRIC_NAMESPACE : ApplicationSignals
53+ LOG_GROUP_NAME : /aws/application-signals/data
54+ TEST_RESOURCES_FOLDER : ${GITHUB_WORKSPACE}
55+
56+ jobs :
57+ otlp-ocb :
58+ runs-on : ubuntu-latest
59+ timeout-minutes : 30
60+ outputs :
61+ job-started : ${{ steps.job-started.outputs.job-started }}
62+ validation-result : ${{ steps.validation-result.outputs.validation-result }}
63+ steps :
64+ - name : Check if the job started
65+ id : job-started
66+ run : echo "job-started=true" >> $GITHUB_OUTPUT
67+
68+ - name : Generate testing id and sample app namespace
69+ run : |
70+ echo TESTING_ID="${{ github.job }}-${{ github.run_id }}-${{ github.run_number }}-${{ github.run_attempt }}" >> $GITHUB_ENV
71+ echo SAMPLE_APP_NAMESPACE="ns-${{ github.run_id }}-${{ github.run_number }}" >> $GITHUB_ENV
72+
73+ - uses : actions/checkout@v4
74+ with :
75+ repository : ' aws-observability/aws-application-signals-test-framework'
76+ ref : ${{ env.CALLER_WORKFLOW_NAME == 'main-build' && 'main' || github.ref }}
77+ fetch-depth : 0
78+
79+ # We initialize Gradlew Daemon early on during the workflow because sometimes initialization
80+ # fails due to transient issues. If it fails here, then we will try again later before the validators
81+ - name : Initiate Gradlew Daemon
82+ id : initiate-gradlew
83+ uses : ./.github/workflows/actions/execute_and_retry
84+ continue-on-error : true
85+ with :
86+ command : " ./gradlew :validator:build"
87+ cleanup : " ./gradlew clean"
88+ max_retry : 3
89+ sleep_time : 60
90+
91+ - name : Download enablement script
92+ uses : ./.github/workflows/actions/execute_and_retry
93+ with :
94+ pre-command : " mkdir enablement-script && cd enablement-script"
95+ command : " wget https://raw.githubusercontent.com/aws-observability/application-signals-demo/refs/heads/ocb/scripts/eks/appsignals/enable-app-signals-ocb.sh"
96+ cleanup : " rm -f enable-app-signals.sh && rm -f clean-app-signals.sh"
97+ post-command : " chmod +x enable-app-signals.sh && chmod +x clean-app-signals.sh"
98+
99+ - name : Remove log group deletion command
100+ if : always()
101+ working-directory : enablement-script
102+ run : |
103+ delete_log_group="aws logs delete-log-group --log-group-name '${{ env.LOG_GROUP_NAME }}' --region \$REGION"
104+ sed -i "s#$delete_log_group##g" clean-app-signals.sh
105+
106+ - name : Configure AWS Credentials
107+ uses : aws-actions/configure-aws-credentials@v4
108+ with :
109+ role-to-assume : arn:aws:iam::${{ env.E2E_TEST_ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
110+ aws-region : us-east-1
111+
112+ - name : Retrieve account
113+ uses : aws-actions/aws-secretsmanager-get-secrets@v2
114+ with :
115+ secret-ids : |
116+ ACCOUNT_ID, region-account/${{ env.E2E_TEST_AWS_REGION }}
117+ JAVA_MAIN_SAMPLE_APP_IMAGE, e2e-test/java-main-sample-app-image
118+ JAVA_REMOTE_SAMPLE_APP_IMAGE, e2e-test/java-remote-sample-app-image
119+
120+ # If the workflow is running as a canary, then we want to log in to the aws account in the appropriate region
121+ - name : Configure AWS Credentials
122+ if : ${{ github.event.repository.name == 'aws-application-signals-test-framework' }}
123+ uses : aws-actions/configure-aws-credentials@v4
124+ with :
125+ role-to-assume : arn:aws:iam::${{ env.ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
126+ aws-region : ${{ env.E2E_TEST_AWS_REGION }}
127+
128+ # local directory to store the kubernetes config
129+ - name : Create kubeconfig directory
130+ run : mkdir -p ${{ github.workspace }}/.kube
131+
132+ - name : Set KUBECONFIG environment variable
133+ run : echo KUBECONFIG="${{ github.workspace }}/.kube/config" >> $GITHUB_ENV
134+
135+ - name : Set up kubeconfig
136+ run : aws eks update-kubeconfig --name ${{ env.CLUSTER_NAME }} --region ${{ env.E2E_TEST_AWS_REGION }}
137+
138+ - name : Download and install eksctl
139+ uses : ./.github/workflows/actions/execute_and_retry
140+ with :
141+ pre-command : ' mkdir ${{ github.workspace }}/eksctl'
142+ command : ' curl -sLO "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_Linux_amd64.tar.gz"
143+ && tar -xzf eksctl_Linux_amd64.tar.gz -C ${{ github.workspace }}/eksctl && rm eksctl_Linux_amd64.tar.gz'
144+ cleanup : ' rm -f eksctl_Linux_amd64.tar.gz'
145+
146+ - name : Add eksctl to Github Path
147+ run : |
148+ echo "${{ github.workspace }}/eksctl" >> $GITHUB_PATH
149+
150+ # This step deletes lingering resources from previous test runs
151+ - name : Delete all sample app namespaces
152+ continue-on-error : true
153+ timeout-minutes : 5
154+ run : kubectl get namespace | awk '/^ns-[0-9]+-[0-9]+/{print $1}' | xargs kubectl delete namespace
155+
156+ # Set up App Signals permissions and resources
157+ - name : Create role for AWS access from the sample app
158+ id : create_service_account
159+ uses : ./.github/workflows/actions/execute_and_retry
160+ with :
161+ command : " eksctl create iamserviceaccount \
162+ --name service-account-${{ env.TESTING_ID }} \
163+ --namespace ${{ env.SAMPLE_APP_NAMESPACE }} \
164+ --cluster ${{ env.CLUSTER_NAME }} \
165+ --role-name eks-s3-access-${{ env.TESTING_ID }} \
166+ --attach-policy-arn arn:aws:iam::aws:policy/AmazonS3ReadOnlyAccess \
167+ --region ${{ env.E2E_TEST_AWS_REGION }} \
168+ --approve"
169+ cleanup : " eksctl delete iamserviceaccount \
170+ --name service-account-${{ env.TESTING_ID }} \
171+ --namespace ${{ env.SAMPLE_APP_NAMESPACE }} \
172+ --cluster ${{ env.CLUSTER_NAME }} \
173+ --region ${{ env.E2E_TEST_AWS_REGION }}"
174+ sleep_time : 60
175+
176+ - name : Set up terraform
177+ uses : ./.github/workflows/actions/execute_and_retry
178+ with :
179+ command : " wget -O- https://apt.releases.hashicorp.com/gpg | sudo gpg --dearmor -o /usr/share/keyrings/hashicorp-archive-keyring.gpg"
180+ post-command : ' echo "deb [signed-by=/usr/share/keyrings/hashicorp-archive-keyring.gpg] https://apt.releases.hashicorp.com $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/hashicorp.list
181+ && sudo apt update && sudo apt install terraform'
182+ sleep_time : 60
183+
184+ - name : Initiate Terraform
185+ uses : ./.github/workflows/actions/execute_and_retry
186+ with :
187+ command : " cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/java/eks-otlp-ocb && terraform init && terraform validate"
188+ cleanup : " rm -rf .terraform && rm -rf .terraform.lock.hcl"
189+ max_retry : 6
190+ sleep_time : 60
191+
192+ - name : Set Sample App Image
193+ run : |
194+ echo MAIN_SAMPLE_APP_IMAGE_ARN="${{ env.ACCOUNT_ID }}.dkr.ecr.${{ env.E2E_TEST_AWS_REGION }}.amazonaws.com/${{ env.JAVA_MAIN_SAMPLE_APP_IMAGE }}:v${{ env.JAVA_VERSION }}" >> $GITHUB_ENV
195+ echo REMOTE_SAMPLE_APP_IMAGE_ARN="${{ env.ACCOUNT_ID }}.dkr.ecr.${{ env.E2E_TEST_AWS_REGION }}.amazonaws.com/${{ env.JAVA_REMOTE_SAMPLE_APP_IMAGE }}:v${{ env.JAVA_VERSION }}" >> $GITHUB_ENV
196+
197+ # TODO: Fix retry, clean-app-signals doesn't work for enable-app-signals-ocb.sh
198+ - name : Install OTel Operator using enablement script
199+ uses : ./.github/workflows/actions/execute_and_retry
200+ with :
201+ command : " ${{ env.TEST_RESOURCES_FOLDER }}/enablement-script/enable-app-signals-ocb.sh \
202+ ${{ env.CLUSTER_NAME }} \
203+ ${{ env.E2E_TEST_AWS_REGION }} \
204+ ${{ env.SAMPLE_APP_NAMESPACE }}"
205+ max_retry : 1
206+ sleep_time : 60
207+ # TODO: cleanup and increase retries
208+ # cleanup: "TODO"
209+
210+ - name : Install OTel Collector
211+ uses : ./.github/workflows/actions/execute_and_retry
212+ with :
213+ command : " cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/java/eks-otlp-ocb/util && kubectl apply -f ./appsignals-collector.yaml -n ${{ env.SAMPLE_APP_NAMESPACE }}"
214+ cleanup : " kubectl delete -f ./appsignals-collector.yaml -n ${{ env.SAMPLE_APP_NAMESPACE }} && \
215+ aws eks update-kubeconfig --name ${{ env.CLUSTER_NAME }} --region ${{ env.E2E_TEST_AWS_REGION }}"
216+
217+ - name : Deploy sample app via terraform and wait for the endpoint to come online
218+ id : deploy-sample-app
219+ uses : ./.github/workflows/actions/execute_and_retry
220+ with :
221+ command : " cd ${{ env.TEST_RESOURCES_FOLDER }}/terraform/java/eks-otlp-ocb && \
222+ terraform apply -auto-approve \
223+ -var=\" test_id=${{ env.TESTING_ID }}\" \
224+ -var=\" aws_region=${{ env.E2E_TEST_AWS_REGION }}\" \
225+ -var=\" kube_directory_path=${{ github.workspace }}/.kube\" \
226+ -var=\" eks_cluster_name=${{ env.CLUSTER_NAME }}\" \
227+ -var=\" eks_cluster_context_name=$(kubectl config current-context)\" \
228+ -var=\" test_namespace=${{ env.SAMPLE_APP_NAMESPACE }}\" \
229+ -var=\" service_account_aws_access=service-account-${{ env.TESTING_ID }}\" \
230+ -var=\" sample_app_image=${{ env.MAIN_SAMPLE_APP_IMAGE_ARN }}\" \
231+ -var=\" sample_remote_app_image=${{ env.REMOTE_SAMPLE_APP_IMAGE_ARN }}\" \
232+ -var='account_id=${{ env.ACCOUNT_ID }}'"
233+ cleanup : " terraform destroy -auto-approve \
234+ -var=\" test_id=${{ env.TESTING_ID }}\" \
235+ -var=\" aws_region=${{ env.E2E_TEST_AWS_REGION }}\" \
236+ -var=\" kube_directory_path=${{ github.workspace }}/.kube\" \
237+ -var=\" eks_cluster_name=${{ env.CLUSTER_NAME }}\" \
238+ -var=\" test_namespace=${{ env.SAMPLE_APP_NAMESPACE }}\" \
239+ -var=\" service_account_aws_access=service-account-${{ env.TESTING_ID }}\" \
240+ -var=\" sample_app_image=${{ env.MAIN_SAMPLE_APP_IMAGE_ARN }}\" \
241+ -var=\" sample_remote_app_image=${{ env.REMOTE_SAMPLE_APP_IMAGE_ARN }}\" "
242+ max_retry : 2
243+ sleep_time : 60
244+
245+ - name : Validate traces
246+ id : trace-validation
247+ run : echo "TEST"
248+
249+ - name : Refresh AWS Credentials
250+ if : ${{ github.event.repository.name == 'aws-application-signals-test-framework' }}
251+ uses : aws-actions/configure-aws-credentials@v4
252+ with :
253+ role-to-assume : arn:aws:iam::${{ env.ACCOUNT_ID }}:role/${{ env.E2E_TEST_ROLE_NAME }}
254+ aws-region : ${{ env.E2E_TEST_AWS_REGION }}
255+
256+ - name : Save test results
257+ if : always()
258+ id : validation-result
259+ run : |
260+ if [ "${{ steps.trace-validation.outcome }}" = "success" ]; then
261+ echo "validation-result=success" >> $GITHUB_OUTPUT
262+ else
263+ echo "validation-result=failure" >> $GITHUB_OUTPUT
264+ fi
265+
266+ # TODO: Cleanup
267+ - name : Clean up
268+ run : echo "TODO"
0 commit comments