diff --git a/.github/workflows/docker-image.yml b/.github/workflows/docker-image.yml index caed30fd6..34ec711df 100644 --- a/.github/workflows/docker-image.yml +++ b/.github/workflows/docker-image.yml @@ -15,3 +15,19 @@ jobs: - name: Build images run: | make docker-compose + - name: Start services + run: | + MODE=dev make start + sleep 10 + - name: Run newman tests + run: | + make check-api + - name: Stop services + if: always() + run: | + MODE=dev make stop + - name: Clean up + if: always() + run: | + make clean + docker system prune -f diff --git a/Makefile b/Makefile index 62395c600..d23cf0c12 100755 --- a/Makefile +++ b/Makefile @@ -201,6 +201,9 @@ clean-images: check-dashboard: docker compose -f tests/dashboard/docker-compose.yml up --abort-on-container-exit || (echo "check dashboard failed $$?"; exit 1) +check-api: ##@Test Run API tests with newman + cd tests/postman && docker compose up --abort-on-container-exit || (echo "API tests failed $$?"; exit 1) + start-docker-compose: docker compose -f bootup/docker-compose-files/${COMPOSE_FILE} up -d --force-recreate --remove-orphans @@ -230,6 +233,8 @@ dashboard: all \ license \ check \ + check-api \ + check-dashboard \ doc \ help \ docker \ diff --git a/tests/postman/Makefile b/tests/postman/Makefile deleted file mode 100644 index bf778f174..000000000 --- a/tests/postman/Makefile +++ /dev/null @@ -1,6 +0,0 @@ -initial-json: - @envsubst < env.json.tmpl > env.json - -test-api: - @$(MAKE) initial-json - bash ${ROOT_PATH}/tests/postman/test.sh || (echo "test api failed $$?"; exit 1) diff --git a/tests/postman/README.md b/tests/postman/README.md new file mode 100644 index 000000000..bbe69dceb --- /dev/null +++ b/tests/postman/README.md @@ -0,0 +1,48 @@ +# Postman API Testing + +This directory contains Postman test collections and Newman automation testing configuration for Hyperledger Cello API Engine. + +## Features + +- **Hyperledger Cello Api Engine.postman_collection.json**: Complete API test collection with all RESTful endpoints +- **Cello Engine CI Test.postman_collection.json**: Streamlined test collection for CI/CD + +### Test Coverage +- 🔐 User Authentication (login, registration, token verification) +- 🤖 Agent Management (Docker/Kubernetes agents) +- 🏢 Organization Management +- 🌐 Network Management +- 🖥️ Node Management (Peer/Orderer) +- 📡 Channel Management +- 📦 Chaincode Management +- 👥 User Management +- 📁 File Management + +## Newman Usage + +### 1. Using Makefile Commands +```bash +# Run API tests +make check-api +``` + +### 2. Using Docker Compose +```bash +# Navigate to test directory +cd tests/postman + +# Run tests +docker compose up --abort-on-container-exit +``` + +## Configuration + +### Environment Variables +Tests use internally defined collection variables: +- `base_url`: API base URL (default: http://127.0.0.1:8080) +- `token`: JWT access token +- Other business-related variables (org_id, agent_id, etc.) + +### Test Reports +- **JUnit Format**: `junitResult.xml` - for CI/CD integration +- **CLI Output**: Real-time console test results \ No newline at end of file diff --git a/tests/postman/basic.tar.gz b/tests/postman/basic.tar.gz new file mode 100644 index 000000000..6bea405fe Binary files /dev/null and b/tests/postman/basic.tar.gz differ diff --git a/tests/postman/collections/Cello Engine CI Test.postman_collection.json b/tests/postman/collections/Cello Engine CI Test.postman_collection.json new file mode 100644 index 000000000..fa5c4e7b0 --- /dev/null +++ b/tests/postman/collections/Cello Engine CI Test.postman_collection.json @@ -0,0 +1,677 @@ +{ + "info": { + "_postman_id": "04314160-39b9-401c-b74f-6ea9f1cd89fd", + "name": "Cello Engine CI Test", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "43793131", + "_collection_link": "https://www.postman.com/haiboyang-3238546/workspace/hyperledger-cello/collection/43793131-04314160-39b9-401c-b74f-6ea9f1cd89fd?action=share&source=collection_link&creator=43793131" + }, + "item": [ + { + "name": "Register User", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "if (pm.response.code === 200) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"org_id\", jsonData.data.id);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"email\": \"foo@email.com\",\n\t\"password\": \"foo\",\n\t\"orgName\": \"org1.foo.com\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/register", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "register" + ] + }, + "description": "Register new user with organization" + } + }, + { + "name": "Login User", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "if (pm.response.code === 200) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"token\", jsonData.data.token);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"email\": \"foo@email.com\",\n\t\"password\": \"foo\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/login", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "login" + ] + }, + "description": "Login with email and password to get access token" + } + }, + { + "name": "Create Agent", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "if (pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"agent_id\", jsonData.data.id);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"cello-agent-docker\",\n\t\"type\": \"docker\",\n\t\"urls\": \"http://cello.docker.agent:5001\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/agents", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "agents" + ] + }, + "description": "Create new agent" + } + }, + { + "name": "Create Peer Node", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "if (pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"peer_id\", jsonData.data.id);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"peer0\",\n\t\"type\": \"peer\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/nodes", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "nodes" + ] + }, + "description": "Create new peer node" + } + }, + { + "name": "Create Orderer Node", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "if (pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"orderer_id\", jsonData.data.id);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"orderer0\",\n\t\"type\": \"orderer\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/nodes", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "nodes" + ] + }, + "description": "Create new orderer node" + } + }, + { + "name": "Create Network", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "if (pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"network_id\", jsonData.data.id);", + " ", + " setTimeout(function() {", + " console.log(\"Delayed 5 seconds\");", + " }, 5000);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"test-network\",\n\t\"consensus\": \"etcdraft\",\n\t\"database\": \"couchdb\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/networks", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "networks" + ] + }, + "description": "Create new blockchain network" + } + }, + { + "name": "Create Channel", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 201\", function () {", + " pm.response.to.have.status(201);", + "});", + "", + "if (pm.response.code === 201) {", + " var jsonData = pm.response.json();", + " pm.environment.set(\"channel_id\", jsonData.id);", + " ", + " setTimeout(function() {", + " console.log(\"Delayed 10 seconds\");", + " }, 10000);", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"name\": \"mychannel\",\n\t\"orderers\": [\"{{orderer_id}}\"],\n\t\"peers\": [\"{{peer_id}}\"]\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/channels", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "channels" + ] + }, + "description": "Create new channel with specified peers and orderers" + } + }, + { + "name": "Upload Chaincode Package", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "formdata", + "formdata": [ + { + "key": "file", + "type": "file", + "src": ["basic.tar.gz"], + "description": "basic chaincode package" + }, + { + "key": "description", + "value": "Sample chaincode for testing", + "type": "text" + } + ] + }, + "url": { + "raw": "{{base_url}}/api/v1/chaincodes/chaincodeRepo", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "chaincodes", + "chaincodeRepo" + ] + }, + "description": "Upload chaincode package file" + } + }, + { + "name": "List Chaincodes", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});", + "", + "if (pm.response.code === 200) {", + " var jsonData = pm.response.json();", + " if (jsonData.data && jsonData.data.data && jsonData.data.data.length > 0) {", + " var latestChaincode = jsonData.data.data[0];", + " pm.environment.set(\"package_id\", latestChaincode.package_id);", + " } else {", + " console.log(\"No chaincodes found in response\");", + " }", + "}" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "GET", + "header": [ + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "url": { + "raw": "{{base_url}}/api/v1/chaincodes?page=1&per_page=10", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "chaincodes" + ], + "query": [ + { + "key": "page", + "value": "1" + }, + { + "key": "per_page", + "value": "10" + } + ] + }, + "description": "List chaincodes to get the latest uploaded chaincode ID" + } + }, + { + "name": "Install Chaincode", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"id\": \"{{package_id}}\",\n\t\"node\": \"{{peer_id}}\"\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/chaincodes/install", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "chaincodes", + "install" + ] + }, + "description": "Install chaincode package to peer node" + } + }, + { + "name": "Approve Chaincode", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"channel_name\": \"mychannel\",\n\t\"chaincode_name\": \"basic\",\n\t\"chaincode_version\": \"1.0\",\n\t\"sequence\": 1,\n\t\"policy\": \"\",\n\t\"init_flag\": false\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/chaincodes/approve_for_my_org", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "chaincodes", + "approve_for_my_org" + ] + }, + "description": "Approve chaincode for organization" + } + }, + { + "name": "Commit Chaincode", + "event": [ + { + "listen": "test", + "script": { + "exec": [ + "pm.test(\"Status code is 200\", function () {", + " pm.response.to.have.status(200);", + "});" + ], + "type": "text/javascript" + } + } + ], + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json", + "type": "text" + }, + { + "key": "Authorization", + "value": "JWT {{token}}", + "type": "text" + } + ], + "body": { + "mode": "raw", + "raw": "{\n\t\"channel_name\": \"mychannel\",\n\t\"chaincode_name\": \"basic\",\n\t\"chaincode_version\": \"1.0\",\n\t\"sequence\": 1,\n\t\"policy\": \"\",\n\t\"init_flag\": false\n}" + }, + "url": { + "raw": "{{base_url}}/api/v1/chaincodes/commit", + "host": [ + "{{base_url}}" + ], + "path": [ + "api", + "v1", + "chaincodes", + "commit" + ] + }, + "description": "Commit chaincode definition to channel" + } + } + ], + "variable": [ + { + "key": "base_url", + "value": "http://127.0.0.1:8080", + "type": "string" + }, + { + "key": "token", + "value": "", + "type": "string" + }, + { + "key": "org_id", + "value": "", + "type": "string" + }, + { + "key": "agent_id", + "value": "", + "type": "string" + }, + { + "key": "network_id", + "value": "", + "type": "string" + }, + { + "key": "peer_id", + "value": "", + "type": "string" + }, + { + "key": "orderer_id", + "value": "", + "type": "string" + }, + { + "key": "channel_id", + "value": "", + "type": "string" + }, + { + "key": "package_id", + "value": "", + "type": "string" + } + ] +} \ No newline at end of file diff --git a/tests/postman/collections/Hyperledger Cello Api Engine.postman_collection.json b/tests/postman/collections/Hyperledger Cello Api Engine.postman_collection.json deleted file mode 100644 index ecdf29b02..000000000 --- a/tests/postman/collections/Hyperledger Cello Api Engine.postman_collection.json +++ /dev/null @@ -1,2017 +0,0 @@ -{ - "info": { - "_postman_id": "deaa6f62-4155-4b00-b84f-ed1354f3f321", - "name": "Hyperledger Cello API Engine", - "description": "Hyperledger Cello is a blockchain provision and operation system, which helps manage blockchain networks in an efficient way. This document is a complete API collection for its API Engine with all RESTful endpoints", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "Authentication", - "item": [ - { - "name": "Login User", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "if (pm.response.code === 200) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"token\", jsonData.data.token);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"email\": \"foo@email.com\",\n\t\"password\": \"foo\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/login", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "login" - ] - }, - "description": "Login with email and password to get access token" - } - }, - { - "name": "Refresh Token", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"refresh\": \"{{refresh_token}}\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/login/refresh/", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "login", - "refresh", - "" - ] - }, - "description": "Refresh access token using refresh token" - } - }, - { - "name": "Verify Token", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"token\": \"{{token}}\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/token-verify", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "token-verify" - ] - }, - "description": "Verify the validity of access token" - } - }, - { - "name": "Register User", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"org_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"admin\",\n\t\"email\": \"admin@email.com\",\n\t\"password\": \"password\",\n\t\"orgName\": \"org1.example.com\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/register", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "register" - ] - }, - "description": "Register new user with organization" - } - } - ], - "description": "Authentication and user registration endpoints" - }, - { - "name": "Agents", - "item": [ - { - "name": "List Agents", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/agents", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "name", - "value": "", - "disabled": true - }, - { - "key": "status", - "value": "", - "disabled": true - }, - { - "key": "type", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of agents with pagination and filtering options" - } - }, - { - "name": "Create Agent", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"agent_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"cello-agent-docker\",\n\t\"type\": \"docker\",\n\t\"urls\": \"http://cello.docker.agent:5001\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/agents", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents" - ] - }, - "description": "Create new agent" - } - }, - { - "name": "Get Agent", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/agents/{{agent_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "{{agent_id}}" - ] - }, - "description": "Get agent details by ID" - } - }, - { - "name": "Update Agent", - "request": { - "method": "PUT", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"updated-agent-name\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/agents/{{agent_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "{{agent_id}}" - ] - }, - "description": "Update agent information" - } - }, - { - "name": "Partial Update Agent", - "request": { - "method": "PATCH", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"partial-updated-name\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/agents/{{agent_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "{{agent_id}}" - ] - }, - "description": "Partially update agent information" - } - }, - { - "name": "Delete Agent", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/agents/{{agent_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "{{agent_id}}" - ] - }, - "description": "Delete agent by ID" - } - }, - { - "name": "Apply Agent", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"type\": \"kubernetes\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/agents/organization", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "organization" - ] - }, - "description": "Apply for agent assignment to organization" - } - }, - { - "name": "Release Agent", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/agents/{{agent_id}}/organization", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "agents", - "{{agent_id}}", - "organization" - ] - }, - "description": "Release agent from organization assignment" - } - } - ], - "description": "Agent management endpoints for Docker and Kubernetes agents" - }, - { - "name": "Organizations", - "item": [ - { - "name": "List Organizations", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/organizations", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "organizations" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "name", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of organizations with pagination" - } - }, - { - "name": "Create Organization", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"org_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"org1.example.com\",\n\t\"peernum\": 2,\n\t\"orderernum\": 1\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/organizations", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "organizations" - ] - }, - "description": "Create new organization with specified peer and orderer nodes" - } - }, - { - "name": "Get Organization", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/organizations/{{org_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "organizations", - "{{org_id}}" - ] - }, - "description": "Get organization details by ID" - } - }, - { - "name": "Update Organization", - "request": { - "method": "PUT", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"updated-org.example.com\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/organizations/{{org_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "organizations", - "{{org_id}}" - ] - }, - "description": "Update organization information" - } - }, - { - "name": "Delete Organization", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/organizations/{{org_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "organizations", - "{{org_id}}" - ] - }, - "description": "Delete organization by ID" - } - } - ], - "description": "Organization management endpoints" - }, - { - "name": "Networks", - "item": [ - { - "name": "List Networks", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/networks", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "networks" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "status", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of blockchain networks" - } - }, - { - "name": "Create Network", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"network_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"test-network\",\n\t\"consensus\": \"etcdraft\",\n\t\"database\": \"leveldb\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/networks", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "networks" - ] - }, - "description": "Create new blockchain network" - } - }, - { - "name": "Get Network", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/networks/{{network_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "networks", - "{{network_id}}" - ] - }, - "description": "Get network details by ID" - } - }, - { - "name": "Delete Network", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/networks/{{network_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "networks", - "{{network_id}}" - ] - }, - "description": "Delete network by ID" - } - } - ], - "description": "Blockchain network management endpoints" - }, - { - "name": "Nodes", - "item": [ - { - "name": "List Nodes", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/nodes", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "type", - "value": "", - "disabled": true - }, - { - "key": "name", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of blockchain nodes (peers and orderers)" - } - }, - { - "name": "Create Peer Node", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"peer_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"peer0\",\n\t\"type\": \"peer\",\n\t\"num\": 1\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes" - ] - }, - "description": "Create new peer node" - } - }, - { - "name": "Create Orderer Node", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"orderer_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"orderer0\",\n\t\"type\": \"orderer\",\n\t\"num\": 1\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes" - ] - }, - "description": "Create new orderer node" - } - }, - { - "name": "Get Node", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}" - ] - }, - "description": "Get node details by ID" - } - }, - { - "name": "Update Node", - "request": { - "method": "PUT", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"updated-peer0\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}" - ] - }, - "description": "Update node information" - } - }, - { - "name": "Delete Node", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}" - ] - }, - "description": "Delete node by ID" - } - }, - { - "name": "Operate Node", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"action\": \"start\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/operations", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "operations" - ] - }, - "description": "Perform operations on node (start, stop, restart)" - } - }, - { - "name": "Get Node Config", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/config", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "config" - ] - }, - "description": "Download node configuration files" - } - }, - { - "name": "Upload Node Config", - "request": { - "method": "POST", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "file", - "type": "file", - "src": [] - } - ] - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/config", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "config" - ] - }, - "description": "Upload node configuration file" - } - }, - { - "name": "Join Channel", - "request": { - "method": "POST", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "file", - "type": "file", - "src": [], - "description": "Genesis block file" - } - ] - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/block", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "block" - ] - }, - "description": "Upload genesis block to join channel" - } - }, - { - "name": "List Node Users", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/users", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "users" - ] - }, - "description": "Get list of users registered to node" - } - }, - { - "name": "Register User to Node", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"user1\",\n\t\"password\": \"password123\",\n\t\"type\": \"client\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/nodes/{{peer_id}}/users", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "nodes", - "{{peer_id}}", - "users" - ] - }, - "description": "Register new user to node" - } - } - ], - "description": "Blockchain node (peer and orderer) management endpoints" - }, - { - "name": "Channels", - "item": [ - { - "name": "List Channels", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/channels", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "channels" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - } - ] - }, - "description": "Get list of channels" - } - }, - { - "name": "Create Channel", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"channel_id\", jsonData.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"mychannel\",\n\t\"orderers\": [\"{{orderer_id}}\"],\n\t\"peers\": [\"{{peer_id}}\"]\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/channels", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "channels" - ] - }, - "description": "Create new channel with specified peers and orderers" - } - }, - { - "name": "Get Channel", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/channels/{{channel_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "channels", - "{{channel_id}}" - ] - }, - "description": "Get channel details by ID" - } - }, - { - "name": "Update Channel", - "request": { - "method": "PUT", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "msp_id", - "value": "Org1MSP", - "type": "text" - }, - { - "key": "org_type", - "value": "Application", - "type": "text" - }, - { - "key": "data", - "type": "file", - "src": [] - } - ] - }, - "url": { - "raw": "{{base_url}}/api/v1/channels/{{channel_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "channels", - "{{channel_id}}" - ] - }, - "description": "Update channel configuration" - } - } - ], - "description": "Blockchain channel management endpoints" - }, - { - "name": "Chaincodes", - "item": [ - { - "name": "List Chaincodes", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/chaincodes", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "chaincodes" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - } - ] - }, - "description": "Get list of chaincode packages" - } - }, - { - "name": "Upload Chaincode Package", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"chaincode_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "file", - "type": "file", - "src": [], - "description": "Chaincode package (.tar.gz)" - }, - { - "key": "description", - "value": "Sample chaincode for testing", - "type": "text" - } - ] - }, - "url": { - "raw": "{{base_url}}/api/v1/chaincodes/chaincodeRepo", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "chaincodes", - "chaincodeRepo" - ] - }, - "description": "Upload chaincode package file" - } - }, - { - "name": "Approve Chaincode", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"channel_name\": \"mychannel\",\n\t\"chaincode_name\": \"mycc\",\n\t\"chaincode_version\": \"1.0\",\n\t\"sequence\": 1,\n\t\"policy\": \"\",\n\t\"init_flag\": false\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/chaincodes/{{chaincode_id}}/approve", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "chaincodes", - "{{chaincode_id}}", - "approve" - ] - }, - "description": "Approve chaincode for organization" - } - }, - { - "name": "Commit Chaincode", - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"channel_name\": \"mychannel\",\n\t\"chaincode_name\": \"mycc\",\n\t\"chaincode_version\": \"1.0\",\n\t\"sequence\": 1,\n\t\"policy\": \"\",\n\t\"init_flag\": false\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/chaincodes/{{chaincode_id}}/commit", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "chaincodes", - "{{chaincode_id}}", - "commit" - ] - }, - "description": "Commit chaincode definition to channel" - } - } - ], - "description": "Chaincode management endpoints for smart contract deployment" - }, - { - "name": "Users", - "item": [ - { - "name": "List Users", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/users?page=1&per_page=10", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "users" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "username", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of users with pagination and filtering" - } - }, - { - "name": "Create User", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"user_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"testuser\",\n\t\"email\": \"testuser@email.com\",\n\t\"password\": \"password123\",\n\t\"role\": \"operator\",\n\t\"organization\": \"{{org_id}}\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/users", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "users" - ] - }, - "description": "Create new user" - } - }, - { - "name": "Get User", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/users/{{user_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "users", - "{{user_id}}" - ] - }, - "description": "Get user details by ID" - } - }, - { - "name": "Update User", - "request": { - "method": "PUT", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"password\": \"newpassword123\"\n}" - }, - "url": { - "raw": "{{base_url}}/api/v1/users/{{user_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "users", - "{{user_id}}" - ] - }, - "description": "Update user information" - } - }, - { - "name": "Delete User", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/users/{{user_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "users", - "{{user_id}}" - ] - }, - "description": "Delete user by ID" - } - } - ], - "description": "User management endpoints" - }, - { - "name": "Files", - "item": [ - { - "name": "List Files", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/files", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "files" - ], - "query": [ - { - "key": "page", - "value": "1" - }, - { - "key": "per_page", - "value": "10" - }, - { - "key": "name", - "value": "", - "disabled": true - }, - { - "key": "type", - "value": "", - "disabled": true - } - ] - }, - "description": "Get list of uploaded files" - } - }, - { - "name": "Upload File", - "event": [ - { - "listen": "test", - "script": { - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "if (pm.response.code === 201) {", - " var jsonData = pm.response.json();", - " pm.environment.set(\"file_id\", jsonData.data.id);", - "}" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "formdata", - "formdata": [ - { - "key": "file", - "type": "file", - "src": [] - }, - { - "key": "name", - "value": "test-file", - "type": "text" - }, - { - "key": "type", - "value": "config", - "type": "text" - } - ] - }, - "url": { - "raw": "{{base_url}}/api/v1/files", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "files" - ] - }, - "description": "Upload new file" - } - }, - { - "name": "Get File", - "request": { - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/files/{{file_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "files", - "{{file_id}}" - ] - }, - "description": "Get file details by ID" - } - }, - { - "name": "Delete File", - "request": { - "method": "DELETE", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "url": { - "raw": "{{base_url}}/api/v1/files/{{file_id}}", - "host": [ - "{{base_url}}" - ], - "path": [ - "api", - "v1", - "files", - "{{file_id}}" - ] - }, - "description": "Delete file by ID" - } - } - ], - "description": "File management endpoints for configuration and other files" - } - ], - "variable": [ - { - "key": "base_url", - "value": "http://127.0.0.1:8080", - "type": "string" - }, - { - "key": "token", - "value": "", - "type": "string" - }, - { - "key": "refresh_token", - "value": "", - "type": "string" - }, - { - "key": "org_id", - "value": "", - "type": "string" - }, - { - "key": "agent_id", - "value": "", - "type": "string" - }, - { - "key": "network_id", - "value": "", - "type": "string" - }, - { - "key": "peer_id", - "value": "", - "type": "string" - }, - { - "key": "orderer_id", - "value": "", - "type": "string" - }, - { - "key": "channel_id", - "value": "", - "type": "string" - }, - { - "key": "chaincode_id", - "value": "", - "type": "string" - }, - { - "key": "user_id", - "value": "", - "type": "string" - }, - { - "key": "file_id", - "value": "", - "type": "string" - } - ] -} \ No newline at end of file diff --git a/tests/postman/docker-compose.dev.yml b/tests/postman/docker-compose.dev.yml new file mode 100644 index 000000000..35071d78c --- /dev/null +++ b/tests/postman/docker-compose.dev.yml @@ -0,0 +1,9 @@ +version: '3.2' +services: + newman: + image: postman/newman:latest + volumes: + - ./:/etc/newman + working_dir: /etc/newman + command: run collections/Cello\ Engine\ CI\ Test.postman_collection.json -r junit,cli --reporter-junit-export junitResult.xml + network_mode: "host" \ No newline at end of file diff --git a/tests/postman/docker-compose.yml b/tests/postman/docker-compose.yml deleted file mode 100644 index e6dca05c0..000000000 --- a/tests/postman/docker-compose.yml +++ /dev/null @@ -1,8 +0,0 @@ -version: '3.2' -services: - newman: - image: postman/newman_ubuntu1404:4.4.0 - volumes: - - ./:/etc/newman - command: run /etc/newman/test/test.json -e /etc/newman/env.json -r junit,cli --reporter-junit-export junitResult.xml - network_mode: "host" \ No newline at end of file diff --git a/tests/postman/env.json.tmpl b/tests/postman/env.json.tmpl deleted file mode 100644 index 86d45ca77..000000000 --- a/tests/postman/env.json.tmpl +++ /dev/null @@ -1,136 +0,0 @@ -{ - "id": "1e3c31bf-a898-44bb-bc3d-63dabfff72ed", - "name": "Cello", - "values": [ - { - "key": "apiServer", - "value": "http://127.0.0.1:$API_ENGINE_SERVICE_PORT", - "description": "", - "enabled": true - }, - { - "key": "webRoot", - "value": "$API_ENGINE_WEBROOT", - "description": "", - "enabled": true - }, - { - "key": "token", - "value": "$API_ENGINE_ADMIN_TOKEN", - "description": "", - "enabled": true - }, - { - "key": "orgName", - "value": "test-org", - "description": "", - "enabled": true - }, - { - "key": "orgID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "operatorName", - "value": "operator-user", - "description": "", - "enabled": true - }, - { - "key": "operatorPassword", - "value": "password", - "description": "", - "enabled": true - }, - { - "key": "operatorID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "operatorToken", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "k8sAgentName", - "value": "k8s-agent", - "description": "", - "enabled": true - }, - { - "key": "k8sAgentWorkerApi", - "value": "http://192.168.1.2:8080", - "description": "", - "enabled": true - }, - { - "key": "agentCapacity", - "value": "10", - "description": "", - "enabled": true - }, - { - "key": "k8sNfsServer", - "value": "192.168.1.2:/", - "description": "", - "enabled": true - }, - { - "key": "agentID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "ordererID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "peerID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "nodeCapacity", - "value": "40", - "description": "", - "enabled": true - }, - { - "key": "appliedAgentID", - "value": "", - "description": "", - "enabled": true - }, - { - "key": "adminName", - "value": "$API_ENGINE_ADMIN_USERNAME", - "description": "", - "enabled": true - }, - { - "key": "adminPassword", - "value": "$API_ENGINE_ADMIN_PASSWORD", - "description": "", - "enabled": true - }, - { - "key": "operatorEmail", - "value": "operator@cello.com", - "type": "text", - "description": "", - "enabled": true - } - ], - "_postman_variable_scope": "environment", - "_postman_exported_at": "2019-03-10T08:10:15.305Z", - "_postman_exported_using": "Postman/7.0.4" -} \ No newline at end of file diff --git a/tests/postman/test.sh b/tests/postman/test.sh deleted file mode 100755 index d3dea5ac1..000000000 --- a/tests/postman/test.sh +++ /dev/null @@ -1,16 +0,0 @@ -#!/usr/bin/env bash - -#for testfile in ${ROOT_PATH}/tests/postman/test/*; do -# filename="${testfile##*/}" -# docker run -v ${ROOT_PATH}/tests/postman:/etc/newman --network="host" -v /tmp:/tmp postman/newman_ubuntu1404:4.4.0 run /etc/newman/test/$filename -e /etc/newman/env.json -# -# if [[ "$?" != "0" ]]; then -# echo "API tests ${filename} failed"; -# exit 1; -# else -# echo "API tests ${filename} passed"; -# fi -#done -docker compose up --abort-on-container-exit - -cp ${ROOT_PATH}/tests/postman/junitResult.xml ${ROOT_PATH}/ \ No newline at end of file diff --git a/tests/postman/test/test.json b/tests/postman/test/test.json deleted file mode 100644 index f2d38094c..000000000 --- a/tests/postman/test/test.json +++ /dev/null @@ -1,751 +0,0 @@ -{ - "info": { - "_postman_id": "ec98c130-1347-480e-8908-1f00d906ab06", - "name": "Hyperledger Cello Api Engine", - "description": "Hyperledger Cello Api Engine", - "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json" - }, - "item": [ - { - "name": "Login Admin", - "event": [ - { - "listen": "test", - "script": { - "id": "30bb7433-5d34-407a-9c24-8d33f080446e", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"token\", jsonData.token);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"admin\",\n\t\"password\": \"pass\"\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/auth/login/", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "auth", - "login", - "" - ] - }, - "description": "Login Admin" - }, - "response": [] - }, - { - "name": "List Agents", - "event": [ - { - "listen": "test", - "script": { - "id": "2493c5e9-eaf2-4689-a6ec-59080e571783", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [ - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents" - ] - }, - "description": "List Agents" - }, - "response": [] - }, - { - "name": "Create Organization", - "event": [ - { - "listen": "test", - "script": { - "id": "a0f5e8df-9ce8-44e6-ad23-2f0899ce594a", - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"orgID\", jsonData.id);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"{{orgName}}\"\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/organizations", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "organizations" - ] - }, - "description": "Create Organization" - }, - "response": [] - }, - { - "name": "Retrieve Organization", - "event": [ - { - "listen": "test", - "script": { - "id": "a0f5e8df-9ce8-44e6-ad23-2f0899ce594a", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Test is right org\", function () {", - " var jsonData = pm.response.json();", - " var orgName = pm.environment.get(\"orgName\");", - "", - " tests[\"Name is right\"] = jsonData.name === orgName;", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/organizations/{{orgID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "organizations", - "{{orgID}}" - ] - }, - "description": "Retrieve Organization" - }, - "response": [] - }, - { - "name": "Create Admin with organization", - "event": [ - { - "listen": "test", - "script": { - "id": "a0f5e8df-9ce8-44e6-ad23-2f0899ce594a", - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"operatorID\", jsonData.id);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"{{operatorName}}\",\n\t\"organization\": \"{{orgID}}\",\n\t\"role\": \"administrator\",\n\t\"password\": \"{{operatorPassword}}\",\n\t\"email\": \"{{operatorEmail}}\"\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/users", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "users" - ] - }, - "description": "Create Admin with organization" - }, - "response": [] - }, - { - "name": "Create Agent", - "event": [ - { - "listen": "test", - "script": { - "id": "5fb7881e-27c4-4420-bebb-9c9a604ef129", - "exec": [ - "pm.test(\"Status code is 201\", function () {", - " pm.response.to.have.status(201);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"agentID\", jsonData.id);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"name\": \"{{k8sAgentName}}\",\n\t\"worker_api\": \"{{k8sAgentWorkerApi}}\",\n\t\"capacity\": {{agentCapacity}},\n\t\"node_capacity\": {{nodeCapacity}},\n\t\"log_level\": \"info\",\n\t\"type\": \"kubernetes\",\n\t\"schedulable\": true,\n\t\"k8s_config\": {\n\t\t\"credential_type\": \"cert_key\",\n\t\t\"enable_ssl\": false,\n\t\t\"nfs_server\": \"{{k8sNfsServer}}\",\n\t\t\"cert\": \"cert\",\n\t\t\"key\": \"key\"\n\t}\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents" - ] - }, - "description": "Create Agent" - }, - "response": [] - }, - { - "name": "Retrieve Agent", - "event": [ - { - "listen": "test", - "script": { - "id": "269f857f-7e26-417d-a4b0-dec87aac3853", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Test is right agent\", function () {", - " var jsonData = pm.response.json();", - " var agentName = pm.environment.get(\"k8sAgentName\");", - " var agentCapacity = parseInt(pm.environment.get(\"agentCapacity\"));", - " var k8sAgentWorkerApi = pm.environment.get(\"k8sAgentWorkerApi\");", - "", - " tests[\"Name is right\"] = jsonData.name === agentName;", - " tests[\"Capacity is right\"] = jsonData.capacity === agentCapacity;", - " tests[\"Worker api is right\"] = jsonData.worker_api === k8sAgentWorkerApi;", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents/{{agentID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents", - "{{agentID}}" - ] - }, - "description": "Retrieve Agent" - }, - "response": [] - }, - { - "name": "Auth Operator", - "event": [ - { - "listen": "test", - "script": { - "id": "62366c1c-74bf-4f81-ae81-f5da3c17eabb", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"operatorToken\", jsonData.token);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "method": "POST", - "header": [ - { - "key": "Content-Type", - "value": "application/json", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"username\": \"{{operatorName}}\",\n\t\"password\": \"{{operatorPassword}}\"\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/auth/login/", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "auth", - "login", - "" - ] - }, - "description": "Auth Operator" - }, - "response": [] - }, - { - "name": "Apply agent with operator token", - "event": [ - { - "listen": "test", - "script": { - "id": "62366c1c-74bf-4f81-ae81-f5da3c17eabb", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "var jsonData = pm.response.json();", - "pm.environment.set(\"appliedAgentID\", jsonData.id);" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "POST", - "header": [ - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{operatorToken}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "{\n\t\"type\": \"kubernetes\",\n\t\"capacity\": {{agentCapacity}}\n}" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents/organization", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents", - "organization" - ] - }, - "description": "Apply agent with operator token" - }, - "response": [] - }, - { - "name": "Retrieve Agent with operator token", - "event": [ - { - "listen": "test", - "script": { - "id": "269f857f-7e26-417d-a4b0-dec87aac3853", - "exec": [ - "pm.test(\"Status code is 200\", function () {", - " pm.response.to.have.status(200);", - "});", - "", - "pm.test(\"Test is right agent\", function () {", - " var jsonData = pm.response.json();", - " var agentID = pm.environment.get(\"appliedAgentID\");", - "", - " tests[\"ID is right\"] = jsonData.id === agentID;", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "GET", - "header": [ - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{operatorToken}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents/{{agentID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents", - "{{agentID}}" - ] - }, - "description": "Retrieve Agent with operator token" - }, - "response": [] - }, - { - "name": "Release Agent with operator token", - "event": [ - { - "listen": "test", - "script": { - "id": "269f857f-7e26-417d-a4b0-dec87aac3853", - "exec": [ - "pm.test(\"Status code is 204\", function () {", - " pm.response.to.have.status(204);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{operatorToken}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents/{{agentID}}/organization", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents", - "{{agentID}}", - "organization" - ] - }, - "description": "Release agent with operator token" - }, - "response": [] - }, - { - "name": "Delete Agent", - "event": [ - { - "listen": "test", - "script": { - "id": "269f857f-7e26-417d-a4b0-dec87aac3853", - "exec": [ - "pm.test(\"Status code is 204\", function () {", - " pm.response.to.have.status(204);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/agents/{{agentID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "agents", - "{{agentID}}" - ] - }, - "description": "Delete Agent" - }, - "response": [] - }, - { - "name": "Delete User", - "event": [ - { - "listen": "test", - "script": { - "id": "a0f5e8df-9ce8-44e6-ad23-2f0899ce594a", - "exec": [ - "pm.test(\"Status code is 204\", function () {", - " pm.response.to.have.status(204);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/users/{{operatorID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "users", - "{{operatorID}}" - ] - }, - "description": "Delete User" - }, - "response": [] - }, - { - "name": "Delete Organization", - "event": [ - { - "listen": "test", - "script": { - "id": "a0f5e8df-9ce8-44e6-ad23-2f0899ce594a", - "exec": [ - "pm.test(\"Status code is 204\", function () {", - " pm.response.to.have.status(204);", - "});" - ], - "type": "text/javascript" - } - } - ], - "request": { - "auth": { - "type": "noauth" - }, - "method": "DELETE", - "header": [ - { - "key": "Content-Type", - "name": "Content-Type", - "type": "text", - "value": "application/json" - }, - { - "key": "Authorization", - "value": "JWT {{token}}", - "type": "text" - } - ], - "body": { - "mode": "raw", - "raw": "" - }, - "url": { - "raw": "{{apiServer}}{{webRoot}}/organizations/{{orgID}}", - "host": [ - "{{apiServer}}{{webRoot}}" - ], - "path": [ - "organizations", - "{{orgID}}" - ] - }, - "description": "Delete Organization" - }, - "response": [] - } - ] -} \ No newline at end of file