{"id":39711052,"url":"https://github.com/oracle-samples/oci-ag","last_synced_at":"2026-01-18T10:38:28.293Z","repository":{"id":329972441,"uuid":"1098838472","full_name":"oracle-samples/oci-ag","owner":"oracle-samples","description":"The open source repo for Oracle Access Governance Data Feed Analytics (DFA)","archived":false,"fork":false,"pushed_at":"2025-12-22T15:10:58.000Z","size":744,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-12-24T02:35:36.979Z","etag":null,"topics":["access-governance","dfa","etl"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"upl-1.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/oracle-samples.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE.txt","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-18T07:59:05.000Z","updated_at":"2025-12-22T15:11:03.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/oracle-samples/oci-ag","commit_stats":null,"previous_names":["oracle-samples/oci-ag"],"tags_count":null,"template":false,"template_full_name":"oracle/template-repo","purl":"pkg:github/oracle-samples/oci-ag","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-samples%2Foci-ag","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-samples%2Foci-ag/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-samples%2Foci-ag/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-samples%2Foci-ag/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/oracle-samples","download_url":"https://codeload.github.com/oracle-samples/oci-ag/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/oracle-samples%2Foci-ag/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28534559,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-18T10:13:46.436Z","status":"ssl_error","status_checked_at":"2026-01-18T10:13:11.045Z","response_time":98,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.6:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["access-governance","dfa","etl"],"created_at":"2026-01-18T10:38:28.152Z","updated_at":"2026-01-18T10:38:28.227Z","avatar_url":"https://github.com/oracle-samples.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Oracle - Access Governance Data Feed Analytics (DFA)\n\nData Feed Analytics (DFA) is an implementation to extract, transform, and load (ETL) data published by the Data Feed feature in the Oracle Access Governance product. This implementation creates several resources (listed below) in your OCI tenancy and transforms the published data into an Oracle Autonomous Database. This makes it simpler to query the data to build powerful reports in your preferred choice of BI tools.\n\n## Getting Started\n\n### Prerequisites\n\nPlease verify the following resources can be created in your OCI tenancy (ensuring access and permissions to list, create, and manage the resource as well as availability of resource limits):\n    - VCN  \n    - Vault  \n    - Master Encryption Key  \n    - Secrets  \n    - Autonomous Database  \n    - Functions Application  \n    - Concurrency for Functions (70 units required by default)  \n    - Event Rules  \n    - Connector Hubs  \n    - Dynamic Group  \n    - Policy  \n\nInstall OCI CLI: https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/cliinstall.htm  \nInstall Python: https://www.python.org/downloads/. Python version 3.12.x is required.  \nInstall Docker/Podman in order to build images: https://www.docker.com/get-started https://podman.io/get-started  \nSet up a virtual environment for Python: https://docs.python.org/3/library/venv.html  \n\n\n### Run Unit Tests\n\nTo execute DFA's unit tests, ensure the tox package is installed in your virtual environment, and python version is set to 3.11.x. \nNavigate to the project's root, and run: `tox`\n\n### Build and Upload Docker Image\n\nThe following article describes a quick tutorial on how to build and upload Docker images -  \nhttps://www.oracle.com/webfolder/technetwork/tutorials/obe/oci/registry/index.html\n\n1. Log in to your OCI tenancy. \n2. Navigate to the Container Registry. \n3. Create a new repo in the target compartment (i.e dfa-images/dfa). This name must be unique across the tenancy. Update the REPOSITORY_NAME variable value in config.ini to match the new repo name if needed. \n4. Build the DFA image. If using podman, replace 'docker' with 'podman' for the following commands. \n```shell\ndocker build --platform linux/amd64 -t \u003cregion-key\u003e.ocir.io/\u003ctenancy-namespace\u003e/\u003coci-repo-name\u003e:0.1.0 -f Dockerfile .\n```\nExample:\n```shell\ndocker build --platform linux/amd64 -t iad.ocir.io/iwxyzlmkmn63/dfa-images/dfa:0.1.0 -f Dockerfile .\n```\n5. Log in to Docker. \n\n```shell\ndocker login \u003cregion-key\u003e.ocir.io\nUsername: \u003cdocker-username\u003e\nPassword: \u003coci-auth-token\u003e\n```\nNote: The username may be \u003ctenancy-namespace\u003e/\u003cidentity-domain\u003e/\u003cusername\u003e for service accounts. \n\n6. Push the image to your OCI tenancy. \n```shell\ndocker push \u003cregion-key\u003e.ocir.io/\u003ctenancy-namespace\u003e/\u003coci-repo-name\u003e:0.1.0\n```\nExample:\n```shell\ndocker push iad.ocir.io/iwxyzlmkmn63/dfa-images/dfa:0.1.0\n```\n\n### Configure and Run Installer\n\nAs part of the installation process, the installer script will create the following OCI resources in your tenancy:\n- VCN\n- Vault\n- Secrets\n- Autonomous Database\n- Database Schema\n- Database Tables\n- Functions Application\n- OCI Functions\n- Event Rules\n- Connector Hubs\n- Dynamic Group\n- Policy\n\nLogin to your OCI tenancy to get the following values. These are added to the repository's config.ini file and are utilized by the installer script - \n\n**1. Tenancy ID**\n1. Click on your profile icon in the upper right corner. Then click on Tenancy.\n2. Copy and paste this value to the `DFA_TENANCY_ID` variable in the `config.ini` file.\n\n**2. Region, Region Key, and Realm Key**\n1. Note your region in the upper right corner of your OCI console.\n2. Open this link: https://docs.oracle.com/en-us/iaas/Content/General/Concepts/regions.htm#:~:text=%3A-,Region%20Name,-Region%20Identifier\n3. Copy and paste the corresponding Region Identifier to the `DFA_REGION_ID` variable in `config.ini`.\n4. Copy and paste the corresponding Region Key to the `DFA_REGION_KEY` variable in `config.ini`.\n5. Copy and paste the corresponding Realm Key to the `DFA_REALM_KEY` variable in `config.ini`.\n\n**3. Data Feed Stream ID and Service Endpoint**\n1. Click on the OCI hamburger menu in the upper left corner. \n2. Select Storage. Under Object Storage \u0026 Archive Storage, select Buckets.\n3. From the list of buckets, select the bucket configured with AG Data Feed. (Note: Ensure that the Emit Objects Events feature is Enabled)\n4. Copy and paste the bucket name to the DFA_BUCKET_NAME variable in the config.ini file.\n5. Copy and paste the Namespace to the DFA_NAMESPACE variable in the config.ini file.\n6. Click on the hyperlink next to Compartment.\n7. Copy and paste the Compartment OCID to the DFA_COMPARTMENT_ID variable in the config.ini file.\n\n**4. Data Feed Stream ID and Service Endpoint**\n1. Click on the OCI hamburger menu in the upper left corner.\n2. Select Analytics \u0026 AI. Under Messaging, select Streaming. \n3. From the list of streams, select the stream configured with AGCS Data Feed.\n4. Copy and paste the Stream OCID to the DFA_STREAM_ID variable in the config.ini file.\n5. Copy and paste the Messages endpoint to the DFA_STREAM_SERVICE_ENDPOINT variable in the config.ini file.\n\n\n### Authentication\nThe installer uses the OCI CLI config created for an API key or a temporary session token.\n- API signing key: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#apisigningkey_topic_How_to_Generate_an_API_Signing_Key_Console\n- Temporary session token: https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/clitoken.htm\n\nIf you are using command line, follow this link to generate a temporary security token: https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/clitoken.htm \nKeep in mind that this is a temporary token and will expire 1 hour from creation. The token can be re-authenticated or refreshed as seen here: https://docs.oracle.com/en-us/iaas/Content/API/SDKDocs/clitoken.htm#Refreshing_a_Token \n\nIf you are using OCI Cloud Shell, follow this link: https://docs.oracle.com/en-us/iaas/Content/API/Concepts/apisigningkey.htm#apisigningkey_topic_How_to_Generate_an_API_Signing_Key_Console  \nThen add the following line to your new config:\n`delegation_token_file=/etc/oci/delegation_token`\n\nOnce the configuration file is ready:\n1. Replace the value of DFA_CONFIG_LOCATION in the config.ini file with the path to your config file. \n2. Replace the value of DFA_CONFIG_PROFILE in the config.ini file with the profile name. \n3. Replace the value of OCI_AUTH_TYPE in the config.ini file with security_token_file if you are using a temporary session token or delegation_token_file if using Cloud Shell. \n\n\n### Run the Installer\n\nTo run the installer:\n1. Clone the DFA repository. \n2. Make sure you are authenticated to OCI. \n3. Ensure Docker images are pushed to OCI.\n4. In a terminal or IDE, navigate to the DFA project's root. \n5. Create and activate the virtual environment. \n6. Install the following packages in the virtual environment using `pip install`\n    - fdk\n    - oci\n    - oracledb\n    - pandas\n    - pypika\n7. Run `export PYTHONPATH=/Users/yourName/oci-ag/src`\nPaste the full path to DFA's source directory for the PYTHONPATH. \n8. Run `python installer.py installer.log 2\u003e\u00261`\n\nNote: The creation of the Vault and Master Key can take time, the script will wait a max of 20 minutes for an Active state before timing out. In the case of a timeout, please run the script again once the resource is in an active state in OCI. \n\n### Final Steps and Validation\n1. To enable logging for your transformer functions, navigate to the newly created OCI function application. Click on Monitoring. Under Logs, click on the 3 dots next to Function Invocation Logs. Click Enable log. Choose a log group and provide a name for your logs. \n2. Navigate to your Data Feed bucket in OCI object storage. Ensure that the 'Emit Objects Events' feature is Enabled. Else, the file data will not be processed by DFA. \n3. If `MANUALLY_CREATE_DYNAMIC_GROUP` was set to True, navigate to the Identity Domain and create a new dynamic group called `dfa-functions` with the values given at the end of the script execution. This dynamic group will contain all the function OCIDs. \n\nThe script can take a few minutes to complete. Once it's done, you can navigate to the OCI console and see all the new resources that were created. All the resources created with the script will have the following tag \n\n{'Feature' : 'Data Feed Analytics(DFA)'}\n\n## Documentation\n\n### OCI Policies to be Created\n\nThe script will create the required OCI Policies, but for reference the following policies are required:\n- Allow dynamic group \u0026lt;domain\u0026gt;/dfa-functions to manage vaults in compartment id \u0026lt;compartment-ocid\u0026gt;\n- Allow dynamic group \u0026lt;domain\u0026gt;/dfa-functions to manage secret-family in compartment id \u0026lt;compartment-ocid\u0026gt;\n- Allow dynamic group \u0026lt;domain\u0026gt;/dfa-functions to use keys in compartment id \u0026lt;compartment-ocid\u0026gt;\n- Allow dynamic group \u0026lt;domain\u0026gt;/dfa-functions to manage autonomous-databases in compartment id \u0026lt;compartment-ocid\u0026gt;\n- Allow dynamic group \u0026lt;domain\u0026gt;/dfa-functions to manage object-family in compartment id \u0026lt;compartment-ocid\u0026gt;\n- Allow any-user to {STREAM_READ, STREAM_CONSUME} in compartment id \u0026lt;compartment-ocid\u0026gt; where all {request.principal.type='serviceconnector', target.stream.id='\u0026lt;stream-ocid\u0026gt;, request.principal.compartment.id='\u0026lt;compartment-ocid\u0026gt;'}\n- Allow any-user to use fn-function in compartment id \u0026lt;compartment-ocid\u0026gt; where all {request.principal.type='serviceconnector', request.principal.compartment.id='\u0026lt;compartment-ocid\u0026gt;'}\n- Allow any-user to use fn-invocation in compartment id \u0026lt;compartment-ocid\u0026gt; where all {request.principal.type='serviceconnector', request.principal.compartment.id='\u0026lt;compartment-ocid\u0026gt;'}\n\n### Config.ini Variables Explained\nThere are a few variables in the config.ini file that can be replaced if you choose to and some that are required. \n\u003c/br\u003e\n\nThe installer will create a new vault in OCI by default. If you would prefer to reuse an existing vault, paste the vault OCID to the `DFA_VAULT_ID` variable in the config.ini file. Note that a vault is required. The script will create secrets and the DFA code will reference these secrets. \n\u003c/br\u003e\n\nThe installer will by default download the DB wallet to the /tmp location in your local file system. To change this, please assign the desired location to the `DFA_LOCAL_SAVE_DIRECTORY` variable in the config.ini file. \n\u003c/br\u003e\n\nThe installer will create State tables but will not create Time Series tables in the database by default. While State tables are a current snapshot of the AG data, Time Series tables show a history of all the events. To create the required resources for the Time Series, set the `CREATE_TIME_SERIES` variable in the config.ini file to True. \n\u003c/br\u003e\n\nThe `OCI_AUTH_TYPE` variable accepts the values 'security_token_file' or 'delegation_token_file' based on how you've decided to authenticate. \n\u003c/br\u003e\n\nIf your OCI tenancy has restrictions on creating dynamic groups at the tenancy level, set the `MANUALLY_CREATE_DYNAMIC_GROUP` variable in config.ini to True. Please manually create a dynamic group in your desired domain using the statement printed out at the end of the script. Replace the `DYNAMIC_GROUP_DOMAIN` variable in config.ini with the domain name where the dynamic group will be created. \n\u003c/br\u003e\n\nBy default, the installer script will create the resources with prefix 'dfa'. This can be changed by updating the `RESOURCE_NAME_PREFIX` variable in config.ini. \n\u003c/br\u003e\n\nAny variable ending in *_FUNCTION_PROVISIONED_CONCURRENCY is related to the provisioned concurrency units used by the OCI Functions. Adjust these values in config.ini as needed based on tenancy limits and amount of AG data. The concurrency units can be changed in OCI once the functions have been created by the script. \n\u003c/br\u003e\n\nAny variable ending in *_SECRET_NAME is related to secrets in the vault. The installer script creates secrets in an OCI vault to store the DB's ewallet.pem file contents, wallet.sso file contents, user schema name, and user schema password. The secrets will be named based off the values assigned to the *_SECRET_NAME variables. Once the script has created the secrets in the vault, changing the names in the config.ini file will not update the secret names in the OCI Vault, they must be manually changed. \n\u003c/br\u003e\n\nThe `REPOSITORY_NAME` and `IMAGE_VERSION` variables should match the name and version tag of the Docker image built in Step 2. If necessary, update them in the config.ini file to ensure consistency.\n\u003c/br\u003e\n\nThe `DFA_RECREATE_DFA_ADW_TABLES` variable should be set to false when running the script for the first time. This variable should be set to true if a table's schema or unique constraints have changed. Setting this variable to true will delete the existing DFA tables and will re-create them. \n\u003c/br\u003e\n\n\n### Delete OCI Resources \n\nIn the case you need to delete the OCI resources created by the installer script, search for the tag `'Data Feed Analytics(DFA)'` in OCI. Then, delete all the resources associated with that tag as all the OCI resources created by the script will contain the tag. \n\n### Relevant Documentation\n- Applications and Functions: https://docs.oracle.com/en-us/iaas/Content/Functions/Tasks/functionscreatingapps.htm#top  \n- Connector Hub: https://docs.oracle.com/en-us/iaas/Content/connector-hub/create-service-connector.htm  \n- Event Rules: https://docs.oracle.com/en-us/iaas/Content/Events/Concepts/eventsgetstarted.htm#Console  \n- Using Cloud Shell Private Networking (for databases on private endpoint): https://docs.oracle.com/en-us/iaas/Content/API/Concepts/cloudshellintro_topic-Cloud_Shell_Networking.htm#Cloud_Shell_Private_Access:~:text=Using%20Cloud%20Shell%20Private%20Networking \n\n## Examples\n\n- See the detailed Examples and Tutorials section below: [Examples and Tutorials](#examples-and-tutorials)\n- Unit test backed examples:\n  - File-based: tests/dfa/etl/test_file_transformer.py (uses sample JSONL in tests/dfa/etl/test_data/file/)\n  - Stream-based: tests/dfa/etl/test_stream_transformer.py\n  - Audit events: tests/dfa/etl/test_audit_transformer.py\n  - Run locally with coverage: `tox -e py312`\n- Quick local demo snippet:\n  ```python\n  import os\n  from dfa.etl.file_transformer import FileTransformer\n\n  os.environ.setdefault(\"DFA_BATCH_SIZE\", \"10000\")\n  os.environ.setdefault(\"DFA_LOG_LEVEL\", \"INFO\")\n\n  t = FileTransformer(namespace=\"your-namespace\", bucket_name=\"your-bucket\", object_name=\"path/to/object.jsonl\")\n  t.extract_data()\n  t.transform_data()\n  t.clean_data()\n  t.load_data()\n  ```\n- OCI tutorials:\n  - Functions: https://docs.oracle.com/en-us/iaas/Content/Functions/Tasks/functionscreatingapps.htm\n  - Service Connector Hub: https://docs.oracle.com/en-us/iaas/Content/connector-hub/create-service-connector.htm\n  - Events: https://docs.oracle.com/en-us/iaas/Content/Events/Concepts/eventsgetstarted.htm\n\n## Help\n\nNeed help? Please contact Oracle Customer Support: https://support.oracle.com/signin\n\n## Contributing\n\nThis project is not accepting external contributions at this time. For bugs or enhancement requests, please file a GitHub issue unless it's security related. When filing a bug remember that the better written the bug is, the more likely it is to be fixed. If you think you've found a security vulnerability, do not raise a GitHub issue and follow the instructions in our security policy.\n\n## Security\n\nPlease consult the [security guide](./SECURITY.md) for our responsible security vulnerability disclosure process\n\n## Runtime Configuration and Environment Variables\nAt runtime (inside OCI Functions), the application expects environment variables for configuration. The installer creates most of the necessary infrastructure and secrets; the function should reference these via environment variables.\n\nCore runtime environment variables:\n- DFA_FUNCTION_NAME: Selects which handler to run. Supported values:\n  - `audit`, `stream`, `file`, `stream_to_ts`, `file_to_ts`\n- DFA_LOG_LEVEL: Optional log level for structured logs. Defaults to `INFO`. Examples: `DEBUG`, `INFO`, `WARNING`.\n- DFA_BATCH_SIZE: Optional batch size for load operations. Defaults to `10000`.\n\nADW connection and wallet:\n- DFA_ADW_DFA_SCHEMA: Database username (schema) for DFA.\n- DFA_CONN_PROTOCOL: Typically `tcps`.\n- DFA_CONN_HOST: Database host.\n- DFA_CONN_PORT: Database port (e.g., `1522`).\n- DFA_CONN_SERVICE_NAME: Database service name.\n- DFA_CONN_RETRY_COUNT: Optional retry count for connection.\n- DFA_CONN_RETRY_DELAY: Optional delay between retries.\n- DFA_ADW_DFA_USER_PASSWORD_SECRET_NAME: Secret name for DFA user password.\n- DFA_ADW_WALLET_SECRET_NAME: Secret name for cwallet.sso.\n- DFA_ADW_WALLET_PASSWORD_SECRET_NAME: Secret name for wallet password.\n- DFA_ADW_EWALLET_PEM_SECRET_NAME: Secret name for ewallet.pem.\n\nOCI access and vault:\n- DFA_SIGNER_TYPE: `resource` (default for Functions) or `user` (when using a user token).\n- DFA_VAULT_ID: OCID of the vault holding secrets.\n- DFA_COMPARTMENT_ID: OCID of the compartment where secrets reside.\n- DFA_CONFIG_LOCATION / DFA_CONFIG_PROFILE: Required if `DFA_SIGNER_TYPE=user` for reading OCI CLI config.\n\nNotes:\n- The connection layer enforces secure wallet directory permissions and constructs DSNs robustly.\n- Missing or unknown secrets will raise a descriptive error with the secret name and vault/compartment identifiers.\n\n## Version Alignment\n- Python: The project targets Python 3.12 (tox env `py312`, requires-python `\u003e=3.12`).\n- Ensure the Functions base image and local tooling use Python 3.12 for consistency, or adjust tox/metadata if you decide to use another version and validate dependencies.\n\n## Examples and Tutorials\n\nThis repository includes practical examples you can use to understand DFA’s ETL flow and to validate your setup locally.\n\n- Unit-test backed examples (recommended starting point)\n  - Explore the test suites under tests/dfa/etl to see input and expected transformations:\n    - File-based examples: tests/dfa/etl/test_file_transformer.py\n      - Uses sample JSONL in tests/dfa/etl/test_data/file/*.jsonl (e.g., permission.jsonl, identity.jsonl)\n    - Stream-based examples: tests/dfa/etl/test_stream_transformer.py\n    - Audit events example: tests/dfa/etl/test_audit_transformer.py\n  - Run with coverage:\n    tox -e py312\n\n- Minimal local snippet (FileTransformer)\n  - Illustrative example of how a file-based event is processed (assumes BaseObjectStorage configured and PYTHONPATH=./src):\n    ```python\n    import os\n    from dfa.etl.file_transformer import FileTransformer\n\n    # Example environment for batch sizing and logging\n    os.environ.setdefault(\"DFA_BATCH_SIZE\", \"10000\")\n    os.environ.setdefault(\"DFA_LOG_LEVEL\", \"INFO\")\n\n    # Replace with your namespace/bucket/object\n    t = FileTransformer(namespace=\"your-namespace\", bucket_name=\"your-bucket\", object_name=\"path/to/object.jsonl\")\n    t.extract_data()\n    t.transform_data()\n    t.clean_data()\n    t.load_data()  # Writes to ADW using configured wallet and connection details\n    ```\n\n- Minimal local snippet (dispatcher)\n  - The dispatcher selects the handler by DFA_FUNCTION_NAME (audit, stream, file, stream_to_ts, file_to_ts):\n    ```python\n    import io\n    import json\n    from types import SimpleNamespace\n    from handlers.dispatcher import dispatch\n\n    # Emulate Fn context with Config().get(...)\n    ctx = SimpleNamespace(Config=lambda: SimpleNamespace(get=lambda k, d=None: \"file\"))\n    # Example body for file handler (object storage event)\n    body = {\n      \"data\": {\n        \"resourceName\": \"path/to/object.jsonl\",\n        \"additionalDetails\": {\"bucketName\": \"your-bucket\", \"namespace\": \"your-namespace\"},\n      }\n    }\n    data = io.BytesIO(json.dumps(body).encode(\"utf-8\"))\n    result = dispatch(ctx, data)\n    print(result)\n    ```\n\n- Sample configuration walkthrough\n  - Review README “Configure and Run Installer” to create OCI resources (VCN, Vault, ADW, Functions, Event Rules, Service Connectors).\n  - Use config.ini to map your tenancy and resource identifiers.\n  - The installer creates the required resources and secrets; the application reads ADW wallet/password secrets and connects securely to ADW.\n\n- Docker demo\n  - Build the image (see Build and Upload Docker Image section) and run it with your environment variables configured to point to OCI Vault/ADW and Stream/Bucket sources.\n\nHelpful tutorials and docs\n- OCI Functions getting started: https://docs.oracle.com/en-us/iaas/Content/Functions/Tasks/functionscreatingapps.htm\n- Service Connector Hub: https://docs.oracle.com/en-us/iaas/Content/connector-hub/create-service-connector.htm\n- OCI Events: https://docs.oracle.com/en-us/iaas/Content/Events/Concepts/eventsgetstarted.htm\n\nIf you’d like a guided demo, start by running tox -e py312 which exercises the ETL logic against included sample datasets and prints out transformation progress in the logs.\n\n## License\n\nCopyright (c) 2025 Oracle and/or its affiliates.\nReleased under the Universal Permissive License v1.0 as shown at\n\u003chttps://oss.oracle.com/licenses/upl/\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foracle-samples%2Foci-ag","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Foracle-samples%2Foci-ag","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Foracle-samples%2Foci-ag/lists"}