diff --git a/.env.example b/.env.example index b59c0f9d..1a98134e 100644 --- a/.env.example +++ b/.env.example @@ -1,4 +1,4 @@ -DATABASE_URL=postgres://postgres:docker@dockerdns:5432/config?sslmode=disable +DATABASE_URL=postgres://postgres:docker@localhost:5432/config?sslmode=disable RUST_LOG=debug AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test @@ -8,7 +8,7 @@ DB_USER=postgres DB_HOST=dockerdns:5432 DB_NAME=config APP_ENV=DEV -AWS_REGION_ENDPOINT=http://dockerdns:4566 +AWS_REGION_ENDPOINT=http://localhost:4566 ALLOW_SAME_KEYS_OVERLAPPING_CTX=true ALLOW_DIFF_KEYS_OVERLAPPING_CTX=true ALLOW_SAME_KEYS_NON_OVERLAPPING_CTX=true @@ -22,6 +22,5 @@ MAX_DB_CONNECTION_POOL_SIZE=3 ENABLE_TENANT_AND_SCOPE=true TENANTS=dev,test TENANT_MIDDLEWARE_EXCLUSION_LIST="/health,/assets/favicon.ico,/pkg/frontend.js,/pkg,/pkg/frontend_bg.wasm,/pkg/tailwind.css,/pkg/style.css,/assets,/admin,/" -DASHBOARD_AUTH_URL="https://sandbox.portal.juspay.in/ec/v1/authorize" SERVICE_PREFIX="" SERVICE_NAME="CAC" \ No newline at end of file diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS new file mode 100644 index 00000000..52ede050 --- /dev/null +++ b/.github/CODEOWNERS @@ -0,0 +1 @@ +* @juspay/sdk-backend diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 00000000..9b28183c --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,23 @@ +## Problem +Describe the problem you are trying to solve here + +## Solution +Provide a brief summary of your solution so that reviewers can understand your code + +## Environment variable changes + +What ENVs need to be added or changed + +## Pre-deployment activity +Things needed to be done before deploying this change (if any) + +## Post-deployment activity +Things needed to be done after deploying this change (if any) + +## API changes +| Endpoint | Method | Request body | Response Body | +| ------------- |:-------------:| -----:| ----------------:| +| API | GET/POST, etc | request | response | + +## Possible Issues in the future +Describe any possible issues that could occur because of this change \ No newline at end of file diff --git a/.github/workflows/ci_check_pr.yaml b/.github/workflows/ci_check_pr.yaml new file mode 100644 index 00000000..a45ebb55 --- /dev/null +++ b/.github/workflows/ci_check_pr.yaml @@ -0,0 +1,132 @@ +name: CI Checks on PRs + +on: + pull_request: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +env: + # Disable incremental compilation. + # + # Incremental compilation is useful as part of an edit-build-test-edit cycle, + # as it lets the compiler avoid recompiling code that hasn't changed. However, + # on CI, we're not making small edits; we're almost always building the entire + # project from scratch. Thus, incremental compilation on CI actually + # introduces *additional* overhead to support making future builds + # faster...but no future builds will ever occur in any given CI environment. + # + # See https://matklad.github.io/2021/09/04/fast-rust-builds.html#ci-workflow + # for details. + CARGO_INCREMENTAL: 0 + # Allow more retries for network requests in cargo (downloading crates) and + # rustup (installing toolchains). This should help to reduce flaky CI failures + # from transient network timeouts or other issues. + CARGO_NET_RETRY: 10 + RUSTUP_MAX_RETRIES: 10 + # Don't emit giant backtraces in the CI logs. + RUST_BACKTRACE: short + # Use cargo's sparse index protocol + CARGO_REGISTRIES_CRATES_IO_PROTOCOL: sparse + AWS_ACCESS_KEY_ID: test + AWS_SECRET_ACCESS_KEY: test + AWS_SESSION_TOKEN: test + AWS_REGION: ap-south-1 + APP_ENV: "TEST" + +jobs: + formatting: + name: Check formatting + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + # - name: Check git settings + # shell: bash + # run: | + # echo "${{ github.event.pull_request.head.ref }}" + # git log --pretty=oneline --abbrev-commit + # echo "----------------" + # git tag "abc_tag" ${{github.event.pull_request.head.sha}} + # git tag + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.76.0 + targets: wasm32-unknown-unknown + components: rustfmt, clippy + + - name: Check formatting + shell: bash + run: cargo fmt --all --check + + - name: install cocogitto + uses: baptiste0928/cargo-install@v2.2.0 + with: + crate: cocogitto + + - name: Check conventional commit + shell: bash + run: | + git config --global user.name "${{ github.event.pull_request.user.login }}" + git config --global user.email "temp_email@juspay.in" + commit=$(git log --format=%B -n 1 ${{ github.event.pull_request.head.sha }}) + cog verify "$commit" + + test: + name: Testing + runs-on: ubuntu-latest + services: + postgres: + image: postgres:12-alpine + ports: + - 5432:5432 + env: + POSTGRES_PASSWORD: "docker" + POSTGRES_DB: "config" + restart: on-failure + + localstack: + image: localstack/localstack:1.3.0 + ports: + - 4510-4559:4510-4559 # external service port range + - 4566:4566 # LocalStack Edge Proxy + - 4571:4571 + env: + LOCALSTACK_SERVICES: kms + AWS_DEFAULT_REGION: ap-south-1 + EDGE_PORT: 4566 + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.76.0 + targets: wasm32-unknown-unknown + components: rustfmt, clippy + + - name: install node + uses: actions/setup-node@v4 + with: + node-version: 18.19.0 + + - name: Install wasm-pack + shell: bash + run: curl https://rustwasm.github.io/wasm-pack/installer/init.sh -sSf | sh + + - name: run tests + shell: bash + run: | + export DB_PASSWORD=`./docker-compose/localstack/get_db_password.sh | base64 --decode` && echo $DB_PASSWORD + make ci-test + env: + APP_ENV: "TEST" diff --git a/.github/workflows/ci_merge_main.yaml b/.github/workflows/ci_merge_main.yaml new file mode 100644 index 00000000..866bf11e --- /dev/null +++ b/.github/workflows/ci_merge_main.yaml @@ -0,0 +1,44 @@ +name: Create release tags + +permissions: + contents: write + +on: + push: + branches: + - main + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + tag-release: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Install Rust + uses: dtolnay/rust-toolchain@master + with: + toolchain: 1.76.0 + targets: wasm32-unknown-unknown + components: rustfmt, clippy + + - name: Semver release + uses: cocogitto/cocogitto-action@v3 + id: release + with: + release: true + git-user: "Superposition Bot" + git-user-email: "super_bot@juspay.in" + + - name: Push code to main + shell: bash + run: | + git config user.email "super_bot@juspay.in" + git config user.name "Superposition Bot" + git push --follow-tags diff --git a/crates/frontend/src/types.rs b/crates/frontend/src/types.rs index b47a2556..c0f61e8f 100644 --- a/crates/frontend/src/types.rs +++ b/crates/frontend/src/types.rs @@ -23,6 +23,7 @@ pub type InputVector = Vec<(ReadSignal, WriteSignal)>; pub enum AppEnv { PROD, SANDBOX, + TEST, DEV, } @@ -33,6 +34,7 @@ impl FromStr for AppEnv { "PROD" => Ok(AppEnv::PROD), "SANDBOX" => Ok(AppEnv::SANDBOX), "DEV" => Ok(AppEnv::DEV), + "TEST" => Ok(AppEnv::TEST), _ => Err("invalid app env!!".to_string()), } } diff --git a/crates/service_utils/src/db/utils.rs b/crates/service_utils/src/db/utils.rs index 54405f4e..7dff3d7c 100644 --- a/crates/service_utils/src/db/utils.rs +++ b/crates/service_utils/src/db/utils.rs @@ -11,9 +11,14 @@ use urlencoding::encode; pub async fn get_database_url() -> String { let db_user: String = get_from_env_unsafe("DB_USER").unwrap(); - let kms_client = kms::new_client(); - let db_password_raw = kms::decrypt(kms_client, "DB_PASSWORD").await; - let db_password = encode(db_password_raw.as_str()).to_string(); + let app_env: String = get_from_env_or_default("APP_ENV", "TEST".into()); + let db_password: String = if app_env.as_str() == "TEST" { + "docker".into() + } else { + let kms_client = kms::new_client(); + let db_password_raw = kms::decrypt(kms_client, "DB_PASSWORD").await; + encode(db_password_raw.as_str()).to_string() + }; let db_host: String = get_from_env_unsafe("DB_HOST").unwrap(); let db_name: String = get_from_env_unsafe("DB_NAME").unwrap(); format!("postgres://{db_user}:{db_password}@{db_host}/{db_name}") diff --git a/crates/service_utils/src/service/types.rs b/crates/service_utils/src/service/types.rs index 5f0db5eb..7774a06e 100644 --- a/crates/service_utils/src/service/types.rs +++ b/crates/service_utils/src/service/types.rs @@ -24,6 +24,7 @@ pub struct ExperimentationFlags { pub enum AppEnv { PROD, SANDBOX, + TEST, DEV, } @@ -49,6 +50,7 @@ impl FromStr for AppEnv { "PROD" => Ok(AppEnv::PROD), "SANDBOX" => Ok(AppEnv::SANDBOX), "DEV" => Ok(AppEnv::DEV), + "TEST" => Ok(AppEnv::TEST), _ => Err("invalid app env!!".to_string()), } } diff --git a/docker-compose.yaml b/docker-compose.yaml index e221cbec..a2580adc 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -3,7 +3,7 @@ version: "3.4" services: postgres: build: ./docker-compose/postgres/ - container_name: context-aware-config_postgres + container_name: superposition_postgres ports: - "5432:5432" environment: @@ -14,7 +14,7 @@ services: localstack: build : ./docker-compose/localstack/ - container_name: context-aware-config_localstack + container_name: superposition_localstack ports: - "4510-4559:4510-4559" # external service port range - "4566:4566" # LocalStack Edge Proxy diff --git a/docker-compose/localstack/get_db_password.sh b/docker-compose/localstack/get_db_password.sh index e6744910..f8887c71 100755 --- a/docker-compose/localstack/get_db_password.sh +++ b/docker-compose/localstack/get_db_password.sh @@ -2,7 +2,7 @@ # CONSTANTS region="ap-south-1" -alias aws="aws --endpoint-url=http://$DOCKER_DNS:4566 --region=${region}" +alias aws="aws --endpoint-url=http://localhost:4566 --region=${region}" # ****** KMS ******* diff --git a/makefile b/makefile index e9d99e3f..0af89da0 100644 --- a/makefile +++ b/makefile @@ -9,25 +9,21 @@ SHELL := /usr/bin/env bash kill run ci-test - ci-build - ci-push - registry-login validate-aws-connection validate-psql-connection cac -cleanup: - -docker rm -f $$(docker container ls --filter name=^context-aware-config -a -q) - -docker rmi -f $$(docker images | grep context-aware-config-postgres | cut -f 10 -d " ") - db-init: diesel migration run --locked-schema --config-file=crates/context_aware_config/diesel.toml -diesel migration run --locked-schema --config-file=crates/experimentation_platform/diesel.toml +cleanup: + -docker rm -f $$(docker container ls --filter name=^context-aware-config -a -q) + -docker rmi -f $$(docker images | grep context-aware-config-postgres | cut -f 10 -d " ") + cac-migration: cleanup docker-compose up -d postgres cp .env.example .env - sed -i 's/dockerdns/$(DOCKER_DNS)/g' ./.env while ! make validate-psql-connection; \ do echo "waiting for postgres bootup"; \ sleep 0.5; \ @@ -38,7 +34,6 @@ cac-migration: cleanup exp-migration: cleanup docker-compose up -d postgres cp .env.example .env - sed -i 's/dockerdns/$(DOCKER_DNS)/g' ./.env while ! make validate-psql-connection; \ do echo "waiting for postgres bootup"; \ sleep 0.5; \ @@ -63,7 +58,7 @@ validate-psql-connection: env-setup: npm ci - docker-compose up -d postgres localstack + -docker-compose up -d postgres localstack cp .env.example .env sed -i 's/dockerdns/$(DOCKER_DNS)/g' ./.env while ! make validate-psql-connection validate-aws-connection; \ @@ -131,32 +126,14 @@ run: kill build do echo "waiting for postgres, localstack bootup"; \ sleep 0.5; \ done - sed -i 's/dockerdns/$(DOCKER_DNS)/g' ./.env make superposition -e DOCKER_DNS=$(DOCKER_DNS) -ci-test: cleanup ci-setup +ci-test: ci-setup cargo test npm run test rm test_cac.sql rm test_experimentation.sql -ci-build: - docker buildx build --ssh default=$(SSH_AUTH_SOCK) \ - -t $(IMAGE_NAME):$(VERSION) \ - --build-arg "CONTEXT_AWARE_CONFIG_VERSION=${VERSION}" \ - --build-arg "SOURCE_COMMIT=${SOURCE_COMMIT}" \ - . - -ci-push: registry-login - docker tag $(IMAGE_NAME):$(VERSION) $(REGISTRY_HOST)/$(IMAGE_NAME):$(VERSION) - docker push $(REGISTRY_HOST)/$(IMAGE_NAME):$(VERSION) - -registry-login: - aws ecr get-login-password --region $(REGION) | \ - docker login \ - --username AWS \ - --password-stdin $(REGISTRY_HOST) - tailwind: cd crates/frontend && npx tailwindcss -i ./styles/tailwind.css -o ./pkg/style.css --watch