Provision is a user and account micro-platform, a highly opinionated building block for TXN2 components. Provision defines basic object models that represent the foundation for an account, user and asset. Provision is intended as a fundamental dependency of current and future TXN2 platform services.
- Elasticsearch is used as a database for Account, User and Asset objects.
- Intended for basic storage, retrieval and searching.
Provision is intended as in internal service to be accessed by other services. Use a secure reverse proxy for direct access by system operators.
Configuration is inherited from txn2/micro. The following configuration is specific to provision:
Flag | Environment Variable | Description |
---|---|---|
-esServer | ELASTIC_SERVER | Elasticsearch Server (default "http://elasticsearch:9200") |
-systemPrefix | SYSTEM_PREFIX | Prefix for system indices. (default "system_") |
Method | Route Pattern | Description |
---|---|---|
GET | /prefix | Get the prefix used for Elasticsearch indexes. |
POST | /account | Upsert an Account object. |
GET | /account/:id | Get an Account ojbect by id. |
POST | /keyCheck/:id | Check if an AccessKey is associated with an account. |
POST | /searchAccounts | Search for Accounts with a Lucene query. |
POST | /user | Upsert a User object. |
GET | /user/:id | Get a User object by id. |
POST | /searchUsers | Search for Users with a Lucene query. |
POST | /userHasAccess | Post an AccessCheck object with Token to determine basic access. |
POST | /userHasAdminAccess | Post an AccessCheck object with Token to determine admin access. |
POST | /authUser | Post Credentials and if valid receive a Token. |
POST | /asset | Upsert an Asset. |
GET | /asset/:id | Get an asset by id. |
POST | /searchAssets | Search for Assets with a Lucene query. |
GET | /adm/:parentAccount/account/:account | Get a child account. |
POST | /adm/:parentAccount/account | Upsert a child account. |
GET | /adm/:parentAccount/children | Get children of parent account. |
GET | /adm/:parentAccount/assets/:account | Get assets with associations to account. |
GET | /adm/:parrentId/assetAssoc/:asset/:accountFrom/:accountTo | Re-associate any routes from specified account to another (child or self) |
Testing using Elasticsearch and Kibana in docker compose:
docker-compose up
Run for source:
go run ./cmd/provision.go --esServer="http://localhost:9200"
curl http://localhost:8080/prefix
curl -X POST \
http://localhost:8080/account \
-H 'Content-Type: application/json' \
-d '{
"id": "test_account",
"description": "This is a test account",
"display_name": "Test Organization",
"active": true,
"access_keys": [
{
"name": "test-data",
"key": "sRqhFPdudA9s8qtVqgixHXyU8ubbYhrCBttC8amLdMwkxeZHskseNXyCRe4eXRxP",
"description": "Generic access key",
"active": true
},
{
"name": "test",
"key": "PDWgYr3bQGNoLptBRDkLTGQcRmCMqLGRFpXoXJ8xMPsMLMg3LHvWpJgDu2v3LYBA",
"description": "Generic access key 2",
"active": true
}
],
"modules": [
"telematics",
"wx",
"data_science",
"gpu"
]
}'
curl http://localhost:8080/account/test_account
curl -X POST \
http://localhost:8080/searchAccounts \
-d '{
"query": {
"match_all": {}
}
}'
curl -X POST \
http://localhost:8080/keyCheck/test_account \
-H 'Content-Type: application/json' \
-d '{
"name": "test_data",
"key": "sRqhFPdudA9s8qtVqgixHXyU8ubbYhrCBttC8amLdMwkxeZHskseNXyCRe4eXRxP"
}'
curl -X POST \
http://localhost:8080/user \
-H 'Content-Type: application/json' \
-d '{
"id": "test_user",
"description": "Test User non-admin",
"display_name": "Test User",
"active": true,
"sysop": false,
"password": "eWidL7UtiWJABHgn8WAv8MWbqNKjHUqhNC7ZaWotEFKYNrLvzAwwCXC9eskPFJoY",
"sections_all": false,
"sections": ["api", "config", "data"],
"accounts": ["test"],
"admin_accounts": []
}'
curl -X GET http://localhost:8080/user/test_user
curl -X POST \
http://localhost:8080/searchUsers \
-d '{
"query": {
"match_all": {}
}
}'
curl -X POST \
http://localhost:8080/authUser \
-H 'Content-Type: application/json' \
-d '{
"id": "test_user",
"password": "eWidL7UtiWJABHgn8WAv8MWbqNKjHUqhNC7ZaWotEFKYNrLvzAwwCXC9eskPFJoY"
}'
# first get a token
TOKEN=$(curl -s -X POST \
http://localhost:8080/authUser?raw=true \
-d '{
"id": "test_user",
"password": "eWidL7UtiWJABHgn8WAv8MWbqNKjHUqhNC7ZaWotEFKYNrLvzAwwCXC9eskPFJoY"
}') && echo $TOKEN
# check for basic access
curl -X POST \
http://localhost:8080/userHasAccess \
-H "Authorization: Bearer $TOKEN" \
-d '{
"sections": ["api"],
"accounts": ["test"]
}'
# check for admin access
curl -X POST \
http://localhost:8080/userHasAdminAccess \
-H "Authorization: Bearer $TOKEN" \
-d '{
"sections": ["api"],
"accounts": ["test"]
}'
curl -X POST \
http://localhost:8080/asset \
-H 'Content-Type: application/json' \
-d '{
"id": "test-unique-asset-id-12345",
"description": "A unique asset in the system.",
"display_name": "Asset 12345",
"active": true,
"asset_class": "iot_device",
"routes": [
{ "account_id": "test", "model_id": "device_details", type: "system" },
{ "account_id": "test", "model_id": "device_location", type: "account" }
]
}'
curl -X GET http://localhost:8080/asset/test-unique-asset-id-12345
curl -X POST \
http://localhost:8080/searchAssets \
-H 'Content-Type: application/json' \
-d '{
"query": {
"match_all": {}
}
}'
Build test release:
goreleaser --skip-publish --rm-dist --skip-validate
Build and release:
GITHUB_TOKEN=$GITHUB_TOKEN goreleaser --rm-dist