From 73746710e7f6cf1f586440d0b45e6ee17133fc22 Mon Sep 17 00:00:00 2001 From: kexkey Date: Tue, 21 May 2019 22:59:03 -0400 Subject: [PATCH] Schema in README, added broker and notifier tests --- README.md | 6 ++- doc/CN-Arch-0.2.1.jpg | Bin 0 -> 74189 bytes .../installer/docker/docker-compose.yaml | 9 ++-- .../app/templates/installer/testfeatures.sh | 48 ++++++++++++++++-- 4 files changed, 55 insertions(+), 8 deletions(-) create mode 100644 doc/CN-Arch-0.2.1.jpg diff --git a/README.md b/README.md index 9abc7e9..ce671e8 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # cyphernode -Modular Bitcoin full-node microservices API server architecture and utilities toolkit to build scalable, secure and featureful apps and services without trusted third parties. +Modular Bitcoin full-node microservices API server architecture and utilities toolkit to build scalable, secure and featureful apps and services without trusted third parties. # What is cyphernode? @@ -14,9 +14,11 @@ It is currently in production by Bylls.com, Canada's first and largest Bitcoin p The project is in **heavy development** - we are currently looking for reviews, new features, user feedback and contributors to our roadmap. +![image](doc/CN-Arch-0.2.1.jpg) + # Low requirements, efficient use of resources -Cyphernode is designed to be deployed on virtual machines with launch scripts, but with efficiency and minimalism in mind so that it can also run on multiple Rasberry Pi with very low computing ressources (and extremely low if installing pre-synchronized blockchain and pruned). Because of the modular architecture, heavier modules like blockchain indexers are optional (and not needed for most commercial use-cases). +Cyphernode is designed to be deployed on virtual machines with launch scripts, but with efficiency and minimalism in mind so that it can also run on multiple Rasberry Pi with very low computing ressources (and extremely low if installing pre-synchronized blockchain and pruned). Because of the modular architecture, heavier modules like blockchain indexers are optional (and not needed for most commercial use-cases). * For a full-node and all modules: * 350 GB of storage, 2GB of RAM. diff --git a/doc/CN-Arch-0.2.1.jpg b/doc/CN-Arch-0.2.1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..0163945e92ccb22aa7fe1869fb051be3d8917982 GIT binary patch literal 74189 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 Wgf28C-S1Jov>VzWCT!*Z-vj_$p+q16 literal 0 HcmV?d00001 diff --git a/install/generator-cyphernode/generators/app/templates/installer/docker/docker-compose.yaml b/install/generator-cyphernode/generators/app/templates/installer/docker/docker-compose.yaml index b6a9c64..b0bbb1e 100644 --- a/install/generator-cyphernode/generators/app/templates/installer/docker/docker-compose.yaml +++ b/install/generator-cyphernode/generators/app/templates/installer/docker/docker-compose.yaml @@ -33,6 +33,9 @@ services: ports: - 80:80 - 443:443 +# deploy: +# placement: +# constraints: [node.hostname==dev] volumes: - "/var/run/docker.sock:/var/run/docker.sock" - "<%= traefik_datapath%>/traefik.toml:/traefik.toml" @@ -160,6 +163,9 @@ services: ports: - "<%= (net === 'mainnet')?'8332:8332':'18332:18332' %>" <% } %> +# deploy: +# placement: +# constraints: [node.hostname==dev] volumes: - "<%= bitcoin_datapath %>:/.bitcoin" networks: @@ -172,9 +178,6 @@ services: # deploy: # placement: # constraints: [node.hostname==dev] -# ports: -# - "1883:1883" -# - "9001:9001" networks: - cyphernodenet restart: always diff --git a/install/generator-cyphernode/generators/app/templates/installer/testfeatures.sh b/install/generator-cyphernode/generators/app/templates/installer/testfeatures.sh index 40bff9b..82d79ca 100644 --- a/install/generator-cyphernode/generators/app/templates/installer/testfeatures.sh +++ b/install/generator-cyphernode/generators/app/templates/installer/testfeatures.sh @@ -83,6 +83,26 @@ checkpycoin() { return 0 } +checkbroker() { + echo -en "\r\n\e[1;36mTesting Broker... " > /dev/console + local rc + + + echo -e "\e[1;36mBroker rocks!" > /dev/console + + return 0 +} + +checknotifier() { + echo -en "\r\n\e[1;36mTesting Notifier... " > /dev/console + local rc + + + echo -e "\e[1;36mNotifier rocks!" > /dev/console + + return 0 +} + checkots() { echo -en "\r\n\e[1;36mTesting OTSclient... " > /dev/console local rc @@ -133,12 +153,12 @@ checkservice() { while : do outcome=0 - for container in gatekeeper proxy proxycron pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do + for container in gatekeeper proxy proxycron broker notifier pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do echo -e " \e[0;32mVerifying \e[0;33m${container}\e[0;32m..." > /dev/console (ping -c 10 ${container} 2> /dev/null | grep "0% packet loss" > /dev/null) & eval ${container}=$! done - for container in gatekeeper proxy proxycron pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do + for container in gatekeeper proxy proxycron broker notifier pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do eval wait '$'${container} ; returncode=$? ; outcome=$((${outcome} + ${returncode})) eval c_${container}=${returncode} done @@ -160,7 +180,7 @@ checkservice() { # { "name": "bitcoin", "active":true }, # { "name": "lightning", "active":true }, # ] - for container in gatekeeper proxy proxycron pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do + for container in gatekeeper proxy proxycron broker notifier pycoin <%= (features.indexOf('otsclient') != -1)?'otsclient ':'' %>bitcoin <%= (features.indexOf('lightning') != -1)?'lightning ':'' %>; do [ -n "${result}" ] && result="${result}," result="${result}{\"name\":\"${container}\",\"active\":" eval "returncode=\$c_${container}" @@ -279,6 +299,28 @@ fi finalreturncode=$((${returncode} | ${finalreturncode})) result="${result}$(feature_status ${returncode} 'Bitcoin error!')}" +result="${result},{\"coreFeature\":true, \"name\":\"broker\",\"working\":" +status=$(echo "{${containers}}" | jq ".containers[] | select(.name == \"broker\") | .active") +if [[ "${brokenproxy}" != "true" && "${status}" = "true" ]]; then + timeout_feature checkbroker + returncode=$? +else + returncode=1 +fi +finalreturncode=$((${returncode} | ${finalreturncode})) +result="${result}$(feature_status ${returncode} 'Broker error!')}" + +result="${result},{\"coreFeature\":true, \"name\":\"notifier\",\"working\":" +status=$(echo "{${containers}}" | jq ".containers[] | select(.name == \"notifier\") | .active") +if [[ "${brokenproxy}" != "true" && "${status}" = "true" ]]; then + timeout_feature checknotifier + returncode=$? +else + returncode=1 +fi +finalreturncode=$((${returncode} | ${finalreturncode})) +result="${result}$(feature_status ${returncode} 'Notifier error!')}" + result="${result},{\"coreFeature\":true, \"name\":\"pycoin\",\"working\":" status=$(echo "{${containers}}" | jq ".containers[] | select(.name == \"pycoin\") | .active") if [[ "${brokenproxy}" != "true" && "${status}" = "true" ]]; then