Repository: bcgov/namex
Pull request #1720: 23712 migrate namex solr feeder to gcp
Author: login: EPortman
Created: 2025-02-28T22:58:44Z | Merged: 2025-03-05T18:38:56Z

*Issue #, if available:* [Zenhub 23712](https://app.zenhub.com/workspaces/names-team-board-new-655554cbddd49510027dad2e/issues/gh/bcgov/entity/23712)

*Description of changes:*
1. Upgrade from pip to poetry (python 3.12 & poetry 1.3.2)
    - Dockerfile Changes
    - Remove setup.py (only used in pip-based installations)
2. GCP Infrastructure
    - Update CI/CD scripts for GCP
    - Add clouddeploy.yaml and vaults.gcp.env
    - Remove old OpenShift stuff
 
**Important**
- This service needs to be changed in the GCP Console to allow unauthenticated invocations but only invocations from within the VPC. This will allow the Solr Names Updater to call it internally. 

By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of the namex license (Apache 2.0).



Diff:
diff --git a/.github/workflows/solr-feeder-cd.yml b/.github/workflows/solr-feeder-cd.yml
index fcff4160a..4aa9d738a 100644
--- a/.github/workflows/solr-feeder-cd.yml
+++ b/.github/workflows/solr-feeder-cd.yml
@@ -1,4 +1,4 @@
-name: Solr Feeder CD
+name: Namex Solr Feeder CD
 
 on:
   push:
@@ -8,106 +8,23 @@ on:
       - "solr-feeder/**"
   workflow_dispatch:
     inputs:
-      environment:
-        description: "Environment (dev/test/prod)"
+      target:
+        description: "Deploy To"
         required: true
-        default: "dev"
-
-defaults:
-  run:
-    shell: bash
-    working-directory: ./solr-feeder
-
-env:
-  APP_NAME: "solr-feeder"
-  TAG_NAME: "dev"
+        type: choice
+        options:
+        - dev
+        - test
+        - sandbox
+        - prod
 
 jobs:
-  solr-feeder-cd-by-push:
-    runs-on: ubuntu-20.04
-
-    if: github.event_name == 'push' && github.repository == 'bcgov/namex'
-    environment:
-      name: "dev"
-
-    steps:
-      - uses: actions/checkout@v3
-
-      - name: Login Openshift
-        shell: bash
-        run: |
-          oc login --server=${{secrets.OPENSHIFT4_LOGIN_REGISTRY}} --token=${{secrets.OPENSHIFT4_SA_TOKEN}}
-
-      - name: CD Flow
-        shell: bash
-        env:
-          OPS_REPOSITORY: ${{ secrets.OPS_REPOSITORY }}
-          OPENSHIFT_DOCKER_REGISTRY: ${{ secrets.OPENSHIFT4_DOCKER_REGISTRY }}
-          OPENSHIFT_SA_NAME: ${{ secrets.OPENSHIFT4_SA_NAME }}
-          OPENSHIFT_SA_TOKEN: ${{ secrets.OPENSHIFT4_SA_TOKEN }}
-          OPENSHIFT_REPOSITORY: ${{ secrets.OPENSHIFT4_REPOSITORY }}
-          TAG_NAME: ${{ env.TAG_NAME }}
-        run: |
-          make cd
-
-      - name: Watch new rollout (trigger by image change in Openshift)
-        shell: bash
-        run: |
-          oc rollout status dc/${{ env.APP_NAME }}-${{ env.TAG_NAME }} -n ${{ secrets.OPENSHIFT4_REPOSITORY }}-${{ env.TAG_NAME }} -w
-
-      - name: Rocket.Chat Notification
-        uses: RocketChat/Rocket.Chat.GitHub.Action.Notification@master
-        if: failure()
-        with:
-          type: ${{ job.status }}
-          job_name: "*Solr Feeder Built and Deployed to ${{env.TAG_NAME}}*"
-          channel: "#registries-bot"
-          url: ${{ secrets.ROCKETCHAT_WEBHOOK }}
-          commit: true
-          token: ${{ secrets.GITHUB_TOKEN }}
-
-  solr-feeder-cd-by-dispatch:
-    runs-on: ubuntu-20.04
-
-    if: github.event_name == 'workflow_dispatch' && github.repository == 'bcgov/namex'
-    environment:
-      name: "${{ github.event.inputs.environment }}"
-
-    steps:
-      - uses: actions/checkout@v3
-      - name: Set env by input
-        run: |
-          echo "TAG_NAME=${{ github.event.inputs.environment }}" >> $GITHUB_ENV
-
-      - name: Login Openshift
-        shell: bash
-        run: |
-          oc login --server=${{secrets.OPENSHIFT4_LOGIN_REGISTRY}} --token=${{secrets.OPENSHIFT4_SA_TOKEN}}
-
-      - name: CD Flow
-        shell: bash
-        env:
-          OPS_REPOSITORY: ${{ secrets.OPS_REPOSITORY }}
-          OPENSHIFT_DOCKER_REGISTRY: ${{ secrets.OPENSHIFT4_DOCKER_REGISTRY }}
-          OPENSHIFT_SA_NAME: ${{ secrets.OPENSHIFT4_SA_NAME }}
-          OPENSHIFT_SA_TOKEN: ${{ secrets.OPENSHIFT4_SA_TOKEN }}
-          OPENSHIFT_REPOSITORY: ${{ secrets.OPENSHIFT4_REPOSITORY }}
-          TAG_NAME: ${{ env.TAG_NAME }}
-        run: |
-          make cd
-
-      - name: Watch new rollout (trigger by image change in Openshift)
-        shell: bash
-        run: |
-          oc rollout status dc/${{ env.APP_NAME }}-${{ env.TAG_NAME }} -n ${{ secrets.OPENSHIFT4_REPOSITORY }}-${{ env.TAG_NAME }} -w
-
-      - name: Rocket.Chat Notification
-        uses: RocketChat/Rocket.Chat.GitHub.Action.Notification@master
-        if: failure()
-        with:
-          type: ${{ job.status }}
-          job_name: "*Solr Feeder Built and Deployed to ${{env.TAG_NAME}}*"
-          channel: "#registries-bot"
-          url: ${{ secrets.ROCKETCHAT_WEBHOOK }}
-          commit: true
-          token: ${{ secrets.GITHUB_TOKEN }}
+  solr-feeder-cd:
+    uses: bcgov/bcregistry-sre/.github/workflows/backend-cd.yaml@main
+    with:
+      target: ${{ inputs.target }}
+      app_name: "namex-solr-feeder"
+      working_directory: "./solr-feeder"
+    secrets:
+      WORKLOAD_IDENTIFY_POOLS_PROVIDER: ${{ secrets.WORKLOAD_IDENTIFY_POOLS_PROVIDER }}
+      GCP_SERVICE_ACCOUNT: ${{ secrets.GCP_SERVICE_ACCOUNT }}
\ No newline at end of file
diff --git a/.github/workflows/solr-feeder-ci.yml b/.github/workflows/solr-feeder-ci.yml
index 6687609d9..ed9a38ae9 100644
--- a/.github/workflows/solr-feeder-ci.yml
+++ b/.github/workflows/solr-feeder-ci.yml
@@ -1,84 +1,22 @@
-name: Solr Feeder CI
+name: Namex Solr Feeder CI
 
 on:
   pull_request:
-    types: [assigned, synchronize]
     paths:
       - "solr-feeder/**"
+  workflow_dispatch:
 
 defaults:
   run:
     shell: bash
-    working-directory: ./solr-feeder
+    working-directory: "solr-feeder"
 
 jobs:
-  setup-job:
-    runs-on: ubuntu-20.04
-
-    if: github.repository == 'bcgov/namex'
-
-    steps:
-      - uses: actions/checkout@v3
-      - run: "true"
-
-  linting:
-    needs: setup-job
-    runs-on: ubuntu-20.04
-
-    strategy:
-      matrix:
-        python-version: [3.11]
-
-    steps:
-      - uses: actions/checkout@v3
-      - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v1
-        with:
-          python-version: ${{ matrix.python-version }}
-      - name: Install dependencies
-        run: |
-          make setup
-      - name: Lint with pylint
-        id: pylint
-        run: |
-          make pylint
-      - name: Lint with flake8
-        id: flake8
-        run: |
-          make flake8
-
-  testing:
-    needs: setup-job
-    runs-on: ubuntu-20.04
-    steps:
-      - uses: actions/checkout@v3
-      - name: Set up Python ${{ matrix.python-version }}
-        uses: actions/setup-python@v1
-        with:
-          python-version: ${{ matrix.python-version }}
-      - name: Install dependencies
-        run: |
-          make setup
-      # no pytests exist for this project
-      # - name: Test with pytest
-      #   id: test
-      #   run: |
-      #     make test
-      #- name: Upload coverage to Codecov
-      #  uses: codecov/codecov-action@v3
-      #  with:
-      #    file: ./queue_services/entity-pay/coverage.xml
-      #    flags: entitypay
-      #    name: codecov-entity-pay
-      #    fail_ci_if_error: true
-
-  build-check:
-    needs: setup-job
-    runs-on: ubuntu-20.04
-
-    steps:
-      - uses: actions/checkout@v3
-      - name: build to check strictness
-        id: build
-        run: |
-          make build-nc
+  solr-feeder-ci:
+    uses: bcgov/bcregistry-sre/.github/workflows/backend-ci.yaml@main
+    with:
+      app_name: "namex-solr-feeder"
+      working_directory: "solr-feeder"
+      codecov_flag: "solrfeeder"
+      skip_isort: "true"
+      skip_black: "true"
\ No newline at end of file
diff --git a/solr-feeder/Dockerfile b/solr-feeder/Dockerfile
index e8c2745cb..5f2e19208 100644
--- a/solr-feeder/Dockerfile
+++ b/solr-feeder/Dockerfile
@@ -1,33 +1,87 @@
-FROM python:3.11.4-buster
+# platform=linux/amd64
+FROM python:3.12.2
 
 ARG VCS_REF="missing"
 ARG BUILD_DATE="missing"
