From 8f380209520b58e9b3cb3946035cf68e7987d4c3 Mon Sep 17 00:00:00 2001 From: kansi Date: Wed, 17 Jan 2018 14:41:40 +0530 Subject: [PATCH] ND Api to connect nodes --- network_driver/Dockerfile.tendermint | 2 +- network_driver/build_images.sh | 8 ++++---- network_driver/network.py | 20 +++++++++++++++++- network_driver/node.py | 26 ++++++++++++++++++++++-- network_driver/tnode/config.toml | 15 ++++++++++++++ network_driver/tnode/genesis.json | 1 + network_driver/tnode/priv_validator.json | 1 + 7 files changed, 65 insertions(+), 8 deletions(-) create mode 100644 network_driver/tnode/config.toml create mode 100644 network_driver/tnode/genesis.json create mode 100644 network_driver/tnode/priv_validator.json diff --git a/network_driver/Dockerfile.tendermint b/network_driver/Dockerfile.tendermint index 2ec448f3..1d162fbe 100644 --- a/network_driver/Dockerfile.tendermint +++ b/network_driver/Dockerfile.tendermint @@ -1,6 +1,6 @@ FROM tendermint/tendermint:develop WORKDIR / -COPY ./tnode1 /tendermint +COPY ./tnode /tendermint COPY tendermint_entrypoint.sh tendermint_entrypoint.sh VOLUME /tmp/bigchain/tendermint /tendermint_node_data EXPOSE 46656 46657 diff --git a/network_driver/build_images.sh b/network_driver/build_images.sh index 69011a4c..e8af209e 100644 --- a/network_driver/build_images.sh +++ b/network_driver/build_images.sh @@ -1,10 +1,10 @@ #!/bin/bash # build mongodb image -docker build -t mongodb:bdb -f Dockerfile.mongo . +docker build -t mongodb:bdb-itest -f Dockerfile.mongo . # build mongodb image -docker build -t tendermint:bdb -f Dockerfile.tendermint . +docker build -t tendermint:bdb-itest -f Dockerfile.tendermint . -# build bigchaindb image -docker build -t bigchaindb:itest -f ../Dockerfile.itest . +# build bigchaindb image (execute in parent directory) +cd .. && docker build -t bigchaindb:bdb-itest -f Dockerfile.itest . diff --git a/network_driver/network.py b/network_driver/network.py index 038372a7..554683c0 100644 --- a/network_driver/network.py +++ b/network_driver/network.py @@ -42,7 +42,8 @@ class Network(): nodes_online = 0 while concurrent: - if nodes_online == n: + print("Online nodes::", nodes_online) + if nodes_online >= n: break for i in range(0, n): @@ -52,12 +53,29 @@ class Network(): time.sleep(1) def stop(self, n=None): + """ Stop n nodes are stopped """ if n is None: n = self.max_size + n = min(n, self.max_size) for i in range(0, n): self.nodes[i].stop() + def ensure_connected(self): + """Ensure that running nodes are connected""" + online_nodes = [] + for i in range(0, self.max_size): + if self.nodes[i].is_running: + online_nodes.append(self.nodes[i]) + + for i in range(0, len(online_nodes)): + seeds = [] + for j in range(i+1, len(online_nodes)): + seeds.append(online_nodes[j].tendermint_uri) + + if len(seeds): + online_nodes[i].dial_seeds(seeds) + def load_validators(count): with open('validators.json') as json_data: diff --git a/network_driver/node.py b/network_driver/node.py index fd2b8891..54bdd21d 100644 --- a/network_driver/node.py +++ b/network_driver/node.py @@ -7,6 +7,8 @@ import kubernetes from kubernetes.client.rest import ApiException from kubernetes.stream import stream +TENDERMINT_PORT = 46656 + # TODO: create a default pod spec of BDB MONGODB_SPEC = {"name": "mongodb", @@ -25,13 +27,14 @@ BIGCHAINDB_SPEC = {"name": "bigchaindb", class Node(): def __init__(self, tendermint_priv_validator=None, tendermint_genesis=None, - namespace='default', name=None): + namespace='default', name=None, seeds=[]): kubernetes.config.load_kube_config() config = kubernetes.client.Configuration() config.assert_hostname = False kubernetes.client.Configuration.set_default(config) + self.seeds = seeds self.api_instance = kubernetes.client.CoreV1Api(kubernetes.client.ApiClient(config)) self.namespace = namespace self.name = name or uuid.uuid4().hex @@ -99,17 +102,31 @@ class Node(): @property def uri(self): + self.ip + + @property + def ip(self): if self.is_running: resp = self.api_instance.read_namespaced_pod(self.name, self.namespace, exact=True) return resp.status.pod_ip else: return False + @property + def tendermint_uri(self): + ip = self.ip + if ip: + return '{}:{}'.format(ip, TENDERMINT_PORT) + else: + return False + def stop_tendermint(self): self._exec_command('tendermint', 'pkill tendermint') def start_tendermint(self): - self._exec_command('tendermint', 'tendermint node --proxy_app=dummy', tty=True) + seeds = ",".join(self.seeds) + command = 'tendermint node --p2p.seeds "{}"'.format(seeds) + self._exec_command('tendermint', command, tty=True) def reset_tendermint(self): self.stop_tendermint() @@ -146,6 +163,11 @@ class Node(): except ApiException as e: print("Exception when executing command: %s\n" % e) + def dial_seeds(self, seeds): + self.seeds = seeds + self.stop_tendermint() + self.start_tendermint() + def _create_namespace(self, namespace): namespace_spec = kubernetes.client.V1Namespace() namespace_spec.api_version = 'v1' diff --git a/network_driver/tnode/config.toml b/network_driver/tnode/config.toml new file mode 100644 index 00000000..80e58f9c --- /dev/null +++ b/network_driver/tnode/config.toml @@ -0,0 +1,15 @@ +# This is a TOML config file. +# For more information, see https://github.com/toml-lang/toml + +proxy_app = "tcp://127.0.0.1:46658" +moniker = "anonymous" +fast_sync = true +db_backend = "leveldb" +log_level = "state:info,*:error" + +[rpc] +laddr = "tcp://0.0.0.0:46657" + +[p2p] +laddr = "tcp://0.0.0.0:46656" +seeds = "" diff --git a/network_driver/tnode/genesis.json b/network_driver/tnode/genesis.json new file mode 100644 index 00000000..30fdb97c --- /dev/null +++ b/network_driver/tnode/genesis.json @@ -0,0 +1 @@ +{"genesis_time":"0001-01-01T00:00:00Z","chain_id":"test-chain-WeowEL","validators":[{"pub_key":{"type":"ed25519","data":"2A780D17E84274F6FF88A91239E761F99C743E05349075F5A83831C30FB6CF9C"},"power":10,"name":""}],"app_hash":""} diff --git a/network_driver/tnode/priv_validator.json b/network_driver/tnode/priv_validator.json new file mode 100644 index 00000000..a0db5ed2 --- /dev/null +++ b/network_driver/tnode/priv_validator.json @@ -0,0 +1 @@ +{"address":"FCBC8AA81C7BBDB67B2DE8A60F7F0C064F4E2DC5","pub_key":{"type":"ed25519","data":"2A780D17E84274F6FF88A91239E761F99C743E05349075F5A83831C30FB6CF9C"},"last_height":0,"last_round":0,"last_step":0,"last_signature":null,"priv_key":{"type":"ed25519","data":"14AD125DFB50481FDBE61DAE5F6B63C4FA86127C75E6A3F8796680F4D47728652A780D17E84274F6FF88A91239E761F99C743E05349075F5A83831C30FB6CF9C"}} \ No newline at end of file