many updates later on tuesday...

This commit is contained in:
David Tai
2019-05-14 15:02:42 -04:00
parent a838632006
commit bca91998a7
10 changed files with 3206 additions and 159 deletions
+94 -41
View File
@@ -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
View File
@@ -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
View File
@@ -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
View File
@@ -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',
+1 -1
View File
@@ -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
View File
@@ -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
View File
@@ -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
+1
View File
@@ -10,3 +10,4 @@ quart-cors
asyncio
pymongo
hypercorn
requests_async
+31 -22
View File
@@ -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