From c0b57be336c7c9167cea571facc7efb3222e9c0b Mon Sep 17 00:00:00 2001 From: "Dixing (Dex) Xu" Date: Sat, 29 Aug 2020 09:44:33 +0800 Subject: [PATCH] add docker rest api agent docker agent for api-agent #121 * support for node creation, start, stop, restart, deletion * add crypto materials and integration test Signed-off-by: Dixing (Dex) Xu --- src/agent/docker-rest-agent/README.md | 1 + .../intergration-test/block.zip | Bin 0 -> 762 bytes .../intergration-test/msp.zip | Bin 0 -> 158 bytes .../intergration-test/orderer_config.zip | Bin 0 -> 4594 bytes .../intergration-test/peer_config.zip | Bin 0 -> 10306 bytes .../intergration-test/test.py | 45 ++++++++++ .../intergration-test/tls.zip | Bin 0 -> 158 bytes src/agent/docker-rest-agent/requirements.txt | 3 + src/agent/docker-rest-agent/server.py | 79 ++++++++++++++++++ 9 files changed, 128 insertions(+) create mode 100644 src/agent/docker-rest-agent/README.md create mode 100644 src/agent/docker-rest-agent/intergration-test/block.zip create mode 100644 src/agent/docker-rest-agent/intergration-test/msp.zip create mode 100644 src/agent/docker-rest-agent/intergration-test/orderer_config.zip create mode 100644 src/agent/docker-rest-agent/intergration-test/peer_config.zip create mode 100644 src/agent/docker-rest-agent/intergration-test/test.py create mode 100644 src/agent/docker-rest-agent/intergration-test/tls.zip create mode 100644 src/agent/docker-rest-agent/requirements.txt create mode 100644 src/agent/docker-rest-agent/server.py diff --git a/src/agent/docker-rest-agent/README.md b/src/agent/docker-rest-agent/README.md new file mode 100644 index 000000000..69c9851c9 --- /dev/null +++ b/src/agent/docker-rest-agent/README.md @@ -0,0 +1 @@ +## Pre-requisite \ No newline at end of file diff --git a/src/agent/docker-rest-agent/intergration-test/block.zip b/src/agent/docker-rest-agent/intergration-test/block.zip new file mode 100644 index 0000000000000000000000000000000000000000..461b2e8f1134b2cff82435462f8f5122f28593ca GIT binary patch literal 762 zcmWIWW@Zs#U|`^2=wcKNoMSs9Ab^R1L5_uifr~+gp(M4qL@y~PKRG)zgp+~!%R0Mw z5H79YW?*D_!OXw_Ce}_mpDpYta(wodyE*Zf%PNzkzdz{L&~?c&zF8vNeL*d7h4|EE zSDX)8-JEOIJp1m3&5YU{Kc#IdUSBL0bP0K}RpVaO_JEAg4IS)`UlQ)NoQ>kw6}i)x z`u%MBz2E!3%X+MOp8qbsxG4VnK3kpM+&4DSx93Iuul@hHyLReZKmYr;?%X=AZ}>x| zd9TEpLyKerl~$?b*Zlap+5F~v!-tZgr*iX_rF~hm&1YuXlM_ali>C-|-jtKIYuU@n zB!Mh}W9y89PA=E3a#L<|TQSdndE~sb(q4hy1znxr{kin#?~8rB{@$I6x&WQ7hrTcG zJ(lk+{iAYlU5m9)p1We%ZPS^jWA1dVn!aGYM=fvazmA6-d?)Vjo|?A#=Ijsg`z|y^ zKHe5^-f55T+0RnNQgVDr{4T~yckJ1hdxd7*J~QjHbM39dI~le=_Hyz~|MaZCqX#lx0r8R5+<}`UNx`>QzLqTh@( zysy8>$lG=5ZEe=2~AX%j<&s+1O9byKS(i?e;$HPmTY1 z{(j$G#PmP3Vcof3%mLnvOmfV)Ql$hiwL-v>Mi7mhMp+?g6fJ!Qc(byBR5Ai#0Fa&n IOyLX+0FnVp>;M1& literal 0 HcmV?d00001 diff --git a/src/agent/docker-rest-agent/intergration-test/msp.zip b/src/agent/docker-rest-agent/intergration-test/msp.zip new file mode 100644 index 0000000000000000000000000000000000000000..5e001613b6d25c2cb0d27f54fdff93065b9e11b8 GIT binary patch literal 158 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 literal 0 HcmV?d00001 diff --git a/src/agent/docker-rest-agent/intergration-test/peer_config.zip b/src/agent/docker-rest-agent/intergration-test/peer_config.zip new file mode 100644 index 0000000000000000000000000000000000000000..5fea13e828b4277d8a5f0979757c437396a3a4bb GIT binary patch literal 10306 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 N|Lv{+q#ywBzW~Kh^PT_z literal 0 HcmV?d00001 diff --git a/src/agent/docker-rest-agent/intergration-test/test.py b/src/agent/docker-rest-agent/intergration-test/test.py new file mode 100644 index 000000000..afc24f13f --- /dev/null +++ b/src/agent/docker-rest-agent/intergration-test/test.py @@ -0,0 +1,45 @@ +from requests import put, get, post +import base64 +import docker +import json + +client = docker.from_env() + +with open('msp.zip', 'rb') as node_msp, open('tls.zip', 'rb') as tls, open('block.zip', 'rb') as block, open('peer_config.zip', 'rb') as peer_config, open('orderer_config.zip', 'rb') as orderer_config: + + data = { + 'msp':base64.b64encode(node_msp.read()), + 'tls':base64.b64encode(tls.read()), + 'bootstrap_block':base64.b64encode(block.read()), + 'peer_config_file':base64.b64encode(peer_config.read()), + 'orderer_config_file':base64.b64encode(orderer_config.read()), + 'img': 'yeasy/hyperledger-fabric:2.2.0', + 'cmd': 'bash /tmp/init.sh "peer node start"', + 'name': 'cello-hlf-peer' + } + +# Test creating a node +n = post('http://localhost:5001/api/v1/nodes', data=data) +print(n.text) +txt = json.loads(n.text) +nid = txt['data']['id'] + +# Test starting a node +data = {'action': 'start'} +response = post('http://localhost:5001/api/v1/nodes/'+nid, data=data) +print(response.text) + +# Test restarting a node +data = {'action': 'restart'} +response = post('http://localhost:5001/api/v1/nodes/'+nid, data=data) +print(response.text) + +# Test stopping a node +data = {'action': 'stop'} +response = post('http://localhost:5001/api/v1/nodes/'+nid, data=data) +print(response.text) + +# Test deleting a node +data = {'action': 'delete'} +response = post('http://localhost:5001/api/v1/nodes/'+nid, data=data) +print(response.text) diff --git a/src/agent/docker-rest-agent/intergration-test/tls.zip b/src/agent/docker-rest-agent/intergration-test/tls.zip new file mode 100644 index 0000000000000000000000000000000000000000..b7f4a2c9f4268c9c59edf11c1ad5dd482b2f6404 GIT binary patch literal 158 zcmWIWW@h1H0D*!?u|O~bO0Y1xYJLGBAIcS%_82&nfm=M!gA*NxN#L5Oz!w7_4K-vz(VE_P%t`{!= literal 0 HcmV?d00001 diff --git a/src/agent/docker-rest-agent/requirements.txt b/src/agent/docker-rest-agent/requirements.txt new file mode 100644 index 000000000..94f0dc9a6 --- /dev/null +++ b/src/agent/docker-rest-agent/requirements.txt @@ -0,0 +1,3 @@ +Flask +flask-restful +requests \ No newline at end of file diff --git a/src/agent/docker-rest-agent/server.py b/src/agent/docker-rest-agent/server.py new file mode 100644 index 000000000..136394019 --- /dev/null +++ b/src/agent/docker-rest-agent/server.py @@ -0,0 +1,79 @@ +from flask import Flask, jsonify, request +import docker +import sys +import logging + +app = Flask(__name__) +PASS_CODE = 'OK' +FAIL_CODE = 'Fail' + +client = docker.from_env() +res = {'code': '', 'data': {}, 'msg': ''} + +@app.route('/api/v1/networks', methods=['GET']) +def get_network(): + return jsonify({'networks': client.containers.list()}) + +@app.route('/api/v1/nodes', methods=['POST']) +def create_node(): + + env = { + 'HLF_NODE_MSP': request.form.get('msp'), + 'HLF_NODE_TLS':request.form.get('tls'), + 'HLF_NODE_BOOTSTRAP_BLOCK':request.form.get('bootstrap_block'), + 'HLF_NODE_PEER_CONFIG':request.form.get('peer_config_file'), + 'HLF_NODE_ORDERER_CONFIG':request.form.get('orderer_config_file'), + } + + + try: + # same as `docker run -dit yeasy/hyperledge-fabric:2.2.0 -e VARIABLES`` + container = client.containers.run(request.form.get('img'), request.form.get('cmd'), detach=True, tty=True, stdin_open=True, name=request.form.get('name'), environment=env) + except: + res['code'] = FAIL_CODE + res['data'] = sys.exc_info()[0] + res['msg'] = 'creation failed' + logging.debug(res) + raise + + res['code'] = PASS_CODE + res['data']['status'] = 'created' + res['data']['id'] = container.id + res['data']['public-grpc'] = '127.0.0.1:7050' # TODO: read the info from config file + res['data']['public-raft'] = '127.0.0.1:7052' + return jsonify(res) + +@app.route('/api/v1/nodes/', methods=['GET', 'POST']) +def operate_node(id): + + container = client.containers.get(id) + if request.method == 'POST': + act = request.form.get('action') # only with POST + + try: + if act == 'start': + container.start() + elif act == 'restart': + container.restart() + elif act == 'stop': + container.stop() + elif act == 'delete': + container.remove() + else: + res['msg'] = 'undefined action' + except: + res['code'] = FAIL_CODE + res['data'] = sys.exc_info()[0] + res['msg'] = act + 'failed' + logging.debug(res) + raise + else: + # GET + res['data']['status'] = container.status() + + res['code'] = PASS_CODE + return jsonify(res) + + +if __name__ == '__main__': + app.run(port=5001, debug=True)