-
Notifications
You must be signed in to change notification settings - Fork 68
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Fission benchmark #56
base: master
Are you sure you want to change the base?
Changes from 46 commits
3a8dd2a
78605d1
c8c1012
5443c4a
25f3f0e
fd24ea3
d4f2687
a1edfae
337314c
42de6c7
3f51a5b
6148f76
eb93174
e6e6286
d6e9894
3caaa12
341dae3
f434a2b
954c5a4
68afc9d
460ca18
77004ff
0ddaded
d0775cd
7d451e9
335984b
a6415e1
e88c255
4276602
25de6ea
d6894c6
15922f7
5e816bf
f013a68
5ad80aa
36c03a6
9e1cd1c
f31b192
9933975
16ecf04
4a4403b
6846a47
4a83600
b3818fd
d732d64
c0ffa55
501f2c6
9106337
25d98dd
fcf22cc
af2ca47
46a6f07
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -179,6 +179,8 @@ sebs-* | |
# cache | ||
cache | ||
|
||
# ide | ||
.vscode | ||
# IntelliJ IDEA files | ||
.idea | ||
*.iml |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,31 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const path = require('path'), fs = require('fs'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exports.handler = async function(context) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var body = JSON.stringify(context.request.body); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var unbody = JSON.parse(body); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var func = require('./function/function'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var begin = Date.now()/1000; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var start = process.hrtime(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var ret = await func.handler(unbody); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var elapsed = process.hrtime(start); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var end = Date.now()/1000; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var micro = elapsed[1] / 1e3 + elapsed[0] * 1e6; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var is_cold = false; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var fname = path.join('/tmp','cold_run'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if(!fs.existsSync(fname)) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_cold = true; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fs.closeSync(fs.openSync(fname, 'w')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
status: 200, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
body: JSON.stringify({ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
begin, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
end, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
compute_time: micro, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
results_time: 0, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
result: ret, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
is_cold | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+3
to
+31
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider adding error handling. The function currently lacks error handling. Consider wrapping the logic in a try-catch block to handle potential errors gracefully. exports.handler = async function(context) {
+ try {
var body = JSON.stringify(context.request.body);
var unbody = JSON.parse(body);
var func = require('./function/function');
var begin = Date.now()/1000;
var start = process.hrtime();
var ret = await func.handler(unbody);
var elapsed = process.hrtime(start);
var end = Date.now()/1000;
var micro = elapsed[1] / 1e3 + elapsed[0] * 1e6;
var is_cold = false;
var fname = path.join('/tmp','cold_run');
if(!fs.existsSync(fname)) {
is_cold = true;
fs.closeSync(fs.openSync(fname, 'w'));
}
return {
status: 200,
body: JSON.stringify({
begin,
end,
compute_time: micro,
results_time: 0,
result: ret,
is_cold
})
};
+ } catch (error) {
+ return {
+ status: 500,
+ body: JSON.stringify({ error: error.message })
+ };
+ }
}; Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,63 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
const minio = require('minio'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uuid = require('uuid'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
util = require('util'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
stream = require('stream'), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
fs = require('fs'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
class minio_storage { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
constructor() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let minioConfig = JSON.parse(fs.readFileSync('minioConfig.json')); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Any specific reason why we are using a file here and not envs, like in Python? |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let address = minioConfig["url"]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let access_key = minioConfig["access_key"]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let secret_key = minioConfig["secret_key"]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.client = new minio.Client( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
{ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
endPoint: address.split(':')[0], | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
port: parseInt(address.split(':')[1], 10), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
accessKey: access_key, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
secretKey: secret_key, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
useSSL: false | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+11
to
+24
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle potential file read and parse exceptions. The file read and JSON parse operations should be wrapped in a try-catch block to handle potential errors. - let minioConfig = JSON.parse(fs.readFileSync('minioConfig.json'));
+ let minioConfig;
+ try {
+ minioConfig = JSON.parse(fs.readFileSync('minioConfig.json'));
+ } catch (e) {
+ console.error(`Failed to read or parse minioConfig.json: ${e}`);
+ throw e;
+ } Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
unique_name(file) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let [name, extension] = file.split('.'); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let uuid_name = uuid.v4().split('-')[0]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return util.format('%s.%s.%s', name, uuid_name, extension); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
upload(bucket, file, filepath) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let uniqueName = this.unique_name(file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return [uniqueName, this.client.fPutObject(bucket, uniqueName, filepath)]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
download(bucket, file, filepath) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.client.fGetObject(bucket, file, filepath); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
uploadStream(bucket, file) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var write_stream = new stream.PassThrough(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let uniqueName = this.unique_name(file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
let promise = this.client.putObject(bucket, uniqueName, write_stream, write_stream.size); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return [write_stream, promise, uniqueName]; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
downloadStream(bucket, file) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
var read_stream = new stream.PassThrough(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.client.getObject(bucket, file); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
static get_instance() { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
if(!this.instance) { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
this.instance = new storage(); | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
return this.instance; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Comment on lines
+55
to
+58
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Avoid using Using - if(!this.instance) {
- this.instance = new storage();
+ if(!minio_storage.instance) {
+ minio_storage.instance = new storage(); Committable suggestion
Suggested change
ToolsBiome
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
}; | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
exports.storage = minio_storage; |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,51 @@ | ||||||||||||||||||||||||||||||||
import logging | ||||||||||||||||||||||||||||||||
import datetime | ||||||||||||||||||||||||||||||||
import os | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
import minio | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove unused import. The - import minio Committable suggestion
Suggested change
ToolsRuff
|
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
def main(args): | ||||||||||||||||||||||||||||||||
logging.getLogger().setLevel(logging.INFO) | ||||||||||||||||||||||||||||||||
begin = datetime.datetime.now() | ||||||||||||||||||||||||||||||||
args['request-id'] = os.getenv('__OW_ACTIVATION_ID') | ||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Did you test this? This looks like a copy-paste from OpenWhisk |
||||||||||||||||||||||||||||||||
args['income-timestamp'] = begin.timestamp() | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
for arg in ["MINIO_STORAGE_CONNECTION_URL", "MINIO_STORAGE_ACCESS_KEY", "MINIO_STORAGE_SECRET_KEY"]: | ||||||||||||||||||||||||||||||||
os.environ[arg] = args[arg] | ||||||||||||||||||||||||||||||||
del args[arg] | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
try: | ||||||||||||||||||||||||||||||||
from function import function | ||||||||||||||||||||||||||||||||
ret = function.handler(args) | ||||||||||||||||||||||||||||||||
Comment on lines
+17
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Handle potential import exceptions. The import of - from function import function
+ try:
+ from function import function
+ except ImportError as e:
+ logging.error(f"Failed to import function: {e}")
+ return {
+ "begin": begin.strftime("%s.%f"),
+ "end": datetime.datetime.now().strftime("%s.%f"),
+ "request_id": os.getenv('__OW_ACTIVATION_ID'),
+ "results_time": (datetime.datetime.now() - begin) / datetime.timedelta(microseconds=1),
+ "result": f"Error - import failed! Reason: {e}"
+ } Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||
end = datetime.datetime.now() | ||||||||||||||||||||||||||||||||
logging.info("Function result: {}".format(ret)) | ||||||||||||||||||||||||||||||||
log_data = {"result": ret["result"]} | ||||||||||||||||||||||||||||||||
if "measurement" in ret: | ||||||||||||||||||||||||||||||||
log_data["measurement"] = ret["measurement"] | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
results_time = (end - begin) / datetime.timedelta(microseconds=1) | ||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
is_cold = False | ||||||||||||||||||||||||||||||||
fname = "cold_run" | ||||||||||||||||||||||||||||||||
if not os.path.exists(fname): | ||||||||||||||||||||||||||||||||
is_cold = True | ||||||||||||||||||||||||||||||||
open(fname, "a").close() | ||||||||||||||||||||||||||||||||
Comment on lines
+30
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Simplify cold start check. The cold start check can be simplified using a single line. - if not os.path.exists(fname):
- is_cold = True
- open(fname, "a").close()
+ is_cold = not os.path.exists(fname)
+ if is_cold:
+ open(fname, "a").close() Committable suggestion
Suggested change
|
||||||||||||||||||||||||||||||||
|
||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||
"begin": begin.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||
"end": end.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||
"request_id": os.getenv('__OW_ACTIVATION_ID'), | ||||||||||||||||||||||||||||||||
"results_time": results_time, | ||||||||||||||||||||||||||||||||
"is_cold": is_cold, | ||||||||||||||||||||||||||||||||
"result": log_data, | ||||||||||||||||||||||||||||||||
} | ||||||||||||||||||||||||||||||||
except Exception as e: | ||||||||||||||||||||||||||||||||
end = datetime.datetime.now() | ||||||||||||||||||||||||||||||||
results_time = (end - begin) / datetime.timedelta(microseconds=1) | ||||||||||||||||||||||||||||||||
return { | ||||||||||||||||||||||||||||||||
"begin": begin.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||
"end": end.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||
"request_id": os.getenv('__OW_ACTIVATION_ID'), | ||||||||||||||||||||||||||||||||
"results_time": results_time, | ||||||||||||||||||||||||||||||||
"result": f"Error - invocation failed! Reason: {e}" | ||||||||||||||||||||||||||||||||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,2 @@ | ||
#!/bin/sh | ||
pip3 install -r ${SRC_PKG}/requirements.txt -t ${SRC_PKG} && cp -r ${SRC_PKG} ${DEPLOY_PKG} |
Original file line number | Diff line number | Diff line change | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
@@ -0,0 +1,42 @@ | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# from flask import request, jsonify, current_app | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# import json | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# import datetime | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# import os | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# def handler(): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# body = request.get_data().decode("utf-8") | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# current_app.logger.info("Body: " + body) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# event = json.loads(body) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# current_app.logger.info("Event: " + str(event)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# begin = datetime.datetime.now() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# from function import function | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# ret = function.handler(event) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# end = datetime.datetime.now() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# current_app.logger.info("Function result: " + str(ret)) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# log_data = {"result": ret["result"]} | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# if "measurement" in ret: | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# log_data["measurement"] = ret["measurement"] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# results_time = (end - begin) / datetime.timedelta(microseconds=1) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# # cold test | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# is_cold = False | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# fname = "cold_run" | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# if not os.path.exists(fname): | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# is_cold = True | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# open(fname, "a").close() | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# return jsonify( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# json.dumps( | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# { | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# "begin": begin.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# "end": end.strftime("%s.%f"), | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# "results_time": results_time, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# "is_cold": is_cold, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# "result": log_data, | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# } | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
# ) | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove or implement the commented-out code. The file contains commented-out code for a -# from flask import request, jsonify, current_app
-#
-# import json
-# import datetime
-# import os
-#
-#
-# def handler():
-# body = request.get_data().decode("utf-8")
-# current_app.logger.info("Body: " + body)
-# event = json.loads(body)
-# current_app.logger.info("Event: " + str(event))
-# begin = datetime.datetime.now()
-# from function import function
-#
-# ret = function.handler(event)
-# end = datetime.datetime.now()
-# current_app.logger.info("Function result: " + str(ret))
-# log_data = {"result": ret["result"]}
-# if "measurement" in ret:
-# log_data["measurement"] = ret["measurement"]
-#
-# results_time = (end - begin) / datetime.timedelta(microseconds=1)
-#
-# # cold test
-# is_cold = False
-# fname = "cold_run"
-# if not os.path.exists(fname):
-# is_cold = True
-# open(fname, "a").close()
-#
-# return jsonify(
-# json.dumps(
-# {
-# "begin": begin.strftime("%s.%f"),
-# "end": end.strftime("%s.%f"),
-# "results_time": results_time,
-# "is_cold": is_cold,
-# "result": log_data,
-# }
-# )
-# ) Committable suggestion
Suggested change
|
Original file line number | Diff line number | Diff line change | ||||
---|---|---|---|---|---|---|
@@ -0,0 +1,14 @@ | ||||||
from distutils.core import setup | ||||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Consider using
- from distutils.core import setup
+ from setuptools import setup Committable suggestion
Suggested change
|
||||||
from glob import glob | ||||||
from pkg_resources import parse_requirements | ||||||
|
||||||
with open('requirements.txt') as f: | ||||||
requirements = [str(r) for r in parse_requirements(f)] | ||||||
|
||||||
setup( | ||||||
name='function', | ||||||
install_requires=requirements, | ||||||
packages=['function'], | ||||||
package_dir={'function': '.'}, | ||||||
package_data={'function': glob('**', recursive=True)}, | ||||||
) |
Original file line number | Diff line number | Diff line change | ||
---|---|---|---|---|
@@ -0,0 +1,148 @@ | ||||
import os | ||||
xylini marked this conversation as resolved.
Show resolved
Hide resolved
|
||||
import uuid | ||||
import json | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Remove unused import. The import statement for - import json Committable suggestion
Suggested change
ToolsRuff
|
||||
import minio | ||||
import logging | ||||
|
||||
|
||||
class storage: | ||||
instance = None | ||||
client = None | ||||
|
||||
def __init__(self): | ||||
try: | ||||
""" | ||||
Minio does not allow another way of configuring timeout for connection. | ||||
The rest of configuration is copied from source code of Minio. | ||||
""" | ||||
import urllib3 | ||||
from datetime import timedelta | ||||
|
||||
timeout = timedelta(seconds=1).seconds | ||||
|
||||
mgr = urllib3.PoolManager( | ||||
timeout=urllib3.util.Timeout(connect=timeout, read=timeout), | ||||
maxsize=10, | ||||
retries=urllib3.Retry( | ||||
total=5, backoff_factor=0.2, status_forcelist=[500, 502, 503, 504] | ||||
) | ||||
) | ||||
self.client = minio.Minio( | ||||
os.getenv("MINIO_STORAGE_CONNECTION_URL"), | ||||
access_key=os.getenv("MINIO_STORAGE_ACCESS_KEY"), | ||||
secret_key=os.getenv("MINIO_STORAGE_SECRET_KEY"), | ||||
secure=False, | ||||
http_client=mgr | ||||
) | ||||
except Exception as e: | ||||
logging.info(e) | ||||
raise e | ||||
|
||||
@staticmethod | ||||
def unique_name(name): | ||||
name, extension = os.path.splitext(name) | ||||
return '{name}.{random}{extension}'.format( | ||||
name=name, | ||||
extension=extension, | ||||
random=str(uuid.uuid4()).split('-')[0] | ||||
) | ||||
|
||||
|
||||
def upload(self, bucket, file, filepath): | ||||
key_name = storage.unique_name(file) | ||||
self.client.fput_object(bucket, key_name, filepath) | ||||
return key_name | ||||
|
||||
def download(self, bucket, file, filepath): | ||||
self.client.fget_object(bucket, file, filepath) | ||||
|
||||
def download_directory(self, bucket, prefix, path): | ||||
objects = self.client.list_objects(bucket, prefix, recursive=True) | ||||
for obj in objects: | ||||
file_name = obj.object_name | ||||
self.download(bucket, file_name, os.path.join(path, file_name)) | ||||
|
||||
def upload_stream(self, bucket, file, bytes_data): | ||||
key_name = storage.unique_name(file) | ||||
self.client.put_object( | ||||
bucket, key_name, bytes_data, bytes_data.getbuffer().nbytes | ||||
) | ||||
return key_name | ||||
|
||||
def download_stream(self, bucket, file): | ||||
data = self.client.get_object(bucket, file) | ||||
return data.read() | ||||
|
||||
@staticmethod | ||||
def get_instance(): | ||||
if storage.instance is None: | ||||
storage.instance = storage() | ||||
return storage.instance | ||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
# import os | ||||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. remove? |
||||
# import uuid | ||||
# import json | ||||
# import minio | ||||
# from flask import current_app | ||||
# | ||||
# | ||||
# class storage: | ||||
# instance = None | ||||
# client = None | ||||
# | ||||
# def __init__(self): | ||||
# file = open(os.path.join(os.path.dirname(__file__), "minioConfig.json"), "r") | ||||
# minioConfig = json.load(file) | ||||
# try: | ||||
# self.client = minio.Minio( | ||||
# minioConfig["url"], | ||||
# access_key=minioConfig["access_key"], | ||||
# secret_key=minioConfig["secret_key"], | ||||
# secure=False, | ||||
# ) | ||||
# except Exception as e: | ||||
# current_app.logger.info(e) | ||||
# | ||||
# @staticmethod | ||||
# def unique_name(name): | ||||
# name, extension = name.split(".") | ||||
# return "{name}.{random}.{extension}".format( | ||||
# name=name, extension=extension, random=str(uuid.uuid4()).split("-")[0] | ||||
# ) | ||||
# | ||||
# def upload(self, bucket, file, filepath): | ||||
# key_name = storage.unique_name(file) | ||||
# self.client.fput_object(bucket, key_name, filepath) | ||||
# return key_name | ||||
# | ||||
# def download(self, bucket, file, filepath): | ||||
# self.client.fget_object(bucket, file, filepath) | ||||
# | ||||
# def download_directory(self, bucket, prefix, path): | ||||
# objects = self.client.list_objects_v2(bucket, prefix, recursive=True) | ||||
# for obj in objects: | ||||
# file_name = obj.object_name | ||||
# self.download(bucket, file_name, os.path.join(path, file_name)) | ||||
# | ||||
# def upload_stream(self, bucket, file, bytes_data): | ||||
# key_name = storage.unique_name(file) | ||||
# self.client.put_object( | ||||
# bucket, key_name, bytes_data, bytes_data.getbuffer().nbytes | ||||
# ) | ||||
# return key_name | ||||
# | ||||
# def download_stream(self, bucket, file): | ||||
# data = self.client.get_object(bucket, file) | ||||
# return data.read() | ||||
# | ||||
# def get_instance(): | ||||
# if storage.instance is None: | ||||
# storage.instance = storage() | ||||
# return storage.instance |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
For all wrappers, we need to compare them against newest implementation in OpenWhisk/Knative - there have been changes. In particular, storage triggers received few bugfixes.