diff --git a/README.md b/README.md index 317646b..832ae4a 100644 --- a/README.md +++ b/README.md @@ -152,75 +152,138 @@ Uses Google's Vertex AI multimodal embedding model for generating high-quality i ### Prerequisites - Python 3.8+ +- Docker - Google Cloud account with Firestore, Storage, Pub/Sub, Cloud Functions, Compute Engine, and Vision API enabled -- Terraform (for infrastructure deployment) +- Terraform (for infrastructure deployment): https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli +- gcloud CLI: https://cloud.google.com/sdk/docs/install -### Installation +### Deployment -1. Clone the repository: - ```bash - git clone {repo-url} - cd {repo-name} - ``` +#### 1. Clone the Repository -2. Create and activate a virtual environment: - ```bash - python -m venv venv - source venv/bin/activate # Linux/macOS - venv\Scripts\activate # Windows - ``` +```bash +git clone {repo-url} +cd {repo-name} +``` -3. Install dependencies: - ```bash - pip install -r requirements.txt - ``` +#### 2. Configure Google Cloud Project -4. Create a `.env` file with the following environment variables: - ``` - # Project Environment Variables - ENVIRONMENT=development - LOG_LEVEL=DEBUG +Set your Google Cloud project ID: - # CORS settings - Must be a valid JSON list of strings or comma-separated values - CORS_ORIGINS=["*"] +```bash +gcloud config set project PROJECT_ID +gcloud auth login +gcloud auth application-default login +gcloud auth configure-docker +``` - # Firestore settings - FIRESTORE_PROJECT_ID=gen-lang-client-0424120530 - FIRESTORE_DATABASE_NAME=contoso-imagedb - FIRESTORE_CREDENTIALS_FILE=firestore-credentials.json - - # Google Cloud Storage settings - GCS_BUCKET_NAME=contoso-images - GCS_CREDENTIALS_FILE=firestore-credentials.json - - # Security settings - API_KEY_SECRET=super-secret-key - API_KEY_EXPIRY_DAYS=365 - - # Vector Database settings - QDRANT_PORT=6333 - QDRANT_HTTPS=false - QDRANT_PREFER_GRPC=false - ``` - -5. **Deploy Infrastructure** - ```bash - ./deployment/deploy.sh --build --deploy - python ./scripts/seed_firestore.py - ``` - -6. **Destroy Infrastructure** - ```bash - ./deployment/deploy.sh --destroy - ``` +Replace `PROJECT_ID` with your actual Google Cloud project ID. -7. **Local Development** - ```bash - ./scripts/start.sh - ``` +#### 3. Configure Terraform Variables -8. **Local Testing** +Create your Terraform variables file from the example: + +```bash +cp deployment/terraform/terraform.tfvars.example deployment/terraform/terraform.tfvars +``` + +Edit the variables file with your specific values. + +#### 4. Download Service Account Credentials + +Download the service account credentials for the project and save them as `firestore-credentials.json` in the root directory. + +#### 5. Deploy Infrastructure + +Deploy the complete infrastructure including VM, Cloud Functions, and all Google Cloud services: + +```bash +./deployment/deploy.sh --build --deploy +``` + +#### 6. Seed Initial Data (Optional and requires to install the virtual environment first) + +Initialize the database with sample data: + +```bash +python ./scripts/seed_firestore.py +``` + +#### 7. Verify Deployment + +Your API will be available at the Cloud Run URL provided after deployment. Check the deployment status and test the endpoints. + +#### 8. Destroy Infrastructure (Optional) + +To tear down all deployed resources: + +```bash +./deployment/deploy.sh --destroy +``` + +### Local Development + +#### 1. Setup Local Environment + +Create and activate a virtual environment: + +```bash +python -m venv venv +source venv/bin/activate # Linux/macOS +venv\Scripts\activate # Windows +``` + +#### 2. Install Dependencies + +```bash +pip install -r requirements.txt +``` + +#### 3. Configure Local Environment + +Create a `.env` file for local development (use different values from production): + +```env +# Project Environment Variables +ENVIRONMENT=development +LOG_LEVEL=DEBUG + +# CORS settings - Must be a valid JSON list of strings or comma-separated values +CORS_ORIGINS=["*"] + +# Firestore settings +FIRESTORE_PROJECT_ID=gen-lang-client-0424120530 +FIRESTORE_DATABASE_NAME=contoso-imagedb-dev +FIRESTORE_CREDENTIALS_FILE=firestore-credentials.json + +# Google Cloud Storage settings +GCS_BUCKET_NAME=contoso-images-dev +GCS_CREDENTIALS_FILE=firestore-credentials.json + +# Security settings +API_KEY_SECRET=local-dev-secret-key +API_KEY_EXPIRY_DAYS=30 + +# Vector Database settings (point to deployed VM or local instance) +QDRANT_PORT=6333 +QDRANT_HTTPS=false +QDRANT_PREFER_GRPC=false +``` + +#### 4. Start Local Development Server + +```bash +./scripts/start.sh +``` + +#### 5. Run Tests + +```bash +source venv/Scripts/activate && python scripts/run_tests.py all +``` + +The local development server will be available at `http://localhost:8000` with API documentation at `http://localhost:8000/docs`. ## API Endpoints @@ -298,7 +361,6 @@ A **hybrid authentication model**: 1. **Public Management Endpoints**: Users, teams, and API key creation are **publicly accessible** for easy integration and setup 2. **Protected Data Endpoints**: Image storage and search require **API key authentication** - ### **Authentication & Pagination Status** | Endpoint Category | Authentication | Pagination Status | Notes | @@ -455,4 +517,4 @@ This modular architecture provides several benefits: ### Low Priority - [ ] Move all auth logic to auth module - [ ] Move cloud function code to src folder and reuse code with embedding service -- [ ] Remove Pinecone integration +- [ ] Remove Pinecone integration \ No newline at end of file diff --git a/deployment/deploy.sh b/deployment/deploy.sh old mode 100644 new mode 100755 diff --git a/deployment/terraform/.terraform.lock.hcl b/deployment/terraform/.terraform.lock.hcl index 28129ba..7b71fc0 100644 --- a/deployment/terraform/.terraform.lock.hcl +++ b/deployment/terraform/.terraform.lock.hcl @@ -4,6 +4,7 @@ provider "registry.terraform.io/hashicorp/archive" { version = "2.7.1" hashes = [ + "h1:62VrkalDPMKB9zerCBS4iKTbvxejwnAWn/XXYZZQWD4=", "h1:RzToQiFwVaxcV0QmgbyaKgNOhqc6oLKiFyZTrQSGcog=", "zh:19881bb356a4a656a865f48aee70c0b8a03c35951b7799b6113883f67f196e8e", "zh:2fcfbf6318dd514863268b09bbe19bfc958339c636bcbcc3664b45f2b8bf5cc6", @@ -23,6 +24,7 @@ provider "registry.terraform.io/hashicorp/archive" { provider "registry.terraform.io/hashicorp/google" { version = "6.36.1" hashes = [ + "h1:DTbEbqeeLHIC+hsNr+IsYk8Qt+UXrTtza0YttHrfHUg=", "h1:rj3g00i0dH4VxXYO5xXJg188i6OXWbFUT6WmLbO5orY=", "zh:161d054bda352a286a997f80f3d59366d072377abc6777bfe8abacc2e10ac2bf", "zh:314c38d8050036176031f691b533184c3578036085483fed877b3b139f887047", diff --git a/deployment/terraform/.terraform.tfstate.lock.info b/deployment/terraform/.terraform.tfstate.lock.info deleted file mode 100644 index ac09571..0000000 --- a/deployment/terraform/.terraform.tfstate.lock.info +++ /dev/null @@ -1 +0,0 @@ -{"ID":"f7ebd466-aa1e-1c15-bedf-0f9c92044463","Operation":"OperationTypeApply","Info":"","Who":"DESKTOP\\habal@Desktop","Version":"1.10.1","Created":"2025-05-26T16:46:06.4288884Z","Path":"terraform.tfstate"} \ No newline at end of file diff --git a/deployment/terraform/terraform.tfstate b/deployment/terraform/terraform.tfstate index fbc19ca..fa76fd0 100644 --- a/deployment/terraform/terraform.tfstate +++ b/deployment/terraform/terraform.tfstate @@ -1,7 +1,7 @@ { "version": 4, - "terraform_version": "1.10.1", - "serial": 451, + "terraform_version": "1.12.1", + "serial": 482, "lineage": "a183cd95-f987-8698-c6dd-84e933c394a5", "outputs": { "cloud_function_name": { @@ -13,11 +13,11 @@ "type": "string" }, "cloud_run_qdrant_host": { - "value": "35.193.174.125", + "value": "35.239.162.50", "type": "string" }, "cloud_run_qdrant_host_internal": { - "value": "10.128.0.7", + "value": "10.128.0.10", "type": "string" }, "cloud_run_url": { @@ -32,8 +32,8 @@ "value": { "cloud_run_url": "https://contoso-p64zpdtkta-uc.a.run.app", "firestore_database": "contoso-imagedb", - "qdrant_endpoint": "http://35.193.174.125:6333", - "qdrant_host_ip": "35.193.174.125", + "qdrant_endpoint": "http://35.239.162.50:6333", + "qdrant_host_ip": "35.239.162.50", "static_ip_enabled": false, "storage_bucket": "contoso-images" }, @@ -62,11 +62,11 @@ "type": "string" }, "qdrant_grpc_endpoint": { - "value": "http://35.193.174.125:6334", + "value": "http://35.239.162.50:6334", "type": "string" }, "qdrant_http_endpoint": { - "value": "http://35.193.174.125:6333", + "value": "http://35.239.162.50:6333", "type": "string" }, "storage_bucket_name": { @@ -74,11 +74,11 @@ "type": "string" }, "vector_db_vm_external_ip": { - "value": "35.193.174.125", + "value": "35.239.162.50", "type": "string" }, "vector_db_vm_internal_ip": { - "value": "10.128.0.7", + "value": "10.128.0.10", "type": "string" }, "vector_db_vm_name": { @@ -98,16 +98,16 @@ "attributes": { "exclude_symlink_directories": null, "excludes": null, - "id": "fe2be242d7b603458e099720b9d99e319952abb0", - "output_base64sha256": "+3DKsNV8OT4cv8S2rftR1Pe8UUHzJNn2hhWkS8FcN9I=", - "output_base64sha512": "2+zPRbyYxFDTa0LJz6TmZOajp10eJNQla9tK0S8d++4T6vXgt7nKSy81GO+V4ttWYopmipOvRYJe5YZ4WvmecA==", + "id": "89f7ed751d329280db05b2b98b5018b0af9ece39", + "output_base64sha256": "EJTnhfhxMekptx4HEzFKW+jo7mvd0K/ecHZr4CnvJCQ=", + "output_base64sha512": "f2NkqpPZp+ZLfUvhzm+er2o5edUW9A6u0RsyKTSngTQs1DCF9OUpEoUgvPE+Pjwg5bZWk4XU1xIlGyuG60GMag==", "output_file_mode": null, - "output_md5": "8e8a10dd705e45fe8645782a20d999a3", + "output_md5": "7f6e38555ecabf16a324987982823b6e", "output_path": "./function-source.zip", - "output_sha": "fe2be242d7b603458e099720b9d99e319952abb0", - "output_sha256": "fb70cab0d57c393e1cbfc4b6adfb51d4f7bc5141f324d9f68615a44bc15c37d2", - "output_sha512": "dbeccf45bc98c450d36b42c9cfa4e664e6a3a75d1e24d4256bdb4ad12f1dfbee13eaf5e0b7b9ca4b2f3518ef95e2db56628a668a93af45825ee586785af99e70", - "output_size": 69764811, + "output_sha": "89f7ed751d329280db05b2b98b5018b0af9ece39", + "output_sha256": "1094e785f87131e929b71e0713314a5be8e8ee6bddd0afde70766be029ef2424", + "output_sha512": "7f6364aa93d9a7e64b7d4be1ce6f9eaf6a3979d516f40eaed11b322934a781342cd43085f4e529128520bcf13e3e3c20e5b6569385d4d712251b2b86eb418c6a", + "output_size": 3871, "source": [], "source_content": null, "source_content_filename": null, @@ -115,7 +115,8 @@ "source_file": null, "type": "zip" }, - "sensitive_attributes": [] + "sensitive_attributes": [], + "identity_schema_version": 0 } ] }, @@ -148,7 +149,8 @@ "generative-language": "enabled" } }, - "sensitive_attributes": [] + "sensitive_attributes": [], + "identity_schema_version": 0 } ] }, @@ -172,7 +174,7 @@ "effective_annotations": { "run.googleapis.com/ingress": "all", "run.googleapis.com/ingress-status": "all", - "run.googleapis.com/operation-id": "2b1374b6-6b03-4d99-a76c-b8e751f46df0", + "run.googleapis.com/operation-id": "0425a798-bd0b-4453-83ba-38983e678875", "run.googleapis.com/urls": "[\"https://contoso-761163285547.us-central1.run.app\",\"https://contoso-p64zpdtkta-uc.a.run.app\"]", "serving.knative.dev/creator": "johnpccd3@gmail.com", "serving.knative.dev/lastModifier": "johnpccd3@gmail.com" @@ -184,12 +186,12 @@ "generation": 1, "labels": null, "namespace": "gen-lang-client-0424120530", - "resource_version": "AAY191YVk4g", + "resource_version": "AAY2Deo4Uy8", "self_link": "/apis/serving.knative.dev/v1/namespaces/761163285547/services/contoso", "terraform_labels": { "goog-terraform-provisioned": "true" }, - "uid": "d8b0e29e-2db1-4f23-8b6c-d7238a9a5f89" + "uid": "65c83cd2-1e60-4541-a922-6132aabb9311" } ], "name": "contoso", @@ -216,14 +218,14 @@ "type": "RoutesReady" } ], - "latest_created_revision_name": "contoso-00001-htg", - "latest_ready_revision_name": "contoso-00001-htg", + "latest_created_revision_name": "contoso-00001-w6c", + "latest_ready_revision_name": "contoso-00001-w6c", "observed_generation": 1, "traffic": [ { "latest_revision": true, "percent": 100, - "revision_name": "contoso-00001-htg", + "revision_name": "contoso-00001-w6c", "tag": "", "url": "" } @@ -291,7 +293,7 @@ }, { "name": "QDRANT_HOST", - "value": "35.193.174.125", + "value": "35.239.162.50", "value_from": [] }, { @@ -308,16 +310,6 @@ "name": "QDRANT_PREFER_GRPC", "value": "false", "value_from": [] - }, - { - "name": "VECTOR_DB_ENVIRONMENT", - "value": "gcp-starter", - "value_from": [] - }, - { - "name": "VECTOR_DB_INDEX_NAME", - "value": "image-embeddings", - "value_from": [] } ], "env_from": [], @@ -379,47 +371,8 @@ } ] }, - "sensitive_attributes": [ - [ - { - "type": "get_attr", - "value": "template" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "spec" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "containers" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "env" - } - ] - ], + "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMiJ9", "dependencies": [ "google_compute_address.vector_db_static_ip", @@ -440,7 +393,7 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY191avNJc=", + "etag": "BwY2DeqBDyE=", "id": "v1/projects/gen-lang-client-0424120530/locations/us-central1/services/contoso/roles/run.invoker/allUsers", "location": "us-central1", "member": "allUsers", @@ -449,6 +402,7 @@ "service": "v1/projects/gen-lang-client-0424120530/locations/us-central1/services/contoso" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "google_cloud_run_service.contoso", @@ -474,7 +428,7 @@ "automatic_update_policy": [ {} ], - "build": "projects/761163285547/locations/us-central1/builds/3804d611-8e49-491b-b994-4ed7fc528e92", + "build": "projects/761163285547/locations/us-central1/builds/08578917-6013-4d38-9c9e-6cf438f1cbd4", "docker_repository": "projects/gen-lang-client-0424120530/locations/us-central1/repositories/gcf-artifacts", "entry_point": "process_image_embedding", "environment_variables": {}, @@ -488,7 +442,7 @@ { "bucket": "gen-lang-client-0424120530-cloud-function-source", "generation": 1748186294324568, - "object": "function-source-8e8a10dd705e45fe8645782a20d999a3.zip" + "object": "function-source-7f6e38555ecabf16a324987982823b6e.zip" } ] } @@ -508,13 +462,13 @@ "pubsub_topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic", "retry_policy": "RETRY_POLICY_RETRY", "service_account_email": "761163285547-compute@developer.gserviceaccount.com", - "trigger": "projects/gen-lang-client-0424120530/locations/us-central1/triggers/process-image-embedding-873142", + "trigger": "projects/gen-lang-client-0424120530/locations/us-central1/triggers/process-image-embedding-093029", "trigger_region": "us-central1" } ], "id": "projects/gen-lang-client-0424120530/locations/us-central1/functions/process-image-embedding", "kms_key_name": "", - "labels": null, + "labels": {}, "location": "us-central1", "name": "process-image-embedding", "project": "gen-lang-client-0424120530", @@ -534,7 +488,7 @@ "PROJECT_ID": "gen-lang-client-0424120530", "QDRANT_API_KEY": "", "QDRANT_COLLECTION": "image_vectors", - "QDRANT_HOST": "35.193.174.125", + "QDRANT_HOST": "35.239.162.50", "QDRANT_HTTPS": "false", "QDRANT_PORT": "6333", "VERTEX_AI_LOCATION": "us-central1" @@ -559,35 +513,11 @@ "goog-terraform-provisioned": "true" }, "timeouts": null, - "update_time": "2025-05-25T15:20:42.834818284Z", + "update_time": "2025-05-26T17:37:44.525533692Z", "url": "https://us-central1-gen-lang-client-0424120530.cloudfunctions.net/process-image-embedding" }, - "sensitive_attributes": [ - [ - { - "type": "get_attr", - "value": "service_config" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "environment_variables" - }, - { - "type": "index", - "value": { - "value": "QDRANT_API_KEY", - "type": "string" - } - } - ] - ], + "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInVwZGF0ZSI6MzYwMDAwMDAwMDAwMH19", "dependencies": [ "data.archive_file.function_source", @@ -621,7 +551,7 @@ "protocol": "tcp" } ], - "creation_timestamp": "2025-05-24T14:09:17.159-07:00", + "creation_timestamp": "2025-05-26T10:30:31.215-07:00", "deny": [], "description": "", "destination_ranges": [], @@ -648,6 +578,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9" } ] @@ -711,7 +642,7 @@ "can_ip_forward": false, "confidential_instance_config": [], "cpu_platform": "Intel Broadwell", - "creation_timestamp": "2025-05-25T03:58:31.230-07:00", + "creation_timestamp": "2025-05-26T10:30:45.304-07:00", "current_status": "RUNNING", "deletion_protection": false, "description": "", @@ -724,7 +655,7 @@ "hostname": "", "id": "projects/gen-lang-client-0424120530/zones/us-central1-a/instances/contoso-vector-db", "instance_encryption_key": [], - "instance_id": "3665939918038714681", + "instance_id": "7202785867853274026", "key_revocation_action_type": "", "label_fingerprint": "vezUS-42LLM=", "labels": {}, @@ -738,7 +669,7 @@ { "access_config": [ { - "nat_ip": "35.193.174.125", + "nat_ip": "35.239.162.50", "network_tier": "PREMIUM", "public_ptr_domain_name": "" } @@ -751,7 +682,7 @@ "name": "nic0", "network": "https://www.googleapis.com/compute/v1/projects/gen-lang-client-0424120530/global/networks/default", "network_attachment": "", - "network_ip": "10.128.0.7", + "network_ip": "10.128.0.10", "nic_type": "", "queue_count": 0, "stack_type": "IPV4_ONLY", @@ -823,7 +754,7 @@ }, { "type": "get_attr", - "value": "disk_encryption_key_rsa" + "value": "disk_encryption_key_raw" } ], [ @@ -840,16 +771,11 @@ }, { "type": "get_attr", - "value": "disk_encryption_key_raw" - } - ], - [ - { - "type": "get_attr", - "value": "metadata_startup_script" + "value": "disk_encryption_key_rsa" } ] ], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiNiJ9", "dependencies": [ "google_compute_address.vector_db_static_ip", @@ -875,8 +801,8 @@ "database_edition": "STANDARD", "delete_protection_state": "DELETE_PROTECTION_DISABLED", "deletion_policy": "ABANDON", - "earliest_version_time": "2025-05-25T14:17:09.893967Z", - "etag": "IKfR75n1vo0DMKrW4vCEvY0D", + "earliest_version_time": "2025-05-26T17:30:34.654251Z", + "etag": "IJPvj6vewY0DMLiE6qfXwY0D", "id": "projects/gen-lang-client-0424120530/databases/contoso-imagedb", "key_prefix": "", "location_id": "us-central1", @@ -885,11 +811,12 @@ "project": "gen-lang-client-0424120530", "timeouts": null, "type": "FIRESTORE_NATIVE", - "uid": "f4aa945b-2205-4f94-b903-57815519f2fc", + "uid": "1b80214d-7fd4-4c54-9542-729c7225ed1f", "update_time": "", "version_retention_period": "3600s" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19", "dependencies": [ "google_project_service.services" @@ -907,13 +834,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/eventarc.eventReceiver/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/eventarc.eventReceiver" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -931,13 +859,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/datastore.user/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/datastore.user" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -955,13 +884,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/pubsub.subscriber/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/pubsub.subscriber" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -979,13 +909,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/storage.objectViewer/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/storage.objectViewer" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -1003,13 +934,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/aiplatform.user/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/aiplatform.user" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -1035,6 +967,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1049,6 +982,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1063,6 +997,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1077,6 +1012,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1091,6 +1027,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1105,6 +1042,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1119,6 +1057,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1133,6 +1072,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1147,6 +1087,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1161,6 +1102,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1175,6 +1117,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" } ] @@ -1228,6 +1171,7 @@ "topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic-dlq" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19", "dependencies": [ "google_pubsub_topic.image_processing_dlq" @@ -1272,6 +1216,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19" } ] @@ -1313,6 +1258,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19" } ] @@ -1327,7 +1273,7 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16CEHGDA=", + "etag": "BwY2DU48nbo=", "id": "projects/gen-lang-client-0424120530/topics/image-processing-topic/roles/pubsub.publisher", "members": [ "serviceAccount:761163285547-compute@developer.gserviceaccount.com" @@ -1337,6 +1283,7 @@ "topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current", @@ -1365,9 +1312,10 @@ "name": "projects/gen-lang-client-0424120530/serviceAccounts/vector-db-sa@gen-lang-client-0424120530.iam.gserviceaccount.com", "project": "gen-lang-client-0424120530", "timeouts": null, - "unique_id": "115648202672357296665" + "unique_id": "118261137128240596892" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDB9fQ==" } ] @@ -1411,7 +1359,7 @@ "self_link": "https://www.googleapis.com/storage/v1/b/contoso-images", "soft_delete_policy": [ { - "effective_time": "2025-05-24T21:09:21.315Z", + "effective_time": "2025-05-26T17:30:31.355Z", "retention_duration_seconds": 604800 } ], @@ -1419,15 +1367,16 @@ "terraform_labels": { "goog-terraform-provisioned": "true" }, - "time_created": "2025-05-24T21:09:21.315Z", + "time_created": "2025-05-26T17:30:31.355Z", "timeouts": null, "uniform_bucket_level_access": true, - "updated": "2025-05-24T21:09:21.315Z", + "updated": "2025-05-26T17:30:31.355Z", "url": "gs://contoso-images", "versioning": [], "website": [] }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsInJlYWQiOjI0MDAwMDAwMDAwMCwidXBkYXRlIjoyNDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjMifQ==", "dependencies": [ "google_project_service.services" @@ -1474,7 +1423,7 @@ "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source", "soft_delete_policy": [ { - "effective_time": "2025-05-24T21:47:35.399Z", + "effective_time": "2025-05-26T17:30:31.392Z", "retention_duration_seconds": 604800 } ], @@ -1482,15 +1431,16 @@ "terraform_labels": { "goog-terraform-provisioned": "true" }, - "time_created": "2025-05-24T21:47:35.399Z", + "time_created": "2025-05-26T17:30:31.392Z", "timeouts": null, "uniform_bucket_level_access": true, - "updated": "2025-05-24T21:47:35.399Z", + "updated": "2025-05-26T17:30:31.392Z", "url": "gs://gen-lang-client-0424120530-cloud-function-source", "versioning": [], "website": [] }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsInJlYWQiOjI0MDAwMDAwMDAwMCwidXBkYXRlIjoyNDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjMifQ==", "dependencies": [ "google_project_service.services" @@ -1514,21 +1464,21 @@ "content_encoding": "", "content_language": "", "content_type": "application/zip", - "crc32c": "cMTkTw==", + "crc32c": "aWG2+g==", "customer_encryption": [], - "detect_md5hash": "jooQ3XBeRf6GRXgqINmZow==", + "detect_md5hash": "f244VV7KvxajJJh5goI7bg==", "event_based_hold": false, - "generation": 1748186292978895, - "id": "gen-lang-client-0424120530-cloud-function-source-function-source-8e8a10dd705e45fe8645782a20d999a3.zip", + "generation": 1748280633915865, + "id": "gen-lang-client-0424120530-cloud-function-source-function-source-7f6e38555ecabf16a324987982823b6e.zip", "kms_key_name": "", - "md5hash": "jooQ3XBeRf6GRXgqINmZow==", - "md5hexhash": "8e8a10dd705e45fe8645782a20d999a3", - "media_link": "https://storage.googleapis.com/download/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-8e8a10dd705e45fe8645782a20d999a3.zip?generation=1748186292978895\u0026alt=media", - "metadata": null, - "name": "function-source-8e8a10dd705e45fe8645782a20d999a3.zip", - "output_name": "function-source-8e8a10dd705e45fe8645782a20d999a3.zip", + "md5hash": "f244VV7KvxajJJh5goI7bg==", + "md5hexhash": "7f6e38555ecabf16a324987982823b6e", + "media_link": "https://storage.googleapis.com/download/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-7f6e38555ecabf16a324987982823b6e.zip?generation=1748280633915865\u0026alt=media", + "metadata": {}, + "name": "function-source-7f6e38555ecabf16a324987982823b6e.zip", + "output_name": "function-source-7f6e38555ecabf16a324987982823b6e.zip", "retention": [], - "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-8e8a10dd705e45fe8645782a20d999a3.zip", + "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-7f6e38555ecabf16a324987982823b6e.zip", "source": "./function-source.zip", "storage_class": "STANDARD", "temporary_hold": false, @@ -1542,6 +1492,7 @@ } ] ], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoyNDAwMDAwMDAwMDAsImRlbGV0ZSI6MjQwMDAwMDAwMDAwLCJ1cGRhdGUiOjI0MDAwMDAwMDAwMH19", "dependencies": [ "data.archive_file.function_source", diff --git a/deployment/terraform/terraform.tfstate.backup b/deployment/terraform/terraform.tfstate.backup index 9dc98e3..6a8d36d 100644 --- a/deployment/terraform/terraform.tfstate.backup +++ b/deployment/terraform/terraform.tfstate.backup @@ -1,7 +1,7 @@ { "version": 4, - "terraform_version": "1.10.1", - "serial": 445, + "terraform_version": "1.12.1", + "serial": 479, "lineage": "a183cd95-f987-8698-c6dd-84e933c394a5", "outputs": { "cloud_function_name": { @@ -13,11 +13,11 @@ "type": "string" }, "cloud_run_qdrant_host": { - "value": "35.193.174.125", + "value": "35.239.162.50", "type": "string" }, "cloud_run_qdrant_host_internal": { - "value": "10.128.0.7", + "value": "10.128.0.10", "type": "string" }, "cloud_run_url": { @@ -32,8 +32,8 @@ "value": { "cloud_run_url": "https://contoso-p64zpdtkta-uc.a.run.app", "firestore_database": "contoso-imagedb", - "qdrant_endpoint": "http://35.193.174.125:6333", - "qdrant_host_ip": "35.193.174.125", + "qdrant_endpoint": "http://35.239.162.50:6333", + "qdrant_host_ip": "35.239.162.50", "static_ip_enabled": false, "storage_bucket": "contoso-images" }, @@ -62,11 +62,11 @@ "type": "string" }, "qdrant_grpc_endpoint": { - "value": "http://35.193.174.125:6334", + "value": "http://35.239.162.50:6334", "type": "string" }, "qdrant_http_endpoint": { - "value": "http://35.193.174.125:6333", + "value": "http://35.239.162.50:6333", "type": "string" }, "storage_bucket_name": { @@ -74,11 +74,11 @@ "type": "string" }, "vector_db_vm_external_ip": { - "value": "35.193.174.125", + "value": "35.239.162.50", "type": "string" }, "vector_db_vm_internal_ip": { - "value": "10.128.0.7", + "value": "10.128.0.10", "type": "string" }, "vector_db_vm_name": { @@ -98,16 +98,16 @@ "attributes": { "exclude_symlink_directories": null, "excludes": null, - "id": "0cfb36e4e396f12e3ad2944c44b083bff2224ad5", - "output_base64sha256": "uMoV4IM2IuGcRtqeI7wbu3OsTmvDx1ohDDxkEE5NY9U=", - "output_base64sha512": "BQB+g3lC0+y5vOx6KHh4AWCeHk3D2nmdgE8JrFaiPlCWV6KsrMdANGyKeZ/aFmvGjbFw7MGQD4s0u/tn+viVAA==", + "id": "89f7ed751d329280db05b2b98b5018b0af9ece39", + "output_base64sha256": "EJTnhfhxMekptx4HEzFKW+jo7mvd0K/ecHZr4CnvJCQ=", + "output_base64sha512": "f2NkqpPZp+ZLfUvhzm+er2o5edUW9A6u0RsyKTSngTQs1DCF9OUpEoUgvPE+Pjwg5bZWk4XU1xIlGyuG60GMag==", "output_file_mode": null, - "output_md5": "b532cf3ff81d62dd7dec013e486931aa", + "output_md5": "7f6e38555ecabf16a324987982823b6e", "output_path": "./function-source.zip", - "output_sha": "0cfb36e4e396f12e3ad2944c44b083bff2224ad5", - "output_sha256": "b8ca15e0833622e19c46da9e23bc1bbb73ac4e6bc3c75a210c3c64104e4d63d5", - "output_sha512": "05007e837942d3ecb9bcec7a28787801609e1e4dc3da799d804f09ac56a23e509657a2acacc740346c8a799fda166bc68db170ecc1900f8b34bbfb67faf89500", - "output_size": 69764346, + "output_sha": "89f7ed751d329280db05b2b98b5018b0af9ece39", + "output_sha256": "1094e785f87131e929b71e0713314a5be8e8ee6bddd0afde70766be029ef2424", + "output_sha512": "7f6364aa93d9a7e64b7d4be1ce6f9eaf6a3979d516f40eaed11b322934a781342cd43085f4e529128520bcf13e3e3c20e5b6569385d4d712251b2b86eb418c6a", + "output_size": 3871, "source": [], "source_content": null, "source_content_filename": null, @@ -115,7 +115,8 @@ "source_file": null, "type": "zip" }, - "sensitive_attributes": [] + "sensitive_attributes": [], + "identity_schema_version": 0 } ] }, @@ -148,7 +149,8 @@ "generative-language": "enabled" } }, - "sensitive_attributes": [] + "sensitive_attributes": [], + "identity_schema_version": 0 } ] }, @@ -172,7 +174,7 @@ "effective_annotations": { "run.googleapis.com/ingress": "all", "run.googleapis.com/ingress-status": "all", - "run.googleapis.com/operation-id": "a9aeb6de-fdd6-43b2-93f8-8b7f72afab4c", + "run.googleapis.com/operation-id": "fd6ae30c-0621-41c4-998b-cbf693bd98da", "run.googleapis.com/urls": "[\"https://contoso-761163285547.us-central1.run.app\",\"https://contoso-p64zpdtkta-uc.a.run.app\"]", "serving.knative.dev/creator": "johnpccd3@gmail.com", "serving.knative.dev/lastModifier": "johnpccd3@gmail.com" @@ -184,12 +186,12 @@ "generation": 1, "labels": null, "namespace": "gen-lang-client-0424120530", - "resource_version": "AAY19MELEOc", + "resource_version": "AAY2DdPXaEU", "self_link": "/apis/serving.knative.dev/v1/namespaces/761163285547/services/contoso", "terraform_labels": { "goog-terraform-provisioned": "true" }, - "uid": "8c8be11c-c607-4caa-a65e-c552ec445882" + "uid": "d3664fe2-c0fc-40d5-90bd-93904dd237b1" } ], "name": "contoso", @@ -216,14 +218,14 @@ "type": "RoutesReady" } ], - "latest_created_revision_name": "contoso-00001-z4g", - "latest_ready_revision_name": "contoso-00001-z4g", + "latest_created_revision_name": "contoso-00001-v79", + "latest_ready_revision_name": "contoso-00001-v79", "observed_generation": 1, "traffic": [ { "latest_revision": true, "percent": 100, - "revision_name": "contoso-00001-z4g", + "revision_name": "contoso-00001-v79", "tag": "", "url": "" } @@ -291,7 +293,7 @@ }, { "name": "QDRANT_HOST", - "value": "35.193.174.125", + "value": "35.239.162.50", "value_from": [] }, { @@ -308,16 +310,6 @@ "name": "QDRANT_PREFER_GRPC", "value": "false", "value_from": [] - }, - { - "name": "VECTOR_DB_ENVIRONMENT", - "value": "gcp-starter", - "value_from": [] - }, - { - "name": "VECTOR_DB_INDEX_NAME", - "value": "image-embeddings", - "value_from": [] } ], "env_from": [], @@ -379,47 +371,8 @@ } ] }, - "sensitive_attributes": [ - [ - { - "type": "get_attr", - "value": "template" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "spec" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "containers" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "env" - } - ] - ], + "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMiJ9", "dependencies": [ "google_compute_address.vector_db_static_ip", @@ -440,7 +393,7 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY19MG70Fs=", + "etag": "BwY2DdQrt9Y=", "id": "v1/projects/gen-lang-client-0424120530/locations/us-central1/services/contoso/roles/run.invoker/allUsers", "location": "us-central1", "member": "allUsers", @@ -449,6 +402,7 @@ "service": "v1/projects/gen-lang-client-0424120530/locations/us-central1/services/contoso" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "google_cloud_run_service.contoso", @@ -474,7 +428,7 @@ "automatic_update_policy": [ {} ], - "build": "projects/761163285547/locations/us-central1/builds/ae88c918-6bb3-4aef-a56f-270f48f73049", + "build": "projects/761163285547/locations/us-central1/builds/08578917-6013-4d38-9c9e-6cf438f1cbd4", "docker_repository": "projects/gen-lang-client-0424120530/locations/us-central1/repositories/gcf-artifacts", "entry_point": "process_image_embedding", "environment_variables": {}, @@ -487,8 +441,8 @@ "storage_source": [ { "bucket": "gen-lang-client-0424120530-cloud-function-source", - "generation": 1748175166697242, - "object": "function-source-b532cf3ff81d62dd7dec013e486931aa.zip" + "generation": 1748186294324568, + "object": "function-source-7f6e38555ecabf16a324987982823b6e.zip" } ] } @@ -508,13 +462,13 @@ "pubsub_topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic", "retry_policy": "RETRY_POLICY_RETRY", "service_account_email": "761163285547-compute@developer.gserviceaccount.com", - "trigger": "projects/gen-lang-client-0424120530/locations/us-central1/triggers/process-image-embedding-645734", + "trigger": "projects/gen-lang-client-0424120530/locations/us-central1/triggers/process-image-embedding-093029", "trigger_region": "us-central1" } ], "id": "projects/gen-lang-client-0424120530/locations/us-central1/functions/process-image-embedding", "kms_key_name": "", - "labels": null, + "labels": {}, "location": "us-central1", "name": "process-image-embedding", "project": "gen-lang-client-0424120530", @@ -534,7 +488,7 @@ "PROJECT_ID": "gen-lang-client-0424120530", "QDRANT_API_KEY": "", "QDRANT_COLLECTION": "image_vectors", - "QDRANT_HOST": "35.193.174.125", + "QDRANT_HOST": "35.239.162.50", "QDRANT_HTTPS": "false", "QDRANT_PORT": "6333", "VERTEX_AI_LOCATION": "us-central1" @@ -559,35 +513,11 @@ "goog-terraform-provisioned": "true" }, "timeouts": null, - "update_time": "2025-05-25T12:15:22.215124150Z", + "update_time": "2025-05-26T17:37:44.525533692Z", "url": "https://us-central1-gen-lang-client-0424120530.cloudfunctions.net/process-image-embedding" }, - "sensitive_attributes": [ - [ - { - "type": "get_attr", - "value": "service_config" - }, - { - "type": "index", - "value": { - "value": 0, - "type": "number" - } - }, - { - "type": "get_attr", - "value": "environment_variables" - }, - { - "type": "index", - "value": { - "value": "QDRANT_API_KEY", - "type": "string" - } - } - ] - ], + "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozNjAwMDAwMDAwMDAwLCJkZWxldGUiOjM2MDAwMDAwMDAwMDAsInVwZGF0ZSI6MzYwMDAwMDAwMDAwMH19", "dependencies": [ "data.archive_file.function_source", @@ -621,7 +551,7 @@ "protocol": "tcp" } ], - "creation_timestamp": "2025-05-24T14:09:17.159-07:00", + "creation_timestamp": "2025-05-26T10:30:31.215-07:00", "deny": [], "description": "", "destination_ranges": [], @@ -648,6 +578,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiMSJ9" } ] @@ -711,7 +642,7 @@ "can_ip_forward": false, "confidential_instance_config": [], "cpu_platform": "Intel Broadwell", - "creation_timestamp": "2025-05-25T03:58:31.230-07:00", + "creation_timestamp": "2025-05-26T10:30:45.304-07:00", "current_status": "RUNNING", "deletion_protection": false, "description": "", @@ -724,7 +655,7 @@ "hostname": "", "id": "projects/gen-lang-client-0424120530/zones/us-central1-a/instances/contoso-vector-db", "instance_encryption_key": [], - "instance_id": "3665939918038714681", + "instance_id": "7202785867853274026", "key_revocation_action_type": "", "label_fingerprint": "vezUS-42LLM=", "labels": {}, @@ -738,7 +669,7 @@ { "access_config": [ { - "nat_ip": "35.193.174.125", + "nat_ip": "35.239.162.50", "network_tier": "PREMIUM", "public_ptr_domain_name": "" } @@ -751,7 +682,7 @@ "name": "nic0", "network": "https://www.googleapis.com/compute/v1/projects/gen-lang-client-0424120530/global/networks/default", "network_attachment": "", - "network_ip": "10.128.0.7", + "network_ip": "10.128.0.10", "nic_type": "", "queue_count": 0, "stack_type": "IPV4_ONLY", @@ -823,7 +754,7 @@ }, { "type": "get_attr", - "value": "disk_encryption_key_rsa" + "value": "disk_encryption_key_raw" } ], [ @@ -840,16 +771,11 @@ }, { "type": "get_attr", - "value": "disk_encryption_key_raw" - } - ], - [ - { - "type": "get_attr", - "value": "metadata_startup_script" + "value": "disk_encryption_key_rsa" } ] ], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH0sInNjaGVtYV92ZXJzaW9uIjoiNiJ9", "dependencies": [ "google_compute_address.vector_db_static_ip", @@ -875,8 +801,8 @@ "database_edition": "STANDARD", "delete_protection_state": "DELETE_PROTECTION_DISABLED", "deletion_policy": "ABANDON", - "earliest_version_time": "2025-05-25T11:12:43.126081Z", - "etag": "IPjb6fzLvo0DMKrW4vCEvY0D", + "earliest_version_time": "2025-05-26T17:30:34.654251Z", + "etag": "IInb+u7cwY0DMLiE6qfXwY0D", "id": "projects/gen-lang-client-0424120530/databases/contoso-imagedb", "key_prefix": "", "location_id": "us-central1", @@ -885,11 +811,12 @@ "project": "gen-lang-client-0424120530", "timeouts": null, "type": "FIRESTORE_NATIVE", - "uid": "f4aa945b-2205-4f94-b903-57815519f2fc", + "uid": "1b80214d-7fd4-4c54-9542-729c7225ed1f", "update_time": "", "version_retention_period": "3600s" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19", "dependencies": [ "google_project_service.services" @@ -907,13 +834,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/eventarc.eventReceiver/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/eventarc.eventReceiver" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -931,13 +859,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/datastore.user/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/datastore.user" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -955,13 +884,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/pubsub.subscriber/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/pubsub.subscriber" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -979,13 +909,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/storage.objectViewer/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/storage.objectViewer" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -1003,13 +934,14 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16WAsDU4=", + "etag": "BwY2DU48jAs=", "id": "gen-lang-client-0424120530/roles/aiplatform.user/serviceAccount:761163285547-compute@developer.gserviceaccount.com", "member": "serviceAccount:761163285547-compute@developer.gserviceaccount.com", "project": "gen-lang-client-0424120530", "role": "roles/aiplatform.user" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current" @@ -1035,6 +967,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1049,6 +982,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1063,6 +997,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1077,6 +1012,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1091,6 +1027,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1105,6 +1042,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1119,6 +1057,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1133,6 +1072,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1147,6 +1087,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1161,6 +1102,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" }, { @@ -1175,6 +1117,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInJlYWQiOjYwMDAwMDAwMDAwMCwidXBkYXRlIjoxMjAwMDAwMDAwMDAwfX0=" } ] @@ -1228,6 +1171,7 @@ "topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic-dlq" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19", "dependencies": [ "google_pubsub_topic.image_processing_dlq" @@ -1272,6 +1216,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19" } ] @@ -1313,6 +1258,7 @@ "timeouts": null }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoxMjAwMDAwMDAwMDAwLCJkZWxldGUiOjEyMDAwMDAwMDAwMDAsInVwZGF0ZSI6MTIwMDAwMDAwMDAwMH19" } ] @@ -1327,7 +1273,7 @@ "schema_version": 0, "attributes": { "condition": [], - "etag": "BwY16CEHGDA=", + "etag": "BwY2DU48nbo=", "id": "projects/gen-lang-client-0424120530/topics/image-processing-topic/roles/pubsub.publisher", "members": [ "serviceAccount:761163285547-compute@developer.gserviceaccount.com" @@ -1337,6 +1283,7 @@ "topic": "projects/gen-lang-client-0424120530/topics/image-processing-topic" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "bnVsbA==", "dependencies": [ "data.google_project.current", @@ -1365,9 +1312,10 @@ "name": "projects/gen-lang-client-0424120530/serviceAccounts/vector-db-sa@gen-lang-client-0424120530.iam.gserviceaccount.com", "project": "gen-lang-client-0424120530", "timeouts": null, - "unique_id": "115648202672357296665" + "unique_id": "118261137128240596892" }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjozMDAwMDAwMDAwMDB9fQ==" } ] @@ -1411,7 +1359,7 @@ "self_link": "https://www.googleapis.com/storage/v1/b/contoso-images", "soft_delete_policy": [ { - "effective_time": "2025-05-24T21:09:21.315Z", + "effective_time": "2025-05-26T17:30:31.355Z", "retention_duration_seconds": 604800 } ], @@ -1419,15 +1367,16 @@ "terraform_labels": { "goog-terraform-provisioned": "true" }, - "time_created": "2025-05-24T21:09:21.315Z", + "time_created": "2025-05-26T17:30:31.355Z", "timeouts": null, "uniform_bucket_level_access": true, - "updated": "2025-05-24T21:09:21.315Z", + "updated": "2025-05-26T17:30:31.355Z", "url": "gs://contoso-images", "versioning": [], "website": [] }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsInJlYWQiOjI0MDAwMDAwMDAwMCwidXBkYXRlIjoyNDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjMifQ==", "dependencies": [ "google_project_service.services" @@ -1474,7 +1423,7 @@ "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source", "soft_delete_policy": [ { - "effective_time": "2025-05-24T21:47:35.399Z", + "effective_time": "2025-05-26T17:30:31.392Z", "retention_duration_seconds": 604800 } ], @@ -1482,15 +1431,16 @@ "terraform_labels": { "goog-terraform-provisioned": "true" }, - "time_created": "2025-05-24T21:47:35.399Z", + "time_created": "2025-05-26T17:30:31.392Z", "timeouts": null, "uniform_bucket_level_access": true, - "updated": "2025-05-24T21:47:35.399Z", + "updated": "2025-05-26T17:30:31.392Z", "url": "gs://gen-lang-client-0424120530-cloud-function-source", "versioning": [], "website": [] }, "sensitive_attributes": [], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjo2MDAwMDAwMDAwMDAsInJlYWQiOjI0MDAwMDAwMDAwMCwidXBkYXRlIjoyNDAwMDAwMDAwMDB9LCJzY2hlbWFfdmVyc2lvbiI6IjMifQ==", "dependencies": [ "google_project_service.services" @@ -1514,21 +1464,21 @@ "content_encoding": "", "content_language": "", "content_type": "application/zip", - "crc32c": "EgiVnQ==", + "crc32c": "aWG2+g==", "customer_encryption": [], - "detect_md5hash": "tTLPP/gdYt197AE+SGkxqg==", + "detect_md5hash": "f244VV7KvxajJJh5goI7bg==", "event_based_hold": false, - "generation": 1748174860755303, - "id": "gen-lang-client-0424120530-cloud-function-source-function-source-b532cf3ff81d62dd7dec013e486931aa.zip", + "generation": 1748280633915865, + "id": "gen-lang-client-0424120530-cloud-function-source-function-source-7f6e38555ecabf16a324987982823b6e.zip", "kms_key_name": "", - "md5hash": "tTLPP/gdYt197AE+SGkxqg==", - "md5hexhash": "b532cf3ff81d62dd7dec013e486931aa", - "media_link": "https://storage.googleapis.com/download/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-b532cf3ff81d62dd7dec013e486931aa.zip?generation=1748174860755303\u0026alt=media", + "md5hash": "f244VV7KvxajJJh5goI7bg==", + "md5hexhash": "7f6e38555ecabf16a324987982823b6e", + "media_link": "https://storage.googleapis.com/download/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-7f6e38555ecabf16a324987982823b6e.zip?generation=1748280633915865\u0026alt=media", "metadata": {}, - "name": "function-source-b532cf3ff81d62dd7dec013e486931aa.zip", - "output_name": "function-source-b532cf3ff81d62dd7dec013e486931aa.zip", + "name": "function-source-7f6e38555ecabf16a324987982823b6e.zip", + "output_name": "function-source-7f6e38555ecabf16a324987982823b6e.zip", "retention": [], - "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-b532cf3ff81d62dd7dec013e486931aa.zip", + "self_link": "https://www.googleapis.com/storage/v1/b/gen-lang-client-0424120530-cloud-function-source/o/function-source-7f6e38555ecabf16a324987982823b6e.zip", "source": "./function-source.zip", "storage_class": "STANDARD", "temporary_hold": false, @@ -1542,6 +1492,7 @@ } ] ], + "identity_schema_version": 0, "private": "eyJlMmJmYjczMC1lY2FhLTExZTYtOGY4OC0zNDM2M2JjN2M0YzAiOnsiY3JlYXRlIjoyNDAwMDAwMDAwMDAsImRlbGV0ZSI6MjQwMDAwMDAwMDAwLCJ1cGRhdGUiOjI0MDAwMDAwMDAwMH19", "dependencies": [ "data.archive_file.function_source", diff --git a/deployment/terraform/terraform.tfvars.example b/deployment/terraform/terraform.tfvars.example index 887cfe7..e0d95b6 100644 --- a/deployment/terraform/terraform.tfvars.example +++ b/deployment/terraform/terraform.tfvars.example @@ -1,15 +1,7 @@ -project_id = "your-gcp-project-id" +project_id = "gen-lang-client-0424120530" region = "us-central1" zone = "us-central1-a" -storage_bucket_name = "your-app-storage-bucket" +storage_bucket_name = "contoso-images" firestore_db_name = "contoso-imagedb" - -# Vector Database Configuration -qdrant_api_key = "your-secure-api-key-here" # Optional: leave empty for no authentication -allowed_cidr_blocks = "YOUR_IP_ADDRESS/32" # Replace with your IP or network range -use_static_ip = false # Set to true if you want a static IP - -# Secret Configuration (all optional - random values will be generated if not provided) -api_key_secret = "" # Optional: will generate random key if empty -gcs_credentials_json = "" # Optional: JSON content of GCS service account key -firestore_credentials_json = "" # Optional: JSON content of Firestore service account key \ No newline at end of file +cloud_run_service_account = "service-account@gen-lang-client-xxx.iam.gserviceaccount.com" +cloud_function_service_account = "service-account@gen-lang-client-xxx.iam.gserviceaccount.com" \ No newline at end of file diff --git a/deployment/terraform/variables.tf b/deployment/terraform/variables.tf index 554061c..51c9aca 100644 --- a/deployment/terraform/variables.tf +++ b/deployment/terraform/variables.tf @@ -54,7 +54,6 @@ variable "cloud_function_service_account" { variable "qdrant_api_key" { description = "API key for Qdrant vector database" type = string - sensitive = true default = "" } diff --git a/scripts/README.md b/scripts/README.md deleted file mode 100644 index b00e9f2..0000000 --- a/scripts/README.md +++ /dev/null @@ -1,256 +0,0 @@ -# Build and Deployment Scripts - -This directory contains scripts for building and deploying the Contoso API application. - -## Prerequisites - -- Docker installed and running -- For deployment: access to a container registry (e.g., DockerHub, Google Container Registry) -- For Cloud Run deployment: Google Cloud SDK (`gcloud`) installed and configured - -## Scripts - -### Build Script (`build.sh`) - -Builds the Docker image for the Contoso API. - -**Usage:** -```bash -# Basic usage (builds with default settings) -./scripts/build.sh - -# Customize the image name -IMAGE_NAME=my-custom-name ./scripts/build.sh - -# Customize the image tag -IMAGE_TAG=v1.0.0 ./scripts/build.sh - -# Use a custom registry -REGISTRY=gcr.io/my-project ./scripts/build.sh -``` - -**Environment Variables:** -- `IMAGE_NAME`: Name for the Docker image (default: "contoso-api") -- `IMAGE_TAG`: Tag for the Docker image (default: "latest") -- `REGISTRY`: Container registry to use (default: empty, using DockerHub) - -### Deploy Script (`deploy.sh`) - -Pushes the built Docker image to a container registry and optionally deploys to Google Cloud Run. - -**Usage:** -```bash -# Push to registry only -./scripts/deploy.sh - -# Push to registry and deploy to Cloud Run -DEPLOY_TO_CLOUD_RUN=true PROJECT_ID=my-project-id ./scripts/deploy.sh - -# Customize deployment settings -DEPLOY_TO_CLOUD_RUN=true PROJECT_ID=my-project-id REGION=us-west1 SERVICE_NAME=my-api ./scripts/deploy.sh -``` - -**Environment Variables:** -All variables from the build script, plus: -- `PROJECT_ID`: Google Cloud project ID (required for Cloud Run deployment) -- `REGION`: Google Cloud region (default: "us-central1") -- `SERVICE_NAME`: Name for the Cloud Run service (default: "contoso-api") - -### Cloud Run Deployment Script (`deploy-to-cloud-run.sh`) - -Deploys the application to Google Cloud Run using the service configuration file. - -**Usage:** -```bash -# Deploy using existing service.yaml -PROJECT_ID=my-project-id ./scripts/deploy-to-cloud-run.sh - -# Build, push, and deploy in one command -PROJECT_ID=my-project-id BUILD=true PUSH=true ./scripts/deploy-to-cloud-run.sh - -# Customize the deployment -PROJECT_ID=my-project-id REGION=us-west1 IMAGE_TAG=v1.0.0 ./scripts/deploy-to-cloud-run.sh -``` - -**Environment Variables:** -- `PROJECT_ID`: Google Cloud project ID (required) -- `REGION`: Google Cloud region (default: "us-central1") -- `SERVICE_CONFIG`: Path to the service configuration file (default: "deployment/cloud-run/service.yaml") -- `IMAGE_NAME`: Name for the Docker image (default: "contoso-api") -- `IMAGE_TAG`: Tag for the Docker image (default: "latest") -- `REGISTRY`: Container registry to use (default: "gcr.io") -- `BUILD`: Set to "true" to build the image before deployment (default: "false") -- `PUSH`: Set to "true" to push the image before deployment (default: "false") - -### Frontend Client Script (`client.sh`) - -Manages the Contoso frontend client development, building, and deployment. - -**Usage:** -```bash -# Start development server -./scripts/client.sh dev -# or -./scripts/client.sh serve - -# Build production files -./scripts/client.sh build - -# Deploy to static hosting -DEPLOY_TARGET=netlify ./scripts/client.sh deploy - -# Clean build artifacts -./scripts/client.sh clean - -# Install dependencies -./scripts/client.sh install - -# Check code quality -./scripts/client.sh lint - -# Run tests -./scripts/client.sh test - -# Show help -./scripts/client.sh help -``` - -**Environment Variables:** -- `PORT`: Development server port (default: 8080) -- `HOST`: Development server host (default: localhost) -- `DEPLOY_TARGET`: Deployment target - netlify, vercel, s3, github, or manual (default: manual) -- `S3_BUCKET`: S3 bucket name (required for S3 deployment) - -**Features:** -- **Development Server**: Starts a local HTTP server with CORS headers for frontend development -- **Production Build**: Creates optimized production files in `dist/` directory -- **Multiple Deployment Options**: Supports Netlify, Vercel, AWS S3, GitHub Pages, and manual deployment -- **Code Quality**: Integrates with ESLint, Stylelint, and HTML Tidy (if installed) -- **Dependency Management**: Handles Python virtual environment setup -- **Clean Build**: Removes build artifacts and cache files - -**Deployment Targets:** -- `netlify`: Deploy using Netlify CLI -- `vercel`: Deploy using Vercel CLI -- `s3`: Deploy to AWS S3 bucket (requires AWS CLI and S3_BUCKET env var) -- `github`: Shows instructions for GitHub Pages deployment -- `manual`: Shows manual deployment instructions - -## Example Workflows - -### Basic workflow: -```bash -# Build and tag with version -IMAGE_TAG=v1.0.0 ./scripts/build.sh - -# Deploy to Cloud Run -DEPLOY_TO_CLOUD_RUN=true PROJECT_ID=my-project-id IMAGE_TAG=v1.0.0 ./scripts/deploy.sh -``` - -### Using the Cloud Run config file: -```bash -# Build and deploy in one step -PROJECT_ID=my-project-id BUILD=true PUSH=true ./scripts/deploy-to-cloud-run.sh -``` - -### Frontend Development Workflow: -```bash -# Install dependencies -./scripts/client.sh install - -# Start development server -./scripts/client.sh dev - -# Build for production -./scripts/client.sh build - -# Deploy to Netlify -DEPLOY_TARGET=netlify ./scripts/client.sh deploy -``` - -# Scripts Documentation - -This directory contains utility scripts for the CONTOSO application. - -## Database Seeding Scripts - -### `seed_firestore.py` - -This script initializes and seeds a Google Cloud Firestore database with initial data for the CONTOSO application. It creates teams, users, API keys, and sample image metadata. - -#### Requirements - -- Google Cloud project with Firestore enabled -- Google Cloud credentials configured on your machine -- Python 3.8+ -- Required Python packages (listed in `requirements.txt`) - -#### Setup - -1. Make sure you have the Google Cloud SDK installed and configured with access to your project: - ```bash - gcloud auth login - gcloud config set project YOUR_PROJECT_ID - ``` - -2. If not using application default credentials, create a service account key file: - ```bash - gcloud iam service-accounts create contoso-app - gcloud projects add-iam-policy-binding YOUR_PROJECT_ID --member="serviceAccount:contoso-app@YOUR_PROJECT_ID.iam.gserviceaccount.com" --role="roles/datastore.user" - gcloud iam service-accounts keys create credentials.json --iam-account=contoso-app@YOUR_PROJECT_ID.iam.gserviceaccount.com - ``` - -3. Set environment variables: - ```bash - # Windows (CMD) - set DATABASE_TYPE=firestore - set GCS_CREDENTIALS_FILE=path/to/credentials.json - - # Windows (PowerShell) - $env:DATABASE_TYPE="firestore" - $env:GCS_CREDENTIALS_FILE="path/to/credentials.json" - - # Linux/macOS - export DATABASE_TYPE=firestore - export GCS_CREDENTIALS_FILE=path/to/credentials.json - ``` - -#### Usage - -Run the seeding script from the project root directory: - -```bash -# Activate the Python virtual environment -source venv/bin/activate # Linux/macOS -venv\Scripts\activate # Windows - -# Run the script -python scripts/seed_firestore.py -``` - -#### Generated Data - -The script will create the following data: - -1. **Teams**: - - Contoso Development - - Marketing Team - - Customer Support - -2. **Users**: - - Admin User (team: Contoso Development) - - Developer User (team: Contoso Development) - - Marketing User (team: Marketing Team) - - Support User (team: Customer Support) - -3. **API Keys**: - - One API key per user (the keys will be output to the console, save them securely) - -4. **Images**: - - Sample image metadata (3 images, one for each team) - -#### Notes - -- The script logs the generated API keys to the console. Save these keys somewhere secure as they won't be displayed again. -- If you need to re-run the script with existing data, use the `--force` flag to overwrite existing data. -- This script only creates metadata entries for images - it does not upload actual files to Google Cloud Storage. \ No newline at end of file