Skip to content

Commit

Permalink
docker compose working
Browse files Browse the repository at this point in the history
  • Loading branch information
AadilLatif committed Feb 29, 2024
1 parent 5a92717 commit 5ae3ae0
Show file tree
Hide file tree
Showing 13 changed files with 312 additions and 47 deletions.
2 changes: 1 addition & 1 deletion LocalFeeder/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -11,5 +11,5 @@ boto3
xarray
fastapi
uvicorn
oedisi==1.1.1
git+https://github.com/openEDI/oedisi@al/config
python-multipart
10 changes: 5 additions & 5 deletions LocalFeeder/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ def read_root():
return JSONResponse(response, 200)


@app.get("/sensor/")
@app.get("/sensor")
async def sensor():
logging.info(os.getcwd())
sensor_path = os.path.join(base_path, "sensors", "sensors.json")
Expand All @@ -63,7 +63,7 @@ async def sensor():
return data


@app.post("/profiles/")
@app.post("/profiles")
async def upload_profiles(file: UploadFile):
try:
data = file.file.read()
Expand Down Expand Up @@ -96,7 +96,7 @@ async def upload_profiles(file: UploadFile):
)


@app.post("/model/")
@app.post("/model")
async def upload_model(file: UploadFile):
try:
data = file.file.read()
Expand Down Expand Up @@ -125,7 +125,7 @@ async def upload_model(file: UploadFile):
HTTPException(500, "Unknown error while uploading userdefined opendss model.")


@app.post("/run/")
@app.post("/run")
async def run_feeder(
broker_config: BrokerConfig, background_tasks: BackgroundTasks
): # :BrokerConfig
Expand All @@ -140,7 +140,7 @@ async def run_feeder(
HTTPException(500, str(err))


@app.post("/configure/")
@app.post("/configure")
async def configure(component_struct:ComponentStruct):
component = component_struct.component
params = component.parameters
Expand Down
Binary file added broker/__pycache__/server.cpython-312.pyc
Binary file not shown.
19 changes: 19 additions & 0 deletions broker/docker-compose.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
networks:
custom-network:
driver: bridge
ipam:
config:
- gateway: 10.5.0.1
subnet: 10.5.0.0/16
services:
oedisi_broker:
build:
context: ./broker/.
environment:
PORT: '8766'
hostname: broker
image: aadillatif/oedisi_broker
networks:
custom-network: {}
ports:
- 8766:8766
2 changes: 1 addition & 1 deletion broker/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,6 @@ helics-apps==3.4.0
pyyaml
fastapi
uvicorn
oedisi==1.1.1
git+https://github.com/openEDI/oedisi@al/config
grequests
python-multipart
71 changes: 50 additions & 21 deletions broker/server.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from fastapi import FastAPI, BackgroundTasks, UploadFile
from fastapi.responses import FileResponse, JSONResponse
from fastapi.exceptions import HTTPException
from pathlib import Path
import helics as h
import grequests
import traceback
Expand All @@ -12,15 +13,27 @@
import shutil
import time
import yaml
import json
import sys
import os

from oedisi.componentframework.system_configuration import WiringDiagram, ComponentStruct
from oedisi.types.common import ServerReply, HeathCheck
from oedisi.types.common import ServerReply, HeathCheck, DefaultFileNames

app = FastAPI()

is_kubernetes_env = os.environ['SERVICE_NAME'] if 'SERVICE_NAME' in os.environ else None


def build_url(host:str, port:int, enpoint:list):
if is_kubernetes_env:
SERVICE_NAME = os.environ['SERVICE_NAME']
url = f"http://{host}.{SERVICE_NAME}:{port}/"
else:
url = f"http://{host}:{port}/"
url = url + "/".join(enpoint) + "/"
return url

def find_filenames(path_to_dir=os.getcwd(), suffix=".feather"):
filenames = os.listdir(path_to_dir)
return [filename for filename in filenames if filename.endswith(suffix)]
Expand All @@ -33,13 +46,15 @@ def read_settings():
services = config["services"]
print(services)
broker = services.pop("oedisi_broker")
broker_ip = broker["networks"]["custom-network"]["ipv4_address"]
broker_host = broker["hostname"]

broker_ip = socket.gethostbyname(broker_host)
api_port = int(broker["ports"][0].split(":")[0])

for service in services:
ip = services[service]["networks"]["custom-network"]["ipv4_address"]
host = services[service]["hostname"]
port = int(services[service]["ports"][0].split(":")[0])
component_map[ip] = port
component_map[host] = port

return services, component_map, broker_ip, api_port

Expand All @@ -54,13 +69,13 @@ def read_root():
return JSONResponse(response, 200)


@app.post("/profiles/")
@app.post("/profiles")
async def upload_profiles(file: UploadFile):
try:
services, _, _, _ = read_settings()
for service in services:
if "feeder" in service.lower():
ip = services[service]["networks"]["custom-network"]["ipv4_address"]
ip = services[service]["host"]
port = int(services[service]["ports"][0].split(":")[0])
data = file.file.read()
if not file.filename.endswith(".zip"):
Expand All @@ -69,7 +84,10 @@ async def upload_profiles(file: UploadFile):
)
with open(file.filename, "wb") as f:
f.write(data)
url = f"http://{ip}:{port}/profiles/"

url = build_url(ip, port, ["profiles"])
logging.info(f"making a request to url - {url}")

files = {"file": open(file.filename, "rb")}
r = requests.post(url, files=files)
response = ServerReply(detail=r.text).dict()
Expand All @@ -80,13 +98,13 @@ async def upload_profiles(file: UploadFile):
raise HTTPException(status_code=500, detail=str(err))


@app.post("/model/")
@app.post("/model")
async def upload_model(file: UploadFile):
try:
services, _, _, _ = read_settings()
for service in services:
if "feeder" in service.lower():
ip = services[service]["networks"]["custom-network"]["ipv4_address"]
ip = services[service]["host"]
port = int(services[service]["ports"][0].split(":")[0])
data = file.file.read()
if not file.filename.endswith(".zip"):
Expand All @@ -95,7 +113,10 @@ async def upload_model(file: UploadFile):
)
with open(file.filename, "wb") as f:
f.write(data)
url = f"http://{ip}:{port}/model/"

url = build_url(ip, port, ["model"])
logging.info(f"making a request to url - {url}")

files = {"file": open(file.filename, "rb")}
r = requests.post(url, files=files)
response = ServerReply(detail=r.text).dict()
Expand All @@ -105,15 +126,17 @@ async def upload_model(file: UploadFile):
err = traceback.format_exc()
raise HTTPException(status_code=500, detail=str(err))


@app.get("/results/")
@app.get("/results")
def download_results():
services, _, _, _ = read_settings()
for service in services:
if "recorder" in service.lower():
ip = services[service]["networks"]["custom-network"]["ipv4_address"]
host = services[service]["hostname"]
port = int(services[service]["ports"][0].split(":")[0])
url = f"http://{ip}:{port}/download/"

url = build_url(host, port, ["download"])
logging.info(f"making a request to url - {url}")

response = requests.get(url)
with open(f"{service}.feather", "wb") as out_file:
shutil.copyfileobj(response.raw, out_file)
Expand All @@ -130,7 +153,7 @@ def download_results():
raise HTTPException(status_code=404, detail="Failed download")


@app.get("/terminate/")
@app.get("/terminate")
def terminate_simulation():
try:
h.helicsCloseLibrary()
Expand All @@ -141,6 +164,7 @@ def terminate_simulation():

def run_simulation():
services, component_map, broker_ip, api_port = read_settings()
logging.info(f"{broker_ip}, {api_port}")
initstring = f"-f {len(component_map)} --name=mainbroker --loglevel=trace --local_interface={broker_ip} --localport=23404"
logging.info(f"Broker initaialization string: {initstring}")
broker = h.helicsCreateBroker("zmq", "", initstring)
Expand All @@ -150,8 +174,10 @@ def run_simulation():
logging.info(str(component_map))
replies = []
for service_ip, service_port in component_map.items():
url = f"http://{service_ip}:{service_port}/run/"
print(url)

url = build_url(service_ip, service_port, ["run"])
logging.info(f"making a request to url - {url}")

