Skip to content

Instantly share code, notes, and snippets.

@alicek106
Created June 12, 2020 03:51
Show Gist options
  • Save alicek106/6349b1a99b3ddcc6fb7b50d645f806ea to your computer and use it in GitHub Desktop.
Save alicek106/6349b1a99b3ddcc6fb7b50d645f806ea to your computer and use it in GitHub Desktop.
Envoy Simple EDS Flask Server Example
import logging
from flask import Flask, request
class ServicesDAO(object):
def __init__(self):
self.services = {}
def get(self, service_name):
if (service_name in self.services):
return self.services[service_name]
api.abort(404, "Services {} doesn't exist".format(service_name))
def create(self, service_name, data):
if (service_name in self.services):
api.abort(409, "Serivce {} already exists".format(str(service_name)))
self.services[service_name] = data
return data
DAO = ServicesDAO()
app = Flask(__name__)
@api.route('/v2/discovery:endpoints')
def envoy_eds(service_name):
data = json.loads(request.data)
print("Inbound v2 request for discovery. POST payload: " + str(data))
id = data['node']["id"]
cluster = data['node']["cluster"]
resource_names = data["resource_names"]
for r in resource_names:
if (DAO.services.has_key(r)):
svc = DAO.services[r]
endpoints = []
for host in svc.get("hosts"):
endpoints.append(
{"endpoint": {
"address": {
"socket_address": {
"address": host.get("ip_address"),
"port_value": host.get("port")
}
}
}}
)
resp = {
"version_info": _VERSION,
"resources": [
{
"@type":"type.googleapis.com/envoy.api.v2.ClusterLoadAssignment",
"cluster_name": r,
"endpoints": [
{
"lb_endpoints": endpoints
}
]
}
]
}
@app.route('/eds/<string:service_name>', methods=['GET'])
def get_service(service_name):
try:
return DAO.services[service_name]
except KeyError:
return "Not found"
@app.route('/eds/<string:service_name>', methods=['POST'])
def create_service(service_name):
data = request.get_json()
return DAO.create(service_name, data), 201
if __name__ == '__main__':
log_level = logging.DEBUG
logging.getLogger('').handlers = []
logging.basicConfig(format='%(asctime)s %(message)s', level=log_level)
app.run(debug=True, host='0.0.0.0', port=80)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment