mirror of
https://github.com/hanzoai/bootnode.git
synced 2026-09-30 20:46:32 +00:00
many updates later on tuesday...
This commit is contained in:
@@ -7,13 +7,17 @@ from util import asynctools, convert
|
||||
from pymongo import MongoClient
|
||||
import datetime
|
||||
import asyncio
|
||||
import requests
|
||||
import requests_async as requests
|
||||
import datetime
|
||||
|
||||
app = Quart(__name__)
|
||||
cors(app)
|
||||
|
||||
SUPPORTED_ZONES = ['us-central1-a', 'europe-west6-a', 'asia-east2-a']
|
||||
SUPPORTED_PROVIDERS = ['private-cloud', 'google']
|
||||
SUPPORTED_ZONES = {
|
||||
'google': ['us-central1-a', 'europe-west6-a', 'asia-east2-a'],
|
||||
'private-cloud': ['test'],
|
||||
}
|
||||
|
||||
# connect to mongo and set up database vars
|
||||
mongo_client = MongoClient()
|
||||
@@ -24,13 +28,17 @@ updates_collection = bootnode_db.updates
|
||||
# set up system update loop
|
||||
async def update_nodes_lambda():
|
||||
print('updating nodes')
|
||||
try:
|
||||
date = datetime.datetime.utcnow()
|
||||
zones = SUPPORTED_ZONES
|
||||
|
||||
# try:
|
||||
date = datetime.datetime.utcnow()
|
||||
|
||||
for provider in SUPPORTED_PROVIDERS:
|
||||
|
||||
zones = SUPPORTED_ZONES[provider]
|
||||
|
||||
for zone in zones:
|
||||
print('getting nodes in zone: ' + zone)
|
||||
bootnode = Bootnode('casper', 'testnet', zone)
|
||||
print('-------- Getting ' + provider + ' nodes in zone: ' + zone + ' --------')
|
||||
bootnode = Bootnode('casper', 'testnet', provider, zone)
|
||||
|
||||
deployments = [d.to_dict() for d in bootnode.list_deployments()]
|
||||
services = [s.to_dict() for s in bootnode.list_services()]
|
||||
@@ -44,19 +52,33 @@ async def update_nodes_lambda():
|
||||
try:
|
||||
if node['blockchain'] == 'casper' and node['ip'] is not None:
|
||||
ip = node['ip']
|
||||
if provider == 'private-cloud':
|
||||
ip = '199.47.196.151'
|
||||
|
||||
node['provider'] = provider
|
||||
|
||||
start = datetime.datetime.now()
|
||||
blockdata = requests.put('https://{0}:9001/show/blocks'.format(ip),
|
||||
json={'depth': 1},
|
||||
verify=False)
|
||||
|
||||
reqs = [
|
||||
requests.put('https://{0}:9001/show/blocks'.format(ip),
|
||||
json={'depth': 1},
|
||||
verify=False),
|
||||
requests.put('https://{0}:9001/show/dag'.format(ip),
|
||||
json={'depth': 10,
|
||||
'showJustifications':
|
||||
True}, verify=False)
|
||||
]
|
||||
|
||||
ress = await asyncio.gather(*reqs)
|
||||
|
||||
blockdata = ress[0]
|
||||
dag = ress[1]
|
||||
|
||||
end = datetime.datetime.now()
|
||||
|
||||
node['metadata'] = {
|
||||
'block': blockdata.json()[0],
|
||||
'dag':
|
||||
requests.put('https://{0}:9001/show/dag'.format(ip),
|
||||
json={'depth': 10,
|
||||
'showJustifications':
|
||||
True}, verify=False).json(),
|
||||
'dag': dag.json(),
|
||||
}
|
||||
node['latencyMillis'] = (end - start).microseconds / 1000
|
||||
|
||||
@@ -66,20 +88,20 @@ async def update_nodes_lambda():
|
||||
|
||||
nodes_collection.insert_one(node)
|
||||
|
||||
except Exception as e:
|
||||
print('update nodes loop' + str(e))
|
||||
finally:
|
||||
updates_collection.update_one(
|
||||
{
|
||||
'name': 'nodes',
|
||||
# except Exception as e:
|
||||
# print('update nodes loop error: ' + str(e))
|
||||
# finally:
|
||||
updates_collection.update_one(
|
||||
{
|
||||
'name': 'nodes',
|
||||
},
|
||||
{
|
||||
'$set': {
|
||||
'date': date
|
||||
},
|
||||
{
|
||||
'$set': {
|
||||
'date': date
|
||||
},
|
||||
},
|
||||
True
|
||||
)
|
||||
},
|
||||
True
|
||||
)
|
||||
|
||||
# function to spin off thread
|
||||
async def update_nodes_loop():
|
||||
@@ -106,6 +128,27 @@ def auth_required(fn):
|
||||
return await fn(*args, **kwargs)
|
||||
return wrapped_fn
|
||||
|
||||
@app.route('/login', methods=['POST'])
|
||||
async def login():
|
||||
try:
|
||||
json = await request.get_json()
|
||||
|
||||
print('login', json)
|
||||
|
||||
if json['email'] == '[email protected]' and json['password'] == 'demo-test-12345':
|
||||
return jsonify({'token': 'fLcLu7OLD81aR9jf'})
|
||||
|
||||
return jsonify({
|
||||
'status': 'failed',
|
||||
'error': 'incorrect username or password'
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
return jsonify({
|
||||
'status': 'failed',
|
||||
'error': 'could not get login: ' + str(e),
|
||||
})
|
||||
|
||||
@app.route('/nodes', methods=['GET'])
|
||||
@auth_required
|
||||
async def get_nodes():
|
||||
@@ -135,28 +178,33 @@ async def put_node():
|
||||
json = await request.get_json()
|
||||
print('launching ' + str(json['number']) + ' nodes in ' + str(json['zone']))
|
||||
|
||||
if json['zone'] not in SUPPORTED_ZONES:
|
||||
provider = json['provider']
|
||||
if provider not in SUPPORTED_PROVIDERS:
|
||||
return jsonify({
|
||||
'status': 'failed',
|
||||
'error': json['zone'] + ' is not a valid zone',
|
||||
'error': provider + ' is not a valid provider',
|
||||
})
|
||||
|
||||
bootnode = Bootnode('casper', 'testnet', json['zone'])
|
||||
zone = json['zone']
|
||||
if zone not in SUPPORTED_ZONES[provider]:
|
||||
return jsonify({
|
||||
'status': 'failed',
|
||||
'error': zone + ' is not a valid zone',
|
||||
})
|
||||
|
||||
bootnode = Bootnode('casper', 'testnet', provider, zone)
|
||||
|
||||
number = 1
|
||||
if json['number'] is not None:
|
||||
number = int(json['number'])
|
||||
|
||||
def create_deployment():
|
||||
try:
|
||||
bootnode.create_deployment()
|
||||
except Exception as e:
|
||||
print('could not create deployment: ' + str(e))
|
||||
|
||||
nodes = []
|
||||
|
||||
ds = []
|
||||
for i in range(number):
|
||||
asyncio.get_event_loop().run_in_executor(None,
|
||||
create_deployment())
|
||||
ds.append(bootnode.create_deployment())
|
||||
|
||||
asyncio.ensure_future(asyncio.gather(*ds))
|
||||
|
||||
return jsonify({
|
||||
'status': 'success',
|
||||
@@ -172,7 +220,11 @@ async def put_node():
|
||||
@auth_required
|
||||
async def get_node(node_id, zone='us-central1-a'):
|
||||
try:
|
||||
bootnode = Bootnode('casper', 'testnet', zone)
|
||||
json = await request.get_json()
|
||||
|
||||
provider = json['provider']
|
||||
|
||||
bootnode = Bootnode('casper', 'testnet', provider, zone)
|
||||
|
||||
deployment = bootnode.get_deployment(node_id)
|
||||
service = bootnode.get_service(node_id)
|
||||
@@ -193,9 +245,10 @@ async def delete_node(node_id, zone='us-central1-a'):
|
||||
json = await request.get_json()
|
||||
print('deleting ' + node_id + ' from zone ' + json['zone'])
|
||||
|
||||
provider = json['provider']
|
||||
zone = json['zone']
|
||||
|
||||
bootnode = Bootnode('casper', 'testnet', zone)
|
||||
bootnode = Bootnode('casper', 'testnet', provider, zone)
|
||||
bootnode.delete_deployment(node_id)
|
||||
return jsonify({
|
||||
'status': 'ok',
|
||||
|
||||
+34
-6
@@ -3,23 +3,29 @@ from .kubernetes import Kubernetes
|
||||
from .template import Ethereum, Casper, Service, Ingress, Backend, ServicePort
|
||||
from .table import table
|
||||
import secrets
|
||||
import asyncio
|
||||
|
||||
blockchains = [Ethereum, Casper]
|
||||
|
||||
class Bootnode(object):
|
||||
def __init__(self, chain, network, zone):
|
||||
def __init__(self, chain, network, provider, zone):
|
||||
self.gcloud = Gcloud()
|
||||
|
||||
self.chain = self.find_blockchain(chain)
|
||||
self.network, id = self.chain.normalize_network(network)
|
||||
self.zone = zone
|
||||
self.provider = provider
|
||||
|
||||
if self.chain is None:
|
||||
raise Exception('Blockchain "" does not exist' % chain)
|
||||
|
||||
self.cluster = '{0}-{1}-{2}'.format(self.chain.get_name(),
|
||||
if provider == 'private-cloud':
|
||||
self.cluster = 'casper-testnet-encloudify-test'
|
||||
else:
|
||||
self.cluster = '{0}-{1}-{2}'.format(self.chain.get_name(),
|
||||
network,
|
||||
zone)
|
||||
|
||||
try:
|
||||
self.kube = Kubernetes('config/{0}/cluster.yaml'.format(self.cluster))
|
||||
except:
|
||||
@@ -147,7 +153,10 @@ class Bootnode(object):
|
||||
def delete_pod(self, name):
|
||||
self.kube.delete_pod(name)
|
||||
|
||||
def list_pods(self, label_selector=None):
|
||||
def list_pods(self, label_selector=None, network=None):
|
||||
if network is None:
|
||||
network = self.network
|
||||
|
||||
pods = self.kube.list_pods(label_selector=label_selector, network=self.network)
|
||||
#table(pods, 'name', 'status')
|
||||
|
||||
@@ -162,7 +171,7 @@ class Bootnode(object):
|
||||
def get_synced_pod(self):
|
||||
table(self.kube.get_synced_pod(network=self.network), 'name', 'phase', 'block_number', 'ip')
|
||||
|
||||
def create_deployment(self, name=None):
|
||||
async def create_deployment(self, name=None):
|
||||
"""
|
||||
Create a new deployment for a specific chain on a specific network of that
|
||||
chain. Ex. geth-mainnet
|
||||
@@ -184,14 +193,33 @@ class Bootnode(object):
|
||||
# if not pool:
|
||||
# self.kube.create_pool(network)
|
||||
print('Creating service for {0}'.format(name))
|
||||
|
||||
service = self.kube.create_service(config.get_service())
|
||||
print('Creating volume for {0}'.format(name))
|
||||
service = self.kube.create_volume(config.get_volume_claim())
|
||||
|
||||
if self.cluster == 'casper-testnet-encloudify-test':
|
||||
config.set_env('EXTERNAL_IP', '199.47.196.151')
|
||||
else:
|
||||
service = self.kube.get_service('service-'+name)
|
||||
while service.ip == '':
|
||||
print('NO IP!', service.ip)
|
||||
service = self.kube.get_service('service-'+name)
|
||||
await asyncio.sleep(1)
|
||||
print('IP!', service.ip)
|
||||
|
||||
config.set_env('EXTERNAL_IP', service.ip)
|
||||
|
||||
volume = config.get_volume_claim()
|
||||
|
||||
if volume is not None:
|
||||
print('Creating volume for {0}'.format(name))
|
||||
pvc = self.kube.create_volume(volume)
|
||||
|
||||
print('Creating deployment for {0}'.format(name))
|
||||
deployment = self.kube.create_deployment(config)
|
||||
|
||||
return {
|
||||
'service': service,
|
||||
'volume': volume,
|
||||
'deployment': deployment,
|
||||
}
|
||||
|
||||
|
||||
+47
-31
@@ -26,21 +26,27 @@ class Pod(object):
|
||||
self.status = pod.status.phase
|
||||
self.ip = pod.status.pod_ip
|
||||
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
|
||||
# Currently only support directly attached gce persistent disks
|
||||
try:
|
||||
self.disk = pod.spec.volumes[0].gce_persistent_disk.pd_name
|
||||
except Exception:
|
||||
self.disk = 'unknown'
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
|
||||
# Pod may not follow correct naming scheme
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
# Currently only support directly attached gce persistent disks
|
||||
try:
|
||||
self.disk = pod.spec.volumes[0].gce_persistent_disk.pd_name
|
||||
except Exception:
|
||||
self.disk = 'unknown'
|
||||
|
||||
# Pod may not follow correct naming scheme
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
self.number = -1
|
||||
except Exception as e:
|
||||
print('warning: probably not one of ours: ' + str(e))
|
||||
self.client = ''
|
||||
self.network = ''
|
||||
self.number = -1
|
||||
|
||||
def to_dict(self):
|
||||
@@ -70,14 +76,20 @@ class Service(object):
|
||||
|
||||
self.ports = service.spec.ports
|
||||
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
try:
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
self.number = -1
|
||||
except Exception as e:
|
||||
print('warning: probably not one of ours: ' + str(e))
|
||||
self.client = ''
|
||||
self.network = ''
|
||||
self.number = -1
|
||||
|
||||
def to_dict(self):
|
||||
@@ -123,15 +135,21 @@ class Deployment(object):
|
||||
name = deployment.metadata.name
|
||||
self.name = name
|
||||
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
try:
|
||||
# Pod names should follow client-network-number scheme
|
||||
bits = name.split('-')
|
||||
self.client = bits[0]
|
||||
self.network = bits[1]
|
||||
|
||||
# Pod may not follow correct naming scheme
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
# Pod may not follow correct naming scheme
|
||||
if len(bits) > 2:
|
||||
self.number = int(bits[2])
|
||||
else:
|
||||
self.number = -1
|
||||
except Exception as e:
|
||||
print('warning: probably not one of ours: ' + str(e))
|
||||
self.client = ''
|
||||
self.network = ''
|
||||
self.number = -1
|
||||
|
||||
def to_dict(self):
|
||||
@@ -167,7 +185,7 @@ class Kubernetes(object):
|
||||
propagation_policy='Background')
|
||||
|
||||
def create_service(self, config):
|
||||
return self.api.create_namespaced_service(NAMESPACE, body=config)
|
||||
return Service(self.api.create_namespaced_service(NAMESPACE, body=config), self)
|
||||
|
||||
def delete_service(self, name):
|
||||
return self.api.delete_namespaced_service(name, NAMESPACE, body=client.V1DeleteOptions())
|
||||
@@ -221,8 +239,6 @@ class Kubernetes(object):
|
||||
if not network:
|
||||
return deployments
|
||||
|
||||
return deployments
|
||||
|
||||
return [p for p in deployments if p.network == network]
|
||||
|
||||
def get_deployment(self, name):
|
||||
|
||||
+86
-41
@@ -66,17 +66,24 @@ class Resources(Dict):
|
||||
self.requests = requests
|
||||
self.limits = limits
|
||||
|
||||
class EnvVar(Dict):
|
||||
def __init__(self, name=None, value=None):
|
||||
Dict.__init__(self, name=name, value=value)
|
||||
self.name = name
|
||||
self.value = value
|
||||
|
||||
class Container(Dict):
|
||||
def __init__(self, name, image, command, args, resources=None,
|
||||
volumeMounts=None, livenessProbe=None, readinessProbe=None):
|
||||
volumeMounts=None, livenessProbe=None, readinessProbe=None,
|
||||
env=None):
|
||||
Dict.__init__(self, name=name, image=image, command=command, args=args,
|
||||
resources=resources, livenessProbe=livenessProbe,
|
||||
readinessProbe=readinessProbe)
|
||||
readinessProbe=readinessProbe, env=env)
|
||||
self.name = name
|
||||
self.image = image
|
||||
self.command = command
|
||||
self.args = args
|
||||
self.env = env
|
||||
self.resources = resources
|
||||
self.volumeMounts = volumeMounts
|
||||
self.livenessProbe = livenessProbe
|
||||
@@ -264,7 +271,8 @@ class Deployment(BaseTemplateSpec):
|
||||
metadata=metadata, spec=spec)
|
||||
|
||||
class Blockchain(Deployment):
|
||||
def __init__(self, name, cluster, blockchain, network, image, command, args, path,
|
||||
def __init__(self, name, cluster, blockchain, network, image, command,
|
||||
args, env, path,
|
||||
requests=None, limits=None):
|
||||
|
||||
"""
|
||||
@@ -346,14 +354,22 @@ class Blockchain(Deployment):
|
||||
|
||||
self.podSpec.containers.append(container)
|
||||
|
||||
volume = Volume(
|
||||
name=name + '-pv',
|
||||
persistentVolumeClaim=PersistentVolumeClaimVolume(
|
||||
claimName=name + '-pd'
|
||||
# user empty dir for private cloud stuff
|
||||
if cluster == 'casper-testnet-encloudify-test':
|
||||
volume = Volume(
|
||||
name=name + '-pv',
|
||||
emptyDir=EmptyDir()
|
||||
)
|
||||
self.podSpec.volumes.append(volume)
|
||||
else:
|
||||
volume = Volume(
|
||||
name=name + '-pv',
|
||||
persistentVolumeClaim=PersistentVolumeClaimVolume(
|
||||
claimName=name + '-pd'
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
self.podSpec.volumes.append(volume)
|
||||
self.podSpec.volumes.append(volume)
|
||||
|
||||
# Create a PodSpec
|
||||
super(Blockchain, self).__init__(metadata=self.deploymentMetadata, spec=self.deploymentSpec)
|
||||
@@ -364,39 +380,67 @@ class Blockchain(Deployment):
|
||||
self.network = network
|
||||
self.podSpec = podSpec
|
||||
|
||||
def get_service(self, ports):
|
||||
return Service(
|
||||
metadata=Metadata(
|
||||
name='service-' + self.name,
|
||||
cluster=self.cluster,
|
||||
blockchain=self.blockchain,
|
||||
network=self.network
|
||||
),
|
||||
spec=ServiceSpec(
|
||||
selector={
|
||||
'app': self.name
|
||||
},
|
||||
type='LoadBalancer',
|
||||
ports=ports,
|
||||
)
|
||||
)
|
||||
def set_env(self, name, value, container_id=0):
|
||||
if self.podSpec.containers[container_id].env is None:
|
||||
self.podSpec.containers[container_id].env = [EnvVar(name=name,
|
||||
value=value)]
|
||||
else:
|
||||
self.podSpec.containers[container_id].env.append(EnvVar(name=name,
|
||||
value=value))
|
||||
|
||||
def get_volume_claim(self, size='10Gi'):
|
||||
return PersistentVolumeClaim(
|
||||
metadata=Metadata(
|
||||
name=self.name + '-pd',
|
||||
cluster=self.cluster,
|
||||
blockchain=self.blockchain,
|
||||
network=self.network
|
||||
),
|
||||
spec=PersistentVolumeClaimSpec(
|
||||
resources=ResourceRequirements(
|
||||
requests={
|
||||
'storage': size,
|
||||
def get_service(self, ports):
|
||||
if self.cluster == 'casper-testnet-encloudify-test':
|
||||
return Service(
|
||||
metadata=Metadata(
|
||||
name='service-' + self.name,
|
||||
cluster=self.cluster,
|
||||
blockchain=self.blockchain,
|
||||
network=self.network
|
||||
),
|
||||
spec=ServiceSpec(
|
||||
selector={
|
||||
'app': self.name
|
||||
},
|
||||
type='NodePort',
|
||||
ports=ports,
|
||||
)
|
||||
)
|
||||
else:
|
||||
return Service(
|
||||
metadata=Metadata(
|
||||
name='service-' + self.name,
|
||||
cluster=self.cluster,
|
||||
blockchain=self.blockchain,
|
||||
network=self.network
|
||||
),
|
||||
spec=ServiceSpec(
|
||||
selector={
|
||||
'app': self.name
|
||||
},
|
||||
type='LoadBalancer',
|
||||
ports=ports,
|
||||
)
|
||||
)
|
||||
|
||||
def get_volume_claim(self, size='10Gi'):
|
||||
if self.cluster == 'casper-testnet-encloudify-test':
|
||||
return None
|
||||
else:
|
||||
return PersistentVolumeClaim(
|
||||
metadata=Metadata(
|
||||
name=self.name + '-pd',
|
||||
cluster=self.cluster,
|
||||
blockchain=self.blockchain,
|
||||
network=self.network
|
||||
),
|
||||
spec=PersistentVolumeClaimSpec(
|
||||
resources=ResourceRequirements(
|
||||
requests={
|
||||
'storage': size,
|
||||
},
|
||||
)
|
||||
)
|
||||
)
|
||||
)
|
||||
|
||||
@classmethod
|
||||
def to_network_id(cls, network):
|
||||
@@ -500,11 +544,12 @@ class Ethereum(Blockchain):
|
||||
|
||||
# Generate a PodSpec
|
||||
super(Ethereum, self).__init__(name, cluster, 'ethereum', network, image,
|
||||
command, args, path, requests, limits)
|
||||
command, args, None, path, requests, limits)
|
||||
|
||||
this.rpcport=rpcport
|
||||
this.wsport=wsport
|
||||
|
||||
|
||||
def get_service(self):
|
||||
ports = []
|
||||
ports.append(
|
||||
@@ -591,7 +636,7 @@ class Casper(Blockchain):
|
||||
image='gcr.io/hanzo-ai/casper:latest',
|
||||
command='/scripts/start.sh',
|
||||
grpcport=40401, serverport=40400, discoveryport=40404,
|
||||
bootstrapaddress=None,
|
||||
bootstrapaddress=None, externalip=None,
|
||||
args=None, size=None, requests=None):
|
||||
|
||||
"""
|
||||
@@ -633,7 +678,7 @@ class Casper(Blockchain):
|
||||
|
||||
# Generate a PodSpec
|
||||
super(Casper, self).__init__(name, cluster, 'casper', network, image,
|
||||
command, args, path, requests, limits)
|
||||
command, args, None, path, requests, limits)
|
||||
|
||||
envoyContainer = Container(
|
||||
name=name+'-envoy',
|
||||
|
||||
@@ -38,7 +38,7 @@ ENV PROTOC_ZIP=protoc-$PROTOC_VERSION-linux-x86_64.zip
|
||||
RUN curl -OL https://github.com/google/protobuf/releases/download/v$PROTOC_VERSION/$PROTOC_ZIP
|
||||
RUN unzip -o $PROTOC_ZIP -d /usr/local bin/protoc
|
||||
RUN rm -f $PROTOC_ZIP
|
||||
RUN git clone -b v0.2 https://github.com/CasperLabs/CasperLabs.git
|
||||
RUN git clone -b nyc-consensus-demo https://github.com/birchmd/CasperLabs.git
|
||||
|
||||
COPY scripts/ scripts
|
||||
RUN ./scripts/build.sh
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+37
-15
@@ -1,23 +1,45 @@
|
||||
#!/bin/bash
|
||||
|
||||
# echo "---------- Starting Execution Engine ----------"
|
||||
# cd /CasperLabs/execution-engine
|
||||
# $HOME/.cargo/bin/cargo run --bin casperlabs-engine-grpc-server /.casperlabs/.casper-node.sock &
|
||||
|
||||
# echo "---------- Start Bootstrapping Node ----------"
|
||||
# cd /CasperLabs
|
||||
# ./node/target/universal/stage/bin/casperlabs-node run -s --server-data-dir /.casperlabs &
|
||||
# while ! [ -s /.casperlabs/genesis/bonds.txt ]; do
|
||||
# sleep 5
|
||||
# done
|
||||
# sleep 5
|
||||
# echo "---------- Finish Bootstrapping Node ----------"
|
||||
# killall -9 java
|
||||
# sleep 5
|
||||
echo "---------- Creating Socket File ----------"
|
||||
|
||||
echo "touch /.casperlabs/.casper-node.sock"
|
||||
touch /.casperlabs/.casper-node.sock
|
||||
|
||||
echo "---------- Starting Execution Engine ----------"
|
||||
cd /CasperLabs/execution-engine
|
||||
|
||||
echo "$HOME/.cargo/bin/cargo run --bin casperlabs-engine-grpc-server /.casperlabs/.casper-node.sock &"
|
||||
$HOME/.cargo/bin/cargo run --bin casperlabs-engine-grpc-server /.casperlabs/.casper-node.sock &
|
||||
echo "---------- Start Bootstrapping Node ----------"
|
||||
cd /CasperLabs
|
||||
./node/target/universal/stage/bin/casperlabs-node run -s --server-data-dir /.casperlabs &
|
||||
while ! [ -s /.casperlabs/genesis/bonds.txt ]; do
|
||||
sleep 5
|
||||
done
|
||||
sleep 5
|
||||
echo "---------- Finish Bootstrapping Node ----------"
|
||||
killall -9 java
|
||||
sleep 5
|
||||
|
||||
sleep 10
|
||||
|
||||
echo "---------- Starting Node ----------"
|
||||
KEY_FILE=$(find /.casperlabs -type f -name *.sk | sort | tail -n 1 | head -n 1)
|
||||
CL_VALIDATOR_PUBLIC_KEY=$(echo "$KEY_FILE" | awk -F '[/.]' '{print $(NF-1)}')
|
||||
CL_VALIDATOR_PRIVATE_KEY=$(cat "$KEY_FILE")
|
||||
cd /CasperLabs
|
||||
|
||||
echo "./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key $CL_VALIDATOR_PUBLIC_KEY --casper-validator-private-key $CL_VALIDATOR_PRIVATE_KEY --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem --server-host 0.0.0.0 $@"
|
||||
# KEY_FILE=$(find /.casperlabs -type f -name *.sk | sort | tail -n 1 | head -n 1)
|
||||
# CL_VALIDATOR_PUBLIC_KEY=$(echo "$KEY_FILE" | awk -F '[/.]' '{print $(NF-1)}')
|
||||
# CL_VALIDATOR_PRIVATE_KEY=$(cat "$KEY_FILE")
|
||||
|
||||
# echo "./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key $CL_VALIDATOR_PUBLIC_KEY --casper-validator-private-key $CL_VALIDATOR_PRIVATE_KEY --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem --server-host 0.0.0.0 $@"
|
||||
# ./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key $CL_VALIDATOR_PUBLIC_KEY --casper-validator-private-key $CL_VALIDATOR_PRIVATE_KEY --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem --server-host 0.0.0.0 $@
|
||||
|
||||
# echo "./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key 4387a0089d7cbf53493d39923bc182a17edfd70279fdfbd992e97073ffd62bfb --casper-validator-private-key e08d66a68ea53857a61abfd998fb9f741e62f1390788bc3a1dbb0190665bbc3d --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem -b \"casperlabs://[email protected]?protocol=40400&discovery=40404\" --server-host $EXTERNAL_IP"
|
||||
# ./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key 4387a0089d7cbf53493d39923bc182a17edfd70279fdfbd992e97073ffd62bfb --casper-validator-private-key e08d66a68ea53857a61abfd998fb9f741e62f1390788bc3a1dbb0190665bbc3d --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem -b "casperlabs://[email protected]?protocol=40400&discovery=40404" --server-host $EXTERNAL_IP
|
||||
|
||||
echo "./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem -b \"casperlabs://[email protected]?protocol=40400&discovery=40404\" --server-host $EXTERNAL_IP"
|
||||
./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem -b "casperlabs://[email protected]?protocol=40400&discovery=40404" --server-host $EXTERNAL_IP
|
||||
|
||||
./node/target/universal/stage/bin/casperlabs-node run --server-data-dir /.casperlabs --casper-validator-public-key $CL_VALIDATOR_PUBLIC_KEY --casper-validator-private-key $CL_VALIDATOR_PRIVATE_KEY --tls-certificate /.casperlabs/node.certificate.pem --tls-key /.casperlabs/node.key.pem --server-host 0.0.0.0 $@
|
||||
|
||||
+2
-2
@@ -25,10 +25,10 @@ users:
|
||||
user:
|
||||
auth-provider:
|
||||
config:
|
||||
access-token: ya29.Gl0HB7hbIOeQzEFRnfeFkfSyLZqEaVR1H_p0uvDL5j3-DQw1_5mh1VbEVNwC922DUMjldztnIyw17N63tgll6Q6u4Liwm38tmCJInjnGYwRak35SCIvZ5_lHeEP9-GM
|
||||
access-token: ya29.Gl0JB66zST9RV9y7A91EmGRkieDrj4pmwNsZIA4KCVZo5ZViMOoomVKUvi2q8rcMyCojt45bo55JImDBaM8PxKj3qgqpzsmEX2lhm8W1eVgwFkeIR5CGryCSreaqu5Y
|
||||
cmd-args: config config-helper --format=json
|
||||
cmd-path: /usr/local/Caskroom/google-cloud-sdk/latest/google-cloud-sdk/bin/gcloud
|
||||
expiry: 2019-05-12T13:03:22Z
|
||||
expiry: 2019-05-14T00:26:08Z
|
||||
expiry-key: '{.credential.token_expiry}'
|
||||
token-key: '{.credential.access_token}'
|
||||
name: gcp
|
||||
|
||||
@@ -10,3 +10,4 @@ quart-cors
|
||||
asyncio
|
||||
pymongo
|
||||
hypercorn
|
||||
requests_async
|
||||
|
||||
+31
-22
@@ -2,35 +2,44 @@ def to_nodes(deployments, services, pods, zone):
|
||||
nodes_by_id = {}
|
||||
nodes = []
|
||||
for d in deployments:
|
||||
nodes_by_id[d['name']] = len(nodes)
|
||||
try:
|
||||
nodes_by_id[d['name']] = len(nodes)
|
||||
|
||||
nodes.append({
|
||||
'blockchain': d['blockchain'],
|
||||
'network': d['network'],
|
||||
'id': d['name'],
|
||||
'instances': [],
|
||||
'zone': zone,
|
||||
})
|
||||
nodes.append({
|
||||
'blockchain': d['blockchain'],
|
||||
'network': d['network'],
|
||||
'id': d['name'],
|
||||
'instances': [],
|
||||
'zone': zone,
|
||||
})
|
||||
except Exception as e:
|
||||
print('warning: skipping invalid deployment ' + str(d) + ': ' + str(e))
|
||||
|
||||
for s in services:
|
||||
i = nodes_by_id.get(s['name'])
|
||||
try:
|
||||
i = nodes_by_id.get(s['name'])
|
||||
|
||||
if i is not None:
|
||||
nodes[i]['ip'] = s['ip']
|
||||
nodes[i]['ports'] = s['ports']
|
||||
else:
|
||||
print('{0} does not exist'.format(s['name']))
|
||||
if i is not None:
|
||||
nodes[i]['ip'] = s['ip']
|
||||
nodes[i]['ports'] = s['ports']
|
||||
else:
|
||||
print('{0} does not exist'.format(s['name']))
|
||||
except Exception as e:
|
||||
print('warning: skipping invalid service ' + str(s) + ': ' + str(e))
|
||||
|
||||
for p in pods:
|
||||
i = nodes_by_id.get('{0}-{1}-{2}'.format(p['blockchain'], p['network'], p['number']))
|
||||
try:
|
||||
i = nodes_by_id.get('{0}-{1}-{2}'.format(p['blockchain'], p['network'], p['number']))
|
||||
|
||||
if i is not None:
|
||||
nodes[i]['instances'].append({
|
||||
'name': p['name'],
|
||||
'status': p['status'],
|
||||
})
|
||||
else:
|
||||
print('{0} does not exist'.format(p['name']))
|
||||
if i is not None:
|
||||
nodes[i]['instances'].append({
|
||||
'name': p['name'],
|
||||
'status': p['status'],
|
||||
})
|
||||
else:
|
||||
print('{0} does not exist'.format(p['name']))
|
||||
except Exception as e:
|
||||
print('warning: skipping invalid pod ' + str(p) + ': ' + str(e))
|
||||
|
||||
return nodes
|
||||
|
||||
|
||||
Reference in New Issue
Block a user