From 716bde3eb54e3f05fa0910a99e22b5da6b7f14ba Mon Sep 17 00:00:00 2001 From: Taras Hlukhovetskyi Date: Tue, 23 Jun 2026 15:53:38 +0300 Subject: [PATCH] [FIX] [Serving pipelines] Inconsistent deployment status between serving pipelines table and detail pane --- .../DetailsInfoItem/DetailsInfoItem.jsx | 4 +- tests/mockServer/data/funcs.json | 239 ++++++++---------- tests/mockServer/data/nuclioFunctions.json | 110 ++++++-- 3 files changed, 195 insertions(+), 158 deletions(-) diff --git a/src/elements/DetailsInfoItem/DetailsInfoItem.jsx b/src/elements/DetailsInfoItem/DetailsInfoItem.jsx index 1e70d3bcd..828a004f5 100644 --- a/src/elements/DetailsInfoItem/DetailsInfoItem.jsx +++ b/src/elements/DetailsInfoItem/DetailsInfoItem.jsx @@ -319,6 +319,8 @@ const DetailsInfoItem = React.forwardRef( {item.value.map((itemFunc, index) => { const name = itemFunc.func?.name || itemFunc.name || '' const status = itemFunc.func?.state?.value || itemFunc.state?.value || '' + const statusLabel = itemFunc.func?.state?.label || itemFunc.state?.label || status + const statusClassName = classNames( itemFunc.func?.state?.className || `state-${status}-function`, 'status-icon' @@ -327,7 +329,7 @@ const DetailsInfoItem = React.forwardRef( }>{name} {status && ( - }> + }> )} diff --git a/tests/mockServer/data/funcs.json b/tests/mockServer/data/funcs.json index 4c030dc7a..d97330798 100644 --- a/tests/mockServer/data/funcs.json +++ b/tests/mockServer/data/funcs.json @@ -106,10 +106,7 @@ }, "endpoint3": { "inputs": [], - "outputs": [ - "output1", - "output2" - ], + "outputs": ["output1", "output2"], "input_path": "input_path", "result_path": "result_path", "creation_strategy": "inplace", @@ -144,24 +141,18 @@ } }, "shape": "folder", - "cycle_from": [ - "route" - ] + "cycle_from": ["route"] }, "step-above-1": { "model_endpoint_creation_strategy": "skip", - "after": [ - "model-runner" - ], + "after": ["model-runner"], "kind": "task", "class_name": "LoopStep", "endpoint_type": 1 }, "step-above-2": { "model_endpoint_creation_strategy": "skip", - "after": [ - "model-runner" - ], + "after": ["model-runner"], "kind": "task", "class_name": "LoopStep", "endpoint_type": 1, @@ -169,31 +160,23 @@ }, "step1": { "model_endpoint_creation_strategy": "skip", - "after": [ - "model-runner" - ], + "after": ["model-runner"], "kind": "task", "class_name": "LoopStep", "endpoint_type": 1, "function": "function-test", - "cycle_from": [ - "step2" - ] + "cycle_from": ["step2"] }, "step-below-1": { "model_endpoint_creation_strategy": "skip", - "after": [ - "model-runner" - ], + "after": ["model-runner"], "kind": "task", "class_name": "LoopStep", "endpoint_type": 1 }, "step2": { "model_endpoint_creation_strategy": "skip", - "after": [ - "step1" - ], + "after": ["step1"], "kind": "task", "class_name": "DecideNext", "endpoint_type": 1, @@ -201,23 +184,17 @@ "limit": 5 }, "function": "function-test", - "cycle_from": [ - "route" - ] + "cycle_from": ["route"] }, "stream": { - "after": [ - "step2" - ], + "after": ["step2"], "shards": 7, "kind": "queue", "path": "v3io:///projects/mronetttbl//out-stream" }, "route": { "model_endpoint_creation_strategy": "skip", - "after": [ - "stream" - ], + "after": ["stream"], "kind": "task", "class_name": "mlrun.serving.steps.ChoiceByField", "endpoint_type": 1, @@ -228,9 +205,7 @@ "exit": { "responder": true, "model_endpoint_creation_strategy": "skip", - "after": [ - "route" - ], + "after": ["route"], "kind": "task", "endpoint_type": 1, "handler": "exit_handler" @@ -266,9 +241,7 @@ }, "extend_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "choice_by_field" - ], + "after": ["choice_by_field"], "endpoint_type": 1, "class_name": "storey.Extend", "class_args": { @@ -280,9 +253,7 @@ }, "flatmap_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "extend_step" - ], + "after": ["extend_step"], "endpoint_type": 1, "class_name": "storey.FlatMap", "class_args": { @@ -294,18 +265,14 @@ }, "flatten_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "flatmap_step" - ], + "after": ["flatmap_step"], "endpoint_type": 1, "class_name": "storey.Flatten", "kind": "task" }, "map_with_state_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "flatten_step" - ], + "after": ["flatten_step"], "endpoint_type": 1, "class_name": "storey.MapWithState", "class_args": { @@ -317,9 +284,7 @@ }, "batch_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "map_with_state_step" - ], + "after": ["map_with_state_step"], "endpoint_type": 1, "class_name": "storey.Batch", "class_args": { @@ -332,18 +297,14 @@ }, "foreach_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "batch_step" - ], + "after": ["batch_step"], "endpoint_type": 1, "class_name": "storey.ForEach", "kind": "task" }, "filter_step": { "model_endpoint_creation_strategy": "skip", - "after": [ - "foreach_step" - ], + "after": ["foreach_step"], "endpoint_type": 1, "class_name": "storey.Filter", "class_args": { @@ -356,9 +317,7 @@ "sample_window_step": { "model_endpoint_creation_strategy": "skip", "on_error": "sample_window_error_handler", - "after": [ - "filter_step" - ], + "after": ["filter_step"], "endpoint_type": 1, "class_name": "storey.SampleWindow", "class_args": { @@ -381,9 +340,7 @@ "kind": "task" }, "custom_step": { - "after": [ - "remote_step" - ], + "after": ["remote_step"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_name": "CustomLogicStep", @@ -393,15 +350,11 @@ "kind": "task" }, "queue_step": { - "after": [ - "router_step_mock" - ], + "after": ["router_step_mock"], "kind": "queue" }, "final": { - "after": [ - "queue_step" - ], + "after": ["queue_step"], "responder": true, "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, @@ -443,9 +396,7 @@ "base_step": "remote_step" }, "router_step_mock": { - "after": [ - "custom_step" - ], + "after": ["custom_step"], "routes": { "model_0": { "model_endpoint_creation_strategy": "inplace", @@ -509,18 +460,8 @@ "kind": "router" }, "s1": { - "after": [ - "s2", - "s3", - "s4", - "s5" - ], - "cycle_from": [ - "s2", - "s3", - "s4", - "s5" - ], + "after": ["s2", "s3", "s4", "s5"], + "cycle_from": ["s2", "s3", "s4", "s5"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_args": { @@ -530,9 +471,7 @@ "class_name": "HubStep" }, "s2": { - "after": [ - "s1" - ], + "after": ["s1"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_args": { @@ -542,9 +481,7 @@ "class_name": "CycleStep" }, "s3": { - "after": [ - "s1" - ], + "after": ["s1"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_args": { @@ -554,9 +491,7 @@ "class_name": "CycleStep" }, "s4": { - "after": [ - "s1" - ], + "after": ["s1"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_args": { @@ -566,9 +501,7 @@ "class_name": "CycleStep" }, "s5": { - "after": [ - "s1" - ], + "after": ["s1"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "class_args": { @@ -578,18 +511,14 @@ "class_name": "CycleStep" }, "s6": { - "after": [ - "s1" - ], + "after": ["s1"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "kind": "task", "class_name": "ExitStep" }, "final2": { - "after": [ - "s6" - ], + "after": ["s6"], "model_endpoint_creation_strategy": "skip", "endpoint_type": 1, "responder": true, @@ -24688,9 +24617,7 @@ "code_origin": "/User/apps/iris_streamlit.py", "source": "https://github.com/mlrun/demos.git#refs/heads/main", "base_image": "python:3.9-slim", - "commands": [ - "pip install streamlit pandas scikit-learn" - ] + "commands": ["pip install streamlit pandas scikit-learn"] }, "max_replicas": 2, "description": "Interactive Iris classification dashboard built with Streamlit", @@ -24749,9 +24676,7 @@ "address": "default-iris-streamlit-app.default-tenant.app.vmdev36.lab.iguazeng.com/", "container_image": "docker-registry.default-tenant.app.vmdev36.lab.iguazeng.com:80/nuclio/default-iris-streamlit-app-processor:latest", "state": "ready", - "internal_invocation_urls": [ - "nuclio-app-demo-vizro.default-tenant.svc.cluster.local:8080" - ] + "internal_invocation_urls": ["nuclio-app-demo-vizro.default-tenant.svc.cluster.local:8080"] } }, { @@ -24796,9 +24721,7 @@ "code_origin": "/User/apps/iris_streamlit.py", "source": "https://github.com/mlrun/demos.git#refs/heads/main", "base_image": "python:3.9-slim", - "commands": [ - "pip install streamlit pandas scikit-learn" - ] + "commands": ["pip install streamlit pandas scikit-learn"] }, "max_replicas": 2, "description": "Interactive Iris classification dashboard built with Streamlit", @@ -24894,10 +24817,7 @@ "build": { "source": "https://github.com/mlrun/fraud-demo.git", "base_image": "python:3.9", - "commands": [ - "pip install flask pandas numpy", - "pip install scikit-learn xgboost" - ] + "commands": ["pip install flask pandas numpy", "pip install scikit-learn xgboost"] }, "max_replicas": 6, "description": "Real-time fraud detection dashboard with ML-powered transaction scoring and alerting system", @@ -25065,23 +24985,15 @@ "protocol": "TCP" } ], - "command": [ - "/bin/sh", - "-c" - ], - "args": [ - "python app.py --workers 4 --model-cache-size 1024" - ] + "command": ["/bin/sh", "-c"], + "args": ["python app.py --workers 4 --model-cache-size 1024"] } ] }, "build": { "source": "https://github.com/mlrun/recommender-demo.git", "base_image": "python:3.9", - "commands": [ - "pip install fastapi uvicorn redis", - "pip install scipy implicit" - ] + "commands": ["pip install fastapi uvicorn redis", "pip install scipy implicit"] }, "max_replicas": 10, "description": "Real-time product recommendation engine using collaborative filtering with Redis-backed feature store and A/B testing support", @@ -25382,9 +25294,7 @@ "protocol": "TCP" } ], - "command": [ - "python" - ], + "command": ["python"], "args": [ "-m", "uvicorn", @@ -25778,9 +25688,7 @@ "protocol": "TCP" } ], - "command": [ - "gunicorn" - ], + "command": ["gunicorn"], "args": [ "--bind", "0.0.0.0:8080", @@ -32024,6 +31932,71 @@ }, "verbose": false, "kind": "serving" + }, + { + "kind": "serving", + "metadata": { + "name": "test-pipeline", + "tag": "latest", + "hash": "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa", + "project": "default", + "labels": { + "mlrun/class": "serving" + }, + "updated": "2026-06-23T12:00:00.000000+00:00" + }, + "spec": { + "command": "", + "args": [], + "image": "mlrun/mlrun", + "description": "ML-12395 manual test: serving pipeline with a child function in building state.", + "min_replicas": 1, + "max_replicas": 4, + "function_kind": "serving_v2", + "graph": { + "kind": "router", + "routes": { + "child-model": { + "kind": "task", + "class_name": "mlrun.serving.ModelRouter" + } + } + }, + "build": { + "commands": [] + }, + "secret_sources": [] + }, + "verbose": false, + "kind": "serving" + }, + { + "kind": "serving", + "metadata": { + "name": "test-pipeline-child", + "tag": "latest", + "hash": "bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb", + "project": "default", + "labels": { + "mlrun/class": "serving", + "parent-function": "test-pipeline" + }, + "updated": "2026-06-23T12:00:00.000000+00:00" + }, + "spec": { + "command": "", + "args": [], + "image": "mlrun/mlrun", + "description": "ML-12395 manual test: child function in building state.", + "function_kind": "serving_v2", + "build": { + "commands": [] + } + }, + "verbose": false, + "status": { + "state": "building" + } } ] } diff --git a/tests/mockServer/data/nuclioFunctions.json b/tests/mockServer/data/nuclioFunctions.json index 93d2832c2..8bcc05c15 100644 --- a/tests/mockServer/data/nuclioFunctions.json +++ b/tests/mockServer/data/nuclioFunctions.json @@ -116,10 +116,7 @@ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKCgppbXBvcnQgd2FybmluZ3MKd2FybmluZ3Muc2ltcGxlZmlsdGVyKGFjdGlvbj0iaWdub3JlIiwgY2F0ZWdvcnk9RnV0dXJlV2FybmluZykKCmltcG9ydCBqc29uCmltcG9ydCBudW1weSBhcyBucAppbXBvcnQgcmVxdWVzdHMKZnJvbSB0ZW5zb3JmbG93IGltcG9ydCBrZXJhcwpmcm9tIHRlbnNvcmZsb3cua2VyYXMubW9kZWxzIGltcG9ydCBsb2FkX21vZGVsCmZyb20gdGVuc29yZmxvdy5rZXJhcy5wcmVwcm9jZXNzaW5nIGltcG9ydCBpbWFnZQpmcm9tIHRlbnNvcmZsb3cua2VyYXMucHJlcHJvY2Vzc2luZy5pbWFnZSBpbXBvcnQgbG9hZF9pbWcKZnJvbSBvcyBpbXBvcnQgZW52aXJvbiwgcGF0aApmcm9tIFBJTCBpbXBvcnQgSW1hZ2UKZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwpmcm9tIHVybGxpYi5yZXF1ZXN0IGltcG9ydCB1cmxvcGVuCmltcG9ydCBtbHJ1bgoKY2xhc3MgVEZNb2RlbChtbHJ1bi5ydW50aW1lcy5NTE1vZGVsU2VydmVyKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lOiBzdHIsIG1vZGVsX2Rpcjogc3RyKToKICAgICAgICBzdXBlcigpLl9faW5pdF9fKG5hbWUsIG1vZGVsX2RpcikKCiAgICAgICAgc2VsZi5JTUFHRV9XSURUSCA9IGludChlbnZpcm9uLmdldCgnSU1BR0VfV0lEVEgnLCAnMTI4JykpCiAgICAgICAgc2VsZi5JTUFHRV9IRUlHSFQgPSBpbnQoZW52aXJvbi5nZXQoJ0lNQUdFX0hFSUdIVCcsICcxMjgnKSkKICAgICAgICAKICAgICAgICB0cnk6CiAgICAgICAgICAgIHdpdGggb3BlbihlbnZpcm9uWydjbGFzc2VzX21hcCddLCAncicpIGFzIGY6CiAgICAgICAgICAgICAgICBzZWxmLmNsYXNzZXMgPSBqc29uLmxvYWQoZikKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHNlbGYuY2xhc3NlcyA9IE5vbmUKICAgICAgICAKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgIG1vZGVsX2ZpbGUsIGV4dHJhX2RhdGEgPSBzZWxmLmdldF9tb2RlbCgnLmg1JykKICAgICAgICBzZWxmLm1vZGVsID0gbG9hZF9tb2RlbChtb2RlbF9maWxlKQogICAgICAgIAogICAgZGVmIHByZXByb2Nlc3Moc2VsZiwgYm9keSk6CiAgICAgICAgdHJ5OgogICAgICAgICAgICBvdXRwdXQgPSB7J2luc3RhbmNlcyc6IFtdfQogICAgICAgICAgICBpbnN0YW5jZXMgPSBib2R5LmdldCgnaW5zdGFuY2VzJywgW10pCiAgICAgICAgICAgIGZvciBieXRlX2ltYWdlIGluIGluc3RhbmNlczoKICAgICAgICAgICAgICAgIGltZyA9IEltYWdlLm9wZW4oYnl0ZV9pbWFnZSkKICAgICAgICAgICAgICAgIGltZyA9IGltZy5yZXNpemUoKHNlbGYuSU1BR0VfV0lEVEgsIHNlbGYuSU1BR0VfSEVJR0hUKSkKCiAgICAgICAgICAgICAgICB4ID0gaW1hZ2UuaW1nX3RvX2FycmF5KGltZykKICAgICAgICAgICAgICAgIHggPSBucC5leHBhbmRfZGltcyh4LCBheGlzPTApCiAgICAgICAgICAgICAgICBvdXRwdXRbJ2luc3RhbmNlcyddLmFwcGVuZCh4KQogICAgICAgICAgICAKICAgICAgICAgICAgb3V0cHV0WydpbnN0YW5jZXMnXSA9IFtucC52c3RhY2sob3V0cHV0WydpbnN0YW5jZXMnXSldCiAgICAgICAgICAgIHJldHVybiBvdXRwdXQKICAgICAgICBleGNlcHQ6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbihmJ3JlY2VpdmVkOiB7Ym9keX0nKQogICAgICAgICAgICAKCiAgICBkZWYgcHJlZGljdChzZWxmLCBkYXRhKToKICAgICAgICBpbWFnZXMgPSBkYXRhLmdldCgnaW5zdGFuY2VzJywgW10pCgogICAgICAgIHByZWRpY3RlZF9wcm9iYWJpbGl0eSA9IHNlbGYubW9kZWwucHJlZGljdChpbWFnZXMpCgogICAgICAgIHJldHVybiBwcmVkaWN0ZWRfcHJvYmFiaWxpdHkKICAgICAgICAKICAgIGRlZiBwb3N0cHJvY2VzcyhzZWxmLCBwcmVkaWN0ZWRfcHJvYmFiaWxpdHkpOgogICAgICAgIGlmIHNlbGYuY2xhc3NlczoKICAgICAgICAgICAgcHJlZGljdGVkX2NsYXNzZXMgPSBucC5hcm91bmQocHJlZGljdGVkX3Byb2JhYmlsaXR5LCAxKS50b2xpc3QoKVswXQogICAgICAgICAgICBwcmVkaWN0ZWRfcHJvYmFiaWxpdGllcyA9IHByZWRpY3RlZF9wcm9iYWJpbGl0eS50b2xpc3QoKVswXQogICAgICAgICAgICByZXR1cm4gewogICAgICAgICAgICAgICAgJ3ByZWRpY3Rpb24nOiBbc2VsZi5jbGFzc2VzW3N0cihpbnQoY2xzKSldIGZvciBjbHMgaW4gcHJlZGljdGVkX2NsYXNzZXNdLCAKICAgICAgICAgICAgICAgIGYne3NlbGYuY2xhc3Nlc1siMSJdfS1wcm9iYWJpbGl0eSc6IHByZWRpY3RlZF9wcm9iYWJpbGl0aWVzCiAgICAgICAgICAgIH0KICAgICAgICBlbHNlOgogICAgICAgICAgICByZXR1cm4gcHJlZGljdGVkX3Byb2JhYmlsaXR5LnRvbGlzdCgpWzBdCgoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg==", "noBaseImagesPull": true, "baseImage": "mlrun/mlrun:0.6.5-rc12", - "commands": [ - "pip install tensorflow>=2.1", - "pip install requests pillow" - ], + "commands": ["pip install tensorflow>=2.1", "pip install requests pillow"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1625573793 @@ -2031,9 +2028,7 @@ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHNrbXVsdGlmbG93LmRyaWZ0X2RldGVjdGlvbgppbXBvcnQgbnVtcHkgYXMgbnAKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgb3MKaW1wb3J0IGpzb24KaW1wb3J0IHYzaW8uZGF0YXBsYW5lCmltcG9ydCB2M2lvX2ZyYW1lcyBhcyB2M2YKaW1wb3J0IHJlcXVlc3RzCmZyb20gY2xvdWRwaWNrbGUgaW1wb3J0IGxvYWQKCmltcG9ydCByYW5kb20KCgpkZWYgc3BsaXRfcGF0aChtbnRwYXRoPSIiKToKICAgIGlmIG1udHBhdGhbMF0gPT0gIi8iOgogICAgICAgIG1udHBhdGggPSBtbnRwYXRoWzE6XQogICAgcGF0aHMgPSBtbnRwYXRoLnNwbGl0KCIvIikKICAgIGNvbnRhaW5lciA9IHBhdGhzWzBdCiAgICBzdWJwYXRoID0gIiIKICAgIGlmIGxlbihwYXRocykgPiAxOgogICAgICAgIHN1YnBhdGggPSBtbnRwYXRoW2xlbihjb250YWluZXIpIDpdCiAgICByZXR1cm4gY29udGFpbmVyLCBzdWJwYXRoCgoKZGVmIGNyZWF0ZV9zdHJlYW0oY29udGV4dCwgcGF0aCwgc2hhcmRzPTEpOgogICAgY29udGFpbmVyLCBzdHJlYW1fcGF0aCA9IHNwbGl0X3BhdGgocGF0aCkKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oCiAgICAgICAgZiJDcmVhdGluZyBzdHJlYW0gaW4gQ29udGFpbmVyOiB7Y29udGFpbmVyfSAmIFBhdGgge3N0cmVhbV9wYXRofSIKICAgICkKICAgIHJlc3BvbnNlID0gY29udGV4dC52M2lvX2NsaWVudC5jcmVhdGVfc3RyZWFtKAogICAgICAgIGNvbnRhaW5lcj1jb250YWluZXIsCiAgICAgICAgcGF0aD1zdHJlYW1fcGF0aCwKICAgICAgICBzaGFyZF9jb3VudD1zaGFyZHMsCiAgICAgICAgcmFpc2VfZm9yX3N0YXR1cz12M2lvLmRhdGFwbGFuZS5SYWlzZUZvclN0YXR1cy5uZXZlciwKICAgICkKICAgIHJlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoWzQwOSwgMjA0XSkKCgpkZWYgcHVzaF90b19zdHJlYW0oY29udGV4dCwgc3RyZWFtX3BhdGgsIGRhdGEpOgogICAgcmVjb3JkcyA9IFt7ImRhdGEiOiBqc29uLmR1bXBzKHJlYyl9IGZvciByZWMgaW4gZGF0YV0KICAgIGNvbnRhaW5lciwgc3RyZWFtX3BhdGggPSBzcGxpdF9wYXRoKHN0cmVhbV9wYXRoKQogICAgcmVzcG9uc2UgPSBjb250ZXh0LnYzaW9fY2xpZW50LnB1dF9yZWNvcmRzKAogICAgICAgIGNvbnRhaW5lcj1jb250YWluZXIsIHBhdGg9c3RyZWFtX3BhdGgsIHJlY29yZHM9cmVjb3JkcwogICAgKQoKCmRlZiBjb25zdHJ1Y3RfcmVjb3JkKHJlY29yZCk6CiAgICBsYWJlbF9jb2wgPSBvcy5nZXRlbnYoImxhYmVsX2NvbCIsICJsYWJlbCIpCiAgICBwcmVkaWN0aW9uX2NvbCA9IG9zLmdldGVudigicHJlZGljdGlvbl9jb2wiLCAicHJlZGljdGlvbiIpCiAgICByZXMgPSBkaWN0KFsoaywgcmVjb3JkW2tdKSBmb3IgayBpbiBbIndoZW4iLCAiY2xhc3MiLCAibW9kZWwiLCAicmVzcCIsICJyZXF1ZXN0Il1dKQogICAgcmVzWyJmZWF0dXJlX3ZlY3RvciJdID0gcmVzLnBvcCgicmVxdWVzdCIpWyJpbnN0YW5jZXMiXVswXQogICAgcmVzWyJ0aW1lc3RhbXAiXSA9IHJlcy5wb3AoIndoZW4iKQogICAgcmVzWyJwcmVkaWN0aW9uIl0gPSByZXNbInJlc3AiXVswXQogICAgcmV0dXJuIHJlcwoKCmRlZiBpbml0X2NvbnRleHQoY29udGV4dCk6CiAgICB2M2lvX2NsaWVudCA9IHYzaW8uZGF0YXBsYW5lLkNsaWVudCgpCiAgICBzZXRhdHRyKGNvbnRleHQsICJ2M2lvX2NsaWVudCIsIHYzaW9fY2xpZW50KQoKICAgIHYzZl9jbGllbnQgPSB2M2YuQ2xpZW50KCJmcmFtZXNkOjgwODEiLCBjb250YWluZXI9ImJpZ2RhdGEiKQogICAgc2V0YXR0cihjb250ZXh0LCAidjNmIiwgdjNmX2NsaWVudCkKICAgIHdpbmRvdyA9IFtdCiAgICBzZXRhdHRyKGNvbnRleHQsICJ3aW5kb3ciLCB3aW5kb3cpCiAgICBzZXRhdHRyKGNvbnRleHQsICJ3aW5kb3dfc2l6ZSIsIGludChvcy5nZXRlbnYoIndpbmRvd19zaXplIiwgMTApKSkKICAgIHNldGF0dHIoY29udGV4dCwgInRzZGJfdGFibGUiLCBvcy5nZXRlbnYoInRzZGJfdGFibGUiLCAiY29uY2VwdF9kcmlmdF90c2RiXzEiKSkKICAgIHRyeToKICAgICAgICBjb250ZXh0LnYzZi5jcmVhdGUoInRzZGIiLCBjb250ZXh0LnRzZGJfdGFibGUsIHJhdGU9IjEvcyIsIGlmX2V4aXN0cz0xKQogICAgZXhjZXB0IEV4Y2VwdGlvbiBhcyBlOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJDcmVhdGluZyBjb250ZXh0IHdpdGggcmF0ZT0gZmFpbGUgZm9yIHtlfSIpCiAgICAgICAgY29udGV4dC52M2YuY3JlYXRlKAogICAgICAgICAgICAidHNkYiIsIGNvbnRleHQudHNkYl90YWJsZSwgYXR0cnM9eyJyYXRlIjogIjEvcyJ9LCBpZl9leGlzdHM9MQogICAgICAgICkKCiAgICBjYWxsYmFja3MgPSBbY2FsbGJhY2suc3RyaXAoKSBmb3IgY2FsbGJhY2sgaW4gb3MuZ2V0ZW52KCJjYWxsYmFja3MiLCAiIikuc3BsaXQoIiwiKV0KICAgIHNldGF0dHIoY29udGV4dCwgImNhbGxiYWNrcyIsIGNhbGxiYWNrcykKCiAgICBzZXRhdHRyKGNvbnRleHQsICJkcmlmdF9zdHJlYW0iLCBvcy5nZXRlbnYoImRyaWZ0X3N0cmVhbSIsICIvYmlnZGF0YS9kcmlmdF9zdHJlYW0iKSkKICAgIHRyeToKICAgICAgICBjcmVhdGVfc3RyZWFtKAogICAgICAgICAgICBjb250ZXh0LCBjb250ZXh0LmRyaWZ0X3N0cmVhbSwgaW50KG9zLmdldGVudigiZHJpZnRfc3RyZWFtX3NoYXJkcyIsIDEpKQogICAgICAgICkKICAgIGV4Y2VwdDoKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYie2NvbnRleHQuZHJpZnRfc3RyZWFtfSBhbHJlYWR5IGV4aXN0cyIpCgogICAgbW9kZWxzID0ge30KICAgIG1vZGVsX3R5cGVzID0gWyJwYWdlaGlua2VseSIsICJkZG0iLCAiZWRkbSJdCiAgICBwYXRoX3N1ZmZpeCA9ICJfbW9kZWxfcGF0aCIKICAgIGZvciBtb2RlbCBpbiBtb2RlbF90eXBlczoKICAgICAgICBtb2RlbF9lbnYgPSBmInttb2RlbH17cGF0aF9zdWZmaXh9IgogICAgICAgIGlmIG1vZGVsX2VudiBpbiBvcy5lbnZpcm9uOgogICAgICAgICAgICB3aXRoIG9wZW4ob3MuZW52aXJvblttb2RlbF9lbnZdLCAicmIiKSBhcyBmOgogICAgICAgICAgICAgICAgbW9kZWxzW21vZGVsXSA9IGxvYWQoZikKICAgIHNldGF0dHIoY29udGV4dCwgIm1vZGVscyIsIG1vZGVscykKCiAgICBzZXRhdHRyKGNvbnRleHQsICJsYWJlbF9jb2wiLCBvcy5nZXRlbnYoImxhYmVsX2NvbCIsICJsYWJlbCIpKQogICAgc2V0YXR0cihjb250ZXh0LCAicHJlZGljdGlvbl9jb2wiLCBvcy5nZXRlbnYoInByZWRpY3Rpb25fY29sIiwgInByZWRpY3Rpb24iKSkKCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYiZXZlbnQ6IHtldmVudC5ib2R5fSIpCiAgICBmdWxsX2V2ZW50ID0ganNvbi5sb2FkcyhldmVudC5ib2R5KQogICAgcmVjb3JkID0gY29uc3RydWN0X3JlY29yZChmdWxsX2V2ZW50KQoKICAgIGlzX2Vycm9yID0gcmVjb3JkW2NvbnRleHQubGFiZWxfY29sXSAhPSByZWNvcmRbY29udGV4dC5wcmVkaWN0aW9uX2NvbF0KICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZiJBZGRpbmcge2lzX2Vycm9yfSIpCgogICAgZm9yIG5hbWUsIG1vZGVsIGluIGNvbnRleHQubW9kZWxzLml0ZW1zKCk6CiAgICAgICAgcmVzdWx0cyA9IHsidGltZXN0YW1wIjogcmVjb3JkWyJ0aW1lc3RhbXAiXX0KICAgICAgICByZXN1bHRzWyJhbGdvcml0aG0iXSA9IG5hbWUKICAgICAgICBtb2RlbC5hZGRfZWxlbWVudChpc19lcnJvcikKCiAgICAgICAgaWYgaGFzYXR0cihtb2RlbCwgImRldGVjdGVkX3dhcm5pbmdfem9uZSIpIGFuZCBtb2RlbC5kZXRlY3RlZF93YXJuaW5nX3pvbmUoKToKICAgICAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmIntuYW1lfVx0V2FybmluZyB6b25lIGRldGVjdGVkIikKICAgICAgICAgICAgcmVzdWx0c1sid2FybmluZ196b25lIl0gPSAxCiAgICAgICAgICAgIGZ1bGxfZXZlbnRbZiJ7bmFtZX1fd2FybmluZ196b25lIl0gPSAxCiAgICAgICAgZWxzZToKICAgICAgICAgICAgcmVzdWx0c1sid2FybmluZ196b25lIl0gPSAwCiAgICAgICAgICAgIGZ1bGxfZXZlbnRbZiJ7bmFtZX1fd2FybmluZ196b25lIl0gPSAwCgogICAgICAgIGlmIG1vZGVsLmRldGVjdGVkX2NoYW5nZSgpOgogICAgICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCJDaGFuZ2UgRGV0ZWN0ZWQiKQogICAgICAgICAgICByZXN1bHRzWyJjaGFuZ2VfZGV0ZWN0ZWQiXSA9IDEKICAgICAgICAgICAgZnVsbF9ldmVudFtmIntuYW1lfV9kcmlmdCJdID0gMQogICAgICAgIGVsc2U6CiAgICAgICAgICAgIHJlc3VsdHNbImNoYW5nZV9kZXRlY3RlZCJdID0gMAogICAgICAgICAgICBmdWxsX2V2ZW50W2Yie25hbWV9X2RyaWZ0Il0gPSAwCiAgICAgICAgY29udGV4dC53aW5kb3cuYXBwZW5kKHJlc3VsdHMpCgogICAgcHVzaF90b19zdHJlYW0oY29udGV4dCwgY29udGV4dC5kcmlmdF9zdHJlYW0sIFtmdWxsX2V2ZW50XSkKCiAgICBpZiBjb250ZXh0LmNhbGxiYWNrcyAhPSBbIiJdOgogICAgICAgIGZvciBjYWxsYmFjayBpbiBjb250ZXh0LmNhbGxiYWNrczoKICAgICAgICAgICAgcmVxdWVzdHMucG9zdCh1cmw9Y2FsbGJhY2ssIGpzb249ZnVsbF9ldmVudCkKCiAgICBpZiAobGVuKGNvbnRleHQud2luZG93KSAvIGxlbihjb250ZXh0Lm1vZGVscykpID49IGNvbnRleHQud2luZG93X3NpemU6CiAgICAgICAgZGYgPSBwZC5EYXRhRnJhbWUoY29udGV4dC53aW5kb3cpCiAgICAgICAgZGZbInRpbWVzdGFtcCJdID0gcGQudG9fZGF0ZXRpbWUoZGZbInRpbWVzdGFtcCJdKQogICAgICAgIGRmID0gZGYuc2V0X2luZGV4KFsidGltZXN0YW1wIiwgImFsZ29yaXRobSJdKQogICAgICAgIGNvbnRleHQudjNmLndyaXRlKCJ0c2RiIiwgY29udGV4dC50c2RiX3RhYmxlLCBkZikKICAgICAgICBjb250ZXh0LndpbmRvdyA9IFtdCg==", "noBaseImagesPull": true, "baseImage": "mlrun/ml-models:0.7.0-rc11", - "commands": [ - "python -m pip install scikit-multiflow==0.4.1 v3io_frames" - ], + "commands": ["python -m pip install scikit-multiflow==0.4.1 v3io_frames"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1630269000 @@ -2552,9 +2547,7 @@ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IG9zCmltcG9ydCBwYW5kYXMgYXMgcGQKaW1wb3J0IGpzb24KaW1wb3J0IHYzaW8KaW1wb3J0IHYzaW8uZGF0YXBsYW5lCmltcG9ydCBzb2NrZXQKCmRlZiBzcGxpdF9wYXRoKG1udHBhdGg9JycpOgogICAgaWYgbW50cGF0aFswXSA9PSAnLyc6CiAgICAgICAgbW50cGF0aCA9IG1udHBhdGhbMTpdCiAgICBwYXRocyA9IG1udHBhdGguc3BsaXQoJy8nKQogICAgY29udGFpbmVyID0gcGF0aHNbMF0KICAgIHN1YnBhdGggPSAnJwogICAgaWYgbGVuKHBhdGhzKSA+IDE6CiAgICAgICAgc3VicGF0aCA9IG1udHBhdGhbbGVuKGNvbnRhaW5lcik6XQogICAgcmV0dXJuIGNvbnRhaW5lciwgc3VicGF0aAoKZGVmIGNyZWF0ZV9zdHJlYW0oY29udGV4dCwgcGF0aCwgc2hhcmRzPTEpOgogICAgY29udGFpbmVyLCBzdHJlYW1fcGF0aCA9IHNwbGl0X3BhdGgocGF0aCkKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidDcmVhdGluZyBzdHJlYW0gaW4gQ29udGFpbmVyOiB7Y29udGFpbmVyfSAmIFBhdGgge3N0cmVhbV9wYXRofScpCiAgICByZXNwb25zZSA9IGNvbnRleHQudjNpb19jbGllbnQuc3RyZWFtLmNyZWF0ZShjb250YWluZXI9Y29udGFpbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyZWFtX3BhdGg9c3RyZWFtX3BhdGgsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hhcmRfY291bnQ9c2hhcmRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2VfZm9yX3N0YXR1cz12M2lvLmRhdGFwbGFuZS5SYWlzZUZvclN0YXR1cy5uZXZlcikKICAgIHJlc3BvbnNlLnJhaXNlX2Zvcl9zdGF0dXMoWzQwOSwgMjA0XSkKCmRlZiBwdXNoX3RvX3N0cmVhbShjb250ZXh0LCBzdHJlYW1fcGF0aCwgZGF0YSk6CiAgICBkZWYgcmVzdHJ1Y3R1cmVfc3RyZWFtX2V2ZW50KGNvbnRleHQsIGV2ZW50KToKICAgICAgICBpbnN0YW5jZXMgPSBbZGljdCgpXQogICAgICAgIGZvciBrZXkgaW4gZGF0YS5rZXlzKCk6CiAgICAgICAgICAgIGlmIGtleSBub3QgaW4gWyd3aGVuJywgJ2NsYXNzJywgJ21vZGVsJywgJ3dvcmtlcicsICdob3N0bmFtZScsIGNvbnRleHQucHJlZGljdGlvbl9jb2xdOgogICAgICAgICAgICAgICAgaW5zdGFuY2VzWzBdLnVwZGF0ZSh7a2V5OiBldmVudC5wb3Aoa2V5KX0pCiAgICAgICAgZXZlbnRbJ3JlcXVlc3QnXSA9IHsnaW5zdGFuY2VzJzogaW5zdGFuY2VzfQogICAgICAgIGV2ZW50WydyZXNwJ10gPSBbaW50KGV2ZW50LnBvcChjb250ZXh0LnByZWRpY3Rpb25fY29sKSldCiAgICAgICAgcmV0dXJuIGV2ZW50CiAgICAKICAgIHJlY29yZHMgPSBqc29uLmxvYWRzKGRhdGEudG9fanNvbihvcmllbnQ9J3JlY29yZHMnKSkKICAgIHJlY29yZHMgPSBbeydkYXRhJzoganNvbi5kdW1wcyhyZXN0cnVjdHVyZV9zdHJlYW1fZXZlbnQoY29udGV4dCwgcmVjb3JkKSl9IGZvciByZWNvcmQgaW4gcmVjb3Jkc10KICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidMb2dnaW5nIHtsZW4ocmVjb3Jkcyl9IHJlY29yZHMsIFJlY29yZCBleGFtcGxlOiB7cmVjb3Jkc1swXX0nKQogICAgY29udGFpbmVyLCBzdHJlYW1fcGF0aCA9IHNwbGl0X3BhdGgoc3RyZWFtX3BhdGgpCiAgICBzdGVwID0gMTAKICAgIGZvciBpZHggaW4gcmFuZ2UoMCwgbGVuKHJlY29yZHMpLCBzdGVwKToKICAgICAgICByZXNwb25zZSA9IGNvbnRleHQudjNpb19jbGllbnQucHV0X3JlY29yZHMoY29udGFpbmVyPWNvbnRhaW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aD1zdHJlYW1fcGF0aCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlY29yZHM9cmVjb3Jkc1tpZHg6aWR4K3N0ZXBdKQoKZGVmIGdldF9kYXRhX3BhcnF1ZXQoY29udGV4dCwgdGFibGUsIGZpbGVzX3RvX3NlbGVjdD0xKToKICAgIG1wYXRoID0gW29zLnBhdGguam9pbih0YWJsZSwgZmlsZSkgZm9yIGZpbGUgaW4gb3MubGlzdGRpcih0YWJsZSkgaWYgZmlsZS5lbmRzd2l0aCgoJ3BhcnF1ZXQnLCAncHEnKSldCiAgICBmaWxlc19ieV91cGRhdGVkID0gc29ydGVkKG1wYXRoLCBrZXk9b3MucGF0aC5nZXRtdGltZSwgcmV2ZXJzZT1GYWxzZSkKICAgIGNvbnRleHQubG9nZ2VyLmRlYnVnX3dpdGgoJ0lucHV0JywgaW5wdXRfZmlsZXM9ZmlsZXNfYnlfdXBkYXRlZFs6ZmlsZXNfdG9fc2VsZWN0XSkKICAgIGRmcyA9IHBkLmNvbmNhdChbcGQucmVhZF9wYXJxdWV0KGZpbGUpIGZvciBmaWxlIGluIGZpbGVzX2J5X3VwZGF0ZWRbOmZpbGVzX3RvX3NlbGVjdF1dKQogICAgcmV0dXJuIGRmcwoKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIAogICAgYmF0Y2hlc190b19nZW5lcmF0ZSA9IGludChvcy5nZXRlbnYoJ0JBVENIRVNfVE9fR0VORVJBVEUnLCAyMCkpCiAgICBzZXRhdHRyKGNvbnRleHQsICdiYXRjaGVzX3RvX2dlbmVyYXRlJywgYmF0Y2hlc190b19nZW5lcmF0ZSkKICAgIHNldGF0dHIoY29udGV4dCwgJ2JhdGNoZXNfZ2VuZXJhdGVkJywgMCkKICAgIAogICAgc2V0YXR0cihjb250ZXh0LCAnbWV0cmljc190YWJsZScsIG9zLmVudmlyb25bJ01FVFJJQ1NfVEFCTEUnXSkKICAgIHNldGF0dHIoY29udGV4dCwgJ3ByZWRpY3Rpb25zX3RhYmxlJywgb3MuZW52aXJvblsnUFJFRElDVElPTlNfVEFCTEUnXSkKICAgIHNldGF0dHIoY29udGV4dCwgJ291dHB1dF9zdHJlYW0nLCBvcy5lbnZpcm9uWydPVVRQVVRfU1RSRUFNJ10pCiAgICBzZXRhdHRyKGNvbnRleHQsICd0aW1lc3RhbXBfY29sJywgb3MuZ2V0ZW52KCd0aW1lc3RhbXBfY29sJywgJ3doZW4nKSkKICAgIHNldGF0dHIoY29udGV4dCwgJ29yaWdfdGltZXN0YW1wX2NvbCcsIG9zLmdldGVudignb3JpZ190aW1lc3RhbXBfY29sJywgJ3RpbWVzdGFtcCcpKQogICAgCiAgICB2M2lvX2NsaWVudCA9IHYzaW8uZGF0YXBsYW5lLkNsaWVudChsb2dnZXJfdmVyYm9zaXR5PSdERUJVRycsIHRyYW5zcG9ydF92ZXJib3NpdHk9J0RFQlVHJykKICAgIHNldGF0dHIoY29udGV4dCwgJ3YzaW9fY2xpZW50JywgdjNpb19jbGllbnQpCiAgICBjcmVhdGVfc3RyZWFtKGNvbnRleHQsIGNvbnRleHQub3V0cHV0X3N0cmVhbSkKICAgIAogICAgc2V0YXR0cihjb250ZXh0LCAnbGFiZWxfY29sJywgb3MuZW52aXJvblsnbGFiZWxfY29sJ10pCiAgICBzZXRhdHRyKGNvbnRleHQsICdwcmVkaWN0aW9uX2NvbCcsIG9zLmVudmlyb25bJ3ByZWRpY3Rpb25fY29sJ10pCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICAKICAgIGlmIChjb250ZXh0LmJhdGNoZXNfdG9fZ2VuZXJhdGUgPT0gLTEpIG9yIChjb250ZXh0LmJhdGNoZXNfZ2VuZXJhdGVkIDw9IGNvbnRleHQuYmF0Y2hlc190b19nZW5lcmF0ZSk6CiAgICAgICAgCiAgICAgICAgbWV0cmljcyA9IGdldF9kYXRhX3BhcnF1ZXQoY29udGV4dCwgY29udGV4dC5tZXRyaWNzX3RhYmxlLCAyKS5sb2NbOiwgY29udGV4dC5sYWJlbF9jb2xdLmFzdHlwZSgnaW50JykKICAgICAgICBtZXRyaWNzLmluZGV4Lm5hbWVzID0gbGlzdChbbmFtZSBpZiBuYW1lICE9IGNvbnRleHQub3JpZ190aW1lc3RhbXBfY29sIGVsc2UgY29udGV4dC50aW1lc3RhbXBfY29sIGZvciBuYW1lIGluIG1ldHJpY3MuaW5kZXgubmFtZXNdKQogICAgICAgIHByZWRpY3Rpb25zID0gZ2V0X2RhdGFfcGFycXVldChjb250ZXh0LCBjb250ZXh0LnByZWRpY3Rpb25zX3RhYmxlLCAyKQogICAgICAgIGNvbnRleHQubG9nZ2VyLmRlYnVnKGYnTGFiZWxpbmcgbWV0cmljcyAoe21ldHJpY3Muc2hhcGV9KSBhbmQgcHJlZGljdGlvbnMgKHtwcmVkaWN0aW9ucy5zaGFwZX0pJykKICAgICAgICBjb250ZXh0LmxvZ2dlci5kZWJ1Z193aXRoKCdJbmRleGVzJywgbWV0cmljc19pbmRleD1tZXRyaWNzLmluZGV4Lm5hbWVzLCBwcmVkaWN0aW9uc19pbmRleD1wcmVkaWN0aW9ucy5pbmRleC5uYW1lcykKCiAgICAgICAgcHJpbnQoJ21ldHJpY3MnKQogICAgICAgIHByaW50KG1ldHJpY3MuaGVhZCgpKQogICAgICAgIHByaW50KHR5cGUobWV0cmljcykpCiAgICAgICAgbWV0cmljcyA9IHBkLkRhdGFGcmFtZShtZXRyaWNzKQogICAgICAgIHByaW50KCdjaGFuZ2UnKQogICAgICAgIHByaW50KHR5cGUobWV0cmljcykpCiAgICAgICAgcHJpbnQobWV0cmljcy5oZWFkKCkpCiAgICAgICAgcHJpbnQobWV0cmljcy5pbmRleC5uYW1lcykKCiAgICAgICAgZnVsbF9kZiA9IHBkLm1lcmdlKGxlZnQ9cHJlZGljdGlvbnMsIHJpZ2h0PW1ldHJpY3MsIGxlZnRfb249bWV0cmljcy5pbmRleC5uYW1lcywgaG93PSdsZWZ0JywgbGVmdF9pbmRleD1UcnVlLCByaWdodF9pbmRleD1UcnVlKQogICAgICAgIGZ1bGxfZGYgPSBmdWxsX2RmLnJlc2V0X2luZGV4KCkKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnRnVsbHkgbGFiZWxlZCBiYXRjaCBzaXplIGlzIHtmdWxsX2RmLnNoYXBlfScpCiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ0luZGV4ZXM6IHtsaXN0KGZ1bGxfZGYuaW5kZXgubmFtZXMpfScpCiAgICAgICAgY29udGV4dC5sb2dnZXIuaW5mbyhmJ0NvbHVtbnM6IHtmdWxsX2RmLmNvbHVtbnN9JykKICAgICAgICBjb250ZXh0LmxvZ2dlci5pbmZvX3dpdGgoJ3NhbXBsZScsIGZ1bGxfZGY9ZnVsbF9kZi5oZWFkKDEpKSAgICAKICAgICAgICBwdXNoX3RvX3N0cmVhbShjb250ZXh0LCBjb250ZXh0Lm91dHB1dF9zdHJlYW0sIGZ1bGxfZGYpCiAgICAgICAgCiAgICAgICAgY29udGV4dC5iYXRjaGVzX2dlbmVyYXRlZCArPSAxCgo=", "noBaseImagesPull": true, "baseImage": "mlrun/ml-models:0.7.0-rc11", - "commands": [ - "python -m pip install v3io --upgrade" - ], + "commands": ["python -m pip install v3io --upgrade"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1630268941 @@ -2867,9 +2860,7 @@ "consumerGroup": "s2p", "containerName": "users", "heartbeatInterval": "3s", - "partitions": [ - 0 - ], + "partitions": [0], "pollingIntervalMs": 500, "readBatchSize": 64, "seekTo": "earliest", @@ -3354,11 +3345,7 @@ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKZnJvbSBiczQgaW1wb3J0IEJlYXV0aWZ1bFNvdXAgYXMgYnMKZnJvbSB1cmxsaWIucmVxdWVzdCBpbXBvcnQgUmVxdWVzdCwgdXJsb3BlbgppbXBvcnQgcmVxdWVzdHMKaW1wb3J0IHBhbmRhcyBhcyBwZAppbXBvcnQgdjNpb19mcmFtZXMgYXMgdjNmCmZyb20gdW5pY29kZWRhdGEgaW1wb3J0IG5vcm1hbGl6ZQpmcm9tIGRhdGV0aW1lIGltcG9ydCBkYXRldGltZQppbXBvcnQgcmUKaW1wb3J0IG9zCmltcG9ydCBtbHJ1bi5mZWF0dXJlX3N0b3JlIGFzIGZzCmltcG9ydCBtbHJ1bgoKZGVmIGdldF9zdG9ja19uZXdzX3BhZ2Uoc3RvY2tfc3RyaW5nKToKICAgIHJlcXVlc3QgPSBSZXF1ZXN0KCdodHRwczovL3d3dy5pbnZlc3RpbmcuY29tL2VxdWl0aWVzLycgKyBzdG9ja19zdHJpbmcgKyAnLW5ld3MnLCBoZWFkZXJzPXsiVXNlci1BZ2VudCI6ICJNb3ppbGxhLzUuMCJ9KQogICAgY29udGVudCA9IHVybG9wZW4ocmVxdWVzdCkucmVhZCgpCiAgICByZXR1cm4gYnMoY29udGVudCwgJ2h0bWwucGFyc2VyJykKCmRlZiBnZXRfaW50ZXJuYWxfYXJ0aWNsZV9saW5rcyhwYWdlKToKICAgIG5ld3MgPSBwYWdlLmZpbmRfYWxsKCdkaXYnLCBhdHRycz17J2NsYXNzJzogJ21lZGl1bVRpdGxlMSd9KVsxXQogICAgYXJ0aWNsZXMgPSBuZXdzLmZpbmRfYWxsKCdhcnRpY2xlJywgYXR0cnM9eydjbGFzcyc6ICdqcy1hcnRpY2xlLWl0ZW0gYXJ0aWNsZUl0ZW0nfSkKICAgIHJldHVybiBbJ2h0dHBzOi8vd3d3LmludmVzdGluZy5jb20nICsgYS5maW5kKCdhJykuYXR0cnNbJ2hyZWYnXSBmb3IgYSBpbiBhcnRpY2xlc10KCmRlZiBnZXRfYXJ0aWNsZV9wYWdlKGFydGljbGVfbGluayk6CiAgICByZXF1ZXN0ID0gUmVxdWVzdChhcnRpY2xlX2xpbmssIGhlYWRlcnM9eyJVc2VyLUFnZW50IjogIk1vemlsbGEvNS4wIn0pCiAgICBjb250ZW50ID0gdXJsb3BlbihyZXF1ZXN0KS5yZWFkKCkKICAgIHJldHVybiBicyhjb250ZW50LCAnaHRtbC5wYXJzZXInKQoKZGVmIGNsZWFuX3BhcmFncmFwaChwYXJhZ3JhcGgpOgogICAgcGFyYWdyYXBoID0gcmUuc3ViKHInXChodHRwXFMrJywgJycsIHBhcmFncmFwaCkKICAgIHBhcmFncmFwaCA9IHJlLnN1YihyJ1woW0EtWl0rOltBLVpdK1wpJywgJycsIHBhcmFncmFwaCkKICAgIHBhcmFncmFwaCA9IHJlLnN1YihyJ1tcblx0XHNcJ10nLCAnICcsIHBhcmFncmFwaCkKICAgIHJldHVybiBub3JtYWxpemUoJ05GS0QnLCBwYXJhZ3JhcGgpICAgIAoKZGVmIGV4dHJhY3RfdGV4dChhcnRpY2xlX3BhZ2UpOgogICAgdGV4dF90YWcgPSBhcnRpY2xlX3BhZ2UuZmluZCgnZGl2JywgYXR0cnM9eydjbGFzcyc6ICdXWVNJV1lHIGFydGljbGVQYWdlJ30pCiAgICBwYXJhZ3JhcGhzID0gdGV4dF90YWcuZmluZF9hbGwoJ3AnKQogICAgdGV4dCA9ICdcbicuam9pbihbY2xlYW5fcGFyYWdyYXBoKHAuZ2V0X3RleHQoKSkgZm9yIHAgaW4gcGFyYWdyYXBoc1s6LTFdXSkKICAgIHJldHVybiB0ZXh0CgppbXBvcnQganNvbgpkZWYgZ2V0X3B1Ymxpc2hfdGltZShhcnRpY2xlKToKICAgIHRhZyA9IGFydGljbGUuZmluZCgnc2NyaXB0Jyx7InR5cGUiIDogImFwcGxpY2F0aW9uL2xkK2pzb24ifSkuY29udGVudHNbMF0KICAgIHRhZ19kaWN0ID0ganNvbi5sb2FkcyhzdHIodGFnKSkKICAgIGRhdGVNb2RpZmllZCA9IHRhZ19kaWN0WyJkYXRlTW9kaWZpZWQiXQogICAgcmV0dXJuIGRhdGV0aW1lLnN0cmZ0aW1lKGRhdGV0aW1lLnN0cnB0aW1lKGRhdGVNb2RpZmllZCwgJyVZLSVtLSVkICVIOiVNOiVTJyksICclWS0lbS0lZCAlSDolTTolUycpCgpkZWYgZ2V0X3Njb3JlKHBhcmFncmFwaF9zY29yZXMpOgogICAgcmV0dXJuIHN1bShbc2NvcmUgLSAxIGZvciBzY29yZSBpbiBwYXJhZ3JhcGhfc2NvcmVzWydvdXRwdXRzJ11dKSAvIGxlbihwYXJhZ3JhcGhfc2NvcmVzKQoKZGVmIGdldF9hcnRpY2xlX3Njb3Jlcyhjb250ZXh0LCBhcnRpY2xlcywgZW5kcG9pbnQpOgogICAgc2NvcmVzID0gW10gCiAgICBmb3IgaSwgYXJ0aWNsZSBpbiBlbnVtZXJhdGUoYXJ0aWNsZXMpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidnZXR0aW5nIHNjb3JlIGZvciBhcnRpY2xlIHtpICsgMX1cXHtsZW4oYXJ0aWNsZXMpfScpCiAgICAgICAgZXZlbnRfZGF0YSA9IHsnaW5wdXRzJzogYXJ0aWNsZS5zcGxpdCgnXG4nKX0KICAgICAgICByZXNwID0gcmVxdWVzdHMucHV0KGVuZHBvaW50LCBqc29uPWpzb24uZHVtcHMoZXZlbnRfZGF0YSkpCiAgICAgICAgc2NvcmVzLmFwcGVuZChnZXRfc2NvcmUoanNvbi5sb2FkcyhyZXNwLnRleHQpKSkKICAgIHJldHVybiBzY29yZXMKCmRlZiBjb25zdHJ1Y3RfZGF0YWZyYW1lKHNlbnRpbWVudHMsIGl0ZW1zLHRpbWVzKToKICAgIHRpY2tlcnMgPSBbeFswXSBmb3IgeCBpbiBpdGVtc10KICAgIHN0b2NrX3NlbnQgPSBwZC5EYXRhRnJhbWUoeyJzeW1ib2wiOiB0aWNrZXJzLCAic2VudGltZW50Ijogc2VudGltZW50cywgImxhc3RfcmVhY3Rpb24iOiB0aW1lc30pCiAgICByZXR1cm4gc3RvY2tfc2VudAoKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIGNvbnRleHQubG9nZ2VyLmluZm8oImluaXQgbmV3cyByZWFkZXIgY29udGV4dCIpCiAgICBzZXRhdHRyKGNvbnRleHQsICdQUk9KRUNUX05BTUUnLCBvcy5nZXRlbnYoJ1BST0pFQ1RfTkFNRScsICdzdG9ja3MtJyArIG9zLmdldGVudignVjNJT19VU0VSTkFNRScpKSkKICAgIG1scnVuLnNldF9lbnZpcm9ubWVudChwcm9qZWN0ID0gY29udGV4dC5QUk9KRUNUX05BTUUpCiAgICAKICAgIHN0b2Nrc19zZW50X3NldCA9IGZzLkZlYXR1cmVTZXQoIm5ld3MiLCBlbnRpdGllcz1bZnMuRW50aXR5KCJzeW1ib2wiKV0pCiAgICBzZXRhdHRyKGNvbnRleHQsICdzdG9ja19mZWF0dXJlX3NldCcsIHN0b2Nrc19zZW50X3NldCkKICAgIAogICAgY29udGV4dC5zdG9ja19mZWF0dXJlX3NldC5hZGRfYWdncmVnYXRpb24oInNlbnRpbWVudHMiLCJzZW50aW1lbnQiLFsibWluIiwibWF4Il0sWyIxaCJdLCIxMG0iKQogICAgCiAgICBuZXdzX2R1bW15ID0gcGQuRGF0YUZyYW1lKHsic3ltYm9sIjpbJ0dPT0dMJywnTVNGVCcsJ0FNWk4nLCdBQVBMJywnSU5UQyddLCJzZW50aW1lbnQiOlswLDAsMCwwLDBdLCJsYXN0X3JlYWN0aW9uIjpbMCwwLDAsMCwwXX0pCiAgICBmcy5pbmdlc3QoY29udGV4dC5zdG9ja19mZWF0dXJlX3NldCwgbmV3c19kdW1teSwgaW5mZXJfb3B0aW9ucz1mcy5JbmZlck9wdGlvbnMuZGVmYXVsdCgpKQogICAgCiAgICB2M2lvX2ZyYW1lc2QgPSBvcy5nZXRlbnYoJ1YzSU9fRlJBTUVTRCcsICdmcmFtZXNkOjgwODEnKQogICAgdG9rZW4gPSBvcy5nZXRlbnYoJ1RPS0VOJywgJycpCiAgICBjbGllbnQgPSB2M2YuQ2xpZW50KHYzaW9fZnJhbWVzZCwgY29udGFpbmVyPW9zLmdldGVudignVjNJT19DT05UQUlORVInLCAndXNlcnMnKSwgdG9rZW49dG9rZW4pCiAgICBzZXRhdHRyKGNvbnRleHQsICd2M2MnLCBjbGllbnQpCgogICAgc2V0YXR0cihjb250ZXh0LCAnc3RvY2tzX3N0cmVhbScsIG9zLmdldGVudignU1RPQ0tTX1NUUkVBTScsIG9zLmdldGVudignVjNJT19VU0VSTkFNRScpICsgJy9zdG9ja3Mvc3RvY2tzX3N0cmVhbScpKQogICAgY29udGV4dC52M2MuY3JlYXRlKGJhY2tlbmQ9J3N0cmVhbScsIHRhYmxlPWNvbnRleHQuc3RvY2tzX3N0cmVhbSwgaWZfZXhpc3RzPTEpCgogICAgc2V0YXR0cihjb250ZXh0LCAnc3RvY2tzX3RzZGInLCBvcy5nZXRlbnYoJ1NUT0NLU19UU0RCX1RBQkxFJywgb3MuZ2V0ZW52KCdWM0lPX1VTRVJOQU1FJykgKyAnL3N0b2Nrcy9zdG9ja3NfdHNkYicpKQogICAgY29udGV4dC52M2MuY3JlYXRlKGJhY2tlbmQ9J3RzZGInLCB0YWJsZT1jb250ZXh0LnN0b2Nrc190c2RiLCByYXRlPScxL3MnLCBpZl9leGlzdHM9MSkKCiAgICBzZXRhdHRyKGNvbnRleHQsICdzZW50aW1lbnRfbW9kZWxfZW5kcG9pbnQnLAogICAgICAgICAgICBvcy5nZXRlbnYoJ1NFTlRJTUVOVF9NT0RFTF9FTkRQT0lOVCcsICcnKSkgIyBpbiB0aGUgJycgc2hvdWxkIGJlIHRoZSBtb2RlbCBlbmRwb2ludAogICAgY29udGV4dC5sb2dnZXIuaW5mbyhmInNldCBzZW50aW1lbnRfbW9kZWxfZW5kcG9pbnQge2NvbnRleHQuc2VudGltZW50X21vZGVsX2VuZHBvaW50fSIpCiAgICBzeW1fdG9fdXJsID0geydHT09HTCc6ICdnb29nbGUtaW5jJywgJ01TRlQnOiAnbWljcm9zb2Z0LWNvcnAnLCAnQU1aTic6ICdhbWF6b24tY29tLWluYycsCiAgICAgICAgICAgICAgICAgICdBQVBMJzogJ2FwcGxlLWNvbXB1dGVyLWluYycsICdJTlRDJyA6ICdpbnRlbC1jb3JwJ30KICAgIHNldGF0dHIoY29udGV4dCwgJ3N5bV90b191cmwnLCBzeW1fdG9fdXJsKQogICAgc2V0YXR0cihjb250ZXh0LCAnc3RvY2tzX2t2Jywgb3MuZ2V0ZW52KCdTVE9DS1NfS1YnLCBvcy5nZXRlbnYoJ1YzSU9fVVNFUk5BTUUnKSArICcvc3RvY2tzL3N0b2Nrc19rdicpKQogICAgY29udGV4dC5sb2dnZXIuaW5mbygnZW5kIGluaXQgY29udGV4dCcpCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnR2V0dGluZyBuZXdzIGFib3V0IHtjb250ZXh0LnN5bV90b191cmx9JykKICAgIHN5bXMgPSBbXQogICAgY29udGVudHMgPSBbXQogICAgbGlua3MgPSBbXQogICAgdGltZXMgPSBbXQogICAgc2VudGltZW50cyA9IFtdCiAgICBsYXN0X3RpY2tlcl9zZW50aW1lbnQgPSBbXQogICAgbGFzdF90aWNrZXJfdGltZSA9IFtdCiAgICBmb3Igc3ltLCB1cmxfc3RyaW5nIGluIGNvbnRleHQuc3ltX3RvX3VybC5pdGVtcygpOgogICAgICAgIGNvbnRleHQubG9nZ2VyLmluZm8oZidHZXR0aW5nIG5ld3MgYWJvdXQge3N5bX0nKQogICAgICAgIG5ld3NfcGFnZSA9IGdldF9zdG9ja19uZXdzX3BhZ2UodXJsX3N0cmluZykKICAgICAgICBhcnRpY2xlX2xpbmtzID0gZ2V0X2ludGVybmFsX2FydGljbGVfbGlua3MobmV3c19wYWdlKQogICAgICAgIGFydGljbGVfcGFnZXMgPSBbZ2V0X2FydGljbGVfcGFnZShsaW5rKSBmb3IgbGluayBpbiBhcnRpY2xlX2xpbmtzXQogICAgICAgIGFydGljbGVzID0gW2V4dHJhY3RfdGV4dChhcnRpY2xlX3BhZ2UpIGZvciBhcnRpY2xlX3BhZ2UgaW4gYXJ0aWNsZV9wYWdlc10KICAgICAgICBjdXJyX3NlbnRpbWVudHMgPSBnZXRfYXJ0aWNsZV9zY29yZXMoY29udGV4dCwgYXJ0aWNsZXMsIGNvbnRleHQuc2VudGltZW50X21vZGVsX2VuZHBvaW50KQogICAgICAgIGN1cnJfdGltZXMgPSBbZ2V0X3B1Ymxpc2hfdGltZShhcnRpY2xlX3BhZ2UpIGZvciBhcnRpY2xlX3BhZ2UgaW4gYXJ0aWNsZV9wYWdlc10KCiAgICAgICAgc2VudGltZW50cyArPSBjdXJyX3NlbnRpbWVudHMKICAgICAgICB0aW1lcyArPSBjdXJyX3RpbWVzCiAgICAgICAgZm9yIGFydGljbGUsIGxpbmssIHNlbnRpbWVudCwgdGltZSBpbiB6aXAoYXJ0aWNsZXMsIGFydGljbGVfbGlua3MsIGN1cnJfc2VudGltZW50cywgY3Vycl90aW1lcyk6CiAgICAgICAgICAgIHJlY29yZCA9IHsKICAgICAgICAgICAgICAgICdjb250ZW50JzogYXJ0aWNsZSwKICAgICAgICAgICAgICAgICd0aW1lJzogdGltZSwKICAgICAgICAgICAgICAgICdzeW1ib2wnOiBzeW0sCiAgICAgICAgICAgICAgICAnbGluayc6IGxpbmssCiAgICAgICAgICAgICAgICAnc2VudGltZW50Jzogc2VudGltZW50CiAgICAgICAgICAgIH0KICAgICAgICAgICAgY29udGV4dC52M2MuZXhlY3V0ZSgnc3RyZWFtJywgY29udGV4dC5zdG9ja3Nfc3RyZWFtLCAncHV0JywgYXJncz17J2RhdGEnOiBqc29uLmR1bXBzKHJlY29yZCl9KQoKICAgICAgICAgICAgc3ltcy5hcHBlbmQoc3ltKQogICAgICAgICAgICBjb250ZW50cy5hcHBlbmQoYXJ0aWNsZSkKICAgICAgICAgICAgbGlua3MuYXBwZW5kKGxpbmspCiAgICAgICAgY29udGV4dC52M2MuZXhlY3V0ZSgna3YnLCBjb250ZXh0LnN0b2Nrc19rdiwgY29tbWFuZD0ndXBkYXRlJywgYXJncz17J2tleSc6IHN5bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXhwcmVzc2lvbic6IGYiU0VUIHNlbnRpbWVudD0ne3NlbnRpbWVudHNbLTFdfSc7bGFzdF9yZWFjdGlvbj0ne3RpbWVzWy0xXX0nIn0pCiAgICAgICAgbGFzdF90aWNrZXJfc2VudGltZW50LmFwcGVuZChzZW50aW1lbnRzWy0xXSkKICAgICAgICBsYXN0X3RpY2tlcl90aW1lLmFwcGVuZCh0aW1lc1stMV0pCiAgICAgICAgCiAgICBzdG9ja19zZW50ID0gY29uc3RydWN0X2RhdGFmcmFtZShsYXN0X3RpY2tlcl9zZW50aW1lbnQsIGNvbnRleHQuc3ltX3RvX3VybC5pdGVtcygpLGxhc3RfdGlja2VyX3RpbWUpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKGYnSW5nZXN0aW5nIG5ldyBpbmZvcm1hdGlvbiB0byBmZWF0dXJlIHN0b3JlJykKICAgIGZzLmluZ2VzdChjb250ZXh0LnN0b2NrX2ZlYXR1cmVfc2V0LCBzdG9ja19zZW50LCBpbmZlcl9vcHRpb25zPWZzLkluZmVyT3B0aW9ucy5kZWZhdWx0KCkpCgogICAgaWYgbGVuKHNlbnRpbWVudHMpID4gMDoKICAgICAgICBkZiA9IHBkLkRhdGFGcmFtZS5mcm9tX2RpY3QoeydzZW50aW1lbnQnOiBzZW50aW1lbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3RpbWUnOiB0aW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzeW1ib2wnOiBzeW1zfSkKICAgICAgICBkZiA9IGRmLnNldF9pbmRleChbJ3RpbWUnLCAnc3ltYm9sJ10pCiAgICAgICAgZGYuaW5kZXggPSBkZi5pbmRleC5zZXRfbGV2ZWxzKFtwZC50b19kYXRldGltZShkZi5pbmRleC5sZXZlbHNbMF0pLCBkZi5pbmRleC5sZXZlbHNbMV1dKQogICAgICAgIGRmID0gZGYuc29ydF9pbmRleChsZXZlbD0wLCBheGlzPTApCiAgICAgICAgY29udGV4dC52M2Mud3JpdGUoYmFja2VuZD0ndHNkYicsIHRhYmxlPWNvbnRleHQuc3RvY2tzX3RzZGIsIGRmcz1kZikKCg==", "noBaseImagesPull": true, "baseImage": "mlrun/ml-models:0.6.5-rc12", - "commands": [ - "pip install beautifulsoup4", - "pip install pandas", - "pip install v3io_frames" - ], + "commands": ["pip install beautifulsoup4", "pip install pandas", "pip install v3io_frames"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1625662004 @@ -3486,9 +3473,7 @@ "functionSourceCode": "aW1wb3J0IHRvcmNoCmltcG9ydCB0b3JjaC5ubiBhcyBubgpmcm9tIHRyYW5zZm9ybWVycyBpbXBvcnQgQmVydE1vZGVsLCBCZXJ0VG9rZW5pemVyCmltcG9ydCBtbHJ1bgpmcm9tIG1scnVuLnJ1bnRpbWVzIGltcG9ydCBudWNsaW9faW5pdF9ob29rCgpQUkVUUkFJTkVEX01PREVMID0gJ2JlcnQtYmFzZS1jYXNlZCcKdG9rZW5pemVyID0gQmVydFRva2VuaXplci5mcm9tX3ByZXRyYWluZWQoJ2JlcnQtYmFzZS1jYXNlZCcpCgoKY2xhc3MgQmVydFNlbnRpbWVudENsYXNzaWZpZXIobm4uTW9kdWxlKToKICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuX2NsYXNzZXMpOgogICAgICAgIHN1cGVyKEJlcnRTZW50aW1lbnRDbGFzc2lmaWVyLCBzZWxmKS5fX2luaXRfXygpCiAgICAgICAgc2VsZi5iZXJ0ID0gQmVydE1vZGVsLmZyb21fcHJldHJhaW5lZChQUkVUUkFJTkVEX01PREVMKQogICAgICAgIHNlbGYuZHJvcG91dCA9IG5uLkRyb3BvdXQocD0wLjIpCiAgICAgICAgc2VsZi5vdXRfbGluZWFyID0gbm4uTGluZWFyKHNlbGYuYmVydC5jb25maWcuaGlkZGVuX3NpemUsIG5fY2xhc3NlcykKICAgICAgICBzZWxmLnNvZnRtYXggPSBubi5Tb2Z0bWF4KGRpbT0xKQoKICAgIGRlZiBmb3J3YXJkKHNlbGYsIGlucHV0X2lkcywgYXR0ZW50aW9uX21hc2spOgogICAgICAgIF8sIHBvb2xlZF9vdXQgPSBzZWxmLmJlcnQoCiAgICAgICAgICAgIGlucHV0X2lkcz1pbnB1dF9pZHMsCiAgICAgICAgICAgIGF0dGVudGlvbl9tYXNrPWF0dGVudGlvbl9tYXNrCiAgICAgICAgKQogICAgICAgIG91dCA9IHNlbGYuZHJvcG91dChwb29sZWRfb3V0KQogICAgICAgIG91dCA9IHNlbGYub3V0X2xpbmVhcihvdXQpCiAgICAgICAgcmV0dXJuIHNlbGYuc29mdG1heChvdXQpCgoKY2xhc3MgU2VudGltZW50Q2xhc3NpZmllclNlcnZpbmcobWxydW4uc2VydmluZy5WMk1vZGVsU2VydmVyKToKICAgIGRlZiBsb2FkKHNlbGYpOgogICAgICAgICIiIgogICAgICAgIGxvYWQgYmVydCBtb2RlbCBpbnRvIGNsYXNzCiAgICAgICAgIiIiCiAgICAgICAgbW9kZWxfZmlsZSwgXyA9IHNlbGYuZ2V0X21vZGVsKCcucHQnKQogICAgICAgIGRldmljZSA9IHRvcmNoLmRldmljZSgnY3VkYTowJykgaWYgdG9yY2guY3VkYS5pc19hdmFpbGFibGUoKSBlbHNlIHRvcmNoLmRldmljZSgnY3B1JykKICAgICAgICBtb2RlbCA9IEJlcnRTZW50aW1lbnRDbGFzc2lmaWVyKG5fY2xhc3Nlcz0zKQogICAgICAgIG1vZGVsLmxvYWRfc3RhdGVfZGljdCh0b3JjaC5sb2FkKG1vZGVsX2ZpbGUsIG1hcF9sb2NhdGlvbj1kZXZpY2UpKQogICAgICAgIG1vZGVsLmV2YWwoKQogICAgICAgIHNlbGYubW9kZWwgPSBtb2RlbAoKICAgIGRlZiBwcmVkaWN0KHNlbGYsIGJvZHkpOgogICAgICAgICIiIgogICAgICAgIHByZWRpY3QgZnVuY3Rpb24KICAgICAgICA6cGFyYW0gYm9keTogc2V0IG9mIGlucHV0cyBmb3IgYmVydCBtb2RlbCB0byBwcmVkaWN0IGZyb20KICAgICAgICAiIiIKICAgICAgICB0cnk6CiAgICAgICAgICAgIGluc3RhbmNlcyA9IGJvZHlbJ2lucHV0cyddCiAgICAgICAgICAgIGVuYyA9IHRva2VuaXplci5iYXRjaF9lbmNvZGVfcGx1cyhpbnN0YW5jZXMsIHJldHVybl90ZW5zb3JzPSdwdCcsIHBhZF90b19tYXhfbGVuZ3RoPVRydWUpCiAgICAgICAgICAgIG91dHB1dHMgPSBzZWxmLm1vZGVsKGlucHV0X2lkcz1lbmNbJ2lucHV0X2lkcyddLCBhdHRlbnRpb25fbWFzaz1lbmNbJ2F0dGVudGlvbl9tYXNrJ10pCiAgICAgICAgICAgIF8sIHByZWRpY3RzID0gdG9yY2gubWF4KG91dHB1dHMsIGRpbT0xKQogICAgICAgICAgICByZXR1cm4gcHJlZGljdHMuY3B1KCkudG9saXN0KCkKICAgICAgICBleGNlcHQgRXhjZXB0aW9uIGFzIGU6CiAgICAgICAgICAgIHJhaXNlIEV4Y2VwdGlvbigiRmFpbGVkIHRvIHByZWRpY3QgJXMiICUgZSkKCgpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCgpkZWYgaGFuZGxlcihjb250ZXh0LCBldmVudCk6CiAgICByZXR1cm4gY29udGV4dC5tbHJ1bl9oYW5kbGVyKGNvbnRleHQsIGV2ZW50KQoKZnJvbSBtbHJ1bi5ydW50aW1lcyBpbXBvcnQgbnVjbGlvX2luaXRfaG9vawpkZWYgaW5pdF9jb250ZXh0KGNvbnRleHQpOgogICAgbnVjbGlvX2luaXRfaG9vayhjb250ZXh0LCBnbG9iYWxzKCksICdzZXJ2aW5nX3YyJykKCmRlZiBoYW5kbGVyKGNvbnRleHQsIGV2ZW50KToKICAgIHJldHVybiBjb250ZXh0Lm1scnVuX2hhbmRsZXIoY29udGV4dCwgZXZlbnQpCg==", "noBaseImagesPull": true, "baseImage": "mlrun/ml-models:0.6.5-rc12", - "commands": [ - "python -m pip install transformers==3.0.2" - ], + "commands": ["python -m pip install transformers==3.0.2"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1625661944 @@ -3787,9 +3772,7 @@ "functionSourceCode": "IyBHZW5lcmF0ZWQgYnkgbnVjbGlvLmV4cG9ydC5OdWNsaW9FeHBvcnRlcgoKaW1wb3J0IHYzaW8uZGF0YXBsYW5lCmltcG9ydCBqc29uCmltcG9ydCBvcwoKZGVmIGluaXRfY29udGV4dChjb250ZXh0KToKICAgIGFjY2Vzc19rZXkgPSBvcy5nZXRlbnYoJ1YzSU9fQUNDRVNTX0tFWScsIE5vbmUpCiAgICBzZXRhdHRyKGNvbnRleHQsICdjb250YWluZXInLCBvcy5nZXRlbnYoJ1YzSU9fQ09OVEFJTkVSJywgJ3VzZXJzJykpCiAgICBzZXRhdHRyKGNvbnRleHQsICdzdHJlYW1fcGF0aCcsIG9zLmdldGVudignU1RPQ0tTX1NUUkVBTScsb3MuZ2V0ZW52KCdWM0lPX1VTRVJOQU1FJykgKyAnL3N0b2Nrcy9zdG9ja3Nfc3RyZWFtJykpCiAgICAKICAgIHYzaW9fY2xpZW50ID0gdjNpby5kYXRhcGxhbmUuQ2xpZW50KGVuZHBvaW50PW9zLmdldGVudignVjNJT19BUEknLCBOb25lKSwgYWNjZXNzX2tleT1hY2Nlc3Nfa2V5KQogICAgc2V0YXR0cihjb250ZXh0LCAnZGF0YScsIFtdKQogICAgc2V0YXR0cihjb250ZXh0LCAndjNpb19jbGllbnQnLCB2M2lvX2NsaWVudCkgCiAgICBzZXRhdHRyKGNvbnRleHQsICdsaW1pdCcsIG9zLmdldGVudignTElNSVQnLCAxMCkpCiAgICAKCiAgICAKZGVmIGhhbmRsZXIoY29udGV4dCwgZXZlbnQpOgogICAgcmVzcCA9IGNvbnRleHQudjNpb19jbGllbnQuc2Vla19zaGFyZChjb250YWluZXI9Y29udGV4dC5jb250YWluZXIsIHBhdGg9Zid7Y29udGV4dC5zdHJlYW1fcGF0aH0vMCcsIHNlZWtfdHlwZT0nRUFSTElFU1QnKQogICAgc2V0YXR0cihjb250ZXh0LCAnbmV4dF9sb2NhdGlvbicsIHJlc3Aub3V0cHV0LmxvY2F0aW9uKQogICAgcmVzcCA9IGNvbnRleHQudjNpb19jbGllbnQuZ2V0X3JlY29yZHMoY29udGFpbmVyPWNvbnRleHQuY29udGFpbmVyLCBwYXRoPWYne2NvbnRleHQuc3RyZWFtX3BhdGh9LzAnLCBsb2NhdGlvbj1jb250ZXh0Lm5leHRfbG9jYXRpb24sIGxpbWl0PWNvbnRleHQubGltaXQpCiAgICBjb250ZXh0LmxvZ2dlci5pbmZvKCdsb2NhdGlvbjogJXMnLCBjb250ZXh0Lm5leHRfbG9jYXRpb24pCgogICAgZm9yIHJlYyBpbiByZXNwLm91dHB1dC5yZWNvcmRzOgogICAgICAgIHJlY19kYXRhID0gcmVjLmRhdGEuZGVjb2RlKCd1dGYtOCcpCiAgICAgICAgcmVjX2pzb24gPSBqc29uLmxvYWRzKHJlY19kYXRhKQogICAgICAgIGNvbnRleHQuZGF0YS5hcHBlbmQoeydUaW1lJzogcmVjX2pzb25bJ3RpbWUnXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnU3ltYm9sJzogcmVjX2pzb25bJ3N5bWJvbCddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdTZW50aW1lbnQnOiByZWNfanNvblsnc2VudGltZW50J10sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0xpbmsnOiByZWNfanNvblsnbGluayddLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICdDb250ZW50JzogcmVjX2pzb25bJ2NvbnRlbnQnXX0pCgogICAgY29udGV4dC5kYXRhID0gY29udGV4dC5kYXRhWy1jb250ZXh0LmxpbWl0Ol0KICAgIAogICAgY29sdW1ucyA9IFt7J3RleHQnOiBrZXksICd0eXBlJzogJ29iamVjdCd9IGZvciBrZXkgaW4gWydUaW1lJywgJ1N5bWJvbCcsICdTZW50aW1lbnQnLCAnTGluaycsICdDb250ZW50J11dCiAgICBkYXRhID0gW2xpc3QoaXRlbS52YWx1ZXMoKSkgZm9yIGl0ZW0gaW4gY29udGV4dC5kYXRhXQogICAgcmVzcG9uc2UgPSBbeydjb2x1bW5zJzogY29sdW1ucywKICAgICAgICAgICAgICAgICdyb3dzJzogZGF0YSwKICAgICAgICAgICAgICAgICd0eXBlJzogJ3RhYmxlJ31dCiAgICByZXR1cm4gcmVzcG9uc2UgICAgICAgICAgICAgIAoK", "noBaseImagesPull": true, "baseImage": "mlrun/mlrun:0.6.5-rc12", - "commands": [ - "pip install v3io" - ], + "commands": ["pip install v3io"], "offline": true, "codeEntryType": "sourceCode", "timestamp": 1625662037 @@ -5620,5 +5603,84 @@ "status": { "state": "ready" } + }, + "default-test-pipeline": { + "metadata": { + "name": "default-test-pipeline", + "namespace": "default-tenant", + "labels": { + "mlrun/class": "serving", + "nuclio.io/project-name": "default" + }, + "resourceVersion": "99000001" + }, + "spec": { + "handler": "main:handler", + "runtime": "python:3.9", + "env": [ + { + "name": "MLRUN_DEFAULT_PROJECT", + "value": "default" + }, + { + "name": "MLRUN_DBPATH", + "value": "http://mlrun-api:8080" + }, + { + "name": "MLRUN_NAMESPACE", + "value": "default-tenant" + } + ], + "resources": {}, + "minReplicas": 1, + "maxReplicas": 4, + "build": { + "noBaseImagesPull": true, + "codeEntryType": "sourceCode" + } + }, + "status": { + "state": "building" + } + }, + "default-test-pipeline-child": { + "metadata": { + "name": "default-test-pipeline-child", + "namespace": "default-tenant", + "labels": { + "mlrun/class": "remote", + "nuclio.io/project-name": "default", + "parent-function": "test-pipeline" + }, + "resourceVersion": "99000002" + }, + "spec": { + "handler": "main:handler", + "runtime": "python:3.9", + "env": [ + { + "name": "MLRUN_DEFAULT_PROJECT", + "value": "default" + }, + { + "name": "MLRUN_DBPATH", + "value": "http://mlrun-api:8080" + }, + { + "name": "MLRUN_NAMESPACE", + "value": "default-tenant" + } + ], + "resources": {}, + "minReplicas": 1, + "maxReplicas": 2, + "build": { + "noBaseImagesPull": true, + "codeEntryType": "sourceCode" + } + }, + "status": { + "state": "building" + } } }