Permit Tracking System (PTS) microservice with Azure serverless python function
Query http status of the serverless function.
Example
$ curl https://<host>/api/status/http
{"status": "success", "data": {"message": "200 OK"}}
Query status of PTS connection
Example
$ curl https://<host>/api/status/pts
--header 'ACCESS_KEY: 111111'
{"status": "success", "data": {"message": "200 OK"}}
POST permit information to PTS
$ curl --location --request POST 'https://<host>/api/permit'
--header 'ACCESS_KEY: 111111'
--header 'Content-Type: application/json'
--data-raw '{
"P_AVS_ADDRESS_ID": 100000,
"P_SCOPE_OF_WORK": "TEST",
"P_VALUATION": 0,
"P_APPLICANT_FIRST_NAME": "FIRST",
"P_APPLICANT_LASTINNAME": "LAST",
"P_APPLICANT_EMAIL_ADDRESS": "TEST@TEST.TEST",
"P_APPLICANT_PHONE_NUMBER": 4151111111,
"P_APPLICANT_LICENSE_NUMBER": "000001",
"P_APPLICANT_ROLE": "CONTRACTOR",
"P_CONTACT1_FIRST_NAME": "FIRST",
"P_CONTACT1_LASTINNAME": "LAST",
"P_CONTACT1_EMAIL_ADDRESS": "TEST@TEST.TEST",
"P_CONTACT1_PHONE_NUMBER": 4151111111,
"P_CONTACT1_LICENSE_NUMBER": "ABC",
"P_FORMIO": "111111111"
}'
{ "status": "success", "data": { "out": { "P_STATUS": "OKAY", "P_MSG": null, "P_APP_NUM": "1234567890" } }
GET permits based on AVS address id
OKAY
$ curl --request GET 'https://<host>/api/permit?avs_address_id=12345&limit=1'
--header 'ACCESS_KEY: 111111'
{"status": "success", "data": {"out": {"P_PERMITS": [{"APPLICATION_NUMBER": "12345", "DESCRIPTION": "None", "CURRENT_STATUS": "TRIAGE", "CURRENT_DATE": "2023-01-01 14:21:07", "APPLICATION_CREATION_DATE": "2022-11-14 14:38:22", "APPLLCANT_NAME": "BROCK PURDY", "ROLE": "CONTRACTOR"}]}}}
External references can be pass through by using EXT_ prefix, such as EXT_ID.
$ curl --location --request POST 'https://<host>/api/permit'
--header 'ACCESS_KEY: 111111'
--header 'Content-Type: application/json'
--data-raw '{
...,
EXT_ID: "1234"
}'
{ "status": "success", "data": { "out": { ..., EXT_ID: "1234" } }
PUT Blubeam Project ID into Permit Application
$ curl --request PUT 'https://<host>/api/permit/bluebeam'
--header 'ACCESS_KEY: 111111'
--header 'Content-Type: application/json'
--data-raw '{
"P_APPLICATION_NUMBER": 1234567890,
"P_BLUEBEAM_PROJ_NO": "111-111-111"
}'
{"status": "success", "data": {"out": {"P_STATUS": "SUCCESS", "P_MSG": "Application has been updated"}}}
GET complaint based on AVS address id
OKAY
$ curl --request GET 'https://<host>/api/complaint?avs_address_id=12345'
--header 'ACCESS_KEY: 111111'
{"status": "success", "data": {"out": {"P_STATUS": "OKAY", "P_MSG": "No Active Complaints Found"}}}
ERROR
$ curl --request GET 'https://<host>/api/complaint?avs_address_id=12345'
{"status": "success", "data": {"out": {"P_STATUS": "ERROR", "P_MSG": "|Active complaint found 100000001|Active complaint found 100000002|Active complaint found 100000003"}}}
https://www.oracle.com/cis/database/technologies/instant-client/downloads.html
libaio1
package is required. If needed install via SSH apt-get install libaio1
DO NOT USE "SWAP" option until issue is resolved.
see more at: Azure/azure-functions-host#7336
Install git-lfs This is required because the Oracle Instant Client files are larger. Not having git-lfs will cause those files to become corrupted when pulling the files locally from github.
$ brew install git-lfs
Install Pipenv (if needed)
$ pip install --user pipenv
Install included packages
$ pipenv install
Output virtualenv information
$ pipenv --venv
Build the container image and test locally
Build
$ docker build --tag <DOCKER_ID>/azurefunctionsimage:1.0.0 .
Run
$ docker run -p 8080:80 -it <docker_id>/azurefunctionsimage:1.0.0
Run with .env file
$ docker run -p 8080:80 --env-file .env -it <docker_id>/azurefunctionsimage:1.0.0
Azure Gov Cloud Container Registry Quick Start
Create a function in Azure with Python using Visual Studio Code
Create a Python function in Azure from the command line
Documentation
In Functions, application settings
, such as service connection strings, are exposed as environment variables during execution. You can access these settings by declaring import os
and then using, setting = os.environ["setting-name"]
. See example of local.settings.json
file at local.settings.example.json
.
Currently Azure Python Functions does not support pipenv. However we can run pipenv lock --requirements
to produce a requirements file for the non-dev requirements and pipenv lock --requirements --dev
to produce one for just the dev requirements.
sample usage:
production
$ pipenv lock --requirements > requirements.txt
development
pipenv lock --requirements --dev > requirements-dev.txt
DO NOT include azure-functions-worker in requirements.txt The Python Worker is managed by Azure Functions platform Manually managing azure-functions-worker may cause unexpected issues
Code coverage command with missing statement line numbers
$ pipenv run python -m pytest --cov --cov-report term-missing
Set up git hook scripts with pre-commit
$ pipenv run pre-commit install
- Setup
.env
- Setup environmental variables from
local.settings.json
- Setup environmental variables from
- Setup coveralls.
- Log into coveralls.io to obtain the coverall token for your repo.
- Create an environment variable in CircleCI with the name
COVERALLS_REPO_TOKEN
and the coverall token value.
reference: How to fork your own repo in Github
First, create a new blank repo that you want to ultimately be a fork of your existing repo. We will call this new repo "my-awesome-microservice-py".
Next, make a clone of that new blank repo on your machine:
$ git clone https://github.com/SFDigitalServices/my-awesome-microservice-fn-py.git
While this technically isn’t forking, its basically the same thing. What you want to do is add a remote upstream to this new empty repo that points to your original repo you want to fork:
$ git remote add upstream https://github.com/SFDigitalServices/microservice-fn-py.git
The last step is to pull down a complete copy of the original repo:
$ git fetch upstream
$ git merge upstream/main
Or, an easier way:
$ git pull upstream main
Now, you can work on your new repo to your hearts content. If any changes are made to the original repo, simply execute a git pull upstream main
and your new repo will receive the updates that were made to the original!
Psst: Don't forget to upload the fresh copy of your new repo back up to git:
$ git push origin main