Important
On June 26 2024, Linux Foundation announced the merger of its financial services umbrella, the Fintech Open Source Foundation (FINOS), with OS-Climate, an open source community dedicated to building data technologies, modeling, and analytic tools that will drive global capital flows into climate change mitigation and resilience; OS-Climate projects are in the process of transitioning to the FINOS governance framework; read more on finos.org/press/finos-join-forces-os-open-source-climate-sustainability-esg
This is a command line interface (CLI) for Broda Group Software's Ecosystem Platform.
The CLI interacts with any component in the Ecosystem Platform and allows the user to execute the following:
- Register, view, and manage users (guests, subscribers, and publishers)
- Generate UUIDs for products, and then register, view, and manage those registered products
- Discover data products, and view their artifacts, metadata, and sample data
- View with carts and orders
- Various administrative capabilities
- Run test cases to verify system capabilities
The remaining sections explain how to run the CLI, illustrating commands and parameters required to interact with the Ecosystem Platform.
Full documentation is available in in the osc-dm-mesh-doc repo.
This application interacts with other applications. You can run the full set of applications by following instructions in the osc-dm-mesh-doc repo.
Python must be available, preferably in a virtual environment (venv).
Some environment variables are used by various source code and scripts. Setup your environment as follows (note that "source" is used)
source ./bin/environment.sh
It is recommended that a Python virtual environment be created. We have provided several convenience scripts to create and activate a virtual environment. To create a new virtual environment using these convenience scripts, execute the following (this will create a directory called "venv" in your current working directory):
$PROJECT_DIR/bin/venv.sh
Once your virtual enviornment has been created, it can be activated as follows (note: you must activate the virtual environment for it to be used, and the command requires "source" to ensure environment variables to support venv are established correctly):
source $PROJECT_DIR/bin/vactivate.sh
Install the required libraries as follows:
pip install -r requirements.txt
Note that if you wish to run test cases then you will need to also install "pytest" (it is not installed by default as it is a development rather than product dependency).
pip install pytest
The CLI communicates with a Ecosystem Platform proxy and hence requries a host and port. For your convenience, this tutorial uses HOST and PORT variables to contain these values.
Also, verbose logging can be enabled using the "--verbose" tag. For your convenience, each of the examples in this tutorial use an environment variable, VERBOSE, which if set to "--verbose" will permit extended logging in the CLI.
Setup your environment as follows:
HOST=localhost ;
PORT=20000 ;
VERBOSE="--verbose"
To disable verbose logging, unset VERBOSE:
VERBOSE=""
There are several key concepts that the CLI acts upon:
- Users: Can be registered, logged in/out, and viewed
- Products: can have UUIDs generated, be registered, and viewed
- Carts and Orders: Users can put products of interest into carts which can then be ordered (to create an order); both carts can be viewed as well as individual orders or list of orders in an order history
The data product configuration as well as artifact configuration are contained in the following directory:
config
TODO: Configuration should be structured to allow domains, then data product names:
config/domain/name
A sample data product is available in the data product configuration directory, called "rmi". The full set of data product assets are located in:
config/rmi
The configuration for this data product is located in:
config/rmi/product.yaml
Each data product has several attributes:
- domain: the data product domain; domains are unique across all data products
- name: The data product name; names must be unique in a domain
- description: 1-2 sentence description of the data product
- tags: Used for searching
- publisher: The data product publisher, or data product owner
The sample product configuration is as follows:
- domain: brodagroupsoftware.com
- name: rmi.dataproduct
- description: US Utility data provided by RMI
- tags: ["utilities", "emissions"]
- publisher: publisher.user@brodagroupsoftware.com
Numerous artifacts are available for the sample data product:
config/rmi/artifacts
Each artifact has several attributes:
- name: Unique name within the set of artifacts
- description: 1-2 sentnece description
- tags: Used to augment searching
- license: Defines Defines how artifact can be used or shared
- securitypolicy: Access policy for the artifact
- data: URLs to the artifact
There are several other configuration files:
- bundles: groups of artifacts treated as a single entity
- metadata: API specifications to "discover" the data product
- provenance: Lineage information for the data product
- queries: vetted queries permitted by the data product
There are several types of users that can interact with the Ecosystem Platform:
- Guest Users: Lowest previlege users; Genera users can view the marketplace but are not able to subscribe to or download data, nor publish data products
- Publishers: Can do all of the things a general user can do but are also able to publish data products (which makes them available in the Marketplace/Registry)
- Subscribers: Can do all of the things a general user can do but are also able to subscribe to and download data products
- Administrators: Can do all of the things a general user can do but are also able to administer the Ecosystem Platform and Marketplace/Registry, and create users.
In this tutorial, we will perform several steps:
- Start the Data Marketplace/Registry
- Initialize services, using the administration CLI
- Register users, using the administration CLI
- Publish a sample data product, using the publisher CLI
- View the data product in the Marketplace/Registry, using the subscriber CLI
- Discover the interfaces made available by the data product, using the subscriber CLI
- Download data from the data product, using the subscriber CLI
- View the data product data (TODO: Geospatial Ecosystem Platform integration), using the subscriber CLI
The Ecosystem Platform components interact with each other so the simplest way to get all of them running is to use the full Ecosystem Platform docker-compose.
The Ecosystem Platform docker compose is in a different directory and hence must be started in a separate terminal window:
cd $HOME_DIR/bgssrv-dm
source ./bin/environment.sh
$PROJECT_DIR/app/startd.sh
At this point the full set of services should be running. This can be verified by running the following docker command:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
28639179566e brodagroupsoftware/bgssrv-dmproxy:latest "python3 /app/server…" 6 seconds ago Up 4 seconds 0.0.0.0:20000->8000/tcp docker-bgssrv-dmproxy-1
c36fae20722e brodagroupsoftware/bgssrv-dmui:latest "docker-entrypoint.s…" 6 seconds ago Up 4 seconds 0.0.0.0:3000->3000/tcp docker-bgssrv-dmui-1
4a8858c09e9f brodagroupsoftware/bgssrv-dmregistrar:latest "python3 /app/server…" 6 seconds ago Up 4 seconds 0.0.0.0:21000->8000/tcp docker-bgssrv-dmregistrar-1
0838a1bd37f0 quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 6 seconds ago Up 4 seconds 2379-2380/tcp docker-etcd2-1
f86bb447829f quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 6 seconds ago Up 4 seconds 2379-2380/tcp docker-etcd3-1
f4aec44f8ef7 quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 6 seconds ago Up 4 seconds 0.0.0.0:2379-2380->2379-2380/tcp docker-etcd1-1
A data product interacts with the Ecosystem Platform so the simplest way of running one is to use the data product docker-compose.
A data product docker compose is in a different directory and hence must be started in a separate terminal window:
cd $HOME_DIR/bgssrv-dmproduct
source ./bin/environment.sh
$PROJECT_DIR/app/startd.sh
At this point the full set of services as well as the data product instance should be running. This can be verified by running the following docker command:
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6a1a62f1b9d4 brodagroupsoftware/bgssrv-dmproduct:latest "python3 /app/server…" 5 seconds ago Up 4 seconds 0.0.0.0:24000->8000/tcp docker-bgssrv-dmproduct-1
28639179566e brodagroupsoftware/bgssrv-dmproxy:latest "python3 /app/server…" 3 minutes ago Up 3 minutes 0.0.0.0:20000->8000/tcp docker-bgssrv-dmproxy-1
c36fae20722e brodagroupsoftware/bgssrv-dmui:latest "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3000->3000/tcp docker-bgssrv-dmui-1
4a8858c09e9f brodagroupsoftware/bgssrv-dmregistrar:latest "python3 /app/server…" 3 minutes ago Up 3 minutes 0.0.0.0:21000->8000/tcp docker-bgssrv-dmregistrar-1
0838a1bd37f0 quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 3 minutes ago Up 3 minutes 2379-2380/tcp docker-etcd2-1
f86bb447829f quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 3 minutes ago Up 3 minutes 2379-2380/tcp docker-etcd3-1
f4aec44f8ef7 quay.io/coreos/etcd:v3.5.0 "/usr/local/bin/etcd" 3 minutes ago Up 3 minutes 0.0.0.0:2379-2380->2379-2380/tcp docker-etcd1-1
Note the very first line with the data product (NAME is docker-bgssrv-dmproduct-1).
User can be registered. Once registered, you can view all users or a specific user.
User must be registered in a role, either "guest", "subscriber", "publisher", or "administrator".
Let's register a guest:
ROLE="guest" ;
EMAIL="guest.user@brodagroupsoftware.com" ;
NAME="Guest User" ;
PHONE="+1 647.555.1212" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--register \
--role "$ROLE" \
--name "$NAME" \
--email "$EMAIL" \
--phone "$PHONE"
{"uuid": "7eec771b-6140-4741-9845-2e52857c1cb3"}
View all users:
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--retrieve
[{"uuid": "7eec771b-6140-4741-9845-2e52857c1cb3", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-28 23:13:19.375", "updatetimestamp": "2024-03-28 23:13:19.375", "role": "guest"}]
View a user by their UUID (we will use the same UUID that was returned in the previous steps):
UUID="7eec771b-6140-4741-9845-2e52857c1cb3" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--retrieve \
--uuid "$UUID"
{"uuid": "7eec771b-6140-4741-9845-2e52857c1cb3", "contact": {"name": "guest.user@brodagroupsoftware.com", "email": "Guest User", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-17 15:24:07.411", "updatetimestamp": "2024-03-17 15:24:07.411", "role": "guest"}
View all user roles by email (note that user can have multiple roles):
EMAIL="guest.user@brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--retrieve \
--email "$EMAIL"
[{"uuid": "7eec771b-6140-4741-9845-2e52857c1cb3", "contact": {"name": "guest.user@brodagroupsoftware.com", "email": "Guest User", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-17 15:24:07.411", "updatetimestamp": "2024-03-17 15:24:07.411", "role": "guest"}, {"uuid": "d6e1fcc4-943a-491e-9dbb-a1ea190e9fb0", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-17 14:53:27.378", "updatetimestamp": "2024-03-17 14:53:27.378", "role": "guest"}]
NOTE: Not sure this works properly... should only return SINGLE item, not LIST
View specific role/email:
ROLE="guest" ;
EMAIL="guest.user@brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--retrieve \
--role "$ROLE" \
--email "$EMAIL"
[{"uuid": "7eec771b-6140-4741-9845-2e52857c1cb3", "contact": {"name": "guest.user@brodagroupsoftware.com", "email": "Guest User", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-17 15:24:07.411", "updatetimestamp": "2024-03-17 15:24:07.411", "role": "guest"}, {"uuid": "d6e1fcc4-943a-491e-9dbb-a1ea190e9fb0", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-17 14:53:27.378", "updatetimestamp": "2024-03-17 14:53:27.378", "role": "guest"}]
To login a guest:
EMAIL="guest.user@brodagroupsoftware.com" ;
ROLE="guest" ;
PASSWORD="a-fake-password" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT auth \
--login \
--role "$ROLE" \
--email "$EMAIL" \
--password "$PASSWORD"
{"uuid": "e32961f4-d871-4faf-98c2-4f44476a42a1", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-04 18:41:05.797", "updatetimestamp": "2024-03-04 18:41:05.797", "role": "guest"}
To logout a guest:
EMAIL="guest.user@brodagroupsoftware.com" ;
ROLE="guest" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT auth \
--logout \
--role "$ROLE" \
--email "$EMAIL"
{"uuid": "e32961f4-d871-4faf-98c2-4f44476a42a1", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-03-04 18:41:05.797", "updatetimestamp": "2024-03-04 18:41:05.797", "role": "guest"}
To retrieve auth statistics for all users:
python ./src/cli.py $VERBOSE --host $HOST --port $PORT auth \
--statistics
[{"role": "guest", "email": "guest.user@brodagroupsoftware.com", "status": "authorized"}, {"role": "guest", "email": "x@brodagroupsoftware.com", "status": "authorized"}]
To retrieve auth statistics for a specific user:
EMAIL="guest.user@brodagroupsoftware.com"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT auth \
--status \
--email "$EMAIL"
Products and their artifacts must have a unique identifier (UUID) such that they can be recognized and registered in the Ecosystem Platform. Once UUIDs have been generated then products can be registered. Once registered products and their artifacts can be viewed.
Documentation for generating data products
UUIDs are assigned by the data product owner. To generate UUIDs, execute the following command:
DATAPRODUCT_DIR="$SAMPLES_DIR/dataproducts/rmi";
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--assign \
--directory "$DATAPRODUCT_DIR"
{"uuids": "/Users/ericbroda/Development/scratch/bgsdat-samples/dataproducts/rmi/uuids.yaml", "product_uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "artifact_uuids": [{"Assets Earnings Investments": "0586c61c-9aac-4202-aeda-d3e3dfad384c"}, {"Customer Sales": "352a37b1-9fae-4df4-bcef-a5eb68bab9d4"}, {"Debit Equity Returns": "f47d3792-6995-4958-af38-3d7385632a32"}, {"Emissions Targets": "63071083-541b-472d-91ea-6325f214f2c8"}, {"Employees": "7ba33722-596c-493e-8c6f-58b1748f3de6"}, {"Expenditure Bills Burden": "6e889d55-ef19-4a4c-a3c9-c9fe2c9744fd"}, {"Expenditure Bills Burden Detail": "07497ece-7a47-4c4e-8fdb-409b3817e46c"}, {"Housing Units Income": "96bed246-1123-450a-aeea-94d72b9f7bc2"}, {"Net Plant Balance": "70177ae9-f886-496d-a9c8-82d483822e24"}, {"Operations Emissions by Fuel": "1a17518b-fb95-4573-831c-15218e2e8e90"}, {"Operations Emissions by Tech": "0f9b60cb-e18f-4e38-9e1f-cd890098d2e9"}, {"Revenue by Tech": "2bc48809-a916-43dc-bf82-907859e72bc2"}, {"State Targets": "d6b7a49d-9a3f-43e6-a56a-33795c7ffd30"}, {"State Utility Polcies": "423eb06b-cd79-4a52-a864-eca1f4ce79b8"}, {"Uneconomic Dispatch": "d81dcf27-7df3-4b80-8182-5dce58096f77"}, {"Utility Information": "e9273326-6848-4859-beb8-10c1949af89e"}, {"Utility State Map": "262fcfab-c06c-4559-ab1e-65bfd1903ddb"}]}
Note that the UUIDs provided for your data product at the time of registration are stored in a file called "uuids.yaml" in the data product directory. This file is used extensively by data product services and is an item of record for your data product. An example of the contents of the file is shown below:
#####
#
# This file contains the UUIDs for your product and artifacts (by name)
#
# -----
#
# Registered on: 11-Apr-2024 11:55:33
# Registered by: ericbroda
#
#####
product_uuid: 65bf83f8-3e00-4d7a-9553-db1491fd577c
artifact_uuids:
- Assets Earnings Investments: 0586c61c-9aac-4202-aeda-d3e3dfad384c
- Customer Sales: 352a37b1-9fae-4df4-bcef-a5eb68bab9d4
- Debit Equity Returns: f47d3792-6995-4958-af38-3d7385632a32
- Emissions Targets: 63071083-541b-472d-91ea-6325f214f2c8
- Employees: 7ba33722-596c-493e-8c6f-58b1748f3de6
- Expenditure Bills Burden: 6e889d55-ef19-4a4c-a3c9-c9fe2c9744fd
- Expenditure Bills Burden Detail: 07497ece-7a47-4c4e-8fdb-409b3817e46c
- Housing Units Income: 96bed246-1123-450a-aeea-94d72b9f7bc2
- Net Plant Balance: 70177ae9-f886-496d-a9c8-82d483822e24
- Operations Emissions by Fuel: 1a17518b-fb95-4573-831c-15218e2e8e90
- Operations Emissions by Tech: 0f9b60cb-e18f-4e38-9e1f-cd890098d2e9
- Revenue by Tech: 2bc48809-a916-43dc-bf82-907859e72bc2
- State Targets: d6b7a49d-9a3f-43e6-a56a-33795c7ffd30
- State Utility Polcies: 423eb06b-cd79-4a52-a864-eca1f4ce79b8
- Uneconomic Dispatch: d81dcf27-7df3-4b80-8182-5dce58096f77
- Utility Information: e9273326-6848-4859-beb8-10c1949af89e
- Utility State Map: 262fcfab-c06c-4559-ab1e-65bfd1903ddb
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--retrieve
[{"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-05-03 21:43:07.674", "updatetimestamp": "2024-05-03 21:43:07.674"}]
Let's get information for a list of products (note that for simplicity sake we will use the same UUIDs in the list)
UUID1="65bf83f8-3e00-4d7a-9553-db1491fd577c"
UUID2="65bf83f8-3e00-4d7a-9553-db1491fd577c"
UUIDS="$UUID1 $UUID2"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--retrieve \
--uuids "$UUIDS"
{"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-17 16:26:23.144", "updatetimestamp": "2024-03-17 16:26:23.144"}
Let's get information for single product:
UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--retrieve \
--uuid "$UUID"
{"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-17 16:26:23.144", "updatetimestamp": "2024-03-17 16:26:23.144"}
NAMESPACE="brodagroupsoftware.com" ;
NAME="rmi.dataproduct" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--retrieve \
--namespace "$NAMESPACE" \
--name "$NAME"
{"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-17 16:26:23.144", "updatetimestamp": "2024-03-17 16:26:23.144"}
NAMESPACE="brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--retrieve \
--namespace "$NAMESPACE"
[{"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-17 16:26:23.144", "updatetimestamp": "2024-03-17 16:26:23.144"}]
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--search \
--query "find all temperature products"
NOTE: The data product must be registered and then running for this capability to work properly.
Discover is like view/retrieve, except discover gets more details directly from the product:
UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT products \
--discover \
--uuid "$UUID"
{"product": {"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": null, "createtimestamp": "2024-04-28 15:24:56.535", "updatetimestamp": "2024-04-28 15:24:56.535"}, "artifacts": [{"uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Assets Earnings Investments", "description": "Detailed breakdown of utility assets in electric rate base, earnings on these assets, and annual investments (capital additions) by technology.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/assets_earnings_investments.csv"}, {"relationship": "sample", "mimetype": "text/csv", "url": "https://localhost:8000/samples/artifact-001.csv"}, {"relationship": "metadata", "mimetype": "text/csv", "url": "https://localhost:8000/metadata/artifact-001.json"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "fa614c23-f91b-46b1-9ba8-0718d761af93", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Customer Sales", "description": "Number of customers, MWh electricity sales, and revenues by customer type.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/customers_sales.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "26d49b15-9313-4b0e-95b3-7a173c024ec8", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Debit Equity Returns", "description": "Rate base, equity, debt, returns, earnings, interest expense, tax expense, and the rates of return used for earnings and revenue calculations.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/debt_equity_returns.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "3f00e58d-3125-44e6-9a8e-399d49517c60", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Emissions Targets", "description": "CO2 emissions and projections, as well as electricity generation and projections and comparison to RMI 1.5\u00b0C decarbonization pathway for the US electricity sector.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/emissions_targets.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "549c248a-732f-450f-ab83-7419f8ebb671", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Employees", "description": "Number of employees that work at large power plants, by technology, for each utility", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/employees.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "4385f285-2558-4f81-a26a-7dd2b642aa7f", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Expenditure Bills Burden", "description": "Expenditure, average residential customer energy bill, and average residential customer energy burden for each utility by technology and customer group.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/expenditure_bills_burden.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "7fd0bf8c-b9cb-473b-9a94-086904e3d073", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Expenditure Bills Burden Detail", "description": "Expenditure, average residential customer energy bill, and average residential customer energy burden for each utility by technology and customer group. Broken down into additional components and details compared to expenditure_bills_burden, leading a large file size (575 MB) that cannot be opened in Excel.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/expenditure_bills_burden_detail.csv.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "a06b39e6-4e45-4884-ac1f-1b1447777f3b", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Housing Units Income", "description": "Number of housing units and income by customer group for each utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/housing_units_income.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "79d5aea0-98fc-4294-a5d9-fcbea6fa22f7", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Net Plant Balance", "description": "Original cost, accumulated depreciation, and remaining net plant balance of electric plants in service, by FERC classification.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/net_plant_balance.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "2aedca34-539b-4b67-8e87-9346c2874907", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Operations Emissions by Fuel", "description": "Generation, fuel consumption, and emissions of CO2, NOx, and SOx for each generator owned by each utility, and for power purchased by each utility. Within each generator and for purchased power, data values are differentiated by fuel type.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/operations_emissions_by_fuel.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "aa800b61-2509-467b-88a9-fe87dcd5f5a5", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Operations Emissions by Tech", "description": "Capacity, generation, capacity factor, fuel consumption, and emissions of CO2, NOx, and SOx for each generator owned by each utility, and for power purchased by each utility. Each generator is identified by a single technology.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/operations_emissions_by_tech.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "f9045f7c-3840-420e-bbd3-5997e791d36a", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Revenue by Tech", "description": "Revenues for each utility, by technology and component, for each utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/revenue_by_tech.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "7757225d-d79a-42c9-9c38-8932a4b7b927", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "State Targets", "description": "Greenhouse gas (GHG) and renewable portfolio standard (RPS) data by state, including baseline, interim, and final target years", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/state_targets.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "89ad6ed7-79b5-493f-b78f-6eb52f47f301", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "State Utility Polcies", "description": "Policy data shown on the \"Policy & Regulations\" dashboard of the Utility Transition Hub Portal, by state and utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/state_utility_policies.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "70ad811a-8c89-4a2c-bcbb-35e10457fce9", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Uneconomic Dispatch", "description": "Capacity and monthly cash flows used for monthly net revenues and gross losses for all operating coal plants above 5 MWs in the nation", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "url": "https://utilitytransitionhub.rmi.org/static/data_download/uneconomic_dispatch_monthly_cash_flow.xlsx"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "f70c9d81-c74e-4beb-8d94-e6fcfbacf4a8", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Utility Information", "description": "Utility identifiers such as name, ID numbers from various sources, and utility type. Includes connections from operating companies to parent companies.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/utility_information.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "b9eed26c-be23-47c8-87f2-ff3cba4c7862", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Utility State Map", "description": "A list of states that each utility operates in, including capacity owned in state, capacity operated in state, and energy sales in state.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/utility_state_map.csv"}], "createtimestamp": null, "updatetimestamp": null}]}
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT artifacts \
--discover \
--productuuid "$PRODUCT_UUID"
[{"uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Assets Earnings Investments", "description": "Detailed breakdown of utility assets in electric rate base, earnings on these assets, and annual investments (capital additions) by technology.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/assets_earnings_investments.csv"}, {"relationship": "sample", "mimetype": "text/csv", "url": "https://localhost:8000/samples/artifact-001.csv"}, {"relationship": "metadata", "mimetype": "text/csv", "url": "https://localhost:8000/metadata/artifact-001.json"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "fa614c23-f91b-46b1-9ba8-0718d761af93", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Customer Sales", "description": "Number of customers, MWh electricity sales, and revenues by customer type.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/customers_sales.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "26d49b15-9313-4b0e-95b3-7a173c024ec8", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Debit Equity Returns", "description": "Rate base, equity, debt, returns, earnings, interest expense, tax expense, and the rates of return used for earnings and revenue calculations.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/debt_equity_returns.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "3f00e58d-3125-44e6-9a8e-399d49517c60", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Emissions Targets", "description": "CO2 emissions and projections, as well as electricity generation and projections and comparison to RMI 1.5\u00b0C decarbonization pathway for the US electricity sector.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/emissions_targets.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "549c248a-732f-450f-ab83-7419f8ebb671", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Employees", "description": "Number of employees that work at large power plants, by technology, for each utility", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/employees.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "4385f285-2558-4f81-a26a-7dd2b642aa7f", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Expenditure Bills Burden", "description": "Expenditure, average residential customer energy bill, and average residential customer energy burden for each utility by technology and customer group.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/expenditure_bills_burden.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "7fd0bf8c-b9cb-473b-9a94-086904e3d073", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Expenditure Bills Burden Detail", "description": "Expenditure, average residential customer energy bill, and average residential customer energy burden for each utility by technology and customer group. Broken down into additional components and details compared to expenditure_bills_burden, leading a large file size (575 MB) that cannot be opened in Excel.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/expenditure_bills_burden_detail.csv.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "a06b39e6-4e45-4884-ac1f-1b1447777f3b", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Housing Units Income", "description": "Number of housing units and income by customer group for each utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/housing_units_income.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "79d5aea0-98fc-4294-a5d9-fcbea6fa22f7", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Net Plant Balance", "description": "Original cost, accumulated depreciation, and remaining net plant balance of electric plants in service, by FERC classification.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/net_plant_balance.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "2aedca34-539b-4b67-8e87-9346c2874907", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Operations Emissions by Fuel", "description": "Generation, fuel consumption, and emissions of CO2, NOx, and SOx for each generator owned by each utility, and for power purchased by each utility. Within each generator and for purchased power, data values are differentiated by fuel type.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/operations_emissions_by_fuel.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "aa800b61-2509-467b-88a9-fe87dcd5f5a5", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Operations Emissions by Tech", "description": "Capacity, generation, capacity factor, fuel consumption, and emissions of CO2, NOx, and SOx for each generator owned by each utility, and for power purchased by each utility. Each generator is identified by a single technology.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/zip", "url": "https://utilitytransitionhub.rmi.org/static/data_download/operations_emissions_by_tech.zip"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "f9045f7c-3840-420e-bbd3-5997e791d36a", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Revenue by Tech", "description": "Revenues for each utility, by technology and component, for each utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/revenue_by_tech.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "7757225d-d79a-42c9-9c38-8932a4b7b927", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "State Targets", "description": "Greenhouse gas (GHG) and renewable portfolio standard (RPS) data by state, including baseline, interim, and final target years", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/state_targets.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "89ad6ed7-79b5-493f-b78f-6eb52f47f301", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "State Utility Polcies", "description": "Policy data shown on the \"Policy & Regulations\" dashboard of the Utility Transition Hub Portal, by state and utility.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/state_utility_policies.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "70ad811a-8c89-4a2c-bcbb-35e10457fce9", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Uneconomic Dispatch", "description": "Capacity and monthly cash flows used for monthly net revenues and gross losses for all operating coal plants above 5 MWs in the nation", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", "url": "https://utilitytransitionhub.rmi.org/static/data_download/uneconomic_dispatch_monthly_cash_flow.xlsx"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "f70c9d81-c74e-4beb-8d94-e6fcfbacf4a8", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Utility Information", "description": "Utility identifiers such as name, ID numbers from various sources, and utility type. Includes connections from operating companies to parent companies.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/utility_information.csv"}], "createtimestamp": null, "updatetimestamp": null}, {"uuid": "b9eed26c-be23-47c8-87f2-ff3cba4c7862", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Utility State Map", "description": "A list of states that each utility operates in, including capacity owned in state, capacity operated in state, and energy sales in state.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/utility_state_map.csv"}], "createtimestamp": null, "updatetimestamp": null}]
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c"
ARTIFACT_UUID="e6ac3592-5764-443c-a45e-39c801f01e9a"
python ./src/cli.py $VERBOSE --host $HOST --port $PORT artifacts \
--discover \
--productuuid "$PRODUCT_UUID" \
--uuid "$ARTIFACT_UUID"
{"uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a", "productuuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Assets Earnings Investments", "description": "Detailed breakdown of utility assets in electric rate base, earnings on these assets, and annual investments (capital additions) by technology.", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/assets_earnings_investments.csv"}, {"relationship": "sample", "mimetype": "text/csv", "url": "https://localhost:8000/samples/artifact-001.csv"}, {"relationship": "metadata", "mimetype": "text/csv", "url": "https://localhost:8000/metadata/artifact-001.json"}], "createtimestamp": null, "updatetimestamp": null}
Note that only subscribers (ie. users that have been registered in role "subscriber") can have a cart.
Let's register a subscriber (note: this will also create a cart that we will use in the next steps):
ROLE="subscriber" ;
EMAIL="subscriber.user@brodagroupsoftware.com" ;
NAME="Subscriber User" ;
PHONE="+1 647.555.1212" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT users \
--register \
--role "$ROLE" \
--name "$NAME" \
--email "$EMAIL" \
--phone "$PHONE"
{"uuid": "2e8da4bb-fa34-4dcb-9971-29ee93eb5ad3"}
Let's view the carts available (there should only be one if you are following these steps). The cart UUID will be used in subsequent steps):
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--retrieve
[{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-05-08 20:47:33.908", "updatetimestamp": "2024-05-08 20:47:33.908"}]
CART_UUID="ff5150ac-a484-4b64-8b23-047a66f450e9" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--retrieve \
--uuid "$CART_UUID"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-03-18 20:44:37.301", "updatetimestamp": "2024-03-18 20:44:37.301"}
EMAIL="subscriber.user@brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--retrieve \
--email "$EMAIL"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-03-18 20:44:37.301", "updatetimestamp": "2024-03-18 20:44:37.301"}
Add an item (defined by a product uuid and artifact uuid) to a cart:
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c" ;
ARTIFACT_UUID="e6ac3592-5764-443c-a45e-39c801f01e9a" ;
CART_UUID="ff5150ac-a484-4b64-8b23-047a66f450e9" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--add \
--uuid "$CART_UUID" \
--productuuid "$PRODUCT_UUID" \
--artifactuuid "$ARTIFACT_UUID"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [{"product_uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "artifact_uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a"}], "createtimestamp": "2024-03-21 12:26:04.269", "updatetimestamp": "2024-03-21 12:26:04.269"}
Add an item (defined by a product uuid and artifact uuid) to a cart:
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c" ;
ARTIFACT_UUID="e6ac3592-5764-443c-a45e-39c801f01e9a" ;
EMAIL="subscriber.user@brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--add \
--email "$EMAIL" \
--productuuid "$PRODUCT_UUID" \
--artifactuuid "$ARTIFACT_UUID"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [{"product_uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "artifact_uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a"}], "createtimestamp": "2024-03-21 12:26:04.269", "updatetimestamp": "2024-03-21 12:26:04.269"}
Remove an item (defined by a product uuid and artifact uuid) that exists in a cart:
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c" ;
ARTIFACT_UUID="e6ac3592-5764-443c-a45e-39c801f01e9a" ;
CART_UUID="ff5150ac-a484-4b64-8b23-047a66f450e9" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--remove \
--uuid "$CART_UUID" \
--productuuid "$PRODUCT_UUID" \
--artifactuuid "$ARTIFACT_UUID"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-03-19 20:55:28.662", "updatetimestamp": "2024-03-19 20:55:28.662"}
Remove an item (defined by a product uuid and artifact uuid) that exists in a cart:
PRODUCT_UUID="65bf83f8-3e00-4d7a-9553-db1491fd577c" ;
ARTIFACT_UUID="e6ac3592-5764-443c-a45e-39c801f01e9a" ;
EMAIL="subscriber.user@brodagroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT carts \
--remove \
--email "$EMAIL" \
--productuuid "$PRODUCT_UUID" \
--artifactuuid "$ARTIFACT_UUID"
{"uuid": "ff5150ac-a484-4b64-8b23-047a66f450e9", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-03-19 20:55:28.662", "updatetimestamp": "2024-03-19 20:55:28.662"}
To create an order and purchase a cart:
CART_UUID="ff5150ac-a484-4b64-8b23-047a66f450e9" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT orders \
--purchase \
--cartuuid "$CART_UUID"
{"uuid": "c7cb0dd2-0cd4-4fc7-9faa-a547ee116a75"}
To view an existing order:
ORDER_UUID="c7cb0dd2-0cd4-4fc7-9faa-a547ee116a75" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT orders \
--retrieve \
--uuid "$ORDER_UUID"
{"uuid": "c7cb0dd2-0cd4-4fc7-9faa-a547ee116a75", "subscriber": "subscriber.user@brodagroupsoftware.com", "cart": {"uuid": "ab55bcdd-6a7e-4c7c-940b-9d1c198ffede", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [{"product": {"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-23 14:42:51.026", "updatetimestamp": "2024-03-23 14:42:51.026"}, "artifact": {"uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Housing Units Income", "description": "Number of housing units and income by customer group for each utility.", "tags": ["utilities", "emissions"], "license": "Creative Commons 4.0", "securitypolicy": "public", "data": {"mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/housing_units_income.csv"}, "createtimestamp": null, "updatetimestamp": null}}], "createtimestamp": "2024-03-23 14:44:22.995", "updatetimestamp": "2024-03-23 14:44:22.995"}, "createtimestamp": "2024-03-23 14:44:22.995", "updatetimestamp": "2024-03-23 14:44:22.995"}
To view a user's order history:
EMAIL="subscriber.user@brodadgroupsoftware.com" ;
python ./src/cli.py $VERBOSE --host $HOST --port $PORT orders \
--retrieve \
--email "$EMAIL"
[{"uuid": "c7cb0dd2-0cd4-4fc7-9faa-a547ee116a75", "subscriber": "subscriber.user@brodagroupsoftware.com", "cart": {"uuid": "ab55bcdd-6a7e-4c7c-940b-9d1c198ffede", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [{"product": {"uuid": "65bf83f8-3e00-4d7a-9553-db1491fd577c", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://bgssrv-dmproduct-0:8000", "createtimestamp": "2024-03-23 14:42:51.026", "updatetimestamp": "2024-03-23 14:42:51.026"}, "artifact": {"uuid": "e6ac3592-5764-443c-a45e-39c801f01e9a", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Housing Units Income", "description": "Number of housing units and income by customer group for each utility.", "tags": ["utilities", "emissions"], "license": "Creative Commons 4.0", "securitypolicy": "public", "data": {"mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/housing_units_income.csv"}, "createtimestamp": null, "updatetimestamp": null}}], "createtimestamp": "2024-03-23 14:44:22.995", "updatetimestamp": "2024-03-23 14:44:22.995"}, "createtimestamp": "2024-03-23 14:44:22.995", "updatetimestamp": "2024-03-23 14:44:22.995"}]
To monitor ecosystem platform health:
python ./src/cli.py $VERBOSE --host $HOST --port $PORT monitor \
--health
{"osc-dm-proxy-srv": "OK", "osc-dm-registrar-srv": "OK", "osc-dm-search-srv": "OK", "http://osc-dm-product-srv-0:8000": "OK"}
To monitor ecosystem platform metrics:
python ./src/cli.py $VERBOSE --host $HOST --port $PORT monitor \
--metrics
{"osc-dm-proxy-srv": {"osc-dm-search-srv": {"http://osc-dm-proxy-srv:8000/api/registrar/products": {"200": 9, "500": 1}, "http://osc-dm-proxy-srv:8000/api/proxy/health": {"200": 7}, "http://osc-dm-proxy-srv:8000/api/registrar/health": {"200": 7}, "http://osc-dm-proxy-srv:8000/api/search/health": {"503": 2, "200": 5}, "http://osc-dm-proxy-srv:8000/api/proxy/metrics": {"200": 6}, "http://osc-dm-proxy-srv:8000/api/registrar/metrics": {"200": 6}, "http://osc-dm-proxy-srv:8000/api/search/metrics": {"503": 2, "200": 4}, "http://osc-dm-proxy-srv:8000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/health": {"200": 5}, "http://osc-dm-proxy-srv:8000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/metrics": {"200": 4}}, "ericbroda": {"http://localhost:20000/api/registrar/users": {"200": 4}, "http://localhost:20000/api/registrar/users/uuid/b2c8fac1-0a6d-4632-902f-10986ab9bbce": {"200": 1}, "http://localhost:20000/api/registrar/users/email/guest.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/users/role/guest/email/guest.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/products": {"200": 4}, "http://localhost:20000/api/registrar/products/uuids/": {"200": 1}, "http://localhost:20000/api/registrar/products/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 1}, "http://localhost:20000/api/registrar/products/namespace/brodagroupsoftware.com/name/rmi.dataproduct": {"200": 1}, "http://localhost:20000/api/registrar/products/namespace/brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/search/query": {"200": 1}, "http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 2}, "http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/artifacts": {"200": 3}, "http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/artifacts/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 2}, "http://localhost:20000/api/registrar/users/role/subscriber/email/subscriber.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/carts": {"200": 1}, "http://localhost:20000/api/registrar/carts/uuid/788122b1-9150-4e96-a1df-204ee06f8869": {"200": 1}, "http://localhost:20000/api/registrar/carts/email/subscriber.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/carts/uuid/788122b1-9150-4e96-a1df-204ee06f8869/b6e05972-fe25-44aa-b5a0-db6e100ca95a/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 3}, "http://localhost:20000/api/registrar/carts/email/subscriber.user@brodagroupsoftware.com/b6e05972-fe25-44aa-b5a0-db6e100ca95a/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 2}, "http://osc-dm-proxy-srv:8000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/artifacts/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 1}, "http://localhost:20000/api/registrar/orders": {"200": 1}, "http://localhost:20000/api/registrar/orders/uuid/764b3e72-d38b-4d66-8763-2c20e2f8cbb0": {"200": 1}, "http://localhost:20000/api/monitor/health": {"200": 2}, "http://localhost:20000/api/monitor/metrics": {"200": 2}}}, "osc-dm-registrar-srv": {"osc-dm-search-srv": {"http://osc-dm-proxy-srv:8000/api/registrar/products": {"200": 9, "500": 1}, "http://osc-dm-proxy-srv:8000/api/registrar/health": {"200": 7}, "http://osc-dm-proxy-srv:8000/api/registrar/metrics": {"200": 6}, "http://osc-dm-registrar-srv:8000/api/registrar/products": {"200": 6}, "http://osc-dm-registrar-srv:8000/api/registrar/products/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 9}}, "ericbroda": {"http://localhost:20000/api/registrar/users": {"200": 4}, "http://localhost:20000/api/registrar/users/uuid/b2c8fac1-0a6d-4632-902f-10986ab9bbce": {"200": 1}, "http://localhost:20000/api/registrar/users/email/guest.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/users/role/guest/email/guest.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/products": {"200": 4}, "http://localhost:20000/api/registrar/products/uuids/": {"200": 1}, "http://localhost:20000/api/registrar/products/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 1}, "http://localhost:20000/api/registrar/products/namespace/brodagroupsoftware.com/name/rmi.dataproduct": {"200": 1}, "http://localhost:20000/api/registrar/products/namespace/brodagroupsoftware.com": {"200": 1}, "http://osc-dm-registrar-srv:8000/api/registrar/products/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 8}, "http://localhost:20000/api/registrar/users/role/subscriber/email/subscriber.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/carts": {"200": 1}, "http://localhost:20000/api/registrar/carts/uuid/788122b1-9150-4e96-a1df-204ee06f8869": {"200": 1}, "http://localhost:20000/api/registrar/carts/email/subscriber.user@brodagroupsoftware.com": {"200": 1}, "http://localhost:20000/api/registrar/carts/uuid/788122b1-9150-4e96-a1df-204ee06f8869/b6e05972-fe25-44aa-b5a0-db6e100ca95a/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 3}, "http://localhost:20000/api/registrar/carts/email/subscriber.user@brodagroupsoftware.com/b6e05972-fe25-44aa-b5a0-db6e100ca95a/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 2}, "http://localhost:20000/api/registrar/orders": {"200": 1}, "http://localhost:20000/api/registrar/orders/uuid/764b3e72-d38b-4d66-8763-2c20e2f8cbb0": {"200": 1}}}, "osc-dm-search-srv": {"ericbroda": {"http://localhost:20000/api/search/query": {"200": 1}}, "osc-dm-search-srv": {"http://osc-dm-proxy-srv:8000/api/search/health": {"200": 5}, "http://osc-dm-proxy-srv:8000/api/search/metrics": {"200": 4}}}, "http://osc-dm-product-srv-0:8000": {"ericbroda": {"http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a": {"200": 1}, "http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/artifacts": {"200": 1}, "http://localhost:20000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/artifacts/2df6d005-8fb3-444c-b347-7bfc7ca541df": {"200": 1}}, "osc-dm-search-srv": {"http://osc-dm-proxy-srv:8000/api/dataproducts/uuid/b6e05972-fe25-44aa-b5a0-db6e100ca95a/health": {"200": 1}}}}
Dump the registrar information:
python ./src/cli.py $VERBOSE --host $HOST --port $PORT utility \
--dump
[{"key": "/carts/399e1fec-0b66-4570-a84c-8f41ba8e53c4", "value": {"uuid": "399e1fec-0b66-4570-a84c-8f41ba8e53c4", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [], "createtimestamp": "2024-05-19 13:58:09.241", "updatetimestamp": "2024-05-19 13:58:09.241"}}, {"key": "/orders/31705e97-d955-43f8-80ac-fe87e618b9d3", "value": {"uuid": "31705e97-d955-43f8-80ac-fe87e618b9d3", "subscriber": "subscriber.user@brodagroupsoftware.com", "cart": {"uuid": "19e317b5-7069-4d5a-848f-3a95dd912ba1", "subscriber": "subscriber.user@brodagroupsoftware.com", "items": [{"product": {"uuid": "b6e05972-fe25-44aa-b5a0-db6e100ca95a", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://osc-dm-product-srv-0:8000", "createtimestamp": "2024-05-19 13:57:52.702", "updatetimestamp": "2024-05-19 13:57:52.702"}, "artifact": {"uuid": "2df6d005-8fb3-444c-b347-7bfc7ca541df", "productuuid": "b6e05972-fe25-44aa-b5a0-db6e100ca95a", "productnamespace": "brodagroupsoftware.com", "productname": "rmi.dataproduct", "name": "Assets Earnings Investments", "description": "Detailed breakdown of utility assets in electric rate base, earnings\non these assets, and annual investments (capital additions) by technology.\n", "tags": ["utilities", "emissions"], "license": "CDLA 2.0, Permissive, Version 2.0", "securitypolicy": "public", "links": [{"relationship": "artifact", "mimetype": "text/csv", "url": "https://utilitytransitionhub.rmi.org/static/data_download/assets_earnings_investments.csv"}, {"relationship": "sample", "mimetype": "text/csv", "url": "placeholder-sample.csv"}, {"relationship": "metadata", "mimetype": "application/json", "url": "placeholder-metadata.json"}], "createtimestamp": "2024-05-19 13:57:22.450", "updatetimestamp": "2024-05-19 13:57:22.450"}}], "createtimestamp": "2024-05-19 13:58:09.237", "updatetimestamp": "2024-05-19 13:58:09.237"}, "createtimestamp": "2024-05-19 13:58:09.238", "updatetimestamp": "2024-05-19 13:58:09.238"}}, {"key": "/products/b6e05972-fe25-44aa-b5a0-db6e100ca95a", "value": {"uuid": "b6e05972-fe25-44aa-b5a0-db6e100ca95a", "namespace": "brodagroupsoftware.com", "name": "rmi.dataproduct", "publisher": "publisher.user@brodagroupsoftware.com", "description": "US Utility data provided by RMI", "tags": ["utilities", "emissions"], "address": "http://osc-dm-product-srv-0:8000", "createtimestamp": "2024-05-19 14:00:52.027", "updatetimestamp": "2024-05-19 14:00:52.027"}}, {"key": "/users/guest/8e79c805-c206-42ee-91e0-30923f8b2987", "value": {"uuid": "8e79c805-c206-42ee-91e0-30923f8b2987", "contact": {"name": "Guest User", "email": "guest.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-05-19 13:57:38.470", "updatetimestamp": "2024-05-19 13:57:38.470", "role": "guest"}}, {"key": "/users/publisher/a2734f5f-b9d1-40a1-96db-6194dc7b10d5", "value": {"uuid": "a2734f5f-b9d1-40a1-96db-6194dc7b10d5", "contact": {"name": "Publisher User", "email": "publisher.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-05-19 13:57:38.578", "updatetimestamp": "2024-05-19 13:57:38.578", "role": "publisher"}}, {"key": "/users/subscriber/279e2d55-0ac5-48ac-a4e3-c8dec3f55419", "value": {"uuid": "279e2d55-0ac5-48ac-a4e3-c8dec3f55419", "contact": {"name": "Subscriber User", "email": "subscriber.user@brodagroupsoftware.com", "phone": "+1 647.555.1212"}, "createtimestamp": "2024-05-19 13:57:38.519", "updatetimestamp": "2024-05-19 13:57:38.519", "role": "subscriber"}}]
There are several test cases that can be run but they rely on other services to be available and hence must be run in a particular order with some manual intervention.
Start the Ecosystem Platform services (see previous section "Start Ecosystem Platform").
Start the service for your data product (see previous section "Start Data Products").
To test user registration capabilities:
pytest ./integration-tests/test_cli_users.py
To test user authorization (login/out) capabilities:
pytest ./integration-tests/test_cli_auth.py
To test product configuration generation capabilities:
pytest ./integration-tests/test_cli_products_generate.py
To test product UUID assignment capabilities (note that you will need to remove the current data product "uuids.yaml" file or you will receive an error - if this file already exists then you can safely ignore this test):
pytest ./integration-tests/test_cli_products_assign.py
To test product registration capabilities:
pytest ./integration-tests/test_cli_products.py
To test data product capabilities:
pytest ./integration-tests/test_cli_discover.py
To test carts and order management capabilities:
pytest ./integration-tests/test_cli_carts_orders.py
To test carts and order management capabilities:
pytest ./integration-tests/test_cli_monitor.py