Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions fri/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

The Control-Core File Receiving Interface (FRI) is built with is Python-3.10. It is the core component that makes the distributed executions a reality in the Control-Core framework.

# Install Dependencies

Install Jupyter lab
````
$ pip install jupyterlab
````

# Building FRI Container

Expand Down
140 changes: 72 additions & 68 deletions fri/server/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@
import json
import subprocess

cur_path = os.path.dirname(os.path.abspath(__file__))
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))


app = Flask(__name__)
app.secret_key = "secret key"
Expand All @@ -14,7 +17,7 @@
@app.route('/upload/<dir>', methods=['POST'])
def upload(dir):
apikey = request.args.get('apikey')
dirname = dir + "_" + apikey
dirname = secure_filename(dir) + "_" + apikey

if 'files[]' not in request.files:
resp = jsonify({'message': 'No file in the request'})
Expand All @@ -26,13 +29,16 @@ def upload(dir):
errors = {}
success = False

if not os.path.exists(secure_filename(dirname)):
os.makedirs(secure_filename(dirname))
directory_name = os.path.abspath(os.path.join(concore_path, secure_filename(dirname)))

if not os.path.isdir(directory_name):
os.mkdir(directory_name)


for file in files:
if file:
filename = secure_filename(file.filename)
file.save(secure_filename(dirname)+"/"+filename)
file.save(directory_name+"/"+filename)
success = True

if success and errors:
Expand All @@ -49,58 +55,17 @@ def upload(dir):
resp.status_code = 500
return resp

# To execute any python file. For example, /execute/test?apikey=xyz
@app.route('/execute/<dir>', methods=['POST'])
def execute(dir):
apikey = request.args.get('apikey')
dirname = dir + "_" + apikey

if 'file' not in request.files:
resp = jsonify({'message': 'No file in the request'})
resp.status_code = 400
return resp

file = request.files['file']

if file.filename == '':
resp = jsonify({'message': 'No file selected for Executing'})
resp.status_code = 400
return resp

errors = {}
success = False

if not os.path.exists(secure_filename(dirname)):
os.makedirs(secure_filename(dirname))

if file:
filename = secure_filename(file.filename)
file.save(secure_filename(dirname)+"/"+filename)
output_filename = filename + ".out"
file_path = secure_filename(dirname) + "/"+filename
outputfile_path = secure_filename(dirname)+"/"+output_filename
f = open(outputfile_path, "w")
call(["nohup", "python3", file_path], stdout=f)
success = True

if success:
resp = jsonify({'message': 'Files successfully executed'})
resp.status_code = 201
return resp
else:
resp = jsonify(errors)
resp.status_code = 500
return resp

# to download /build/<dir>?fetch=<graphml>. For example, /build/test?fetch=sample1
# to download /build/<dir>?fetch=<graphml>. For example, /build/test?fetch=sample1&apikey=xyz
@app.route('/build/<dir>', methods=['POST'])
def build(dir):
graphml_file = request.args.get('fetch')
makestudy_dir = dir+ "/" + graphml_file #for makestudy
cur_path = os.getcwd()
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
graphml_file = request.args.get('fetch')
apikey = request.args.get('apikey')
dirname = secure_filename(dir) + "_" + apikey
makestudy_dir = dirname + "/" + graphml_file #for makestudy
dir_path = os.path.abspath(os.path.join(concore_path, graphml_file)) #path for ./build
if not os.path.exists(secure_filename(dir_path)):
if not os.path.exists(dir_path):
proc = call(["./makestudy", makestudy_dir], cwd=concore_path)
if(proc == 0):
resp = jsonify({'message': 'Directory successfully created'})
Expand All @@ -114,33 +79,75 @@ def build(dir):

@app.route('/debug/<dir>', methods=['POST'])
def debug(dir):
cur_path = os.getcwd()
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
dir = secure_filename(dir)
dir_path = os.path.abspath(os.path.join(concore_path, dir))
proc = call(["./debug"], cwd=dir_path)
if(proc == 0):
resp = jsonify({'message': 'Close the pop window after obtaing result'})
resp = jsonify({'message': 'Close the pop window after obtaining result'})
resp.status_code = 201
return resp
else:
resp = jsonify({'message': 'There is an Error'})
resp.status_code = 500
return resp

