From d7417462503ce1b6530ead1a118749aa2bb11e7a Mon Sep 17 00:00:00 2001 From: acando Date: Sun, 10 Mar 2024 16:27:02 +0100 Subject: [PATCH 1/8] add github coverage and codecov global config files --- codecov.yaml | 14 +++++++++++ lithops/tests/github_coverage.py | 43 ++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 codecov.yaml create mode 100644 lithops/tests/github_coverage.py diff --git a/codecov.yaml b/codecov.yaml new file mode 100644 index 000000000..16cfde1e3 --- /dev/null +++ b/codecov.yaml @@ -0,0 +1,14 @@ +coverage: + precision: 0 + range: 50..75 + round: up + +flags: + localhost: + carryforward: true + + aws: + carryforward: true + + k8s: + carryforward: true \ No newline at end of file diff --git a/lithops/tests/github_coverage.py b/lithops/tests/github_coverage.py new file mode 100644 index 000000000..5ce7f7f01 --- /dev/null +++ b/lithops/tests/github_coverage.py @@ -0,0 +1,43 @@ +# +# (C) Copyright Cloudlab URV 2024 +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +from lithops.tests.tests_main import run_tests +from lithops.scripts.cli import runtime, lithops_cli + +def test_github_localhost(): + run_tests("all", None, "", None, None, + None, False, False) + +def test_github_k8s(): + runtime(['build', 'acanadilla/k8s_internal', '--file', './runtime/kubernetes/Dockerfile', '--backend', 'k8s'], standalone_mode=False) + run_tests("", None, "call_async", None, None, + None, False, False) + run_tests("", None, "storage", None, None, + None, False, False) + run_tests("", None, "map_reduce", None, None, + None, False, False) + runtime(['build', 'acanadilla/test-bucket-k8s', '--file', './runtime/kubernetes/Dockerfile', '--backend', 'k8s'], standalone_mode=False) + runtime(['deploy', 'acanadilla/test-bucket-k8s', '--memory', 500], standalone_mode=False) + runtime(['list'], standalone_mode=False) + lithops_cli(['clean'], standalone_mode=False) + +def test_github_aws(): + run_tests("all", None, "", None, None, + None, False, False) + runtime(['build', 'acanadilla/test-bucket-s3', '--file', './runtime/aws_lambda/Dockerfile', '--backend', 'aws_lambda'], standalone_mode=False) + runtime(['deploy', 'acanadilla/test-bucket-s3', '--memory', 500], standalone_mode=False) + runtime(['list'], standalone_mode=False) + lithops_cli(['clean'], standalone_mode=False) From baf0eae8c2b041554abf249a2269f5879c7bb988 Mon Sep 17 00:00:00 2001 From: acanadil <79637187+acanadil@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:27:59 +0100 Subject: [PATCH 2/8] Create localhost-coverage.yml --- .github/workflows/localhost-coverage.yml | 39 ++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 .github/workflows/localhost-coverage.yml diff --git a/.github/workflows/localhost-coverage.yml b/.github/workflows/localhost-coverage.yml new file mode 100644 index 000000000..97191f2fa --- /dev/null +++ b/.github/workflows/localhost-coverage.yml @@ -0,0 +1,39 @@ +# This workflow will run a localhost backend test. +name: Localhost Coverage +on: + push: + branches: [ "add-code-coverage" ] + pull_request: + branches: [ "add-code-coverage" ] +jobs: + build: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install pytest + python -m pip install pytest-cov + - name: Install lithops + run: | + pip install . + - name: Test localhost with pytest + run: | + coverage run --omit=./lithops/serverless/*,./lithops/standalone/*,./lithops/util/*,./lithops/libs/*,./lithops/localhost/v2/*,./lithops/utils.py,./lithops/tests/util_func/*,./lithops/scripts/**,./lithops/tests/test_template.py,./lithops/tests/tests_main.py -m pytest ./lithops/tests/github_coverage.py -k localhost + coverage xml + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + slug: acanadil/lithops + flags: localhost From 2c5e64b6368b193bb490a7ae047d41a72e45f955 Mon Sep 17 00:00:00 2001 From: acanadil <79637187+acanadil@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:29:01 +0100 Subject: [PATCH 3/8] Create aws-coverage.yml --- .github/workflows/aws-coverage.yml | 54 ++++++++++++++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 .github/workflows/aws-coverage.yml diff --git a/.github/workflows/aws-coverage.yml b/.github/workflows/aws-coverage.yml new file mode 100644 index 000000000..445aa43f1 --- /dev/null +++ b/.github/workflows/aws-coverage.yml @@ -0,0 +1,54 @@ +# This workflow will run an aws backend test. +name: AWS coverage +on: + push: + branches: [ "add-code-coverage" ] + paths: + - 'lithops/serverless/**' + #- '.github/workflows/aws-coverage.yml' + pull_request: + branches: [ "add-code-coverage" ] + paths: + - 'lithops/serverless/**' + #- '.github/workflows/aws-coverage.yml' +jobs: + build_aws: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install pytest + python -m pip install pytest-cov + - name: Install lithops + run: | + pip install . + - name: Test aws with pytest + run: | + echo "lithops:" > .lithops_config + echo " backend: aws_lambda" >> .lithops_config + echo " storage: aws_s3" >> .lithops_config + echo "aws:" >> .lithops_config + echo " region: us-east-1" >> .lithops_config + echo " access_key_id: ${{ secrets.AWS_KEY_ID }}" >> .lithops_config + echo " secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .lithops_config + echo "aws_lambda:" >> .lithops_config + echo " execution_role: ${{ secrets.AWS_ROLE }}" >> .lithops_config + coverage run --omit=./lithops/standalone/*,./lithops/util/*,./lithops/libs/*,./lithops/localhost/*,./lithops/utils.py,./lithops/tests/util_func/*,./lithops/scripts/**,./lithops/tests/test_template.py,./lithops/tests/tests_main.py -m pytest ./lithops/tests/github_coverage.py -k aws + coverage xml + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + slug: acanadil/lithops + flags: aws From c2a8f1e1fec505851e76dd13ddf365a59852dcb3 Mon Sep 17 00:00:00 2001 From: acanadil <79637187+acanadil@users.noreply.github.com> Date: Sun, 10 Mar 2024 16:31:32 +0100 Subject: [PATCH 4/8] Create k8s-coverage.yml --- .github/workflows/k8s-coverage.yml | 96 ++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 .github/workflows/k8s-coverage.yml diff --git a/.github/workflows/k8s-coverage.yml b/.github/workflows/k8s-coverage.yml new file mode 100644 index 000000000..6fcec3d16 --- /dev/null +++ b/.github/workflows/k8s-coverage.yml @@ -0,0 +1,96 @@ +# This workflow will run a k8s backend. +name: K8s coverage +on: + push: + branches: [ "add-code-coverage" ] + paths: + - 'lithops/serverless/**' + #- '.github/workflows/k8s-coverage.yml' + pull_request: + branches: [ "add-code-coverage" ] + paths: + - 'lithops/serverless/**' + #- '.github/workflows/k8s-coverage.yml' +jobs: + build_k8s: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10"] + steps: + - uses: actions/checkout@v3 + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v3 + with: + python-version: ${{ matrix.python-version }} + - name: Install dependencies + run: | + python -m pip install --upgrade pip + python -m pip install pytest + python -m pip install pytest-cov + - name: Install lithops + run: | + pip install . + - name: Install docker + run: | + sudo apt-get update + sudo apt-get install ca-certificates curl + sudo install -m 0755 -d /etc/apt/keyrings + sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc + sudo chmod a+r /etc/apt/keyrings/docker.asc + echo \ + "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \ + $(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \ + sudo tee /etc/apt/sources.list.d/docker.list > /dev/null + sudo apt-get update + sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin + sudo docker run hello-world + sudo usermod -aG docker $USER + docker login -u ${{ secrets.DOCKER_USER }} -p ${{ secrets.DOCKER_TOKEN }} + - name: Install minikube + run: | + curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 + sudo install minikube-linux-amd64 /usr/local/bin/minikube + minikube start + - name: Install kubectl + run: | + curl -LO "https://dl.k8s.io/release/$(curl -L -s https://dl.k8s.io/release/stable.txt)/bin/linux/amd64/kubectl" + sudo install -o root -g root -m 0755 kubectl /usr/local/bin/kubectl + - name: Wait until aws-coverage finishes + run: | + status="in_progress" + check="completed" + while [ "$check" != "$status" ]; do + response=$(curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/acanadil/lithops/actions/runs?&head_sha=$GITHUB_SHA") + status=$(echo "$response" | jq -r '.workflow_runs[] | select(.path == ".github/workflows/aws-coverage.yml") | .status') + if [ "$status" == "" ]; then + status="completed" + fi + sleep 30 + done + - name: Test k8s with pytest + run: | + echo "lithops:" > .lithops_config + echo " backend: k8s" >> .lithops_config + echo " storage: aws_s3" >> .lithops_config + echo "k8s:" >> .lithops_config + echo " docker_server: docker.io" >> .lithops_config + echo " docker_user: ${{ secrets.DOCKER_USER }}" >> .lithops_config + echo " docker_password: ${{ secrets.DOCKER_TOKEN }}" >> .lithops_config + echo " runtime: ${{ secrets.DOCKER_RUNTIME }}" >> .lithops_config + echo " runtime_memory: 500" >> .lithops_config + echo " runtime_cpu: 1" >> .lithops_config + echo "aws:" >> .lithops_config + echo " region: us-east-1" >> .lithops_config + echo " access_key_id: ${{ secrets.AWS_KEY_ID }}" >> .lithops_config + echo " secret_access_key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}" >> .lithops_config + coverage run --omit=./lithops/standalone/*,./lithops/util/*,./lithops/libs/*,./lithops/localhost/*,./lithops/utils.py,./lithops/tests/util_func/*,./lithops/scripts/**,./lithops/tests/test_template.py,./lithops/tests/tests_main.py -m pytest ./lithops/tests/github_coverage.py -k k8s + coverage xml + - name: Upload coverage to Codecov + uses: codecov/codecov-action@v4.0.1 + with: + token: ${{ secrets.CODECOV_TOKEN }} + verbose: true + slug: acanadil/lithops + flags: k8s From c0a7b9ab1e4281d0b57d111f8e479de95342182c Mon Sep 17 00:00:00 2001 From: acando Date: Sun, 10 Mar 2024 16:41:51 +0100 Subject: [PATCH 5/8] add coverage and build report to README --- README.md | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/README.md b/README.md index 90394c358..bf1ea1c53 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,21 @@