myobj = {
"broker_port": 23404,
"broker_ip": broker_ip,
Expand All @@ -167,7 +193,7 @@ def run_simulation():
return


@app.post("/run/")
@app.post("/run")
async def run_feeder(background_tasks: BackgroundTasks):
try:
background_tasks.add_task(run_simulation)
Expand All @@ -178,8 +204,9 @@ async def run_feeder(background_tasks: BackgroundTasks):
raise HTTPException(status_code=404, detail=str(err))


@app.post("/configure/")
@app.post("/configure")
async def configure(wiring_diagram:WiringDiagram):
json.dump(wiring_diagram.dict(), open(DefaultFileNames.WIRING_DIAGRAM.value, "w"))
for component in wiring_diagram.components:
component_model = ComponentStruct(
component = component,
Expand All @@ -188,11 +215,13 @@ async def configure(wiring_diagram:WiringDiagram):
for link in wiring_diagram.links:
if link.target == component.name:
component_model.links.append(link)

url = build_url(component.host, component.container_port, ["configure"])
logging.info(f"making a request to url - {url}")

url = f'http://{component.host}:{component.container_port}/configure/'
logging.info(f"making post request to: {url}")
r = requests.post(url, json=component_model.dict())
assert r.status_code==200, f"POST request to update configuration failed for url - {url}"
return JSONResponse(ServerReply(detail="Sucessfully updated config files for all containers").dict(), 200)

if __name__ == "__main__":
port = int(sys.argv[2])
Expand Down
2 changes: 1 addition & 1 deletion measuring_federate/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,4 @@ fastapi
uvicorn
requests
grequests
oedisi==1.1.1
git+https://github.com/openEDI/oedisi@al/config
36 changes: 25 additions & 11 deletions measuring_federate/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import requests
import uvicorn
import socket
import logging
import sys
import json
import os
Expand All @@ -15,6 +16,17 @@

app = FastAPI()

is_kubernetes_env = os.environ['SERVICE_NAME'] if 'SERVICE_NAME' in os.environ else None

def build_url(host:str, port:int, enpoint:list):
if is_kubernetes_env:
SERVICE_NAME = os.environ['SERVICE_NAME']
url = f"http://{host}.{SERVICE_NAME}:{port}/"
else:
url = f"http://{host}:{port}/"
url = url + "/".join(enpoint)
return url

@app.get("/")
async def read_root():
hostname = socket.gethostname()
Expand All @@ -25,18 +37,20 @@ async def read_root():
).dict()
return JSONResponse(response, 200)

@app.post("/run/")
@app.post("/run")
async def run_model(broker_config:BrokerConfig, background_tasks: BackgroundTasks):
try:
print(broker_config)
feeder_ip = broker_config.services['oedisi_feeder']['networks']['custom-network']['ipv4_address']
feeder_port = int(broker_config.services['oedisi_feeder']['ports'][0].split(":")[0])

url =f"http://{feeder_ip}:{feeder_port}/sensor/"
print(url)
logging.info(broker_config)
feeder_host = broker_config.services['oedisi_feeder']['hostname']
feeder_port = int(broker_config.services['oedisi_feeder']['ports'][0].split(":")[0])
url = build_url(feeder_host, feeder_port, 'sensor')
logging.info(url)
try:
reply = requests.get(url)
sensor_data = reply.json()
print(sensor_data)
if not sensor_data:
msg = "empty sensor list"
raise HTTPException(404, msg)
logging.info(sensor_data)
with open("sensors.json", "w") as outfile:
json.dump(sensor_data, outfile)

Expand All @@ -47,9 +61,9 @@ async def run_model(broker_config:BrokerConfig, background_tasks: BackgroundTask
return JSONResponse(response, 200)
except Exception as e:
err = traceback.format_exc()
HTTPException(500,str(err))
raise HTTPException(500,str(err))

@app.post("/configure/")
@app.post("/configure")
async def configure(component_struct:ComponentStruct):
component = component_struct.component
params = component.parameters
Expand Down
2 changes: 1 addition & 1 deletion recorder/requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,4 @@ numpy
pandas
fastapi
uvicorn
oedisi==1.1.1
git+https://github.com/openEDI/oedisi@al/config
6 changes: 3 additions & 3 deletions recorder/server.py
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ def find_filenames(path_to_dir=os.getcwd(), suffix=".feather"):
return [filename for filename in filenames if filename.endswith(suffix)]


@app.get("/download/")
@app.get("/download")
def download_results():
file_list = find_filenames()
if file_list:
Expand All @@ -46,7 +46,7 @@ def download_results():
raise HTTPException(status_code=404, detail="No feather file found")


@app.post("/run/")
@app.post("/run")
async def run_model(broker_config: BrokerConfig, background_tasks: BackgroundTasks):
logging.info(broker_config)
try:
Expand All @@ -58,7 +58,7 @@ async def run_model(broker_config: BrokerConfig, background_tasks: BackgroundTas
HTTPException(500, str(err))


@app.post("/configure/")
@app.post("/configure")
async def configure(component_struct:ComponentStruct):
component = component_struct.component
params = component.parameters
Expand Down
Loading

0 comments on commit 5ae3ae0

Please sign in to comment.