# to download /download/<dir>?fetch=<downloadfile>. For example, /download/test?fetch=example.py.out&apikey=xyz

@app.route('/run/<dir>', methods=['POST'])
def run(dir):
dir = secure_filename(dir)
dir_path = os.path.abspath(os.path.join(concore_path, dir))
proc = call(["./run"], cwd=dir_path)
if(proc == 0):
resp = jsonify({'message': 'result prepared'})
resp.status_code = 201
return resp
else:
resp = jsonify({'message': 'There is an Error'})
resp.status_code = 500
return resp

@app.route('/stop/<dir>', methods=['POST'])
def stop(dir):
dir = secure_filename(dir)
dir_path = os.path.abspath(os.path.join(concore_path, dir))
proc = call(["./stop"], cwd=dir_path)
if(proc == 0):
resp = jsonify({'message': 'resources cleaned'})
resp.status_code = 201
return resp
else:
resp = jsonify({'message': 'There is an Error'})
resp.status_code = 500
return resp


@app.route('/clear/<dir>', methods=['POST'])
def clear(dir):
dir = secure_filename(dir)
dir_path = os.path.abspath(os.path.join(concore_path, dir))
proc = call(["./clear"], cwd=dir_path)
if(proc == 0):
resp = jsonify({'message': 'result deleted'})
resp.status_code = 201
return resp
else:
resp = jsonify({'message': 'There is an Error'})
resp.status_code = 500
return resp

# to download /download/<dir>?fetch=<downloadfile>. For example, /download/test?fetchDir=xyz&fetch=u
@app.route('/download/<dir>', methods=['POST', 'GET'])
def download(dir):
download_file = request.args.get('fetch')
apikey = request.args.get('apikey')
dirname = dir + "_" + apikey

if not os.path.exists(secure_filename(dirname)):
sub_folder = request.args.get('fetchDir')
dirname = secure_filename(dir) + "/" + secure_filename(sub_folder)
directory_name = os.path.abspath(os.path.join(concore_path, dirname))
if not os.path.exists(directory_name):
resp = jsonify({'message': 'Directory not found'})
resp.status_code = 400
return resp

try:
return send_from_directory(secure_filename(dirname), download_file, as_attachment=True)
return send_from_directory(directory_name, download_file, as_attachment=True)
except:
resp = jsonify({'message': 'file not found'})
resp.status_code = 400
Expand All @@ -149,8 +156,7 @@ def download(dir):

@app.route('/destroy/<dir>', methods=['DELETE'])
def destroy(dir):
cur_path = os.getcwd()
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
dir = secure_filename(dir)
proc = call(["./destroy", dir], cwd=concore_path)
if(proc == 0):
resp = jsonify({'message': 'Successfuly deleted Dirctory'})
Expand All @@ -163,9 +169,9 @@ def destroy(dir):

@app.route('/getFilesList/<dir>', methods=['POST'])
def getFilesList(dir):
cur_path = os.getcwd()
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
dir_path = os.path.abspath(os.path.join(concore_path, dir))
sub_dir = request.args.get('fetch')
dirname = secure_filename(dir) + "/" + secure_filename(sub_dir)
dir_path = os.path.abspath(os.path.join(concore_path, dirname))
res = []
res = os.listdir(dir_path)
res = json.dumps(res)
Expand All @@ -174,8 +180,6 @@ def getFilesList(dir):

@app.route('/openJupyter/', methods=['POST'])
def openJupyter():
cur_path = os.getcwd()
concore_path = os.path.abspath(os.path.join(cur_path, '../../'))
proc = subprocess.Popen(['jupyter', 'lab'], shell=False, stdout=subprocess.PIPE, cwd=concore_path)
if proc.poll() is None:
resp = jsonify({'message': 'Successfuly opened Jupyter'})
Expand Down
114 changes: 68 additions & 46 deletions fri/test.py
Original file line number Diff line number Diff line change
@@ -1,70 +1,59 @@
from cgi import test
import requests
import os
import urllib.request
import time

