From 3a0c030987f727ac47dd4142bd7f7163edc4297f Mon Sep 17 00:00:00 2001 From: Kuan Fan Date: Thu, 20 Mar 2025 15:47:05 -0700 Subject: [PATCH 01/27] first commit 0.5.0 --- .github/workflows/dev-ci.yaml | 37 ++++++++++++++-------------------- .github/workflows/prod-ci.yaml | 33 ++++++++++++++---------------- .github/workflows/test-ci.yaml | 35 +++++++++++++++----------------- frontend/package.json | 2 +- 4 files changed, 47 insertions(+), 60 deletions(-) diff --git a/.github/workflows/dev-ci.yaml b/.github/workflows/dev-ci.yaml index a87a2fc4..6c671f1b 100644 --- a/.github/workflows/dev-ci.yaml +++ b/.github/workflows/dev-ci.yaml @@ -1,28 +1,26 @@ ## For each release, the value of workflow name, branches and VERSION need to be adjusted accordingly -name: CTHUB 0.4.0 Dev CI +name: CTHUB 0.5.0 Dev CI on: push: - branches: [ release-0.4.0 ] + branches: [release-0.5.0] # paths: # - frontend/** # - backend/** workflow_dispatch: env: - VERSION: 0.4.0 - GIT_URL: https://github.com/bcgov/cthub.git + VERSION: 0.5.0 + GIT_URL: https://github.com/bcgov/cthub.git TOOLS_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-tools DEV_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-dev - concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: true jobs: - install-oc: runs-on: ubuntu-latest outputs: @@ -35,7 +33,7 @@ jobs: id: cache uses: actions/cache@v4.2.0 with: - path: /usr/local/bin/oc # Path where the `oc` binary will be installed + path: /usr/local/bin/oc # Path where the `oc` binary will be installed key: oc-cli-${{ runner.os }} - name: Install OpenShift CLI (if not cached) @@ -53,16 +51,15 @@ jobs: name: Calculate pre-release number runs-on: ubuntu-latest needs: [install-oc] - + outputs: output1: ${{ steps.set-pre-release.outputs.PRE_RELEASE }} - + steps: - id: set-pre-release run: echo "PRE_RELEASE=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT build: - name: Build CTHUB runs-on: ubuntu-latest needs: set-pre-release @@ -72,7 +69,6 @@ jobs: PRE_RELEASE: ${{ needs.set-pre-release.outputs.output1 }} steps: - - name: Check out repository uses: actions/checkout@v4.1.1 @@ -105,7 +101,7 @@ jobs: sleep 5s oc -n ${{ env.TOOLS_NAMESPACE }} wait --for=condition=Complete --timeout=900s build/cthub-frontend-${{ env.VERSION }}-${{ env.PRE_RELEASE }}-1 oc tag ${{ env.TOOLS_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.DEV_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} - + - name: Build CTHUB Task Queue run: | cd openshift/templates/task-queue @@ -123,7 +119,6 @@ jobs: oc tag ${{ env.TOOLS_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.DEV_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} deploy: - name: Deploy CTHUB on Dev runs-on: ubuntu-latest timeout-minutes: 60 @@ -133,22 +128,21 @@ jobs: PRE_RELEASE: ${{ needs.set-pre-release.outputs.output1 }} steps: - - name: Checkout Manifest repository uses: actions/checkout@v4.1.1 with: repository: bcgov-c/tenant-gitops-30b186 ref: main ssh-key: ${{ secrets.MANIFEST_REPO_DEPLOY_KEY }} - + - name: Update tags uses: mikefarah/yq@v4.40.5 with: - cmd: | - yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml - yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml - yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml - yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml + cmd: | + yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml + yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml + yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml + yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml # - name: Update backend tag # uses: mikefarah/yq@v4.40.5 @@ -167,4 +161,3 @@ jobs: git add cthub/values-dev.yaml git commit -m "Update the image tag to ${{ env.VERSION }}-${{ env.PRE_RELEASE }} on Dev" git push - \ No newline at end of file diff --git a/.github/workflows/prod-ci.yaml b/.github/workflows/prod-ci.yaml index 82efa58e..e6d7d231 100644 --- a/.github/workflows/prod-ci.yaml +++ b/.github/workflows/prod-ci.yaml @@ -1,19 +1,18 @@ ## For each release, the value of workflow name, branches and VERSION need to be adjusted accordingly -name: CTHUB 0.4.0 Prod CI +name: CTHUB 0.5.0 Prod CI on: workflow_dispatch: env: - VERSION: 0.4.0 - GIT_URL: https://github.com/bcgov/cthub.git + VERSION: 0.5.0 + GIT_URL: https://github.com/bcgov/cthub.git TEST_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-test PROD_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-prod - concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: true jobs: install-oc: @@ -28,7 +27,7 @@ jobs: id: cache uses: actions/cache@v4.2.0 with: - path: /usr/local/bin/oc # Path where the `oc` binary will be installed + path: /usr/local/bin/oc # Path where the `oc` binary will be installed key: oc-cli-${{ runner.os }} - name: Install OpenShift CLI (if not cached) @@ -46,7 +45,7 @@ jobs: name: Find Test deployment pre-release number runs-on: ubuntu-latest needs: [install-oc] - + outputs: output1: ${{ steps.set-pre-release.outputs.PRE_RELEASE }} @@ -70,7 +69,6 @@ jobs: echo "PRE_RELEASE=$(oc -n ${{ env.TEST_NAMESPACE }} describe deployment/cthub-test-frontend | grep Image | awk -F '-' '{print $NF}')" >> $GITHUB_OUTPUT deploy: - name: Deploy CTHUB on Prod runs-on: ubuntu-latest timeout-minutes: 60 @@ -86,7 +84,7 @@ jobs: secret: ${{ github.TOKEN }} approvers: emi-hi,kuanfandevops,tim738745,JulianForeman minimum-approvals: 2 - issue-title: "CTHUB release-${{ env.VERSION }}-${{ env.PRE_RELEASE }} PRODUCTION Deployment" + issue-title: "CTHUB release-${{ env.VERSION }}-${{ env.PRE_RELEASE }} PRODUCTION Deployment" - name: Restore oc command from Cache uses: actions/cache@v4.2.0 @@ -100,7 +98,7 @@ jobs: openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} openshift_token: ${{ secrets.OPENSHIFT_TOKEN }} insecure_skip_tls_verify: true - namespace: ${{ env.TEST_NAMESPACE }} + namespace: ${{ env.TEST_NAMESPACE }} - name: Tag CTHUB images to Test run: | @@ -108,22 +106,22 @@ jobs: oc tag ${{ env.TEST_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.PROD_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} oc tag ${{ env.TEST_NAMESPACE }}/cthub-task-queue:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.PROD_NAMESPACE }}/cthub-task-queue:${{ env.VERSION }}-${{ env.PRE_RELEASE }} oc tag ${{ env.TEST_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.PROD_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} - + - name: Checkout Manifest repository uses: actions/checkout@v4.1.1 with: repository: bcgov-c/tenant-gitops-30b186 ref: main ssh-key: ${{ secrets.MANIFEST_REPO_DEPLOY_KEY }} - + - name: Update frontend tag uses: mikefarah/yq@v4.40.5 with: - cmd: | - yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml - yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml - yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml - yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml + cmd: | + yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml + yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml + yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml + yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-prod.yaml - name: GitHub Commit & Push run: | @@ -132,4 +130,3 @@ jobs: git add cthub/values-prod.yaml git commit -m "Update the image tag to ${{ env.VERSION }}-${{ env.PRE_RELEASE }} on PRODUCTION" git push - \ No newline at end of file diff --git a/.github/workflows/test-ci.yaml b/.github/workflows/test-ci.yaml index 390f7992..c6ebd89f 100644 --- a/.github/workflows/test-ci.yaml +++ b/.github/workflows/test-ci.yaml @@ -1,19 +1,18 @@ ## For each release, the value of workflow name, branches and VERSION need to be adjusted accordingly -name: CTHUB 0.4.0 Test CI +name: CTHUB 0.5.0 Test CI on: workflow_dispatch: env: - VERSION: 0.4.0 - GIT_URL: https://github.com/bcgov/cthub.git + VERSION: 0.5.0 + GIT_URL: https://github.com/bcgov/cthub.git DEV_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-dev TEST_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-test - concurrency: group: ${{ github.workflow }}-${{ github.ref }} - cancel-in-progress: true + cancel-in-progress: true jobs: install-oc: @@ -28,7 +27,7 @@ jobs: id: cache uses: actions/cache@v4.2.0 with: - path: /usr/local/bin/oc # Path where the `oc` binary will be installed + path: /usr/local/bin/oc # Path where the `oc` binary will be installed key: oc-cli-${{ runner.os }} - name: Install OpenShift CLI (if not cached) @@ -46,7 +45,7 @@ jobs: name: Find Dev deployment pre-release number runs-on: ubuntu-latest needs: [install-oc] - + outputs: output1: ${{ steps.set-pre-release.outputs.PRE_RELEASE }} @@ -70,7 +69,6 @@ jobs: echo "PRE_RELEASE=$(oc -n ${{ env.DEV_NAMESPACE }} describe deployment/cthub-dev-frontend | grep Image | awk -F '-' '{print $NF}')" >> $GITHUB_OUTPUT deploy: - name: Deploy CTHUB on Test runs-on: ubuntu-latest timeout-minutes: 60 @@ -86,8 +84,8 @@ jobs: secret: ${{ github.TOKEN }} approvers: emi-hi,kuanfandevops,tim738745,JulianForeman minimum-approvals: 1 - issue-title: "CTHUB release-${{ env.VERSION }}-${{ env.PRE_RELEASE }} Test Deployment" - + issue-title: "CTHUB release-${{ env.VERSION }}-${{ env.PRE_RELEASE }} Test Deployment" + - name: Restore oc command from Cache uses: actions/cache@v4.2.0 with: @@ -100,7 +98,7 @@ jobs: openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} openshift_token: ${{ secrets.OPENSHIFT_TOKEN }} insecure_skip_tls_verify: true - namespace: ${{ env.DEV_NAMESPACE }} + namespace: ${{ env.DEV_NAMESPACE }} - name: Tag CTHUB images to Test run: | @@ -108,22 +106,22 @@ jobs: oc tag ${{ env.DEV_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.TEST_NAMESPACE }}/cthub-frontend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} oc tag ${{ env.DEV_NAMESPACE }}/cthub-task-queue:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.TEST_NAMESPACE }}/cthub-task-queue:${{ env.VERSION }}-${{ env.PRE_RELEASE }} oc tag ${{ env.DEV_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.TEST_NAMESPACE }}/cthub-vinpower:${{ env.VERSION }}-${{ env.PRE_RELEASE }} - + - name: Checkout Manifest repository uses: actions/checkout@v4.1.1 with: repository: bcgov-c/tenant-gitops-30b186 ref: main ssh-key: ${{ secrets.MANIFEST_REPO_DEPLOY_KEY }} - + - name: Update frontend tag uses: mikefarah/yq@v4.40.5 with: - cmd: | - yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml - yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml - yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml - yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml + cmd: | + yq -i '.frontend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml + yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml + yq -i '.task-queue.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml + yq -i '.vinpower.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-test.yaml - name: GitHub Commit & Push run: | @@ -132,4 +130,3 @@ jobs: git add cthub/values-test.yaml git commit -m "Update the image tag to ${{ env.VERSION }}-${{ env.PRE_RELEASE }} on Test" git push - \ No newline at end of file diff --git a/frontend/package.json b/frontend/package.json index 73dfd4cd..1fd457b9 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -1,6 +1,6 @@ { "name": "frontend", - "version": "0.4.0", + "version": "0.5.0", "private": true, "dependencies": { "@emotion/react": "^11.6.0", From 25f05e00e99d83dd64e5c440714775a0df228fba Mon Sep 17 00:00:00 2001 From: JulianForeman <71847719+JulianForeman@users.noreply.github.com> Date: Thu, 27 Mar 2025 15:01:36 -0700 Subject: [PATCH 02/27] Feat: LDV Data Upload #288 (#453) * Adding LDV Data upload * Adding migrations and model --- django/api/constants/constants.py | 106 +++++++++++++++- django/api/constants/misc.py | 9 ++ django/api/migrations/0042_ldvdata.py | 53 ++++++++ ...043_alter_ldvdata_bc_drivers_license_no.py | 18 +++ .../api/migrations/0044_auto_20250318_1834.py | 25 ++++ django/api/models/ldv_data.py | 115 ++++++++++++++++++ .../api/services/spreadsheet_uploader_prep.py | 57 +++++---- 7 files changed, 360 insertions(+), 23 deletions(-) create mode 100644 django/api/migrations/0042_ldvdata.py create mode 100644 django/api/migrations/0043_alter_ldvdata_bc_drivers_license_no.py create mode 100644 django/api/migrations/0044_auto_20250318_1834.py create mode 100644 django/api/models/ldv_data.py diff --git a/django/api/constants/constants.py b/django/api/constants/constants.py index ffe20391..d0a896c1 100644 --- a/django/api/constants/constants.py +++ b/django/api/constants/constants.py @@ -12,10 +12,12 @@ from api.models.scrap_it import ScrapIt from api.models.go_electric_rebates import GoElectricRebates from api.models.cvp_data import CVPData +from api.models.ldv_data import LdvData from api.services.spreadsheet_uploader_prep import ( prepare_arc_project_tracking, prepare_hydrogen_fleets, prepare_hydrogen_fueling, + prepare_ldv_data, prepare_ldv_rebates, prepare_public_charging, prepare_scrap_it, @@ -30,7 +32,7 @@ format_postal_codes ) from api.services.resolvers import get_google_resolver -from api.constants.misc import GER_VALID_FIELD_VALUES, ARC_VALID_FIELD_VALUES, LOCALITY_FEATURES_MAP, CVP_DATA_VALID_FIELD_VALUES +from api.constants.misc import GER_VALID_FIELD_VALUES, ARC_VALID_FIELD_VALUES, LOCALITY_FEATURES_MAP, CVP_DATA_VALID_FIELD_VALUES, LDV_DATA_VALID_FIELD_VALUES from enum import Enum @@ -522,6 +524,67 @@ class CVPDataColumnMapping(Enum): notes = "Notes" imhzev = "iMHZEV" +from enum import Enum + +class LDVDataColumns(Enum): + APPLICANT_TYPE = "ApplicantType" + APPLICATION_ID = "ApplicationID" + DEALERSHIP_NAME = "DealershipName" + DATE_SUBMITTED = "DateSubmitted" + PAYMENT_DT = "PaymentDT" + BC_DRIVERS_LICENSE_NO = "BC_DriverLicenseNo" + BC_INC_NO = "BC_IncNo" + ELIGIBLE_REBATE_AMT = "EligibleRebateAmt" + SALE_TYPE = "SaleType" + VIN = "VIN" + YEAR = "Year" + MANUFACTURER = "Manufacturer" + MODEL = "Model" + TRIM = "Trim" + VEHICLE_TYPE = "VehicleType" + VEHICLE_CLASS = "Class" + MSRP = "MSRP" + ELECTRIC_RANGE = "ElectricRange" + VIN_TOKEN = "VIN_Token" + CITY = "City" + POSTAL_CODE = "PostalCode" + BUSINESS_CORP_NAME = "BusinessCorpName" + CAR_SHARE_NAME = "CarShareName" + NON_PROFIT_NAME = "NonProfitName" + MUNICIPALITY_NAME = "MunicipalityName" + DATE_OF_DELIVERY = "DateOfDelivery" + LEASE_TERM = "LeaseTerm" + + +class LDVDataColumnMapping(Enum): + applicant_type = "ApplicantType" + application_id = "ApplicationID" + dealership_name = "DealershipName" + date_submitted = "DateSubmitted" + payment_dt = "PaymentDT" + bc_drivers_license_no = "BC_DriverLicenseNo" + bc_inc_no = "BC_IncNo" + eligible_rebate_amt = "EligibleRebateAmt" + sale_type = "SaleType" + vin = "VIN" + year = "Year" + manufacturer = "Manufacturer" + model = "Model" + trim = "Trim" + vehicle_type = "VehicleType" + vehicle_class = "Class" + msrp = "MSRP" + electric_range = "ElectricRange" + vin_token = "VIN_Token" + city = "City" + postal_code = "PostalCode" + business_corp_name = "BusinessCorpName" + car_share_name = "CarShareName" + non_profit_name = "NonProfitName" + municipality_name = "MunicipalityName" + date_of_delivery = "DateOfDelivery" + lease_term = "LeaseTerm" + FIELD_TYPES = { "ARC Project Tracking": { @@ -753,7 +816,35 @@ class CVPDataColumnMapping(Enum): "notes": str, "imhzev": str, }, - + "LDV Data": { + "applicant_type": str, + "application_id": str, + "dealership_name": str, + "date_submitted": datetime.date, + "payment_dt": datetime.date, + "bc_drivers_license_no": str, + "bc_inc_no": str, + "eligible_rebate_amt": int, + "sale_type": str, + "vin": str, + "year": int, + "manufacturer": str, + "model": str, + "trim": str, + "vehicle_type": str, + "vehicle_class": str, + "msrp": int, + "electric_range": int, + "vin_token": str, + "city": str, + "postal_code": str, + "business_corp_name": str, + "car_share_name": str, + "non_profit_name": str, + "municipality_name": str, + "date_of_delivery": datetime.date, + "lease_term": str, + } } @@ -841,5 +932,16 @@ class CVPDataColumnMapping(Enum): "preparation_functions": [prepare_cvp_data], "validation_functions": [{"function": validate_field_values, "columns": [], "kwargs": {"indices_offset":2, "fields_and_values": CVP_DATA_VALID_FIELD_VALUES, "delimiter": ","}},] }, + "LDV Data": { + "model": LdvData, + "columns": LDVDataColumns, + "column_mapping": LDVDataColumnMapping, + "sheet_name": "SP-Complete", + "preparation_functions": [prepare_ldv_data], + "validation_functions": [ + {"function": validate_field_values, "columns": [], "kwargs": {"indices_offset":2, "fields_and_values": LDV_DATA_VALID_FIELD_VALUES, "delimiter": ","}}, + {"function": format_postal_codes, "columns": ["PostalCode"], "kwargs": {"indices_offset":2, "validate": True}} + ] + }, } diff --git a/django/api/constants/misc.py b/django/api/constants/misc.py index 5ede204a..27c20136 100644 --- a/django/api/constants/misc.py +++ b/django/api/constants/misc.py @@ -107,3 +107,12 @@ 'Procurement', 'New Design', 'Hybrid Retrofit', 'BEV Retrofit', 'H2 Retrofit' ] } + +LDV_DATA_VALID_FIELD_VALUES = { + 'ApplicantType': ['Individual', 'Business / Corporation', 'Municipality / School District', 'Car Share Fleet', 'Non Profit Organization'], + 'EligibleRebateAmt': ['1000', '2000', '1500', '500', '666', '1334', '4000', '3000', '334', '2668', '667', '5000', '2500', '1668', '6000', '833', '1665', '3335', '1001', '2001', '1667'], + 'SaleType': ['Purchase', 'Lease', 'lease_agreement', 'oem_order_form'], + 'VehicleType': ['BEV', 'ER-EV', 'FCEV', 'PHEV'], + 'Class': ['0', 'Car', 'Larger Vehicle'], + 'LeaseTerm': ['12 Mos', '24', '24 Mos', '36+ Mos'] +} diff --git a/django/api/migrations/0042_ldvdata.py b/django/api/migrations/0042_ldvdata.py new file mode 100644 index 00000000..54502717 --- /dev/null +++ b/django/api/migrations/0042_ldvdata.py @@ -0,0 +1,53 @@ +# Generated by Django 3.2.25 on 2025-03-17 18:11 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0041_add_datasets_and_file_requirements'), + ] + + operations = [ + migrations.CreateModel( + name='LdvData', + fields=[ + ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')), + ('create_timestamp', models.DateTimeField(auto_now_add=True, null=True)), + ('create_user', models.CharField(default='SYSTEM', max_length=130)), + ('update_timestamp', models.DateTimeField(auto_now=True, null=True)), + ('update_user', models.CharField(max_length=130, null=True)), + ('applicant_type', models.CharField(max_length=100)), + ('application_id', models.CharField(max_length=100, unique=True)), + ('dealership_name', models.CharField(max_length=100)), + ('date_submitted', models.DateField()), + ('payment_dt', models.DateField()), + ('bc_drivers_license_no', models.CharField(max_length=100, unique=True)), + ('bc_inc_no', models.CharField(max_length=100, unique=True)), + ('eligible_rebate_amt', models.IntegerField()), + ('sale_type', models.CharField(blank=True, max_length=100, null=True)), + ('vin', models.CharField(max_length=17, unique=True)), + ('year', models.IntegerField()), + ('manufacturer', models.CharField(max_length=100)), + ('model', models.CharField(blank=True, max_length=100, null=True)), + ('trim', models.CharField(blank=True, max_length=100, null=True)), + ('vehicle_type', models.CharField(blank=True, max_length=50, null=True)), + ('vehicle_class', models.CharField(blank=True, max_length=50, null=True)), + ('msrp', models.IntegerField(blank=True, null=True)), + ('electric_range', models.IntegerField(blank=True, null=True)), + ('vin_token', models.CharField(blank=True, max_length=9, null=True)), + ('city', models.CharField(blank=True, max_length=100, null=True)), + ('postal_code', models.CharField(blank=True, max_length=10, null=True)), + ('business_corp_name', models.CharField(blank=True, max_length=200, null=True)), + ('car_share_name', models.CharField(blank=True, max_length=200, null=True)), + ('non_profit_name', models.CharField(blank=True, max_length=200, null=True)), + ('municipality_name', models.CharField(blank=True, max_length=200, null=True)), + ('date_of_delivery', models.DateField(blank=True, null=True)), + ('lease_term', models.CharField(blank=True, max_length=50, null=True)), + ], + options={ + 'db_table': 'ldv_data', + }, + ), + ] diff --git a/django/api/migrations/0043_alter_ldvdata_bc_drivers_license_no.py b/django/api/migrations/0043_alter_ldvdata_bc_drivers_license_no.py new file mode 100644 index 00000000..972f3e67 --- /dev/null +++ b/django/api/migrations/0043_alter_ldvdata_bc_drivers_license_no.py @@ -0,0 +1,18 @@ +# Generated by Django 3.2.25 on 2025-03-18 18:32 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0042_ldvdata'), + ] + + operations = [ + migrations.AlterField( + model_name='ldvdata', + name='bc_drivers_license_no', + field=models.CharField(max_length=100), + ), + ] diff --git a/django/api/migrations/0044_auto_20250318_1834.py b/django/api/migrations/0044_auto_20250318_1834.py new file mode 100644 index 00000000..3dd3f616 --- /dev/null +++ b/django/api/migrations/0044_auto_20250318_1834.py @@ -0,0 +1,25 @@ +# Generated by Django 3.2.25 on 2025-03-18 18:34 + +from django.db import migrations, models + +class Migration(migrations.Migration): + + dependencies = [ + ('api', '0043_alter_ldvdata_bc_drivers_license_no'), + ] + + operations = [ + migrations.AlterField( + model_name='ldvdata', + name='bc_inc_no', + field=models.CharField(max_length=100), + ), + migrations.AlterField( + model_name='ldvdata', + name='vin', + field=models.CharField(max_length=17), + ), + migrations.RunSQL( + "INSERT INTO datasets (create_user, update_user, name) VALUES ('SYSTEM', 'SYSTEM', 'LDV Data');" + ), + ] diff --git a/django/api/models/ldv_data.py b/django/api/models/ldv_data.py new file mode 100644 index 00000000..675bd677 --- /dev/null +++ b/django/api/models/ldv_data.py @@ -0,0 +1,115 @@ +from auditable.models import Auditable +from django.db import models + +class LdvData(Auditable): + + applicant_type = models.CharField( + max_length=100, unique=False, blank=False, null=False + ) + + application_id = models.CharField( + max_length=100, unique=True, blank=False, null=False + ) + + dealership_name = models.CharField( + max_length=100, unique=False, blank=False, null=False + ) + + date_submitted = models.DateField( + blank=False, null=False + ) + + payment_dt = models.DateField( + blank=False, null=False + ) + + bc_drivers_license_no = models.CharField( + max_length=100, blank=False, null=False + ) + + bc_inc_no = models.CharField( + max_length=100, blank=False, null=False + ) + + eligible_rebate_amt = models.IntegerField( + blank=False, null=False + ) + + sale_type = models.CharField( + max_length=100, unique=False, blank=True, null=True + ) + + vin = models.CharField( + max_length=17, blank=False, null=False + ) + + year = models.IntegerField( + unique=False, blank=False, null=False + ) + + manufacturer = models.CharField( + max_length=100, unique=False, blank=False, null=False + ) + + model = models.CharField( + max_length=100, unique=False, blank=True, null=True + ) + + trim = models.CharField( + max_length=100, unique=False, blank=True, null=True + ) + + vehicle_type = models.CharField( + max_length=50, unique=False, blank=True, null=True + ) + + vehicle_class = models.CharField( + max_length=50, unique=False, blank=True, null=True + ) + + msrp = models.IntegerField( + unique=False, blank=True, null=True + ) + + electric_range = models.IntegerField( + unique=False, blank=True, null=True + ) + + vin_token = models.CharField( + max_length=9, unique=False, blank=True, null=True + ) + + city = models.CharField( + max_length=100, unique=False, blank=True, null=True + ) + + postal_code = models.CharField( + max_length=10, unique=False, blank=True, null=True + ) + + business_corp_name = models.CharField( + max_length=200, unique=False, blank=True, null=True + ) + + car_share_name = models.CharField( + max_length=200, unique=False, blank=True, null=True + ) + + non_profit_name = models.CharField( + max_length=200, unique=False, blank=True, null=True + ) + + municipality_name = models.CharField( + max_length=200, unique=False, blank=True, null=True + ) + + date_of_delivery = models.DateField( + blank=True, null=True + ) + + lease_term = models.CharField( + max_length=50, unique=False, blank=True, null=True + ) + + class Meta: + db_table = "ldv_data" diff --git a/django/api/services/spreadsheet_uploader_prep.py b/django/api/services/spreadsheet_uploader_prep.py index f17fce80..b23be4af 100644 --- a/django/api/services/spreadsheet_uploader_prep.py +++ b/django/api/services/spreadsheet_uploader_prep.py @@ -101,6 +101,14 @@ def prepare_go_electric_rebates(df): adjust_ger_manufacturer_names(df) return df +def prepare_ldv_data(df): + + df = df.applymap(lambda s: s.upper() if type(s) == str else s) + make_names_consistent(df) + make_prepositions_consistent(df) + + return df + def prepare_cvp_data(df): df = df.applymap(lambda s: s.upper() if type(s) == str else s) df = df.apply(lambda x: x.fillna(0) if x.dtype.kind in "biufc" else x.fillna("")) @@ -158,29 +166,36 @@ def make_names_consistent(df): {', Inc.': ' Inc.', '(?i)\\bdba\\b': 'DBA'} # Matches word "dba" regardless of case ) - df[['Applicant Name', 'Manufacturer']] = df[['Applicant Name', 'Manufacturer']].replace( - consistent_name_dict, - regex=True) + existing_columns = {col.lower(): col for col in df.columns} + columns_to_process = [existing_columns[key] for key in ['applicant name', 'manufacturer'] if key in existing_columns] + + if columns_to_process: + df[columns_to_process] = df[columns_to_process].replace(consistent_name_dict, regex=True) def make_prepositions_consistent(df): - df[['Applicant Name', 'Manufacturer']] = df[['Applicant Name', 'Manufacturer']].replace( - dict.fromkeys( - ['(?i)\\bbc(?=\\W)', # Matches word "bc" regardless of case - '(?i)\\bb\\.c\\.(?=\\W)'], 'BC'), # Matches word "b.c." regardless of case - regex=True - ).replace( - {'BC Ltd.': 'B.C. Ltd.', - '\\bOf(?=\\W)': 'of', - '\\bAnd(?=\\W)': 'and', # Matches word "And" - '\\bThe(?=\\W)': 'the', - '\\bA(?=\\W)': 'a', - '\\bAn(?=\\W)': 'an'}, - regex=True - ) - ##The first letter should be capitalized - df[['Applicant Name', 'Manufacturer']] = df[['Applicant Name', 'Manufacturer']].applymap( - lambda x: x[0].upper() + x[1:] if isinstance(x, str) and len(x) > 1 else x.upper() if isinstance(x, str) and len(x) == 1 else x -) + existing_columns = {col.lower(): col for col in df.columns} + columns_to_process = [existing_columns[key] for key in ['applicant name', 'manufacturer'] if key in existing_columns] + + if columns_to_process: + df[columns_to_process] = df[columns_to_process].replace( + dict.fromkeys( + ['(?i)\\bbc(?=\\W)', # Matches word "bc" regardless of case + '(?i)\\bb\\.c\\.(?=\\W)'], 'BC' # Matches word "b.c." regardless of case + ), + regex=True + ).replace( + {'BC Ltd.': 'B.C. Ltd.', + '\\bOf(?=\\W)': 'of', + '\\bAnd(?=\\W)': 'and', + '\\bThe(?=\\W)': 'the', + '\\bA(?=\\W)': 'a', + '\\bAn(?=\\W)': 'an'}, + regex=True + ) + + df[columns_to_process] = df[columns_to_process].applymap( + lambda x: x[0].upper() + x[1:] if isinstance(x, str) and len(x) > 1 else x.upper() if isinstance(x, str) and len(x) == 1 else x + ) def adjust_ger_manufacturer_names(df): From 30e745065125361db1707eca7dcf902d5f5fe0fe Mon Sep 17 00:00:00 2001 From: Kuan Fan Date: Thu, 27 Mar 2025 16:30:41 -0700 Subject: [PATCH 03/27] cleanup --- .github/workflows/replace-DC.yaml | 115 + .pipeline/.nvmrc | 1 - .pipeline/build-metabase.js | 5 - .pipeline/build-patroni.js | 5 - .pipeline/build.js | 5 - .pipeline/clean-tools.js | 5 - .pipeline/clean.js | 5 - .pipeline/deploy-knp.js | 5 - .pipeline/deploy-metabase.js | 5 - .pipeline/deploy-patroni.js | 5 - .pipeline/deploy-unittest.js | 5 - .pipeline/deploy.js | 5 - .pipeline/lib/build-metabase.js | 24 - .pipeline/lib/build-patroni.js | 24 - .pipeline/lib/build.js | 45 - .pipeline/lib/clean-tools.js | 64 - .pipeline/lib/clean.js | 132 -- .pipeline/lib/config.js | 82 - .pipeline/lib/deploy-knp.js | 34 - .pipeline/lib/deploy-metabase.js | 39 - .pipeline/lib/deploy-patroni.js | 54 - .pipeline/lib/deploy-unittest.js | 67 - .pipeline/lib/deploy.js | 69 - .pipeline/lib/keycloak.js | 137 -- .pipeline/npmw | 12 - .pipeline/package.json | 33 - charts/cthub-spilo/.helmignore | 23 - charts/cthub-spilo/Chart.lock | 6 - charts/cthub-spilo/Chart.yaml | 31 - charts/cthub-spilo/Readme.md | 82 - charts/cthub-spilo/charts/spilo-0.2.0.tgz | Bin 381815 -> 0 bytes charts/cthub-spilo/templates/_helpers.tpl | 62 - charts/cthub-spilo/values-dev.yaml | 49 - charts/cthub-spilo/values-prod.yaml | 50 - charts/cthub-spilo/values-test.yaml | 50 - charts/spilo/Chart.yaml | 9 - charts/spilo/docs/restore.md | 87 - charts/spilo/docs/s3.png | Bin 377834 -> 0 bytes charts/spilo/templates/_helpers.tpl | 63 - charts/spilo/templates/archive-pvc.yaml | 14 - charts/spilo/templates/networkpolicy.yaml | 14 - .../spilo/templates/poddisruptionbudget.yaml | 12 - charts/spilo/templates/role.yaml | 44 - charts/spilo/templates/rolebinding.yaml | 14 - charts/spilo/templates/secret.yaml | 30 - charts/spilo/templates/serviceaccount.yaml | 7 - charts/spilo/templates/services.yaml | 29 - charts/spilo/templates/statefulset.yaml | 251 --- charts/spilo/values.yaml | 112 - django/Dockerfile-Openshift | 30 + openshift/README.md | 30 - .../backend-bc-docker.yaml} | 53 +- openshift/templates/crunchydb/readme.md | 31 - .../templates/metabase-postgresql/Dockerfile | 2 - .../templates/metabase-postgresql/README.md | 29 - .../metabase-postgresql/metabase-bc.yaml | 53 - .../metabase-dc-redeploy-prod.yaml | 132 -- .../metabase-dc-spilo.yaml | 203 -- .../metabase-postgresql/metabase-dc.yaml | 209 -- openshift/templates/metabase/Dockerfile | 2 - openshift/templates/metabase/README.md | 6 - openshift/templates/metabase/metabase-bc.yaml | 47 - openshift/templates/metabase/metabase-dc.yaml | 177 -- openshift/templates/patroni-2.1.1/Dockerfile | 43 - openshift/templates/patroni-2.1.1/README.md | 12 - .../contrib/root/usr/bin/entrypoint.sh | 48 - .../usr/share/scripts/patroni/health_check.sh | 8 - .../usr/share/scripts/patroni/post_init.sh | 23 - .../patroni-2.1.1/templates/build.yaml | 98 - .../patroni-2.1.1/templates/deploy.yaml | 295 --- .../patroni-2.1.1/templates/prerequisite.yaml | 119 - .../templates/secret-template.yaml | 61 - openshift/templates/postgrest/Dockerfile | 12 - openshift/templates/postgrest/readme.txt | 12 - .../templates/redis/cthub-dev-values.yaml | 1935 ----------------- .../templates/redis/cthub-test-values.yaml | 1935 ----------------- openshift/templates/redis/readme.md | 18 - .../templates/redis/the-default-values.yaml | 1935 ----------------- openshift/templates/spilo/s3-secret.yaml | 22 - .../templates/spilo/tfrs-patroni-admin.yaml | 30 - .../templates/spilo/tfrs-patroni-app.yaml | 26 - .../superset/Openshift/superset-bc.yaml | 51 - .../superset/cthub-superset-dev.yaml | 888 -------- .../superset/cthub-superset-test.yaml | 867 -------- .../templates/superset/docker/Dockerfile | 5 - openshift/templates/superset/readme.md | 28 - .../superset/the-default-values.yaml | 815 ------- openshift/templates/sysdig/sysdig-team.yaml | 19 - superset/README.md | 75 - superset/docker-bootstrap.sh | 51 - superset/docker-ci.sh | 26 - superset/docker-frontend.sh | 26 - superset/docker-init.sh | 79 - superset/frontend-mem-nag.sh | 49 - superset/pythonpath_dev/.gitignore | 23 - superset/pythonpath_dev/superset_config.py | 114 - .../superset_config_local.example | 27 - superset/run-server.sh | 32 - superset/run.sh | 7 - 99 files changed, 177 insertions(+), 12662 deletions(-) create mode 100644 .github/workflows/replace-DC.yaml delete mode 100644 .pipeline/.nvmrc delete mode 100755 .pipeline/build-metabase.js delete mode 100755 .pipeline/build-patroni.js delete mode 100755 .pipeline/build.js delete mode 100755 .pipeline/clean-tools.js delete mode 100755 .pipeline/clean.js delete mode 100755 .pipeline/deploy-knp.js delete mode 100755 .pipeline/deploy-metabase.js delete mode 100755 .pipeline/deploy-patroni.js delete mode 100644 .pipeline/deploy-unittest.js delete mode 100755 .pipeline/deploy.js delete mode 100755 .pipeline/lib/build-metabase.js delete mode 100755 .pipeline/lib/build-patroni.js delete mode 100755 .pipeline/lib/build.js delete mode 100755 .pipeline/lib/clean-tools.js delete mode 100755 .pipeline/lib/clean.js delete mode 100644 .pipeline/lib/config.js delete mode 100755 .pipeline/lib/deploy-knp.js delete mode 100755 .pipeline/lib/deploy-metabase.js delete mode 100755 .pipeline/lib/deploy-patroni.js delete mode 100644 .pipeline/lib/deploy-unittest.js delete mode 100755 .pipeline/lib/deploy.js delete mode 100644 .pipeline/lib/keycloak.js delete mode 100755 .pipeline/npmw delete mode 100644 .pipeline/package.json delete mode 100644 charts/cthub-spilo/.helmignore delete mode 100644 charts/cthub-spilo/Chart.lock delete mode 100644 charts/cthub-spilo/Chart.yaml delete mode 100644 charts/cthub-spilo/Readme.md delete mode 100644 charts/cthub-spilo/charts/spilo-0.2.0.tgz delete mode 100644 charts/cthub-spilo/templates/_helpers.tpl delete mode 100644 charts/cthub-spilo/values-dev.yaml delete mode 100644 charts/cthub-spilo/values-prod.yaml delete mode 100644 charts/cthub-spilo/values-test.yaml delete mode 100644 charts/spilo/Chart.yaml delete mode 100644 charts/spilo/docs/restore.md delete mode 100644 charts/spilo/docs/s3.png delete mode 100644 charts/spilo/templates/_helpers.tpl delete mode 100644 charts/spilo/templates/archive-pvc.yaml delete mode 100644 charts/spilo/templates/networkpolicy.yaml delete mode 100644 charts/spilo/templates/poddisruptionbudget.yaml delete mode 100644 charts/spilo/templates/role.yaml delete mode 100644 charts/spilo/templates/rolebinding.yaml delete mode 100644 charts/spilo/templates/secret.yaml delete mode 100644 charts/spilo/templates/serviceaccount.yaml delete mode 100644 charts/spilo/templates/services.yaml delete mode 100644 charts/spilo/templates/statefulset.yaml delete mode 100644 charts/spilo/values.yaml create mode 100644 django/Dockerfile-Openshift delete mode 100644 openshift/README.md rename openshift/templates/{postgrest/postgrest-bc.yaml => backend/backend-bc-docker.yaml} (50%) delete mode 100644 openshift/templates/crunchydb/readme.md delete mode 100644 openshift/templates/metabase-postgresql/Dockerfile delete mode 100644 openshift/templates/metabase-postgresql/README.md delete mode 100644 openshift/templates/metabase-postgresql/metabase-bc.yaml delete mode 100644 openshift/templates/metabase-postgresql/metabase-dc-redeploy-prod.yaml delete mode 100644 openshift/templates/metabase-postgresql/metabase-dc-spilo.yaml delete mode 100644 openshift/templates/metabase-postgresql/metabase-dc.yaml delete mode 100644 openshift/templates/metabase/Dockerfile delete mode 100644 openshift/templates/metabase/README.md delete mode 100644 openshift/templates/metabase/metabase-bc.yaml delete mode 100644 openshift/templates/metabase/metabase-dc.yaml delete mode 100644 openshift/templates/patroni-2.1.1/Dockerfile delete mode 100644 openshift/templates/patroni-2.1.1/README.md delete mode 100755 openshift/templates/patroni-2.1.1/contrib/root/usr/bin/entrypoint.sh delete mode 100755 openshift/templates/patroni-2.1.1/contrib/root/usr/share/scripts/patroni/health_check.sh delete mode 100755 openshift/templates/patroni-2.1.1/contrib/root/usr/share/scripts/patroni/post_init.sh delete mode 100644 openshift/templates/patroni-2.1.1/templates/build.yaml delete mode 100644 openshift/templates/patroni-2.1.1/templates/deploy.yaml delete mode 100644 openshift/templates/patroni-2.1.1/templates/prerequisite.yaml delete mode 100644 openshift/templates/patroni-2.1.1/templates/secret-template.yaml delete mode 100644 openshift/templates/postgrest/Dockerfile delete mode 100644 openshift/templates/postgrest/readme.txt delete mode 100644 openshift/templates/redis/cthub-dev-values.yaml delete mode 100644 openshift/templates/redis/cthub-test-values.yaml delete mode 100644 openshift/templates/redis/readme.md delete mode 100644 openshift/templates/redis/the-default-values.yaml delete mode 100644 openshift/templates/spilo/s3-secret.yaml delete mode 100644 openshift/templates/spilo/tfrs-patroni-admin.yaml delete mode 100644 openshift/templates/spilo/tfrs-patroni-app.yaml delete mode 100644 openshift/templates/superset/Openshift/superset-bc.yaml delete mode 100644 openshift/templates/superset/cthub-superset-dev.yaml delete mode 100644 openshift/templates/superset/cthub-superset-test.yaml delete mode 100644 openshift/templates/superset/docker/Dockerfile delete mode 100644 openshift/templates/superset/readme.md delete mode 100644 openshift/templates/superset/the-default-values.yaml delete mode 100644 openshift/templates/sysdig/sysdig-team.yaml delete mode 100644 superset/README.md delete mode 100755 superset/docker-bootstrap.sh delete mode 100755 superset/docker-ci.sh delete mode 100755 superset/docker-frontend.sh delete mode 100755 superset/docker-init.sh delete mode 100755 superset/frontend-mem-nag.sh delete mode 100644 superset/pythonpath_dev/.gitignore delete mode 100644 superset/pythonpath_dev/superset_config.py delete mode 100644 superset/pythonpath_dev/superset_config_local.example delete mode 100644 superset/run-server.sh delete mode 100755 superset/run.sh diff --git a/.github/workflows/replace-DC.yaml b/.github/workflows/replace-DC.yaml new file mode 100644 index 00000000..166331f0 --- /dev/null +++ b/.github/workflows/replace-DC.yaml @@ -0,0 +1,115 @@ +## For each release, the value of workflow name, branches and VERSION need to be adjusted accordingly + +name: CTHUB Replace DC on Dev + +on: + push: + branches: [ replace-dc-0.3.0 ] + workflow_dispatch: + +env: + VERSION: 0.3.0 + GIT_URL: https://github.com/bcgov/cthub.git + TOOLS_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-tools + DEV_NAMESPACE: ${{ secrets.OPENSHIFT_NAMESPACE_PLATE }}-dev + + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + + set-pre-release: + name: Calculate pre-release number + runs-on: ubuntu-latest + + outputs: + output1: ${{ steps.set-pre-release.outputs.PRE_RELEASE }} + + steps: + - id: set-pre-release + run: echo "PRE_RELEASE=$(date +'%Y%m%d%H%M%S')" >> $GITHUB_OUTPUT + + build: + + name: Build CTHUB + runs-on: ubuntu-latest + needs: set-pre-release + timeout-minutes: 60 + + env: + PRE_RELEASE: ${{ needs.set-pre-release.outputs.output1 }} + + steps: + + - name: Check out repository + uses: actions/checkout@v4.1.1 + + - name: Log in to Openshift + uses: redhat-actions/oc-login@v1.3 + with: + openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} + openshift_token: ${{ secrets.OPENSHIFT_TOKEN }} + insecure_skip_tls_verify: true + namespace: ${{ env.TOOLS_NAMESPACE }} + + - name: Build CTHUB Backend + run: | + cd openshift/templates/backend + oc process -f ./backend-bc-docker.yaml NAME=cthub SUFFIX=-${{ env.VERSION }}-${{ env.PRE_RELEASE }} VERSION=${{ env.VERSION }}-${{ env.PRE_RELEASE }} GIT_URL=${{ env.GIT_URL }} GIT_REF=release-${{ env.VERSION }} | oc apply --wait=true -f - -n ${{ env.TOOLS_NAMESPACE }} + sleep 5s + oc -n ${{ env.TOOLS_NAMESPACE }} wait --for=condition=Complete --timeout=900s build/cthub-backend-${{ env.VERSION }}-${{ env.PRE_RELEASE }}-1 + oc tag ${{ env.TOOLS_NAMESPACE }}/cthub-backend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} ${{ env.DEV_NAMESPACE }}/cthub-backend:${{ env.VERSION }}-${{ env.PRE_RELEASE }} + + deploy: + + name: Deploy CTHUB on Dev + runs-on: ubuntu-latest + timeout-minutes: 60 + needs: [set-pre-release, build] + + env: + PRE_RELEASE: ${{ needs.set-pre-release.outputs.output1 }} + + steps: + + - name: Checkout Manifest repository + uses: actions/checkout@v4.1.1 + with: + repository: bcgov-c/tenant-gitops-30b186 + ref: main + ssh-key: ${{ secrets.MANIFEST_REPO_DEPLOY_KEY }} + + - name: Update tags + uses: mikefarah/yq@v4.40.5 + with: + cmd: | + yq -i '.backend.image.tag = "${{ env.VERSION }}-${{ env.PRE_RELEASE }}"' cthub/values-dev.yaml + + # - name: GitHub Commit & Push + # run: | + # git config --global user.email "actions@github.com" + # git config --global user.name "GitHub Actions" + # git add cthub/values-dev.yaml + # git commit -m "Update the image tag to ${{ env.VERSION }}-${{ env.PRE_RELEASE }} on Dev" + # git push + + - name: Log in to Openshift + uses: redhat-actions/oc-login@v1.3 + with: + openshift_server_url: ${{ secrets.OPENSHIFT_SERVER }} + openshift_token: ${{ secrets.OPENSHIFT_TOKEN }} + insecure_skip_tls_verify: true + namespace: ${{ env.TOOLS_NAMESPACE }} + + - name: Tag and deploy to Prod + run: | + helm -n ${{ env.PROD_NAMESPACE }} list + oc tag ${{ env.DEV_NAMESPACE }}/tfrs-backend:${{ env.BUILD_SUFFIX }} ${{ env.PROD_NAMESPACE }}/tfrs-backend:${{ env.BUILD_SUFFIX }} + + - name: Helm Deployment + run: | + cd tfrs/charts/backend + helm -n ${{ env.PROD_NAMESPACE }} -f ./values-dev.yaml upgrade --install cthub-dev-backend . \ + --set podAnnotations.rolloutTriggered="A$(date +%s)E" diff --git a/.pipeline/.nvmrc b/.pipeline/.nvmrc deleted file mode 100644 index 6b12bc74..00000000 --- a/.pipeline/.nvmrc +++ /dev/null @@ -1 +0,0 @@ -v10.15.2 \ No newline at end of file diff --git a/.pipeline/build-metabase.js b/.pipeline/build-metabase.js deleted file mode 100755 index 35935c29..00000000 --- a/.pipeline/build-metabase.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const task = require('./lib/build-metabase.js') -const settings = require('./lib/config.js') - -task(Object.assign(settings, { phase: 'build'})) diff --git a/.pipeline/build-patroni.js b/.pipeline/build-patroni.js deleted file mode 100755 index f9dbb87d..00000000 --- a/.pipeline/build-patroni.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const task = require('./lib/build-patroni.js') -const settings = require('./lib/config.js') - -task(Object.assign(settings, { phase: 'build'})) diff --git a/.pipeline/build.js b/.pipeline/build.js deleted file mode 100755 index 3ac899f8..00000000 --- a/.pipeline/build.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const task = require('./lib/build.js') -const settings = require('./lib/config.js') - -task(Object.assign(settings, { phase: 'build'})) diff --git a/.pipeline/clean-tools.js b/.pipeline/clean-tools.js deleted file mode 100755 index 42f4c43e..00000000 --- a/.pipeline/clean-tools.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/clean-tools.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/clean.js b/.pipeline/clean.js deleted file mode 100755 index 42231d7f..00000000 --- a/.pipeline/clean.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/clean.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/deploy-knp.js b/.pipeline/deploy-knp.js deleted file mode 100755 index ccbc4048..00000000 --- a/.pipeline/deploy-knp.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/deploy-knp.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/deploy-metabase.js b/.pipeline/deploy-metabase.js deleted file mode 100755 index 02d551f0..00000000 --- a/.pipeline/deploy-metabase.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/deploy-metabase.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/deploy-patroni.js b/.pipeline/deploy-patroni.js deleted file mode 100755 index 348313cd..00000000 --- a/.pipeline/deploy-patroni.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/deploy-patroni.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/deploy-unittest.js b/.pipeline/deploy-unittest.js deleted file mode 100644 index c6c95ded..00000000 --- a/.pipeline/deploy-unittest.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/deploy-unittest.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/deploy.js b/.pipeline/deploy.js deleted file mode 100755 index 59550945..00000000 --- a/.pipeline/deploy.js +++ /dev/null @@ -1,5 +0,0 @@ -'use strict'; -const settings = require('./lib/config.js') -const task = require('./lib/deploy.js') - -task(Object.assign(settings, { phase: settings.options.env})); diff --git a/.pipeline/lib/build-metabase.js b/.pipeline/lib/build-metabase.js deleted file mode 100755 index 6ac832d9..00000000 --- a/.pipeline/lib/build-metabase.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const oc = new OpenShiftClientX(Object.assign({ namespace: phases.build.namespace }, options)); - const phase = "build"; - let objects = []; - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - - // The building of your cool app goes here ▼▼▼ - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/metabase/metabase-bc.yaml`, {})); - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - phases[phase].changeId, - phases[phase].instance, - ); - oc.applyAndBuild(objects); -}; diff --git a/.pipeline/lib/build-patroni.js b/.pipeline/lib/build-patroni.js deleted file mode 100755 index 5ea254bf..00000000 --- a/.pipeline/lib/build-patroni.js +++ /dev/null @@ -1,24 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const oc = new OpenShiftClientX(Object.assign({ namespace: phases.build.namespace }, options)); - const phase = "build"; - let objects = []; - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - - // The building of your cool app goes here ▼▼▼ - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/patroni-2.1.1/templates/build.yaml`, {})); - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - phases[phase].changeId, - phases[phase].instance, - ); - oc.applyAndBuild(objects); -}; diff --git a/.pipeline/lib/build.js b/.pipeline/lib/build.js deleted file mode 100755 index c9fe35d1..00000000 --- a/.pipeline/lib/build.js +++ /dev/null @@ -1,45 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const oc = new OpenShiftClientX(Object.assign({ namespace: phases.build.namespace }, options)); - const phase = "build"; - let objects = []; - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - - // The building of your cool app goes here ▼▼▼ - - // build frontend - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/frontend/frontend-bc.yaml`, { - 'param':{ - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'VERSION': phases[phase].tag, - 'GIT_URL': oc.git.http_url, - 'GIT_REF': oc.git.ref - } - })) - - //build backend - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/backend/backend-bc.yaml`, { - 'param':{ - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'VERSION': phases[phase].tag, - 'GIT_URL': oc.git.http_url, - 'GIT_REF': oc.git.ref - } - })) - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - phases[phase].changeId, - phases[phase].instance, - ); - oc.applyAndBuild(objects); -}; diff --git a/.pipeline/lib/clean-tools.js b/.pipeline/lib/clean-tools.js deleted file mode 100755 index 0521bd6f..00000000 --- a/.pipeline/lib/clean-tools.js +++ /dev/null @@ -1,64 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); - -// The clean tasks should be based on the following five labels added by BCDK pipeline -// namespace: '30b186-tools', -// transient: true, -// name: 'cthub', -// phase: 'build', -// changeId: '46', -// suffix: '-build-46', -// instance: 'cthub-build-46', -// version: '1.0.0-46', -// tag: 'build-1.0.0-46', -// ocpName: 'apps.silver.devops' - -const getTargetPhases = (env, phases) => { - let target_phase = []; - for (const phase in phases) { - if (env.match(/^(all|transient)$/) && phases[phase].transient) { - target_phase.push(phase); - } else if (env === phase) { - target_phase.push(phase); - break; - } - } - - return target_phase; -}; - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const oc = new OpenShiftClientX(Object.assign({ namespace: phases.build.namespace }, options)); - const target_phases = getTargetPhases(options.env, phases); - - target_phases.forEach(k => { - if (phases.hasOwnProperty(k)) { - - const phase = phases[k]; - oc.namespace(phase.namespace); - - let buildConfigs = oc.get("bc", { - selector: `app=${phase.instance},env-id=${phase.changeId},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - namespace: phase.namespace, - }); - - buildConfigs.forEach(bc => { - if (bc.spec.output.to.kind == "ImageStreamTag") { - oc.delete([`ImageStreamTag/${bc.spec.output.to.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - } - oc.delete([`BuildConfig/${bc.metadata.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - }); - - } - }); -}; diff --git a/.pipeline/lib/clean.js b/.pipeline/lib/clean.js deleted file mode 100755 index 7ec61c13..00000000 --- a/.pipeline/lib/clean.js +++ /dev/null @@ -1,132 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); - -// The clean tasks should be based on the following five labels added by BCDK pipeline -// app: cthub-dev-45 -// template-hash: 5ee0ba9e32efa8ac4d0ed2b9923ea2be3ddda2f4 -// github-owner: bcgov -// env-name: dev -// app.kubernetes.io/component: database -// app.kubernetes.io/managed-by: template -// app-name: cthub -// app.kubernetes.io/name: patroni -// env-id: '45' -// github-repo: cthub - -const getTargetPhases = (env, phases) => { - let target_phase = []; - for (const phase in phases) { - if (env.match(/^(all|transient)$/) && phases[phase].transient) { - target_phase.push(phase); - } else if (env === phase) { - target_phase.push(phase); - break; - } - } - - return target_phase; -}; - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const oc = new OpenShiftClientX(Object.assign({ namespace: phases.build.namespace }, options)); - const target_phases = getTargetPhases(options.env, phases); - - target_phases.forEach(k => { - - //k is dve, test or prod - if (phases.hasOwnProperty(k)) { - - const phase = phases[k]; - oc.namespace(phase.namespace); - - let deploymentConfigs = oc.get("dc", { - selector: `app=${phase.instance},env-id=${phase.changeId},env-name=${k},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - namespace: phase.namespace, - }); - deploymentConfigs.forEach(dc => { - dc.spec.triggers.forEach(trigger => { - if ( - trigger.type == "ImageChange" && - trigger.imageChangeParams.from.kind == "ImageStreamTag" - ) { - oc.delete([`ImageStreamTag/${trigger.imageChangeParams.from.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - } - }); - oc.delete([`DeploymentConfig/${dc.metadata.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - }); - oc.raw( - "delete", - ["Secret,configmap,endpoints,RoleBinding,role,ServiceAccount,Endpoints,service,route"], - { - selector: `app=${phase.instance},env-id=${phase.changeId},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - wait: "true", - namespace: phase.namespace, - } - ); - - //get all statefulsets before they are deleted - const statefulsets = oc.get("statefulset", { - selector: `app=${phase.instance},env-id=${phase.changeId},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - namespace: phase.namespace, - }); - //remove all the PVCs associated with each statefulset, after they get deleted by above delete all operation - statefulsets.forEach(statefulset => { - //delete StatefulSet - oc.delete([`StatefulSet/${statefulset.metadata.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - //delete configmaps create by patroni - let patroniConfigmaps = oc.get("configmap", { - selector: `app.kubernetes.io/name=patroni,cluster-name=${statefulset.metadata.name}`, - namespace: phase.namespace, - }); - if(Object.entries(patroniConfigmaps).length > 0) { - oc.raw( - "delete", - ["configmap"], - { - selector: `app.kubernetes.io/name=patroni,cluster-name=${statefulset.metadata.name}`, - wait: "true", - "ignore-not-found": "true", - namespace: phase.namespace, - }, - ); - }; - //delete PVCs mounted for statfulset - oc.raw("delete", ["pvc"], { - selector: `app=${phase.instance},statefulset=${statefulset.metadata.name},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - - }); - - //remove all PR's network policies - const knps = oc.get("networkpolicies", { - selector: `app=${phase.instance},env-id=${phase.changeId},env-name=${k},!shared,github-repo=${oc.git.repository},github-owner=${oc.git.owner}`, - namespace: phase.namespace, - }); - knps.forEach(knp => { - oc.delete([`networkpolicy/${knp.metadata.name}`], { - "ignore-not-found": "true", - wait: "true", - namespace: phase.namespace, - }); - }); - - } - }); -}; diff --git a/.pipeline/lib/config.js b/.pipeline/lib/config.js deleted file mode 100644 index b03f1886..00000000 --- a/.pipeline/lib/config.js +++ /dev/null @@ -1,82 +0,0 @@ -'use strict'; -const options= require('@bcgov/pipeline-cli').Util.parseArguments() -const changeId = options.pr //aka pull-request -const version = '0.2.0' -const name = 'cthub' -const ocpName = 'apps.silver.devops' - -//if work directly on bcgov repo, the value is bcgov -//if work on forked developer repo, the value is the developer's GitHub Id -//without this line of code, the pr deployment cann't removed when the pr is closed - -/* -Resource usage base: - -Name CPU Memory -backend 40m 520M -frontend 70m 500M -superset 1m 180M -metabase 130m 820M -patroni 70m 410M -redis 2m 20M -Minio 3m 150M -backup 1m 20M - -Set the cpu usage 20m as the lowest -Set the limit as two times of request - -*/ -options.git.owner='bcgov' -options.git.repository='cthub' - -const phases = { - - build: {namespace:'30b186-tools' , transient:true, name: `${name}`, phase: 'build', - changeId:`${changeId}`, suffix: `-build-${changeId}` , instance: `${name}-build-${changeId}`, - version:`${version}-${changeId}`, tag:`build-${version}-${changeId}`, ocpName: `${ocpName}`}, - - dev: {namespace:'30b186-dev', transient:true, name: `${name}`, ssoSuffix:'-dev', - ssoName:'dev.oidc.gov.bc.ca', phase: 'dev' , changeId:`${changeId}`, suffix: '-dev', - instance: `${name}-dev` , version:`${version}`, tag:`dev-${version}`, - host: `cthub-dev.${ocpName}.gov.bc.ca`, djangoDebug: 'True', logoutHostName: 'logontest7.gov.bc.ca', dbHost: 'cthub-crunchy-dev-pgbouncer', - metabaseCpuRequest: '200m', metabaseCpuLimit: '300m', metabaseMemoryRequest: '500Mi', metabaseMemoryLimit: '2Gi', metabaseReplicas: 1, - frontendCpuRequest: '400m', frontendCpuLimit: '800m', frontendMemoryRequest: '600Mi', frontendMemoryLimit: '1200Mi', frontendReplicas: 1, - backendCpuRequest: '50m', backendCpuLimit: '100m', backendMemoryRequest: '520Mi', backendMemoryLimit: '1Gi', backendHealthCheckDelay: 30, backendHost: `cthub-backend-dev.${ocpName}.gov.bc.ca`, backendReplicas: 1, - minioCpuRequest: '30m', minioCpuLimit: '100m', minioMemoryRequest: '150Mi', minioMemoryLimit: '300Mi', minioPvcSize: '3Gi', minioBucketName: 'zevadv', - schemaspyCpuRequest: '50m', schemaspyCpuLimit: '200m', schemaspyMemoryRequest: '150M', schemaspyMemoryLimit: '300M', schemaspyHealthCheckDelay: 160, - rabbitmqCpuRequest: '250m', rabbitmqCpuLimit: '700m', rabbitmqMemoryRequest: '500M', rabbitmqMemoryLimit: '1G', rabbitmqPvcSize: '1G', rabbitmqReplica: 1, rabbitmqPostStartSleep: 120, storageClass: 'netapp-block-standard', - patroniCpuRequest: '200m', patroniCpuLimit: '400m', patroniMemoryRequest: '250Mi', patroniMemoryLimit: '500Mi', patroniPvcSize: '2G', patroniReplica: 2, storageClass: 'netapp-block-standard', ocpName: `${ocpName}`}, - - test: {namespace:'30b186-test', name: `${name}`, ssoSuffix:'-test', - ssoName:'test.oidc.gov.bc.ca', phase: 'test' , changeId:`${changeId}`, suffix: `-test`, - instance: `${name}-test`, version:`${version}`, tag:`test-${version}`, - host: `cthub-test.${ocpName}.gov.bc.ca`, djangoDebug: 'False', logoutHostName: 'logontest7.gov.bc.ca', dbHost: 'cthub-crunchy-test-pgbouncer', - metabaseCpuRequest: '200m', metabaseCpuLimit: '300m', metabaseMemoryRequest: '500Mi', metabaseMemoryLimit: '2Gi', metabaseReplicas: 1, - frontendCpuRequest: '400m', frontendCpuLimit: '800m', frontendMemoryRequest: '600Mi', frontendMemoryLimit: '1200Mi', frontendReplicas: 1, frontendMinReplicas: 1, frontendMaxReplicas: 3, - backendCpuRequest: '50m', backendCpuLimit: '100m', backendMemoryRequest: '520Mi', backendMemoryLimit: '1Gi', backendHealthCheckDelay: 30, backendReplicas: 1, backendMinReplicas: 1, backendMaxReplicas: 3, backendHost: `cthub-backend-test.${ocpName}.gov.bc.ca`, - minioCpuRequest: '30m', minioCpuLimit: '100m', minioMemoryRequest: '150Mi', minioMemoryLimit: '300Mi', minioPvcSize: '3G', minioBucketName: 'zevats', - schemaspyCpuRequest: '20m', schemaspyCpuLimit: '200m', schemaspyMemoryRequest: '150M', schemaspyMemoryLimit: '300M', schemaspyHealthCheckDelay: 160, - rabbitmqCpuRequest: '250m', rabbitmqCpuLimit: '700m', rabbitmqMemoryRequest: '500M', rabbitmqMemoryLimit: '700M', rabbitmqPvcSize: '1G', rabbitmqReplica: 2, rabbitmqPostStartSleep: 120, storageClass: 'netapp-block-standard', - patroniCpuRequest: '200m', patroniCpuLimit: '400m', patroniMemoryRequest: '250Mi', patroniMemoryLimit: '500Mi', patroniPvcSize: '5G', patroniReplica: 2, storageClass: 'netapp-block-standard', ocpName: `${ocpName}`}, - - prod: {namespace:'30b186-prod', name: `${name}`, ssoSuffix:'', - ssoName:'oidc.gov.bc.ca', phase: 'prod' , changeId:`${changeId}`, suffix: `-prod`, - instance: `${name}-prod`, version:`${version}`, tag:`prod-${version}`, - metabaseCpuRequest: '200m', metabaseCpuLimit: '300m', metabaseMemoryRequest: '500Mi', metabaseMemoryLimit: '2Gi', metabaseReplicas: 1, - host: `cthub-prod.${ocpName}.gov.bc.ca`, djangoDebug: 'False', logoutHostName: 'logon7.gov.bc.ca', dbHost: 'patroni-master-prod', - frontendCpuRequest: '400m', frontendCpuLimit: '800m', frontendMemoryRequest: '600Mi', frontendMemoryLimit: '1200Mi', frontendReplicas: 1, frontendMinReplicas: 1, frontendMaxReplicas: 3, - backendCpuRequest: '50m', backendCpuLimit: '100m', backendMemoryRequest: '520Mi', backendMemoryLimit: '1Gi', backendHealthCheckDelay: 30, backendReplicas: 1, backendMinReplicas: 1, backendMaxReplicas: 3, backendHost: `cthub-backend-prod.${ocpName}.gov.bc.ca`, - minioCpuRequest: '30m', minioCpuLimit: '100m', minioMemoryRequest: '150Mi', minioMemoryLimit: '300Mi', minioPvcSize: '3G', minioBucketName: 'zevapr', - schemaspyCpuRequest: '50m', schemaspyCpuLimit: '400m', schemaspyMemoryRequest: '150M', schemaspyMemoryLimit: '300M', schemaspyHealthCheckDelay: 160, - rabbitmqCpuRequest: '250m', rabbitmqCpuLimit: '700m', rabbitmqMemoryRequest: '500M', rabbitmqMemoryLimit: '1G', rabbitmqPvcSize: '5G', rabbitmqReplica: 2, rabbitmqPostStartSleep: 120, storageClass: 'netapp-block-standard', - patroniCpuRequest: '200m', patroniCpuLimit: '400m', patroniMemoryRequest: '250Mi', patroniMemoryLimit: '500Mi', patroniPvcSize: '8G', patroniReplica: 3, storageClass: 'netapp-block-standard', ocpName: `${ocpName}`} - -}; - -// This callback forces the node process to exit as failure. -process.on('unhandledRejection', (reason) => { - console.log(reason); - process.exit(1); -}); - -module.exports = exports = {phases, options}; diff --git a/.pipeline/lib/deploy-knp.js b/.pipeline/lib/deploy-knp.js deleted file mode 100755 index 6458596c..00000000 --- a/.pipeline/lib/deploy-knp.js +++ /dev/null @@ -1,34 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const phase = options.env; - const changeId = phases[phase].changeId; - const oc = new OpenShiftClientX(Object.assign({namespace: phases[phase].namespace}, options)); - - //add Valid Redirect URIs for the pull request to keycloak - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - var objects = []; - - // The deployment of your cool app goes here ▼▼▼ - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/knp/knp-env-pr.yaml`, { - 'param': { - 'SUFFIX': phases[phase].suffix, - 'ENVIRONMENT': phases[phase].phase - } - })) - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - `${changeId}`, - phases[phase].instance, - ); - oc.importImageStreams(objects, phases[phase].tag, phases.build.namespace, phases.build.tag); - oc.applyAndDeploy(objects, phases[phase].instance); - -}; diff --git a/.pipeline/lib/deploy-metabase.js b/.pipeline/lib/deploy-metabase.js deleted file mode 100755 index 16a5c424..00000000 --- a/.pipeline/lib/deploy-metabase.js +++ /dev/null @@ -1,39 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); -//const KeyCloakClient = require('./keycloak'); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const phase = options.env; - const changeId = phases[phase].changeId; - const oc = new OpenShiftClientX(Object.assign({namespace: phases[phase].namespace}, options)); - - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - var objects = []; - - // The deployment of your cool app goes here ▼▼▼ - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/metabase-postgresql/metabase-dc.yaml`, { - 'param': { - 'ENV_NAME': phases[phase].phase, - 'SUFFIX': phases[phase].suffix, - 'CPU_REQUEST': phases[phase].metabaseCpuRequest, - 'CPU_LIMIT': phases[phase].metabaseCpuLimit, - 'MEMORY_REQUEST': phases[phase].metabaseMemoryRequest, - 'MEMORY_LIMIT': phases[phase].metabaseMemoryLimit, - 'REPLICAS': phases[phase].metabaseReplicas, - } - })) - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - `${changeId}`, - phases[phase].instance, - ); - oc.importImageStreams(objects, phases[phase].tag, phases.build.namespace, phases.build.tag); - oc.applyAndDeploy(objects, phases[phase].instance); - -}; diff --git a/.pipeline/lib/deploy-patroni.js b/.pipeline/lib/deploy-patroni.js deleted file mode 100755 index e7eb5f97..00000000 --- a/.pipeline/lib/deploy-patroni.js +++ /dev/null @@ -1,54 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); -//const KeyCloakClient = require('./keycloak'); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const phase = options.env; - const changeId = phases[phase].changeId; - const oc = new OpenShiftClientX(Object.assign({namespace: phases[phase].namespace}, options)); - - //add Valid Redirect URIs for the pull request to keycloak - /************ - if(phase === 'dev') { - const kc = new KeyCloakClient(settings, oc); - kc.addUris(); - } - *************/ - - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - var objects = []; - - // The deployment of your cool app goes here ▼▼▼ - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/patroni-2.1.1/templates/prerequisite.yaml`, { - 'param': { - 'SUFFIX': phases[phase].suffix - } - })) - - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/patroni-2.1.1/templates/deploy.yaml`, { - 'param': { - 'SUFFIX': phases[phase].suffix, - 'CPU_REQUEST': phases[phase].patroniCpuRequest, - 'CPU_LIMIT': phases[phase].patroniCpuLimit, - 'MEMORY_REQUEST': phases[phase].patroniMemoryRequest, - 'MEMORY_LIMIT': phases[phase].patroniMemoryLimit, - 'REPLICAS': phases[phase].patroniReplica, - 'PVC_SIZE': phases[phase].patroniPvcSize, - 'STORAGE_CLASS': phases[phase].storageClass - } - })) - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - `${changeId}`, - phases[phase].instance, - ); - oc.importImageStreams(objects, phases[phase].tag, phases.build.namespace, phases.build.tag); - oc.applyAndDeploy(objects, phases[phase].instance); - -}; diff --git a/.pipeline/lib/deploy-unittest.js b/.pipeline/lib/deploy-unittest.js deleted file mode 100644 index 93e01e50..00000000 --- a/.pipeline/lib/deploy-unittest.js +++ /dev/null @@ -1,67 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const phase = options.env; - const changeId = phases[phase].changeId; - const oc = new OpenShiftClientX(Object.assign({namespace: phases[phase].namespace}, options)); - - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - var objects = []; - - // The deployment of your cool app goes here ▼▼▼ - - //deploy separate database and backend pod for unit test - if( phase === 'dev' ) { - - //create unit test database init scripts - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/unittest/zeva-postgresql-init.yaml`, { - 'param': { - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix - } - })) - - //deploy postgresql unit test - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/unittest/postgresql-dc-unittest.yaml`, { - 'param': { - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'ENV_NAME': phases[phase].phase - } - })) - - //deploy backend unit test - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/unittest/backend-dc-unittest.yaml`, { - 'param': { - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'VERSION': phases[phase].tag, - 'ENV_NAME': phases[phase].phase, - 'BACKEND_HOST_NAME': phases[phase].backendHost, - 'RABBITMQ_CLUSTER_NAME': 'rabbitmq-cluster', - 'CPU_REQUEST': phases[phase].backendCpuRequest, - 'CPU_LIMIT': '700m', - 'MEMORY_REQUEST': phases[phase].backendMemoryRequest, - 'MEMORY_LIMIT': phases[phase].backendMemoryLimit, - 'HEALTH_CHECK_DELAY': phases[phase].backendHealthCheckDelay, - 'REPLICAS': phases[phase].backendReplicas - } - })) - - } - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - `${changeId}`, - phases[phase].instance, - ); - oc.importImageStreams(objects, phases[phase].tag, phases.build.namespace, phases.build.tag); - oc.applyAndDeploy(objects, phases[phase].instance); - -}; diff --git a/.pipeline/lib/deploy.js b/.pipeline/lib/deploy.js deleted file mode 100755 index 8b5b0f54..00000000 --- a/.pipeline/lib/deploy.js +++ /dev/null @@ -1,69 +0,0 @@ -"use strict"; -const { OpenShiftClientX } = require("@bcgov/pipeline-cli"); -const path = require("path"); -//const KeyCloakClient = require('./keycloak'); - -module.exports = settings => { - const phases = settings.phases; - const options = settings.options; - const phase = options.env; - const changeId = phases[phase].changeId; - const oc = new OpenShiftClientX(Object.assign({namespace: phases[phase].namespace}, options)); - - //add Valid Redirect URIs for the pull request to keycloak - /************ - if(phase === 'dev') { - const kc = new KeyCloakClient(settings, oc); - kc.addUris(); - } - *************/ - - const templatesLocalBaseUrl = oc.toFileUrl(path.resolve(__dirname, "../../openshift")); - var objects = []; - - // The deployment of your cool app goes here ▼▼▼ - - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/frontend/frontend-dc.yaml`, { - 'param': { - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'VERSION': phases[phase].tag, - 'ENV_NAME': phases[phase].phase, - 'HOST_NAME': phases[phase].host, - 'CPU_REQUEST': phases[phase].frontendCpuRequest, - 'CPU_LIMIT': phases[phase].frontendCpuLimit, - 'MEMORY_REQUEST': phases[phase].frontendMemoryRequest, - 'MEMORY_LIMIT': phases[phase].frontendMemoryLimit, - 'REPLICAS': phases[phase].frontendReplicas - } - })) - - objects = objects.concat(oc.processDeploymentTemplate(`${templatesLocalBaseUrl}/templates/backend/backend-dc.yaml`, { - 'param': { - 'NAME': phases[phase].name, - 'SUFFIX': phases[phase].suffix, - 'VERSION': phases[phase].tag, - 'ENV_NAME': phases[phase].phase, - 'BACKEND_HOST_NAME': phases[phase].backendHost, - 'CPU_REQUEST': phases[phase].backendCpuRequest, - 'CPU_LIMIT': phases[phase].backendCpuLimit, - 'MEMORY_REQUEST': phases[phase].backendMemoryRequest, - 'MEMORY_LIMIT': phases[phase].backendMemoryLimit, - 'HEALTH_CHECK_DELAY': phases[phase].backendHealthCheckDelay, - 'REPLICAS': phases[phase].backendReplicas, - 'DB_HOST': phases[phase].dbHost, - 'MINIO_BUCKET_NAME': phases[phase].minioBucketName - } - })) - - oc.applyRecommendedLabels( - objects, - phases[phase].name, - phase, - `${changeId}`, - phases[phase].instance, - ); - oc.importImageStreams(objects, phases[phase].tag, phases.build.namespace, phases.build.tag); - oc.applyAndDeploy(objects, phases[phase].instance); - -}; diff --git a/.pipeline/lib/keycloak.js b/.pipeline/lib/keycloak.js deleted file mode 100644 index 5310a10b..00000000 --- a/.pipeline/lib/keycloak.js +++ /dev/null @@ -1,137 +0,0 @@ -"use strict"; -const axios = require("axios"); -const _ = require("lodash"); -//code reference https://github.com/bcgov/HMCR/blob/0.7/.pipeline/lib/keycloak.js -module.exports = class KeyCloakClient { - constructor(settings, oc) { - this.phases = settings.phases; - this.options = settings.options; - this.oc = oc; - this.zevaHost = this.phases.dev.host; - } - - async init() { - - this.getSecrets(); - - this.apiTokenPath = `/auth/realms/${this.realmId}/protocol/openid-connect/token`; - this.zevaPublicClientPath = `auth/admin/realms/${this.realmId}/clients/${this.zevaClientId}`; - - this.api = axios.create({ - baseURL: `https://${this.ssoHost}` - }); - - const token = await this.getAccessToken(); - - this.api.defaults.headers.common = { - Authorization: `Bearer ${token}` - }; - } - - getSecrets() { - const keycloakSecret = this.oc.raw("get", [ - "secret", - "zeva-keycloak", - "-o", - "json" - ]); - const secret = JSON.parse(keycloakSecret.stdout).data; - - this.clientId = Buffer.from(secret.clientId, "base64").toString(); - this.clientSecret = Buffer.from(secret.clientSecret, "base64").toString(); - this.zevaClientId = Buffer.from(secret.zevaPublic, "base64").toString(); - this.realmId = Buffer.from(secret.realmId, "base64").toString(); - this.ssoHost = Buffer.from(secret.host, "base64").toString(); - - if (!this.clientId || !this.clientSecret || !this.zevaClientId) - throw new Error( - "Unable to retrieve Keycloak service account info from OpenShift" - ); - } - - getAccessToken() { - - return this.api - .post(this.apiTokenPath, "grant_type=client_credentials", { - headers: { "Content-Type": "application/x-www-form-urlencoded" }, - auth: { - username: this.clientId, - password: this.clientSecret - } - }) - .then(function(response) { - if (!response.data.access_token) - throw new Error( - "Unable to retrieve Keycloak service account access token" - ); - - return Promise.resolve(response.data.access_token); - }); - } - - async getUris() { - - const response = await this.api.get(this.zevaPublicClientPath); - - const data = { ...response.data }; - const redirectUris = data.redirectUris; - - return { data, redirectUris }; - } - - async addUris() { - await this.init(); - - console.log("Attempting to add RedirectUri and WebOrigins"); - - const { data, redirectUris} = await this.getUris(); - - const putData = { id: data.id, clientId: data.clientId }; - - const hasRedirectUris = redirectUris.find(item => - item.includes(this.zevaHost) - ); - - if (!hasRedirectUris) { - redirectUris.push(`https://${this.zevaHost}/*`); - putData.redirectUris = redirectUris; - } - - if (!(hasRedirectUris)) { - this.api - .put(this.zevaPublicClientPath, putData) - .then(() => console.log("RedirectUri and WebOrigins added.")); - } else { - console.log("RedirectUri and WebOrigins add skipped."); - } - } - - async removeUris() { - await this.init(); - - console.log("Attempting to remove RedirectUri and WebOrigins"); - - const { data, redirectUris } = await this.getUris(); - - const putData = { id: data.id, clientId: data.clientId }; - - const hasRedirectUris = redirectUris.find(item => - item.includes(this.zevaHost) - ); - - if (hasRedirectUris) { - putData.redirectUris = redirectUris.filter( - item => !item.includes(this.zevaHost) - ); - } - - if (hasRedirectUris) { - this.api - .put(this.zevaPublicClientPath, putData) - .then(() => console.log("RedirectUri and WebOrigins removed.")); - } else { - console.log("RedirectUri and WebOrigins remove skipped."); - } - - } -}; diff --git a/.pipeline/npmw b/.pipeline/npmw deleted file mode 100755 index 1eed7c95..00000000 --- a/.pipeline/npmw +++ /dev/null @@ -1,12 +0,0 @@ -#!/bin/sh -set +x -type -t nvm && nvm deactivate -export NVM_DIR="$(git rev-parse --show-toplevel)/.nvm" -if [ ! -f "$NVM_DIR/nvm.sh" ]; then - mkdir -p "${NVM_DIR}" - curl -sSL -o- https://raw.githubusercontent.com/creationix/nvm/v0.34.0/install.sh | bash &>/dev/null -fi -source "$NVM_DIR/nvm.sh" &>/dev/null -METHOD=script nvm install --no-progress &>/dev/null -nvm use &>/dev/null -exec npm "$@" diff --git a/.pipeline/package.json b/.pipeline/package.json deleted file mode 100644 index 1e097da3..00000000 --- a/.pipeline/package.json +++ /dev/null @@ -1,33 +0,0 @@ -{ - "name": "pipeline", - "version": "1.0.0", - "description": "This a pipeliene script", - "engines": { - "node": ">=8" - }, - "scripts": { - "build": "node build.js", - "build-metabase": "node build-metabase.js", - "build-patroni": "node build-patroni.js", - "clean-tools": "node clean-tools.js", - "clean": "node clean.js", - "deploy": "node deploy.js", - "deploy-unittest": "node deploy-unittest.js", - "deploy-metabase": "node deploy-metabase.js", - "deploy-patroni": "node deploy-patroni.js", - "deploy-knp": "node deploy-knp.js", - "version": "echo \"node@$(node --version) ($(which node))\" && echo \"npm@$(npm --version) ($(which npm))\" && npm ls" - }, - "repository": { - "type": "git", - "url": "git+https://github.com/bcgov/ocp-sso.git" - }, - "author": "", - "license": "Apache-2.0", - "dependencies": { - "@bcgov/gh-deploy": "^1.1.4", - "@bcgov/pipeline-cli": "^1.0.1", - "axios": "^0.21.1", - "lodash": "^4.17.21" - } -} diff --git a/charts/cthub-spilo/.helmignore b/charts/cthub-spilo/.helmignore deleted file mode 100644 index 0e8a0eb3..00000000 --- a/charts/cthub-spilo/.helmignore +++ /dev/null @@ -1,23 +0,0 @@ -# Patterns to ignore when building packages. -# This supports shell glob matching, relative path matching, and -# negation (prefixed with !). Only one pattern per line. -.DS_Store -# Common VCS dirs -.git/ -.gitignore -.bzr/ -.bzrignore -.hg/ -.hgignore -.svn/ -# Common backup files -*.swp -*.bak -*.tmp -*.orig -*~ -# Various IDEs -.project -.idea/ -*.tmproj -.vscode/ diff --git a/charts/cthub-spilo/Chart.lock b/charts/cthub-spilo/Chart.lock deleted file mode 100644 index 97c1cd25..00000000 --- a/charts/cthub-spilo/Chart.lock +++ /dev/null @@ -1,6 +0,0 @@ -dependencies: -- name: spilo - repository: file://../spilo - version: 0.2.0 -digest: sha256:7511538016e34905d07c80deed4ac95eadf6e208c2f1e7036eebfcef7b296897 -generated: "2023-01-20T11:30:53.758009-08:00" diff --git a/charts/cthub-spilo/Chart.yaml b/charts/cthub-spilo/Chart.yaml deleted file mode 100644 index a7329f9a..00000000 --- a/charts/cthub-spilo/Chart.yaml +++ /dev/null @@ -1,31 +0,0 @@ -apiVersion: v2 -name: cthub-spilo -description: A Helm chart for setting up splio for tfrs project on Openshift - -# A chart can be either an 'application' or a 'library' chart. -# -# Application charts are a collection of templates that can be packaged into versioned archives -# to be deployed. -# -# Library charts provide useful utilities or functions for the chart developer. They're included as -# a dependency of application charts to inject those utilities and functions into the rendering -# pipeline. Library charts do not define any templates and therefore cannot be deployed. -type: application - -# This is the chart version. This version number should be incremented each time you make changes -# to the chart and its templates, including the app version. -# Versions are expected to follow Semantic Versioning (https://semver.org/) -version: 1.0.0 - -# This is the version number of the application being deployed. This version number should be -# incremented each time you make changes to the application. Versions are not expected to -# follow Semantic Versioning. They should reflect the version the application is using. -# It is recommended to use it with quotes. -appVersion: "0.2.0" - -#repository: "https://bcgov.github.io/spilo-chart" - -dependencies: - - name: spilo - version: "0.2.0" - repository: "file://../spilo" \ No newline at end of file diff --git a/charts/cthub-spilo/Readme.md b/charts/cthub-spilo/Readme.md deleted file mode 100644 index 71d31279..00000000 --- a/charts/cthub-spilo/Readme.md +++ /dev/null @@ -1,82 +0,0 @@ -## Before running Helm -* Create secret cthub-patroni-admin - * Create the secret by using cthub/openshift/templates/spilo/cthub-patroni-admin.yaml, the three passwords are generated randomly - -* Create secret cthub-patroni-app - * Create the secret by using cthub/openshift-v4/templates/spilo/cthub-patroni-app.yaml, the three password fields must be in sync with the existing secret patroni-dev - * It contains: app-db-name, app-db-password, app-db-username, metabaseuser-name, metabaseuser-password - * The replication- and superuser- are not needed - * If this secret is aleady existed, please verify the password fields - -* Create Object Storage secret for database continuous backup, cthub-object-storage - * Create the secret by using cthub/openshift-v4/templates/object-storage/object-storage-secret.yaml - * The secret should have been created, verify it by using CyberDuck - -* Create secret cthub-db-backup-s3 - * It includes AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY and AWS_ENDPOINT - * The values are in sync with secret cthub-object-storage - -* Verify values-dev.yaml. Create the bucket on object storage if needed - -* Add new KNPs templates/knp/knp-env-pr-new-cthub-spilo.yaml - * oc process -f ./knp-env-pr-new-cthub-spilo.yaml ENVIRONMENT=test | oc apply -f - -n 30b186-dev - -## Heml command -helm install -n 30b186-dev -f ./values-dev.yaml cthub-spilo . -helm uninstall -n 30b186-dev cthub-spilo - -## Migrate Postgresql 10 on Patroni to 14 on Spilo container - -### Bring down the cthub application and route the frontend to maintenance mode - -### Run a final backup on backup container - -### Create cthub database user and database -* Login to the cthub-spilo leader pod -* If the username contains upper case letters, should be double quoted - * create user for cthub database, the username should be the same on v10 otherwise the restore may encounter issue - * create user [username] with password '[password]' - * The password can be found in secret cthub-patroni-app - * create cthub database - * create database cthub owner [username] ENCODING 'UTF8' LC_COLLATE = 'en_US.UTF-8' LC_CTYPE = 'en_US.UTF-8' -### Reset postgresql logging -* login cthub-spilo leader pod, run the following psql to only keep 24 hours log files, otherwise they take too much space - ALTER SYSTEM SET log_filename='postgresql-%H.log'; - ALTER SYSTEM SET log_connections='off'; - ALTER SYSTEM SET log_disconnections='off'; - ALTER SYSTEM SET log_checkpoints='off'; - select pg_reload_conf(); -### Create metabase user -* login cthub-spilo leader pod - CREATE USER metabaseuser WITH PASSWORD 'xxxxxx'; - GRANT CONNECT ON DATABASE cthub TO metabaseuser; - GRANT USAGE ON SCHEMA public TO metabaseuser; - GRANT SELECT ON ALL TABLES IN SCHEMA public TO metabaseuser; - ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO metabaseuser; - verify permissions are granted: select * from information_schema.role_table_grants where grantee='metabaseuser'; - -## Backup the existing v10 database and restore to v14 cluster -* Make sure the application is stopped -* Login to patroni-dev leader pod - * make an empty dir /home/postgres/migration and cd into it - * backup cthub database: pg_dump cthub > cthub.sql -* Restore cthub database - * psql cthub < ./cthub.sql >> ./restore.log 2>&1 - * verify the restore.log when complete - -* Point the applications to v14 cluster, update the enviuronment variables for - * backend: DATABASE_SERVICE_NAME, POSTGRESQL_SERVICE_HOST - * celery: DATABASE_SERVICE_NAME - * scan-handler: DATABASE_SERVICE_NAME -* Bring down the v10 cluster -* Bring down the maintenance page -* Bring up the cthub appliation -* Update patroni backup to only backup minio data -* Update metabase connection from CTHUB -* Update dbServiceName to be cthub-spilo in .pipeline/lib/config.js - -## Notes for uninstalling cthub-spilo when needed -* After the helm uninstall command, remember to remove the followings: - * The two configmaps: cthub-spilo-config, cthub-spilo-leader - * The PVCs storage-volume-cthub-spilo-* - * The backup bucket in object storage diff --git a/charts/cthub-spilo/charts/spilo-0.2.0.tgz b/charts/cthub-spilo/charts/spilo-0.2.0.tgz deleted file mode 100644 index a275b1cc3295832fb8f1b534f2de5249458c3e14..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 381815 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
vgW0yCw9^!?Y#M7OMy2m5@(Q8lLOS7bG zYnJm&prWm#F84{n<(>cL#!GH>C@DzP!`ijWf}7LU^KMBtRd zE30{H!v^^Ep^tb#+kMgQd6?5Xa%INYob*v=TootuaT4RNyZjhz2`22x;3uq!*LBvM zlphA}!Qk4*R2XuYe`UPfb7Hvna^PkHdCxoF*%aTEjJaifI~GIi(^+xx1rVO` z{w_^A&?LuecGOX$7nS?ce^wp9>^P?0!f85V-0EWCQO|X~BF3Rr2479$aql6pm*-;w zK9kE6%^+1bkE39f!k3~1`?W`MV??VSNjAYV_-otxfcXS*?kkPlF=!JCubwVKy!3Tt zcn7;DPQ3#d+KVpwWOZn)5WNI%y^~zVf1UlnXk>+RRsz zam*3DS*pktKSvhC082t-Xk@0zAQ@I<6=!Y?aC`A>Bbv^n?q9TvE-!6oniauK)|(4D zDk-^aY2N46(e3)x zudWMp+}FWNVOuoU^5(CTz3cfRS%!UWOV-Ce->&lkwt})c*U%{@j##~@` zS*L8_-;ucW{$##gC)97fIybVKaJ^pwW?vubVO^SzFXoal%rhD7a!rf{`{gI2lO(VC|wsABpodBBS|ej-9)UR6gnx(|P)u(3HBm$K$x zKDe4OlLz?>bos)6Kw9DG0m@)>K_FowF9$^#i_n^t0d~OtIkO=H-#*BNQJAk=mOb(r z(0!F8hK`qu=4YT!uq;x6F-g56j^;#gO$X;K7HrzsO6u9@+j9)>^7ghS%eH_ zID#yeRm_lV56VE-}Gw>lzjI$m_7O&Yq*jS-P55}{#HRzsV}wkSOWSA