+

+ + + + + + + + + + + + +

+ Lithops is a Python multi-cloud distributed computing framework. It allows you to run unmodified local python code at massive scale in the main serverless computing platforms. Lithops delivers the user’s code into the cloud without requiring knowledge of how it is deployed and run. Moreover, its multicloud-agnostic architecture ensures portability across cloud providers. From 1a806e7b59ea37145310602897b6af8cde0ce7f8 Mon Sep 17 00:00:00 2001 From: acando Date: Sun, 10 Mar 2024 16:46:09 +0100 Subject: [PATCH 6/8] test coverage on all three platforms --- .github/workflows/aws-coverage.yml | 4 ++-- .github/workflows/k8s-coverage.yml | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/.github/workflows/aws-coverage.yml b/.github/workflows/aws-coverage.yml index 445aa43f1..ddb55fb09 100644 --- a/.github/workflows/aws-coverage.yml +++ b/.github/workflows/aws-coverage.yml @@ -5,12 +5,12 @@ on: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' - #- '.github/workflows/aws-coverage.yml' + - '.github/workflows/aws-coverage.yml' pull_request: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' - #- '.github/workflows/aws-coverage.yml' + - '.github/workflows/aws-coverage.yml' jobs: build_aws: runs-on: ubuntu-latest diff --git a/.github/workflows/k8s-coverage.yml b/.github/workflows/k8s-coverage.yml index 6fcec3d16..5a9a1b278 100644 --- a/.github/workflows/k8s-coverage.yml +++ b/.github/workflows/k8s-coverage.yml @@ -5,12 +5,12 @@ on: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' - #- '.github/workflows/k8s-coverage.yml' + - '.github/workflows/k8s-coverage.yml' pull_request: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' - #- '.github/workflows/k8s-coverage.yml' + - '.github/workflows/k8s-coverage.yml' jobs: build_k8s: runs-on: ubuntu-latest From 754506b7dde868e75a5d12e2d974bfe830fa86f4 Mon Sep 17 00:00:00 2001 From: acando Date: Mon, 11 Mar 2024 09:07:49 +0100 Subject: [PATCH 7/8] fix flake8 errors and refine workflow execution conditions --- .github/workflows/aws-coverage.yml | 2 ++ .github/workflows/k8s-coverage.yml | 4 ++++ .github/workflows/localhost-coverage.yml | 4 ++++ lithops/tests/github_coverage.py | 18 ++++++++---------- 4 files changed, 18 insertions(+), 10 deletions(-) diff --git a/.github/workflows/aws-coverage.yml b/.github/workflows/aws-coverage.yml index ddb55fb09..fc0efb8a2 100644 --- a/.github/workflows/aws-coverage.yml +++ b/.github/workflows/aws-coverage.yml @@ -5,11 +5,13 @@ on: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' + - '!lithops/serverless/backends/k8s/**' - '.github/workflows/aws-coverage.yml' pull_request: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' + - '!lithops/serverless/backends/k8s/**' - '.github/workflows/aws-coverage.yml' jobs: build_aws: diff --git a/.github/workflows/k8s-coverage.yml b/.github/workflows/k8s-coverage.yml index 5a9a1b278..38eda5a55 100644 --- a/.github/workflows/k8s-coverage.yml +++ b/.github/workflows/k8s-coverage.yml @@ -5,12 +5,16 @@ on: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' + - '!lithops/serverless/backends/aws_lambda/**' - '.github/workflows/k8s-coverage.yml' + - 'lithops/storage/**' pull_request: branches: [ "add-code-coverage" ] paths: - 'lithops/serverless/**' + - '!lithops/serverless/backends/aws_lambda/**' - '.github/workflows/k8s-coverage.yml' + - 'lithops/storage/**' jobs: build_k8s: runs-on: ubuntu-latest diff --git a/.github/workflows/localhost-coverage.yml b/.github/workflows/localhost-coverage.yml index 97191f2fa..f76acc0a5 100644 --- a/.github/workflows/localhost-coverage.yml +++ b/.github/workflows/localhost-coverage.yml @@ -3,8 +3,12 @@ name: Localhost Coverage on: push: branches: [ "add-code-coverage" ] + paths: + - 'lithops/**' pull_request: branches: [ "add-code-coverage" ] + paths: + - 'lithops/**' jobs: build: runs-on: ubuntu-latest diff --git a/lithops/tests/github_coverage.py b/lithops/tests/github_coverage.py index 5ce7f7f01..1ab7df2d8 100644 --- a/lithops/tests/github_coverage.py +++ b/lithops/tests/github_coverage.py @@ -17,26 +17,24 @@ from lithops.tests.tests_main import run_tests from lithops.scripts.cli import runtime, lithops_cli + def test_github_localhost(): - run_tests("all", None, "", None, None, - None, False, False) + run_tests("all", None, "", None, None, None, False, False) + def test_github_k8s(): runtime(['build', 'acanadilla/k8s_internal', '--file', './runtime/kubernetes/Dockerfile', '--backend', 'k8s'], standalone_mode=False) - run_tests("", None, "call_async", None, None, - None, False, False) - run_tests("", None, "storage", None, None, - None, False, False) - run_tests("", None, "map_reduce", None, None, - None, False, False) + run_tests("", None, "call_async", None, None, None, False, False) + run_tests("", None, "storage", None, None, None, False, False) + run_tests("", None, "map_reduce", None, None, None, False, False) runtime(['build', 'acanadilla/test-bucket-k8s', '--file', './runtime/kubernetes/Dockerfile', '--backend', 'k8s'], standalone_mode=False) runtime(['deploy', 'acanadilla/test-bucket-k8s', '--memory', 500], standalone_mode=False) runtime(['list'], standalone_mode=False) lithops_cli(['clean'], standalone_mode=False) + def test_github_aws(): - run_tests("all", None, "", None, None, - None, False, False) + run_tests("all", None, "", None, None, None, False, False) runtime(['build', 'acanadilla/test-bucket-s3', '--file', './runtime/aws_lambda/Dockerfile', '--backend', 'aws_lambda'], standalone_mode=False) runtime(['deploy', 'acanadilla/test-bucket-s3', '--memory', 500], standalone_mode=False) runtime(['list'], standalone_mode=False) From e8856a7afb3771ba75ce5d763f4bdbfb1d61d0d5 Mon Sep 17 00:00:00 2001 From: acando Date: Mon, 11 Mar 2024 09:41:39 +0100 Subject: [PATCH 8/8] try $GITHUB_REPOSITORY variable --- .github/workflows/k8s-coverage.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/k8s-coverage.yml b/.github/workflows/k8s-coverage.yml index 38eda5a55..26d356383 100644 --- a/.github/workflows/k8s-coverage.yml +++ b/.github/workflows/k8s-coverage.yml @@ -66,7 +66,7 @@ jobs: status="in_progress" check="completed" while [ "$check" != "$status" ]; do - response=$(curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/acanadil/lithops/actions/runs?&head_sha=$GITHUB_SHA") + response=$(curl -H "Accept: application/vnd.github.v3+json" "https://api.github.com/repos/$GITHUB_REPOSITORY/actions/runs?&head_sha=$GITHUB_SHA") status=$(echo "$response" | jq -r '.workflow_runs[] | select(.path == ".github/workflows/aws-coverage.yml") | .status') if [ "$status" == "" ]; then status="completed"