# function to test upload() method.
def upload():
url = "http://127.0.0.1:5000/upload/test?apikey=xyz"

path = os.path.abspath("example.py")

def upload(files):
url = "http://127.0.0.1:5000/upload/test?apikey=xyz"
payload={}
files=[
('files[]',('example.py',open(path,'rb'),'application/octet-stream'))
]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

print(response.text)


# # *******

# function to test execute() method.
def execute():
url = "http://127.0.0.1:5000/execute/test?apikey=xyz"

path = os.path.abspath("example.py")

payload={}
files=[
('file',('example.py',open(path,'rb'),'application/octet-stream'))
]
headers = {}

response = requests.request("POST", url, headers=headers, data=payload, files=files)

# function to check build
def build(dir, graphml, apikey):
url = "http://127.0.0.1:5000/build/"+dir+"?"+"fetch="+graphml+"&"+"apikey="+apikey
response = requests.request("POST", url)
print(response.text)

# function to test download() method.
def download():
url = "http://127.0.0.1:5000/download/test?fetch=f1.txt&apikey=xyz"
urllib.request.urlretrieve(url, "f1.txt")
# function to debug
def debug(graphml):
url = "http://127.0.0.1:5000/debug/"+graphml
response = requests.request("POST", url)
print(response.text)

# function to test run() method.
def run(graphml):
url = "http://127.0.0.1:5000/run/"+graphml
response = requests.request("POST", url)
print(response.text)

# function to check build
def build():
url = "http://127.0.0.1:5000/build/test?fetch=sample1"
def clear(graphml):
url = "http://127.0.0.1:5000/clear/"+graphml
response = requests.request("POST", url)
print(response.text)

# function to debug
def debug():
url = "http://127.0.0.1:5000/debug/sample1"
def stop(graphml):
url = "http://127.0.0.1:5000/stop/"+graphml
response = requests.request("POST", url)
print(response.text)
print(response.text)


#function to destroy dir.
def destroy():
url = "http://127.0.0.1:5000/destroy/sample1"
def destroy(dir):
url = "http://127.0.0.1:5000/destroy/" + dir
response = requests.request("DELETE", url)

print(response.text)

def getFilesList():
url = "http://127.0.0.1:5000/getFilesList/test"
def getFilesList(dir, sub_dir = ""):
url = "http://127.0.0.1:5000/getFilesList/" + dir + "?"+"fetch="+sub_dir
response = requests.request("POST", url)
print(response.text)

Expand All @@ -73,13 +62,46 @@ def openJupyter():
response = requests.request("POST", url)
print(response.text)

# function to test download() method.
def download(dir, subDir, fileName ):
url = "http://127.0.0.1:5000/download/"+dir+"?"+"fetchDir="+subDir+"&"+"fetch="+ fileName
urllib.request.urlretrieve(url, fileName)

# file list to be uploaded
cur_path = os.path.dirname(os.path.abspath(__file__))
demo_path = os.path.abspath(os.path.join(cur_path, '../demo'))
file_name1 = "controller.py"
file_name2 = "pm.py"
file_name3 = "sample1.graphml"
path_file1 = demo_path + "/" +file_name1
path_file2 = demo_path + "/" +file_name2
path_file3 = demo_path + "/" +file_name3
files=[
#('files[]',(file_name,open(file_path,'rb'),'application/octet-stream'))
('files[]',(file_name1,open(path_file1,'rb'),'application/octet-stream')),
('files[]',(file_name2,open(path_file2,'rb'),'application/octet-stream')),
('files[]',(file_name3,open(path_file3,'rb'),'application/octet-stream')),
]


upload(files)
time.sleep(2)
build("test", "sample1", "xyz")
time.sleep(6)
method = input("methods - 1 for debug, 0 for run :")
if method == 1:
debug("sample1")
else:
run("sample1")
time.sleep(2)
stop("sample1")
time.sleep(2)
getFilesList("sample1", "cu")
getFilesList("sample1", "pym")
time.sleep(5)
download("sample1", "cu", "u")
clear("sample1")
destroy("sample1")
openJupyter()

# upload()
# execute()
# download()
# build()
# debug()
# destroy()
getFilesList()
# openJupyter()