-
 ENV VCS_REF=${VCS_REF}
 ENV BUILD_DATE=${BUILD_DATE}
-
 LABEL org.label-schema.vcs-ref=${VCS_REF} \
     org.label-schema.build-date=${BUILD_DATE}
 
 USER root
 
-# Create working directory
-RUN mkdir /opt/app-root && chmod 755 /opt/app-root
-WORKDIR /opt/app-root
+ARG APP_ENV \
+  # Needed for fixing permissions of files created by Docker:
+  UID=1000 \
+  GID=1000
+
+ENV APP_ENV=${APP_ENV} \
+  # python:
+  PYTHONFAULTHANDLER=1 \
+  PYTHONUNBUFFERED=1 \
+  PYTHONHASHSEED=random \
+  PYTHONDONTWRITEBYTECODE=1 \
+  # pip:
+  PIP_NO_CACHE_DIR=1 \
+  PIP_DISABLE_PIP_VERSION_CHECK=1 \
+  PIP_DEFAULT_TIMEOUT=100 \
+  PIP_ROOT_USER_ACTION=ignore \
+  # poetry:
+  POETRY_VERSION=1.3.2 \
+  POETRY_NO_INTERACTION=1 \
+  POETRY_VIRTUALENVS_CREATE=false \
+  POETRY_CACHE_DIR='/var/cache/pypoetry' \
+  POETRY_HOME='/usr/local'
+
+SHELL ["/bin/bash", "-eo", "pipefail", "-c"]
+
+RUN apt-get update && apt-get upgrade -y \
+  && apt-get install --no-install-recommends -y \
+    bash \
+    brotli \
+    build-essential \
+    curl \
+    gettext \
+    git \
+    libpq-dev \
+    wait-for-it \
+  && curl -sSL 'https://install.python-poetry.org' | python - \
+  && poetry --version \
+  # Cleaning cache:
+  && apt-get purge -y --auto-remove -o APT::AutoRemove::RecommendsImportant=false \
+  && apt-get clean -y && rm -rf /var/lib/apt/lists/*
+
+WORKDIR /code
+
+RUN groupadd -g "${GID}" -r web \
+  && useradd -d '/code' -g web -l -r -u "${UID}" web \
+  && chown web:web -R '/code'
 
-# Install the requirements
-COPY ./requirements.txt .
+# Copy only requirements, to cache them in docker layer
+COPY --chown=web:web ./poetry.lock ./pyproject.toml /code/
 
-RUN pip install --upgrade pip
-RUN pip install --no-cache-dir -r requirements.txt
+COPY --chown=web:web ./solr_feeder /code/solr_feeder
+COPY --chown=web:web ./README.md /code
 
-COPY . .
+# Project initialization:
+RUN --mount=type=cache,target="$POETRY_CACHE_DIR" \
+  echo "$APP_ENV" \
+  && poetry version \
+  # Install deps:
+  && poetry run pip install -U pip \
+  && poetry install \
+    $(if [ -z ${APP_ENV+x} ] | [ "$APP_ENV" = 'production' ]; then echo '--only main'; fi) \
+    --no-interaction --no-ansi
 
-RUN pip install .
+# Running as non-root user:
+USER web
 
-USER 1001
+# The following stage is only for production:
+# FROM development_build AS production_build
+COPY --chown=web:web . /code
 
-# Set Python path
-ENV PYTHONPATH=/opt/app-root
+# Run the server
+ENV PYTHONPATH=/code
+EXPOSE 8080
 
-CMD ["gunicorn", "--bind", "0.0.0.0:8080", "--config", "/opt/app-root/gunicorn_config.py", "app:application"]
+CMD gunicorn --bind 0.0.0.0:8080 --config /code/gunicorn_config.py app:application
\ No newline at end of file
diff --git a/solr-feeder/Makefile b/solr-feeder/Makefile
index 2814fef01..6a07db882 100644
--- a/solr-feeder/Makefile
+++ b/solr-feeder/Makefile
@@ -12,7 +12,7 @@ DOCKER_NAME:=solr-feeder
 #################################################################################
 # COMMANDS -- Setup                                                             #
 #################################################################################
-setup: install install-dev ## Setup the project
+setup: install ## Setup the project
 
 clean: clean-build clean-pyc clean-test ## Clean the project
 	rm -rf venv/
@@ -36,24 +36,11 @@ clean-test: ## clean test files
 	rm -f .coverage
 	rm -fr htmlcov/
 
-build-req: clean ## Upgrade requirements
-	test -f venv/bin/activate || python3 -m venv  $(CURRENT_ABS_DIR)/venv ;\
-	. venv/bin/activate ;\
-	pip install pip==22.0.4 ;\
-	pip install -Ur requirements/prod.txt ;\
-	pip freeze | sort > requirements.txt ;\
-	cat requirements/bcregistry-libraries.txt >> requirements.txt ;\
-
-install: clean ## Install python virtrual environment
-	test -f venv/bin/activate || python3 -m venv  $(CURRENT_ABS_DIR)/venv ;\
-	. venv/bin/activate ;\
-	pip install --upgrade pip ;\
-	pip install -Ur requirements.txt
-
-install-dev: ## Install local application
-	. venv/bin/activate ; \
-	pip install -Ur requirements/dev.txt; \
-	pip install -e .
+update: ## Upgrade lock
+	poetry update
+
+install: clean ## Install dependencies
+	poetry install
 
 #################################################################################
 # COMMANDS - CI                                                                 #
@@ -61,75 +48,24 @@ install-dev: ## Install local application
 ci: pylint flake8 test ## CI flow
 
 pylint: ## Linting with pylint
-	. venv/bin/activate && pylint --rcfile=setup.cfg $(PROJECT_NAME)
+	. .venv/bin/activate && pylint --rcfile=setup.cfg $(PROJECT_NAME)
 
 flake8: ## Linting with flake8
-	. venv/bin/activate && flake8 $(PROJECT_NAME)
+	. .venv/bin/activate && flake8 $(PROJECT_NAME)
 
 lint: pylint flake8 ## run all lint type scripts
 
 test: ## Unit testing
-	. venv/bin/activate && pytest
+	. .venv/bin/activate && pytest
 
 mac-cov: test ## Run the coverage report and display in a browser window (mac)
 	@open -a "Google Chrome" htmlcov/index.html
 
-#################################################################################
-# COMMANDS - CD
-# expects the terminal to be openshift login
-# expects export OPENSHIFT_DOCKER_REGISTRY=""
-# expects export OPENSHIFT_SA_NAME="$(oc whoami)"
-# expects export OPENSHIFT_SA_TOKEN="$(oc whoami -t)"
-# expects export OPENSHIFT_REPOSITORY=""
-# expects export TAG_NAME="dev/test/prod"
-# expects export OPS_REPOSITORY=""                                                        #
-#################################################################################
-cd: ## CD flow
-ifeq ($(TAG_NAME), test)
-cd: update-env
-	oc -n "$(OPENSHIFT_REPOSITORY)-tools" tag $(DOCKER_NAME):dev $(DOCKER_NAME):$(TAG_NAME)
-else ifeq ($(TAG_NAME), prod)
-cd: update-env
-	oc -n "$(OPENSHIFT_REPOSITORY)-tools" tag $(DOCKER_NAME):$(TAG_NAME) $(DOCKER_NAME):$(TAG_NAME)-$(shell date +%F)
-	oc -n "$(OPENSHIFT_REPOSITORY)-tools" tag $(DOCKER_NAME):test $(DOCKER_NAME):$(TAG_NAME)
-else
-TAG_NAME=dev
-cd: build update-env tag
-endif
-
-build: ## Build the docker container
-	docker build . -t $(DOCKER_NAME) \
-		--build-arg VCS_REF=$(shell git rev-parse --short HEAD) \
-		--build-arg BUILD_DATE=$(shell date -u +"%Y-%m-%dT%H:%M:%SZ") \
-
-build-nc: ## Build the docker container without caching
-	docker build --no-cache -t $(DOCKER_NAME) .
-
-REGISTRY_IMAGE=$(OPENSHIFT_DOCKER_REGISTRY)/$(OPENSHIFT_REPOSITORY)-tools/$(DOCKER_NAME)
-push: #build ## Push the docker container to the registry & tag latest
-	@echo "$(OPENSHIFT_SA_TOKEN)" | docker login $(OPENSHIFT_DOCKER_REGISTRY) -u $(OPENSHIFT_SA_NAME) --password-stdin ;\
-    docker tag $(DOCKER_NAME) $(REGISTRY_IMAGE):latest ;\
-    docker push $(REGISTRY_IMAGE):latest
-
-VAULTS=`cat devops/vaults.json`
-update-env: ## Update env from 1pass
-	oc -n "$(OPS_REPOSITORY)-$(TAG_NAME)" exec "dc/vault-service-$(TAG_NAME)" -- ./scripts/1pass.sh \
-		-m "secret" \
-		-e "$(TAG_NAME)" \
-		-a "$(DOCKER_NAME)-$(TAG_NAME)" \
-		-n "$(OPENSHIFT_REPOSITORY)-$(TAG_NAME)" \
-		-v "$(VAULTS)" \
-		-r "true" \
-		-f "false"
-
-tag: push ## tag image
-	oc -n "$(OPENSHIFT_REPOSITORY)-tools" tag $(DOCKER_NAME):latest $(DOCKER_NAME):$(TAG_NAME)
-
 #################################################################################
 # COMMANDS - Local                                                              #
 #################################################################################
 run: ## Run the project in local
-	. venv/bin/activate && python -m flask run -p 8080
+	. .venv/bin/activate && python -m flask run -p 8080
 
 #################################################################################
 # Self Documenting Commands                                                     #
@@ -139,4 +75,4 @@ run: ## Run the project in local
 .DEFAULT_GOAL := help
 
 help:
-	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
+	@grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | sort | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}'
\ No newline at end of file
diff --git a/solr-feeder/docs/readme.md b/solr-feeder/README.md
similarity index 100%
rename from solr-feeder/docs/readme.md
rename to solr-feeder/README.md
diff --git a/solr-feeder/devops/gcp/clouddeploy.yaml b/solr-feeder/devops/gcp/clouddeploy.yaml
new file mode 100644
index 000000000..29962a217
--- /dev/null
+++ b/solr-feeder/devops/gcp/clouddeploy.yaml
@@ -0,0 +1,60 @@
+# Copyright 2022 Google LLC
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#      http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+apiVersion: deploy.cloud.google.com/v1
+kind: DeliveryPipeline
+metadata:
+ name: solr-feeder-pipeline
+description: Deployment pipeline
+serialPipeline:
+ stages:
+ - targetId: a083gt-dev
+   profiles: [dev]
+   strategy:
+    standard:
+      verify: false
+   deployParameters:
+   - values:
+      deploy-env: "development"
+      deploy-project-id: "a083gt-dev"
+      service-name: "namex-solr-feeder-dev"
+      container-name: "namex-solr-feeder-dev"
+      service-account: "sa-api@a083gt-dev.iam.gserviceaccount.com"
+      cloudsql-instances: ""
+ - targetId: a083gt-test
+   profiles: [test]
+   strategy:
+    standard:
+      verify: false
+   deployParameters:
+   - values:
+      deploy-env: "test"
+      deploy-project-id: "a083gt-test"
+      service-name: "namex-solr-feeder-test"
+      container-name: "namex-solr-feeder-test"
+      service-account: "sa-api@a083gt-test.iam.gserviceaccount.com"
+      cloudsql-instances: ""
+ - targetId: a083gt-prod
+   profiles: [prod]
+   strategy:
+    standard:
+      verify: false
+   deployParameters:
+   - values:
+      deploy-env: "production"
+      deploy-project-id: "a083gt-prod"
+      service-name: "namex-solr-feeder-prod"
+      container-name: "namex-solr-feeder-prod"
+      service-account: "sa-api@a083gt-prod.iam.gserviceaccount.com"
+      cloudsql-instances: ""
\ No newline at end of file
diff --git a/solr-feeder/devops/vaults.gcp.env b/solr-feeder/devops/vaults.gcp.env
new file mode 100644
index 000000000..b68e6f7eb
--- /dev/null
+++ b/solr-feeder/devops/vaults.gcp.env
@@ -0,0 +1,16 @@
+POD_NAMESPACE=="op://namex/$APP_ENV/shared/POD_NAMESPACE"
+SOLR_FEEDER_FLASK_SECRET_KEY="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_FLASK_SECRET_KEY"
+SOLR_FEEDER_BOR_API_TIMEOUT="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_BOR_API_TIMEOUT"
+SOLR_FEEDER_SOLR_INSTANCE="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_SOLR_INSTANCE"
+KEYCLOAK_AUTH_TOKEN_URL="op://keycloak/$APP_ENV/base/KEYCLOAK_AUTH_TOKEN_URL"
+NDS_SERVICE_ACCOUNT_CLIENT_ID="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_CLIENT_ID"
+NDS_SERVICE_ACCOUNT_SECRET="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_SECRET"
+COLIN_API_URL="op://API/$APP_ENV/colin-api-entity/COLIN_API_URL"
+COLIN_API_VERSION="op://API/$APP_ENV/colin-api-entity/COLIN_API_VERSION"
+REGISTRIES_SEARCH_API_INTERNAL_URL="op://API/$APP_ENV/registries-search-api-internal/REGISTRIES_SEARCH_API_INTERNAL_URL"
+REGISTRIES_SEARCH_API_VERSION="op://API/$APP_ENV/registries-search-api/REGISTRIES_SEARCH_API_VERSION"
+BOR_API_INTERNAL_URL="op://API/$APP_ENV/bor-api-internal/BOR_API_INTERNAL_URL"
+BOR_API_VERSION="op://API/$APP_ENV/bor-api/BOR_API_VERSION"
+SENTRY_DSN="op://sentry/$APP_ENV/solr-feeder/SENTRY_DSN"
+SENTRY_TSR="op://sentry/$APP_ENV/solr-feeder/SENTRY_TSR"
+VPC_CONNECTOR="op://CD/$APP_ENV/namex-solr-synoms-api/VPC_CONNECTOR"
\ No newline at end of file
diff --git a/solr-feeder/devops/vaults.json b/solr-feeder/devops/vaults.json
deleted file mode 100644
index 6b6852391..000000000
--- a/solr-feeder/devops/vaults.json
+++ /dev/null
@@ -1,32 +0,0 @@
-[
-    {
-        "vault": "namex",
-        "application": [
-            "shared",
-            "solr-feeder"
-        ]
-    },
-    {
-        "vault": "keycloak",
-        "application": [
-            "base",
-            "bor-service-account"
-        ]
-    },
-    {
-        "vault": "API",
-        "application": [
-            "colin-api-entity",
-            "registries-search-api",
-            "registries-search-api-internal",
-            "bor-api",
-            "bor-api-internal"
-        ]
-    },
-    {
-        "vault": "sentry",
-        "application": [
-            "solr-feeder"
-        ]
-    }
-]
diff --git a/solr-feeder/docs/img/solr-feeder-cprd.png b/solr-feeder/img/solr-feeder-cprd.png
similarity index 100%
rename from solr-feeder/docs/img/solr-feeder-cprd.png
rename to solr-feeder/img/solr-feeder-cprd.png
diff --git a/solr-feeder/docs/img/solr-feeder-namesp.png b/solr-feeder/img/solr-feeder-namesp.png
similarity index 100%
rename from solr-feeder/docs/img/solr-feeder-namesp.png
rename to solr-feeder/img/solr-feeder-namesp.png
diff --git a/solr-feeder/docs/img/solr-feeder.vsd b/solr-feeder/img/solr-feeder.vsd
similarity index 100%
rename from solr-feeder/docs/img/solr-feeder.vsd
rename to solr-feeder/img/solr-feeder.vsd
diff --git a/solr-feeder/openshift/Readme.md b/solr-feeder/openshift/Readme.md
deleted file mode 100644
index da52f535c..000000000
--- a/solr-feeder/openshift/Readme.md
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# buildconfig
-oc process -f openshift/templates/bc.yaml -o yaml | oc apply -f - -n f2b77c-tools
-# deploymentconfig, service and route
-oc process -f openshift/templates/dc.yaml -o yaml | oc apply -f - -n f2b77c-dev
-oc process -f openshift/templates/dc.yaml -p TAG=test -p APPLICATION_DOMAIN=namex-solr-test.apps.silver.devops.gov.bc.ca -o yaml | oc apply -f - -n f2b77c-test
-oc process -f openshift/templates/dc.yaml -p TAG=prod -p APPLICATION_DOMAIN=namex-solr.apps.silver.devops.gov.bc.ca -o yaml | oc apply -f - -n f2b77c-prod
-
diff --git a/solr-feeder/openshift/templates/bc.yaml b/solr-feeder/openshift/templates/bc.yaml
deleted file mode 100644
index a22aee5ac..000000000
--- a/solr-feeder/openshift/templates/bc.yaml
+++ /dev/null
@@ -1,125 +0,0 @@
-apiVersion: template.openshift.io/v1
-kind: Template
-metadata:
-  labels:
-    name: ${NAME}
-  name: ${NAME}-build
-objects:
-- apiVersion: v1
-  kind: ImageStream
-  metadata:
-    name: ${NAME}
-    labels:
-      name: ${NAME}
-- apiVersion: v1
-  kind: BuildConfig
-  metadata:
-    name: ${NAME}
-    labels:
-      name: ${NAME}
-  spec:
-    output:
-      to:
-        kind: ImageStreamTag
-        name: ${NAME}:${OUTPUT_IMAGE_TAG}
-    resources:
-      limits:
-        cpu: ${CPU_LIMIT}
-        memory: ${MEMORY_LIMIT}
-      requests:
-        cpu: ${CPU_REQUEST}
-        memory: ${MEMORY_REQUEST}
-    runPolicy: Serial
-    source:
-      contextDir: ${SOURCE_CONTEXT_DIR}
-      git:
-        ref: ${GIT_REF}
-        uri: ${GIT_REPO_URL}
-      dockerfile: |
-        FROM docker-remote.artifacts.developer.gov.bc.ca/python:3.8.6-buster
-
-        ARG BUILD_DATE
-        ARG VCS_REF
-
-        LABEL build_date=$BUILD_DATE
-        LABEL vcs_ref=$VCS_REF
-
-        USER root
-
-        # Create working directory
-        RUN mkdir /opt/app-root && chmod 755 /opt/app-root
-        WORKDIR /opt/app-root
-
-        # Install the requirements
-        COPY ./requirements.txt .
-
-        RUN pip install --upgrade pip
-        RUN pip install --no-cache-dir -r requirements.txt
-
-        COPY . .
-
-        USER 1001
-
-        # Set Python path
-        ENV PYTHONPATH=/opt/app-root
-
-        CMD ["gunicorn", "--bind", "0.0.0.0:8080", "wsgi:application"]
-      type: Git
-    strategy:
-      type: Docker
-      dockerStrategy:
-        pullSecret:
-          name: artifactory-creds
-
-    triggers:
-    - type: ConfigChange
-parameters:
-- description: |
-    The name assigned to all of the objects defined in this template.
-    You should keep this as default unless your know what your doing.
-  displayName: Name
-  name: NAME
-  required: true
-  value: solr-feeder
-- description: |
-    The URL to your GIT repo, don't use the this default unless
-    your just experimenting.
-  displayName: Git Repo URL
-  name: GIT_REPO_URL
-  required: true
-  value: https://github.com/bcgov/namex.git
-- description: The git reference or branch.
-  displayName: Git Reference
-  name: GIT_REF
-  required: true
-  value: master
-- description: The source context directory.
-  displayName: Source Context Directory
-  name: SOURCE_CONTEXT_DIR
-  required: false
-  value: solr-feeder
-- description: The tag given to the built image.
-  displayName: Output Image Tag
-  name: OUTPUT_IMAGE_TAG
-  required: true
-  value: latest
-- description: The resources CPU limit (in cores) for this build.
-  displayName: Resources CPU Limit
-  name: CPU_LIMIT
-  required: true
-  value: "2"
-- description: The resources Memory limit (in Mi, Gi, etc) for this build.
-  displayName: Resources Memory Limit
-  name: MEMORY_LIMIT
-  required: true
-  value: 2Gi
-- description: The resources CPU request (in cores) for this build.
-  displayName: Resources CPU Request
-  name: CPU_REQUEST
-  required: true
-  value: "1"
-- description: The resources Memory request (in Mi, Gi, etc) for this build.
-  displayName: Resources Memory Request
-  name: MEMORY_REQUEST
-  required: true
-  value: 2Gi
diff --git a/solr-feeder/openshift/templates/dc.yaml b/solr-feeder/openshift/templates/dc.yaml
deleted file mode 100644
index ea44840c2..000000000
--- a/solr-feeder/openshift/templates/dc.yaml
+++ /dev/null
@@ -1,212 +0,0 @@
----
-kind: Template
-apiVersion: v1
-metadata:
-  name: ${NAME}-${TAG}-deployment-template
-  annotations:
-    description: Deployment template for an API application and connect to database.
-    tags: Flask
-    iconClass: icon-python
-objects:
-  - kind: Service
-    apiVersion: v1
-    metadata:
-      name: ${NAME}-${TAG}
-      labels:
-        name: ${NAME}
-        environment: ${TAG}
-        role: ${ROLE}
-    spec:
-      ports:
-        - name: ${NAME}-${TAG}-tcp
-          port: 8080
-          targetPort: 8080
-      selector:
-        name: ${NAME}
-        environment: ${TAG}
-
-  - kind: Route
-    apiVersion: v1
-    metadata:
-      name: ${NAME}-${TAG}
-      labels:
-        name: ${NAME}
-        environment: ${TAG}
-        role: ${ROLE}
-      annotations:
-        haproxy.router.openshift.io/ip_whitelist: ${ALLOW_LIST}
-    spec:
-      host: ${APPLICATION_DOMAIN}
-      path: ${APPLICATION_DOMAIN_PATH}
-      tls:
-        insecureEdgeTerminationPolicy: Redirect
-        termination: edge
-      port:
-        targetPort: ${NAME}-${TAG}-tcp
-      to:
-        kind: Service
-        name: ${NAME}-${TAG}
-        weight: 100
-
-  - kind: DeploymentConfig
-    apiVersion: v1
-    metadata:
-      name: ${NAME}-${TAG}
-      labels:
-        name: ${NAME}
-        environment: ${TAG}
-        role: ${ROLE}
-      annotations:
-        description: Defines how to deploy the application server
-    spec:
-      strategy:
-        rollingParams:
-          intervalSeconds: 1
-          maxSurge: 25%
-          maxUnavailable: 25%
-          timeoutSeconds: 600
-          updatePeriodSeconds: 1
-        type: Rolling
-      triggers:
-        - type: ImageChange
-          imageChangeParams:
-            automatic: true
-            containerNames:
-              - ${NAME}-${TAG}
-            from:
-              kind: ImageStreamTag
-              namespace: ${NAMESPACE}-${IMAGE_NAMESPACE}
-              name: ${NAME}:${TAG}
-      replicas: 1
-      selector:
-        name: ${NAME}
-        environment: ${TAG}
-      template:
-        metadata:
-          name: ${NAME}-${TAG}
-          labels:
-            name: ${NAME}
-            environment: ${TAG}
-            role: ${ROLE}
-        spec:
-          containers:
-            - name: ${NAME}-${TAG}
-              image: ${IMAGE_REGISTRY}/${NAMESPACE}-${IMAGE_NAMESPACE}/${NAME}:${TAG}
-              ports:
-                - containerPort: 8080
-                  protocol: TCP
-              readinessProbe:
-                initialDelaySeconds: 3
-                timeoutSeconds: 30
-                httpGet:
-                  path: /api/v1/probes/readiness
-                  port: 8080
-              livenessProbe:
-                initialDelaySeconds: 120
-                timeoutSeconds: 30
-                httpGet:
-                  path: /api/v1/probes/liveness
-                  port: 8080
-  - kind: HorizontalPodAutoscaler
-    apiVersion: autoscaling/v1
-    metadata:
-      name: ${NAME}-${TAG}
-      labels:
-        name: "${NAME}"
-        environment: "${TAG}"
-        role: ${ROLE}
-    spec:
-      scaleTargetRef:
-        kind: DeploymentConfig
-        name: ${NAME}-${TAG}
-      minReplicas: ${{MIN_REPLICAS}}
-      maxReplicas: ${{MAX_REPLICAS}}
-
-parameters:
-  - name: NAME
-    displayName: Name
-    description: The name assigned to all of the OpenShift resources associated to the server instance.
-    required: true
-    value: solr-feeder
-
-  - name: TAG
-    displayName: Environment TAG name
-    description: The TAG name for this environment, e.g., dev, test, prod
-    value: dev
-    required: true
-
-  - name: ROLE
-    displayName: Role
-    description: Role
-    required: true
-    value: api
-
-  - name: NAMESPACE
-    displayName: Namespace Name
-    description: The base namespace name for the project.
-    required: true
-    value: f2b77c
-
-  - name: IMAGE_NAMESPACE
-    displayName: Image Namespace
-    required: true
-    description: The namespace of the OpenShift project containing the imagestream for the application.
-    value: tools
-
-  - name: IMAGE_REGISTRY
-    displayName: Image Registry
-    required: true
-    description: The image registry of the OpenShift project.
-    value: image-registry.openshift-image-registry.svc:5000
-
-  - name: APPLICATION_DOMAIN
-    displayName: Application Domain
-    description: The endpoint used for routing access to the application.
-    value: namex-solr-dev.apps.silver.devops.gov.bc.ca
-
-  - name: APPLICATION_DOMAIN_PATH
-    displayName: Application Domain Path
-    description: The endpoint used for routing access to the application.
-    value: /api/v1/feeds
-
-
-  - name: ALLOW_LIST
-    displayName: Allow List
-    description: The allow list containing all of the trusted source IPs.
-    required: false
-
-  - name: MIN_REPLICAS
-    displayName: Minimum Replicas
-    description: The minimum number of pods to have running.
-    required: true
-    value: "1"
-
-  - name: MAX_REPLICAS
-    displayName: Maximum Replicas
-    description: The maximum number of pods to have running.
-    required: true
-    value: "1"
-
-  - name: CPU_REQUEST
-    displayName: Resources CPU Request
-    description: The resources CPU request (in cores) for this build.
-    required: true
-    value: 10m
-
-  - name: CPU_LIMIT
-    displayName: Resources CPU Limit
-    description: The resources CPU limit (in cores) for this build.
-    required: true
-    value: 500m
-
-  - name: MEMORY_REQUEST
-    displayName: Resources Memory Request
-    description: The resources Memory request (in Mi, Gi, etc) for this build.
-    required: true
-    value: 10Mi
-
-  - name: MEMORY_LIMIT
-    displayName: Resources Memory Limit
-    description: The resources Memory limit (in Mi, Gi, etc) for this build.
-    required: true
-    value: 1Gi
diff --git a/solr-feeder/poetry.lock b/solr-feeder/poetry.lock
new file mode 100644
index 000000000..6a518c92d
--- /dev/null
+++ b/solr-feeder/poetry.lock
@@ -0,0 +1,461 @@
+# This file is automatically @generated by Poetry and should not be changed by hand.
+
+[[package]]
+name = "blinker"
+version = "1.9.0"
+description = "Fast, simple object-to-object and broadcast signaling"
+category = "main"
+optional = false
+python-versions = ">=3.9"
+files = [
+    {file = "blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc"},
+    {file = "blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf"},
+]
+
+[[package]]
+name = "certifi"
+version = "2024.12.14"
+description = "Python package for providing Mozilla's CA Bundle."
+category = "main"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "certifi-2024.12.14-py3-none-any.whl", hash = "sha256:1275f7a45be9464efc1173084eaa30f866fe2e47d389406136d332ed4967ec56"},
+    {file = "certifi-2024.12.14.tar.gz", hash = "sha256:b650d30f370c2b724812bee08008be0c4163b163ddaec3f2546c1caf65f191db"},
+]
+
+[[package]]
+name = "charset-normalizer"
+version = "3.4.1"
+description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "charset_normalizer-3.4.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:91b36a978b5ae0ee86c394f5a54d6ef44db1de0815eb43de826d41d21e4af3de"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7461baadb4dc00fd9e0acbe254e3d7d2112e7f92ced2adc96e54ef6501c5f176"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e218488cd232553829be0664c2292d3af2eeeb94b32bea483cf79ac6a694e037"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:80ed5e856eb7f30115aaf94e4a08114ccc8813e6ed1b5efa74f9f82e8509858f"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b010a7a4fd316c3c484d482922d13044979e78d1861f0e0650423144c616a46a"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4532bff1b8421fd0a320463030c7520f56a79c9024a4e88f01c537316019005a"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d973f03c0cb71c5ed99037b870f2be986c3c05e63622c017ea9816881d2dd247"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a3bd0dcd373514dcec91c411ddb9632c0d7d92aed7093b8c3bbb6d69ca74408"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d9c3cdf5390dcd29aa8056d13e8e99526cda0305acc038b96b30352aff5ff2bb"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:2bdfe3ac2e1bbe5b59a1a63721eb3b95fc9b6817ae4a46debbb4e11f6232428d"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:eab677309cdb30d047996b36d34caeda1dc91149e4fdca0b1a039b3f79d9a807"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-win32.whl", hash = "sha256:c0429126cf75e16c4f0ad00ee0eae4242dc652290f940152ca8c75c3a4b6ee8f"},
+    {file = "charset_normalizer-3.4.1-cp310-cp310-win_amd64.whl", hash = "sha256:9f0b8b1c6d84c8034a44893aba5e767bf9c7a211e313a9605d9c617d7083829f"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8bfa33f4f2672964266e940dd22a195989ba31669bd84629f05fab3ef4e2d125"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:28bf57629c75e810b6ae989f03c0828d64d6b26a5e205535585f96093e405ed1"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f08ff5e948271dc7e18a35641d2f11a4cd8dfd5634f55228b691e62b37125eb3"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:234ac59ea147c59ee4da87a0c0f098e9c8d169f4dc2a159ef720f1a61bbe27cd"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd4ec41f914fa74ad1b8304bbc634b3de73d2a0889bd32076342a573e0779e00"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eea6ee1db730b3483adf394ea72f808b6e18cf3cb6454b4d86e04fa8c4327a12"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c96836c97b1238e9c9e3fe90844c947d5afbf4f4c92762679acfe19927d81d77"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4d86f7aff21ee58f26dcf5ae81a9addbd914115cdebcbb2217e4f0ed8982e146"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:09b5e6733cbd160dcc09589227187e242a30a49ca5cefa5a7edd3f9d19ed53fd"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:5777ee0881f9499ed0f71cc82cf873d9a0ca8af166dfa0af8ec4e675b7df48e6"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:237bdbe6159cff53b4f24f397d43c6336c6b0b42affbe857970cefbb620911c8"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-win32.whl", hash = "sha256:8417cb1f36cc0bc7eaba8ccb0e04d55f0ee52df06df3ad55259b9a323555fc8b"},
+    {file = "charset_normalizer-3.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:d7f50a1f8c450f3925cb367d011448c39239bb3eb4117c36a6d354794de4ce76"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:73d94b58ec7fecbc7366247d3b0b10a21681004153238750bb67bd9012414545"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dad3e487649f498dd991eeb901125411559b22e8d7ab25d3aeb1af367df5efd7"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c30197aa96e8eed02200a83fba2657b4c3acd0f0aa4bdc9f6c1af8e8962e0757"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2369eea1ee4a7610a860d88f268eb39b95cb588acd7235e02fd5a5601773d4fa"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc2722592d8998c870fa4e290c2eec2c1569b87fe58618e67d38b4665dfa680d"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffc9202a29ab3920fa812879e95a9e78b2465fd10be7fcbd042899695d75e616"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:804a4d582ba6e5b747c625bf1255e6b1507465494a40a2130978bda7b932c90b"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:0f55e69f030f7163dffe9fd0752b32f070566451afe180f99dbeeb81f511ad8d"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:c4c3e6da02df6fa1410a7680bd3f63d4f710232d3139089536310d027950696a"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:5df196eb874dae23dcfb968c83d4f8fdccb333330fe1fc278ac5ceeb101003a9"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e358e64305fe12299a08e08978f51fc21fac060dcfcddd95453eabe5b93ed0e1"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-win32.whl", hash = "sha256:9b23ca7ef998bc739bf6ffc077c2116917eabcc901f88da1b9856b210ef63f35"},
+    {file = "charset_normalizer-3.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:6ff8a4a60c227ad87030d76e99cd1698345d4491638dfa6673027c48b3cd395f"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:aabfa34badd18f1da5ec1bc2715cadc8dca465868a4e73a0173466b688f29dda"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22e14b5d70560b8dd51ec22863f370d1e595ac3d024cb8ad7d308b4cd95f8313"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8436c508b408b82d87dc5f62496973a1805cd46727c34440b0d29d8a2f50a6c9"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d074908e1aecee37a7635990b2c6d504cd4766c7bc9fc86d63f9c09af3fa11b"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:955f8851919303c92343d2f66165294848d57e9bba6cf6e3625485a70a038d11"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:44ecbf16649486d4aebafeaa7ec4c9fed8b88101f4dd612dcaf65d5e815f837f"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:0924e81d3d5e70f8126529951dac65c1010cdf117bb75eb02dd12339b57749dd"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2967f74ad52c3b98de4c3b32e1a44e32975e008a9cd2a8cc8966d6a5218c5cb2"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:c75cb2a3e389853835e84a2d8fb2b81a10645b503eca9bcb98df6b5a43eb8886"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:09b26ae6b1abf0d27570633b2b078a2a20419c99d66fb2823173d73f188ce601"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:fa88b843d6e211393a37219e6a1c1df99d35e8fd90446f1118f4216e307e48cd"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-win32.whl", hash = "sha256:eb8178fe3dba6450a3e024e95ac49ed3400e506fd4e9e5c32d30adda88cbd407"},
+    {file = "charset_normalizer-3.4.1-cp313-cp313-win_amd64.whl", hash = "sha256:b1ac5992a838106edb89654e0aebfc24f5848ae2547d22c2c3f66454daa11971"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f30bf9fd9be89ecb2360c7d94a711f00c09b976258846efe40db3d05828e8089"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:97f68b8d6831127e4787ad15e6757232e14e12060bec17091b85eb1486b91d8d"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7974a0b5ecd505609e3b19742b60cee7aa2aa2fb3151bc917e6e2646d7667dcf"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc54db6c8593ef7d4b2a331b58653356cf04f67c960f584edb7c3d8c97e8f39e"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:311f30128d7d333eebd7896965bfcfbd0065f1716ec92bd5638d7748eb6f936a"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:7d053096f67cd1241601111b698f5cad775f97ab25d81567d3f59219b5f1adbd"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:807f52c1f798eef6cf26beb819eeb8819b1622ddfeef9d0977a8502d4db6d534"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:dccbe65bd2f7f7ec22c4ff99ed56faa1e9f785482b9bbd7c717e26fd723a1d1e"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:2fb9bd477fdea8684f78791a6de97a953c51831ee2981f8e4f583ff3b9d9687e"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:01732659ba9b5b873fc117534143e4feefecf3b2078b0a6a2e925271bb6f4cfa"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-win32.whl", hash = "sha256:7a4f97a081603d2050bfaffdefa5b02a9ec823f8348a572e39032caa8404a487"},
+    {file = "charset_normalizer-3.4.1-cp37-cp37m-win_amd64.whl", hash = "sha256:7b1bef6280950ee6c177b326508f86cad7ad4dff12454483b51d8b7d673a2c5d"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ecddf25bee22fe4fe3737a399d0d177d72bc22be6913acfab364b40bce1ba83c"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c60ca7339acd497a55b0ea5d506b2a2612afb2826560416f6894e8b5770d4a9"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7b2d86dd06bfc2ade3312a83a5c364c7ec2e3498f8734282c6c3d4b07b346b8"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dd78cfcda14a1ef52584dbb008f7ac81c1328c0f58184bf9a84c49c605002da6"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6e27f48bcd0957c6d4cb9d6fa6b61d192d0b13d5ef563e5f2ae35feafc0d179c"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:01ad647cdd609225c5350561d084b42ddf732f4eeefe6e678765636791e78b9a"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:619a609aa74ae43d90ed2e89bdd784765de0a25ca761b93e196d938b8fd1dbbd"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:89149166622f4db9b4b6a449256291dc87a99ee53151c74cbd82a53c8c2f6ccd"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:7709f51f5f7c853f0fb938bcd3bc59cdfdc5203635ffd18bf354f6967ea0f824"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:345b0426edd4e18138d6528aed636de7a9ed169b4aaf9d61a8c19e39d26838ca"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0907f11d019260cdc3f94fbdb23ff9125f6b5d1039b76003b5b0ac9d6a6c9d5b"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-win32.whl", hash = "sha256:ea0d8d539afa5eb2728aa1932a988a9a7af94f18582ffae4bc10b3fbdad0626e"},
+    {file = "charset_normalizer-3.4.1-cp38-cp38-win_amd64.whl", hash = "sha256:329ce159e82018d646c7ac45b01a430369d526569ec08516081727a20e9e4af4"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:b97e690a2118911e39b4042088092771b4ae3fc3aa86518f84b8cf6888dbdb41"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78baa6d91634dfb69ec52a463534bc0df05dbd546209b79a3880a34487f4b84f"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a2bc9f351a75ef49d664206d51f8e5ede9da246602dc2d2726837620ea034b2"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75832c08354f595c760a804588b9357d34ec00ba1c940c15e31e96d902093770"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0af291f4fe114be0280cdd29d533696a77b5b49cfde5467176ecab32353395c4"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0167ddc8ab6508fe81860a57dd472b2ef4060e8d378f0cc555707126830f2537"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:2a75d49014d118e4198bcee5ee0a6f25856b29b12dbf7cd012791f8a6cc5c496"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:363e2f92b0f0174b2f8238240a1a30142e3db7b957a5dd5689b0e75fb717cc78"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:ab36c8eb7e454e34e60eb55ca5d241a5d18b2c6244f6827a30e451c42410b5f7"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:4c0907b1928a36d5a998d72d64d8eaa7244989f7aaaf947500d3a800c83a3fd6"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:04432ad9479fa40ec0f387795ddad4437a2b50417c69fa275e212933519ff294"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-win32.whl", hash = "sha256:3bed14e9c89dcb10e8f3a29f9ccac4955aebe93c71ae803af79265c9ca5644c5"},
+    {file = "charset_normalizer-3.4.1-cp39-cp39-win_amd64.whl", hash = "sha256:49402233c892a461407c512a19435d1ce275543138294f7ef013f0b63d5d3765"},
+    {file = "charset_normalizer-3.4.1-py3-none-any.whl", hash = "sha256:d98b1668f06378c6dbefec3b92299716b931cd4e6061f3c875a71ced1780ab85"},
+    {file = "charset_normalizer-3.4.1.tar.gz", hash = "sha256:44251f18cd68a75b56585dd00dae26183e102cd5e0f9f1466e6df5da2ed64ea3"},
+]
+
+[[package]]
+name = "click"
+version = "8.1.8"
+description = "Composable command line interface toolkit"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "click-8.1.8-py3-none-any.whl", hash = "sha256:63c132bbbed01578a06712a2d1f497bb62d9c1c0d329b7903a866228027263b2"},
+    {file = "click-8.1.8.tar.gz", hash = "sha256:ed53c9d8990d83c2a27deae68e4ee337473f6330c040a31d4225c9574d16096a"},
+]
+
+[package.dependencies]
+colorama = {version = "*", markers = "platform_system == \"Windows\""}
+
+[[package]]
+name = "colorama"
+version = "0.4.6"
+description = "Cross-platform colored terminal text."
+category = "main"
+optional = false
+python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7"
+files = [
+    {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"},
+    {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"},
+]
+
+[[package]]
+name = "flask"
+version = "3.1.0"
+description = "A simple framework for building complex web applications."
+category = "main"
+optional = false
+python-versions = ">=3.9"
+files = [
+    {file = "flask-3.1.0-py3-none-any.whl", hash = "sha256:d667207822eb83f1c4b50949b1623c8fc8d51f2341d65f72e1a1815397551136"},
+    {file = "flask-3.1.0.tar.gz", hash = "sha256:5f873c5184c897c8d9d1b05df1e3d01b14910ce69607a117bd3277098a5836ac"},
+]
+
+[package.dependencies]
+blinker = ">=1.9"
+click = ">=8.1.3"
+itsdangerous = ">=2.2"
+Jinja2 = ">=3.1.2"
+Werkzeug = ">=3.1"
+
+[package.extras]
+async = ["asgiref (>=3.2)"]
+dotenv = ["python-dotenv"]
+
+[[package]]
+name = "gunicorn"
+version = "23.0.0"
+description = "WSGI HTTP Server for UNIX"
+category = "main"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "gunicorn-23.0.0-py3-none-any.whl", hash = "sha256:ec400d38950de4dfd418cff8328b2c8faed0edb0d517d3394e457c317908ca4d"},
+    {file = "gunicorn-23.0.0.tar.gz", hash = "sha256:f014447a0101dc57e294f6c18ca6b40227a4c90e9bdb586042628030cba004ec"},
+]
+
+[package.dependencies]
+packaging = "*"
+
+[package.extras]
+eventlet = ["eventlet (>=0.24.1,!=0.36.0)"]
+gevent = ["gevent (>=1.4.0)"]
+setproctitle = ["setproctitle"]
+testing = ["coverage", "eventlet", "gevent", "pytest", "pytest-cov"]
+tornado = ["tornado (>=0.2)"]
+
+[[package]]
+name = "idna"
+version = "3.10"
+description = "Internationalized Domain Names in Applications (IDNA)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"},
+    {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"},
+]
+
+[package.extras]
+all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2)"]
+
+[[package]]
+name = "itsdangerous"
+version = "2.2.0"
+description = "Safely pass data to untrusted environments and back."
+category = "main"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef"},
+    {file = "itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173"},
+]
+
+[[package]]
+name = "jinja2"
+version = "3.1.5"
+description = "A very fast and expressive template engine."
+category = "main"
+optional = false
+python-versions = ">=3.7"
+files = [
+    {file = "jinja2-3.1.5-py3-none-any.whl", hash = "sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb"},
+    {file = "jinja2-3.1.5.tar.gz", hash = "sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb"},
+]
+
+[package.dependencies]
+MarkupSafe = ">=2.0"
+
+[package.extras]
+i18n = ["Babel (>=2.7)"]
+
+[[package]]
+name = "markupsafe"
+version = "3.0.2"
+description = "Safely add untrusted strings to HTML/XML markup."
+category = "main"
+optional = false
+python-versions = ">=3.9"
+files = [
+    {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"},
+    {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"},
+    {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"},
+    {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"},
+    {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"},
+    {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"},
+    {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"},
+]
+
+[[package]]
+name = "packaging"
+version = "24.2"
+description = "Core utilities for Python packages"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "packaging-24.2-py3-none-any.whl", hash = "sha256:09abb1bccd265c01f4a3aa3f7a7db064b36514d2cba19a2f694fe6150451a759"},
+    {file = "packaging-24.2.tar.gz", hash = "sha256:c228a6dc5e932d346bc5739379109d49e8853dd8223571c7c5b55260edc0b97f"},
+]
+
+[[package]]
+name = "python-dotenv"
+version = "1.0.1"
+description = "Read key-value pairs from a .env file and set them as environment variables"
+category = "main"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "python-dotenv-1.0.1.tar.gz", hash = "sha256:e324ee90a023d808f1959c46bcbc04446a10ced277783dc6ee09987c37ec10ca"},
+    {file = "python_dotenv-1.0.1-py3-none-any.whl", hash = "sha256:f7b63ef50f1b690dddf550d03497b66d609393b40b564ed0d674909a68ebf16a"},
+]
+
+[package.extras]
+cli = ["click (>=5.0)"]
+
+[[package]]
+name = "requests"
+version = "2.32.3"
+description = "Python HTTP for Humans."
+category = "main"
+optional = false
+python-versions = ">=3.8"
+files = [
+    {file = "requests-2.32.3-py3-none-any.whl", hash = "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6"},
+    {file = "requests-2.32.3.tar.gz", hash = "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760"},
+]
+
+[package.dependencies]
+certifi = ">=2017.4.17"
+charset-normalizer = ">=2,<4"
+idna = ">=2.5,<4"
+urllib3 = ">=1.21.1,<3"
+
+[package.extras]
+socks = ["PySocks (>=1.5.6,!=1.5.7)"]
+use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"]
+
+[[package]]
+name = "sentry-sdk"
+version = "2.20.0"
+description = "Python client for Sentry (https://sentry.io)"
+category = "main"
+optional = false
+python-versions = ">=3.6"
+files = [
+    {file = "sentry_sdk-2.20.0-py2.py3-none-any.whl", hash = "sha256:c359a1edf950eb5e80cffd7d9111f3dbeef57994cb4415df37d39fda2cf22364"},
+    {file = "sentry_sdk-2.20.0.tar.gz", hash = "sha256:afa82713a92facf847df3c6f63cec71eb488d826a50965def3d7722aa6f0fdab"},
+]
+
+[package.dependencies]
+certifi = "*"
+urllib3 = ">=1.26.11"
+
+[package.extras]
+aiohttp = ["aiohttp (>=3.5)"]
+anthropic = ["anthropic (>=0.16)"]
+arq = ["arq (>=0.23)"]
+asyncpg = ["asyncpg (>=0.23)"]
+beam = ["apache-beam (>=2.12)"]
+bottle = ["bottle (>=0.12.13)"]
+celery = ["celery (>=3)"]
+celery-redbeat = ["celery-redbeat (>=2)"]
+chalice = ["chalice (>=1.16.0)"]
+clickhouse-driver = ["clickhouse-driver (>=0.2.0)"]
+django = ["django (>=1.8)"]
+falcon = ["falcon (>=1.4)"]
+fastapi = ["fastapi (>=0.79.0)"]
+flask = ["blinker (>=1.1)", "flask (>=0.11)", "markupsafe"]
+grpcio = ["grpcio (>=1.21.1)", "protobuf (>=3.8.0)"]
+http2 = ["httpcore[http2] (>=1.0.0,<2.0.0)"]
+httpx = ["httpx (>=0.16.0)"]
+huey = ["huey (>=2)"]
+huggingface-hub = ["huggingface_hub (>=0.22)"]
+langchain = ["langchain (>=0.0.210)"]
+launchdarkly = ["launchdarkly-server-sdk (>=9.8.0)"]
+litestar = ["litestar (>=2.0.0)"]
+loguru = ["loguru (>=0.5)"]
+openai = ["openai (>=1.0.0)", "tiktoken (>=0.3.0)"]
+openfeature = ["openfeature-sdk (>=0.7.1)"]
+opentelemetry = ["opentelemetry-distro (>=0.35b0)"]
+opentelemetry-experimental = ["opentelemetry-distro"]
+pure-eval = ["asttokens", "executing", "pure_eval"]
+pymongo = ["pymongo (>=3.1)"]
+pyspark = ["pyspark (>=2.4.4)"]
+quart = ["blinker (>=1.1)", "quart (>=0.16.1)"]
+rq = ["rq (>=0.6)"]
+sanic = ["sanic (>=0.8)"]
+sqlalchemy = ["sqlalchemy (>=1.2)"]
+starlette = ["starlette (>=0.19.1)"]
+starlite = ["starlite (>=1.48)"]
+tornado = ["tornado (>=6)"]
+unleash = ["UnleashClient (>=6.0.1)"]
+
+[[package]]
+name = "urllib3"
+version = "2.3.0"
+description = "HTTP library with thread-safe connection pooling, file post, and more."
+category = "main"
+optional = false
+python-versions = ">=3.9"
+files = [
+    {file = "urllib3-2.3.0-py3-none-any.whl", hash = "sha256:1cee9ad369867bfdbbb48b7dd50374c0967a0bb7710050facf0dd6911440e3df"},
+    {file = "urllib3-2.3.0.tar.gz", hash = "sha256:f8c5449b3cf0861679ce7e0503c7b44b5ec981bec0d1d3795a07f1ba96f0204d"},
+]
+
+[package.extras]
+brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"]
+h2 = ["h2 (>=4,<5)"]
+socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"]
+zstd = ["zstandard (>=0.18.0)"]
+
+[[package]]
+name = "werkzeug"
+version = "3.1.3"
+description = "The comprehensive WSGI web application library."
+category = "main"
+optional = false
+python-versions = ">=3.9"
+files = [
+    {file = "werkzeug-3.1.3-py3-none-any.whl", hash = "sha256:54b78bf3716d19a65be4fceccc0d1d7b89e608834989dfae50ea87564639213e"},
+    {file = "werkzeug-3.1.3.tar.gz", hash = "sha256:60723ce945c19328679790e3282cc758aa4a6040e4bb330f53d30fa546d44746"},
+]
+
+[package.dependencies]
+MarkupSafe = ">=2.1.1"
+
+[package.extras]
+watchdog = ["watchdog (>=2.3)"]
+
+[metadata]
+lock-version = "2.0"
+python-versions = "^3.12"
+content-hash = "bd107cbff59ddcc9d0481f309deb5d8755bdbb561ce8cfdb36bb4fa3dd19881e"
\ No newline at end of file
diff --git a/solr-feeder/pyproject.toml b/solr-feeder/pyproject.toml
new file mode 100644
index 000000000..5a646d71e
--- /dev/null
+++ b/solr-feeder/pyproject.toml
@@ -0,0 +1,30 @@
+[tool.poetry]
+name = "solr-feeder"
+version = "0.1.0"
+description = ""
+authors = ["Your Name <you@example.com>"]
+readme = "README.md"
+packages = [{include = "solr_feeder"}]
+
+[tool.poetry.dependencies]
+python = "^3.12"
+flask = "^3.1.0"
+jinja2 = "^3.1.5"
+markupsafe = "^3.0.2"
+werkzeug = "^3.1.3"
+blinker = "^1.9.0"
+certifi = "^2024.12.14"
+charset-normalizer = "^3.4.1"
+click = "^8.1.8"
+gunicorn = "^23.0.0"
+idna = "^3.10"
+itsdangerous = "^2.2.0"
+python-dotenv = "^1.0.1"
+requests = "^2.32.3"
+sentry-sdk = "^2.20.0"
+urllib3 = "^2.3.0"
+
+
+[build-system]
+requires = ["poetry-core"]
+build-backend = "poetry.core.masonry.api"
\ No newline at end of file
diff --git a/solr-feeder/requirements.txt b/solr-feeder/requirements.txt
deleted file mode 100644
index aabdb68ef..000000000
--- a/solr-feeder/requirements.txt
+++ /dev/null
@@ -1,15 +0,0 @@
-Flask==2.3.2
-Jinja2==3.1.2
-MarkupSafe==2.1.3
-Werkzeug==2.3.6
-blinker==1.6.2
-certifi==2023.5.7
-charset-normalizer==3.1.0
-click==8.1.3
-gunicorn==20.1.0
-idna==3.4
-itsdangerous==2.1.2
-python-dotenv==1.0.0
-requests==2.31.0
-sentry-sdk==1.26.0
-urllib3==2.0.3
diff --git a/solr-feeder/requirements/bcregistry-libraries.txt b/solr-feeder/requirements/bcregistry-libraries.txt
deleted file mode 100644
index e69de29bb..000000000
diff --git a/solr-feeder/requirements/dev.txt b/solr-feeder/requirements/dev.txt
deleted file mode 100644
index 57e68812a..000000000
--- a/solr-feeder/requirements/dev.txt
+++ /dev/null
@@ -1,13 +0,0 @@
-# Lint and code style
-autopep8
-flake8
-flake8-blind-except
-flake8-debugger
-flake8-docstrings
-flake8-isort<6
-flake8-quotes
-pep8-naming
-pydocstyle
-pylint
-pylint-flask
-isort<5
diff --git a/solr-feeder/requirements/prod.txt b/solr-feeder/requirements/prod.txt
deleted file mode 100644
index 8379f1b5a..000000000
--- a/solr-feeder/requirements/prod.txt
+++ /dev/null
@@ -1,6 +0,0 @@
-Flask
-Werkzeug
-gunicorn
-python-dotenv
-requests
-sentry-sdk[flask]
diff --git a/solr-feeder/setup.py b/solr-feeder/setup.py
deleted file mode 100644
index 1be5f5c66..000000000
--- a/solr-feeder/setup.py
+++ /dev/null
@@ -1,21 +0,0 @@
-# Copyright © 2019 Province of British Columbia.
-#
-# Licensed under the Apache License, Version 2.0 (the "License");
-# you may not use this file except in compliance with the License.
-# You may obtain a copy of the License at
-#
-#    http://www.apache.org/licenses/LICENSE-2.0
-#
-# Unless required by applicable law or agreed to in writing, software
-# distributed under the License is distributed on an "AS IS" BASIS,
-# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-# See the License for the specific language governing permissions and
-# limitations under the License.
-"""Installer and setup for this module."""
-
-from setuptools import find_packages, setup
-
-setup(
-    name='solr-feeder',
-    packages=find_packages()
-)
diff --git a/solr-feeder/solr_feeder/config.py b/solr-feeder/solr_feeder/config.py
index 2422ade83..da5ca5aea 100644
--- a/solr-feeder/solr_feeder/config.py
+++ b/solr-feeder/solr_feeder/config.py
@@ -33,8 +33,8 @@ class Config():  # pylint: disable=too-few-public-methods;
 
     POD_NAMESPACE = os.getenv('POD_NAMESPACE', 'unknown')
 
-    COLIN_API_URL = os.getenv('COLIN_SVC_URL', 'http://') + \
-        os.getenv('COLIN_SVC_VERSION', '/api/v1')
+    COLIN_API_URL = os.getenv('COLIN_API_URL', 'http://') + \
+        os.getenv('COLIN_API_VERSION', '/api/v1')
 
     SEARCH_API_URL = os.getenv('REGISTRIES_SEARCH_API_INTERNAL_URL', 'http://') \
         + os.getenv('REGISTRIES_SEARCH_API_VERSION', '/api/v1')


Reviews:
user: login: EPortman
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T17:18:02Z
user: login: EPortman
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T17:18:51Z
user: login: EPortman
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T17:19:25Z
user: login: EPortman
state: COMMENTED
author_association: CONTRIBUTOR
submitted_at: 2025-03-03T17:20:02Z
user: login: eve-git
state: APPROVED
author_association: COLLABORATOR
submitted_at: 2025-03-05T17:04:35Z

Review comments:
diff_hunk: @@ -0,0 +1,16 @@
+POD_NAMESPACE=="op://namex/$APP_ENV/shared/POD_NAMESPACE"
+SOLR_FEEDER_FLASK_SECRET_KEY="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_FLASK_SECRET_KEY"
+SOLR_FEEDER_BOR_API_TIMEOUT="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_BOR_API_TIMEOUT"
+SOLR_FEEDER_SOLR_INSTANCE="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_SOLR_INSTANCE"
path: solr-feeder/devops/vaults.gcp.env
user: login: EPortman
body: Points to Solr Instance in OCP
created_at: 2025-03-03T17:18:02Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,16 @@
+POD_NAMESPACE=="op://namex/$APP_ENV/shared/POD_NAMESPACE"
+SOLR_FEEDER_FLASK_SECRET_KEY="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_FLASK_SECRET_KEY"
+SOLR_FEEDER_BOR_API_TIMEOUT="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_BOR_API_TIMEOUT"
+SOLR_FEEDER_SOLR_INSTANCE="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_SOLR_INSTANCE"
+KEYCLOAK_AUTH_TOKEN_URL="op://keycloak/$APP_ENV/base/KEYCLOAK_AUTH_TOKEN_URL"
+NDS_SERVICE_ACCOUNT_CLIENT_ID="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_CLIENT_ID"
+NDS_SERVICE_ACCOUNT_SECRET="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_SECRET"
+COLIN_API_URL="op://API/$APP_ENV/colin-api-entity/COLIN_API_URL"
path: solr-feeder/devops/vaults.gcp.env
user: login: EPortman
body: Now using the external endpoint instead of the internal one since calling outside of OCP.
created_at: 2025-03-03T17:18:51Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,16 @@
+POD_NAMESPACE=="op://namex/$APP_ENV/shared/POD_NAMESPACE"
+SOLR_FEEDER_FLASK_SECRET_KEY="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_FLASK_SECRET_KEY"
+SOLR_FEEDER_BOR_API_TIMEOUT="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_BOR_API_TIMEOUT"
+SOLR_FEEDER_SOLR_INSTANCE="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_SOLR_INSTANCE"
+KEYCLOAK_AUTH_TOKEN_URL="op://keycloak/$APP_ENV/base/KEYCLOAK_AUTH_TOKEN_URL"
+NDS_SERVICE_ACCOUNT_CLIENT_ID="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_CLIENT_ID"
+NDS_SERVICE_ACCOUNT_SECRET="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_SECRET"
+COLIN_API_URL="op://API/$APP_ENV/colin-api-entity/COLIN_API_URL"
+COLIN_API_VERSION="op://API/$APP_ENV/colin-api-entity/COLIN_API_VERSION"
+REGISTRIES_SEARCH_API_INTERNAL_URL="op://API/$APP_ENV/registries-search-api-internal/REGISTRIES_SEARCH_API_INTERNAL_URL"
path: solr-feeder/devops/vaults.gcp.env
user: login: EPortman
body: This internal URL can still be called from GCP (same with BOR_API_INTERNAL_URL)
created_at: 2025-03-03T17:19:25Z
author_association: CONTRIBUTOR
diff_hunk: @@ -0,0 +1,16 @@
+POD_NAMESPACE=="op://namex/$APP_ENV/shared/POD_NAMESPACE"
+SOLR_FEEDER_FLASK_SECRET_KEY="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_FLASK_SECRET_KEY"
+SOLR_FEEDER_BOR_API_TIMEOUT="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_BOR_API_TIMEOUT"
+SOLR_FEEDER_SOLR_INSTANCE="op://namex/$APP_ENV/solr-feeder/SOLR_FEEDER_SOLR_INSTANCE"
+KEYCLOAK_AUTH_TOKEN_URL="op://keycloak/$APP_ENV/base/KEYCLOAK_AUTH_TOKEN_URL"
+NDS_SERVICE_ACCOUNT_CLIENT_ID="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_CLIENT_ID"
+NDS_SERVICE_ACCOUNT_SECRET="op://keycloak/$APP_ENV/bor-service-account/NDS_SERVICE_ACCOUNT_SECRET"
+COLIN_API_URL="op://API/$APP_ENV/colin-api-entity/COLIN_API_URL"
+COLIN_API_VERSION="op://API/$APP_ENV/colin-api-entity/COLIN_API_VERSION"
+REGISTRIES_SEARCH_API_INTERNAL_URL="op://API/$APP_ENV/registries-search-api-internal/REGISTRIES_SEARCH_API_INTERNAL_URL"
+REGISTRIES_SEARCH_API_VERSION="op://API/$APP_ENV/registries-search-api/REGISTRIES_SEARCH_API_VERSION"
+BOR_API_INTERNAL_URL="op://API/$APP_ENV/bor-api-internal/BOR_API_INTERNAL_URL"
+BOR_API_VERSION="op://API/$APP_ENV/bor-api/BOR_API_VERSION"
+SENTRY_DSN="op://sentry/$APP_ENV/solr-feeder/SENTRY_DSN"
+SENTRY_TSR="op://sentry/$APP_ENV/solr-feeder/SENTRY_TSR"
+VPC_CONNECTOR="op://CD/$APP_ENV/namex-solr-synoms-api/VPC_CONNECTOR"
path: solr-feeder/devops/vaults.gcp.env
user: login: EPortman
body: Allows for internal communication with Solr Names Updater in GCP.
created_at: 2025-03-03T17:20:01Z
author_association: CONTRIBUTOR

PR comments:
user: login: sonarqubecloud[bot]
created_at: 2025-03-05T16:16:17Z
body: ## [![Quality Gate Failed](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/checks/QualityGateBadge/qg-failed-20px.png 'Quality Gate Failed')](https://sonarcloud.io/dashboard?id=bcgov_namex&pullRequest=1720) **Quality Gate failed**  
Failed conditions  
![](https://sonarsource.github.io/sonarcloud-github-static-resources/v2/common/failed-16px.png '') [6 Security Hotspots](https://sonarcloud.io/project/security_hotspots?id=bcgov_namex&pullRequest=1720&issueStatuses=OPEN,CONFIRMED&sinceLeakPeriod=true)  
  
[See analysis details on SonarQube Cloud](https://sonarcloud.io/dashboard?id=bcgov_namex&pullRequest=1720)


author_association: NONE