Skip to content

WIP: Registry api #115

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

Merged
merged 73 commits into from
Jun 22, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
1c9800f
Initial import of comp. services
Jun 13, 2018
7e2a2e3
Adapt sidecar to dockerfile/compose layout
Jun 13, 2018
ca2a7ad
fix requirements
Jun 13, 2018
b8f4bb7
Add server parts needed for comp. backend
Jun 13, 2018
76ab87f
rename source --> src
Jun 13, 2018
ba51898
fix publish/subscribe initialization and add up to date mockup data
Jun 14, 2018
80d8b4a
change default indentation for python in vscode-tmplate
Jun 14, 2018
f3ec478
change build context for services such that we can copy files from th…
Jun 14, 2018
2edb5fb
minor cleanup
Jun 14, 2018
2043c59
change build context for server
Jun 14, 2018
a76d220
rename debug to devel
Jun 14, 2018
8034118
Adds code coverage output
Jun 14, 2018
8c46412
Add local minio for devel and template with credentials
Jun 14, 2018
c6fee87
update readme
Jun 14, 2018
01b8569
WIP: improving first web/client qx docker. Minor cleanup in compose f…
Jun 14, 2018
e4facd8
Merge branch 'master' into comp_backend
Jun 15, 2018
2bc95bb
Improved server/client qx compiler container. - non-root user - dev/p…
Jun 15, 2018
8aaa103
Renamed web/client dockerfile. Emphasizes that it is only to build th…
Jun 15, 2018
703ad74
Adds log messages while installing qx contribs
Jun 15, 2018
92c0d73
Renamed client dockerfile since it is multitarget
Jun 15, 2018
e836528
Renamed webserver dockerfile since it targets ci
Jun 15, 2018
95c8a0a
docker ci version of webserver builds
Jun 15, 2018
dafd2ea
WIP: Implementing webserver devel docker
Jun 15, 2018
bbe1287
Deploying Web-server in devel mode.
Jun 18, 2018
8590498
Deploying web server:
Jun 18, 2018
38534f9
Fixed mounted volumes
Jun 18, 2018
cf21f31
Removed tmp scripts and added mask to ignore them
Jun 18, 2018
b8c833f
Merged git://github.com/mguidon/osparc-simcore.git comp_backend branc…
Jun 18, 2018
b229dac
Fixes bind mount from source-ouput into server's client folder
Jun 18, 2018
8c60310
Merge branch 'master' into comp_backend
pcrespov Jun 19, 2018
9743a72
fix merge conflict
Jun 19, 2018
4d73bbb
Merge branch 'pcrespov-mguidon-comp_backend' into comp_backend
Jun 19, 2018
596ab2d
Mising file save
Jun 19, 2018
a581a53
Merge branch 'master' into comp_backend
pcrespov Jun 19, 2018
0014d1b
TODO for logger
Jun 20, 2018
4ca7852
Merge branch 'comp_backend' of github.com:mguidon/osparc-simcore into…
Jun 20, 2018
c0c7180
Add repo query
Jun 20, 2018
0da30c6
filter for comp in image name
Jun 20, 2018
e236426
Merge branch 'master' into registry_api
Jun 20, 2018
f5baa3e
fix too-many-nested-blocks
Jun 20, 2018
e218c56
minor
Jun 20, 2018
9ec61e8
Merge branch 'mguidon-registry_api'
Jun 20, 2018
c2851b3
minor
Jun 20, 2018
1db7403
"desc" -> "description"
Jun 20, 2018
05147dd
Create metadata dynamically
Jun 20, 2018
bc1cd61
minor fix
Jun 20, 2018
0cf18c8
attempt to fix the array/dictionary mess
Jun 20, 2018
9554c6e
minor
Jun 20, 2018
0251d31
type of files shall be file-url not fileUrl
Jun 21, 2018
69fd030
Merge branch 'mguidon-registry_api'
Jun 21, 2018
b3f95df
Merge branch 'registry_api' of git://github.com/mguidon/osparc-simcor…
Jun 21, 2018
9bbf6e8
make eslint happy
Jun 21, 2018
c4de9c0
Convert directors registry respone into front-end services
Jun 21, 2018
b1dc57c
Service Catalogue gets fake AND Real services
Jun 21, 2018
13b37e6
workarounds to make it work
Jun 21, 2018
659592b
Disable comment warnings
Jun 22, 2018
65c54eb
Show keys intead of label in Node ports
Jun 22, 2018
9bb15a0
Added support for "folder-url"
Jun 22, 2018
47ffb30
Merge pull request #2 from odeimaiz/mguidon-registry_api
mguidon Jun 22, 2018
0d30915
work on swarm
Jun 22, 2018
8f232e9
Merge branch 'registry_api' of github.com:mguidon/osparc-simcore into…
Jun 22, 2018
a457519
fileUrl -> file-url
Jun 22, 2018
caf9358
Max Min for spinner changed + Workaround for default values
Jun 22, 2018
24ba605
Merge pull request #3 from odeimaiz/mguidon-registry_api
mguidon Jun 22, 2018
998d7d3
No more mockup one the comp backend
Jun 22, 2018
1735d84
Fixed data for director
Jun 22, 2018
1776c60
Merge pull request #4 from odeimaiz/mguidon-registry_api
mguidon Jun 22, 2018
2097416
replace minio public repo with our own temporary one
Jun 22, 2018
9b5b215
Merge branch 'registry_api' of github.com:mguidon/osparc-simcore into…
Jun 22, 2018
54455fd
fix production build for server
Jun 22, 2018
422c853
fix acces to registry
Jun 22, 2018
90df888
fix log/progress in frontend
Jun 22, 2018
6dfd62d
pylint
Jun 22, 2018
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
8 changes: 8 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,14 @@ down-swarm:
docker-compose -f services/docker-compose.yml -f services/docker-compose.deploy.yml down
docker swarm leave -f

stack-up:
docker swarm init
POSTGRES_USER=simcore POSTGRES_PASSWORD=simcore POSTGRES_DB=simcoredb RABBITMQ_USER=simcore RABBITMQ_PASSWORD=simcore RABBITMQ_PROGRESS_CHANNEL=comp.backend.channels.progress RABBITMQ_LOG_CHANNEL=comp.backend.channels.log S3_ENDPOINT=minio:9000 S3_ACCESS_KEY=12345678 S3_SECRET_KEY=12345678 S3_BUCKET_NAME=simcore docker stack deploy -c services/docker-compose.yml -c services/docker-compose.deploy.yml osparc

stack-down:
docker stack rm osparc
docker swarm leave -f

pylint:
# See exit codes and command line https://pylint.readthedocs.io/en/latest/user_guide/run.html#exit-codes
/bin/bash -c "pylint --rcfile=.pylintrc $(PY_FILES)"
Expand Down
8 changes: 8 additions & 0 deletions packages/s3wrapper/src/s3wrapper/s3_client.py
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,14 @@ def list_objects(self, bucket_name, recursive=False):

return []

def list_objects_v2(self, bucket_name, recursive=False):
try:
return self.client.list_objects_v2(bucket_name, recursive=recursive)
except ResponseError as _err:
logging.exception("Could not list objects")

return []

def remove_objects(self, bucket_name, objects):
try:
for del_err in self.client.remove_objects(bucket_name, objects):
Expand Down
10 changes: 7 additions & 3 deletions packages/simcore-sdk/src/simcore_sdk/config/docker.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,15 +7,19 @@ def __init__(self):
self._registry = "masu.speag.com"
self._user = "z43"
self._pwd = "z43"

@property
def registry(self):
return self._registry + "/v2"


@property
def registry_name(self):
return self._registry

@property
def user(self):
return self._user

@property
def pwd(self):
return self._pwd
return self._pwd
16 changes: 8 additions & 8 deletions packages/simcore-sdk/src/simcore_sdk/config/s3.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,30 +3,30 @@
"""
from os import environ as env

S3_ENDPOINT = env.get("S3_ENDPOINT", "")
S3_ACCESS_KEY = env.get("S3_ACCESS_KEY", "")
S3_SECRET_KEY = env.get("S3_SECRET_KEY", "")
S3_BUCKET_NAME = env.get("S3_BUCKET_NAME", "")
S3_ENDPOINT = env.get("S3_ENDPOINT", "minio:9000")
S3_ACCESS_KEY = env.get("S3_ACCESS_KEY", "12345678")
S3_SECRET_KEY = env.get("S3_SECRET_KEY", "12345678")
S3_BUCKET_NAME = env.get("S3_BUCKET_NAME", "simcore")

class Config():
def __init__(self):
self._endpoint = S3_ENDPOINT
self._access_key = S3_ACCESS_KEY
self._secret_key = S3_SECRET_KEY
self._bucket_name = S3_BUCKET_NAME

@property
def endpoint(self):
return self._endpoint

@property
def access_key(self):
return self._access_key

@property
def secret_key(self):
return self._secret_key

@property
def bucket_name(self):
return self._bucket_name
return self._bucket_name
5 changes: 5 additions & 0 deletions services/director/source/director.py
Original file line number Diff line number Diff line change
Expand Up @@ -102,6 +102,11 @@ def stop_service():
_LOGGER.exception("Failed to stop service")
abort(500)

@APP.route('/list_repositories', methods=['GET'])
def list_repositories():
repos = registry_proxy.get_repo_details()

return json.dumps(repos)

if __name__ == "__main__":
APP.run(host='0.0.0.0', debug=False, port=8001, threaded=True)
38 changes: 38 additions & 0 deletions services/director/source/registry_proxy.py
Original file line number Diff line number Diff line change
Expand Up @@ -86,3 +86,41 @@ def get_service_sub_name(repository_name):
if last_suffix_index < 0:
raise Exception('Invalid service name: ' + repository_name)
return list_of_suffixes[last_suffix_index]

def _get_repo_details(repo):
#pylint: disable=too-many-nested-blocks
current_repo = []
if "/comp/" in repo:
req_images = registry_request(repo + '/tags/list')
im_data = req_images.json()
tags = im_data['tags']
for tag in tags:
image_tags = {}
label_request = registry_request(repo + '/manifests/' + tag)
label_data = label_request.json()
labels = json.loads(label_data["history"][0]["v1Compatibility"])["container_config"]["Labels"]
if labels:
for key in labels.keys():
if key.startswith("io.simcore."):
label_data = json.loads(labels[key])
for label_key in label_data.keys():
image_tags[label_key] = label_data[label_key]
if image_tags:
current_repo.append(image_tags)

return current_repo

def get_repo_details():
request_result = registry_request('_catalog')

repos = request_result.json()['repositories']
repositories = {}
for repo in repos:
details = _get_repo_details(repo)
if details:
repositories[repo] = details

result_json = json.dumps(repositories)


return result_json
2 changes: 2 additions & 0 deletions services/docker-compose.deploy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,3 +23,5 @@ services:
constraints:
- node.platform.os == linux
- node.role == manager
sidecar:
image: services_sidecar:latest
2 changes: 1 addition & 1 deletion services/docker-compose.devel.yml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ services:
volumes:
- ./web/server:/home/scu/server
- ./web/client/source-output:/home/scu/client
- ../packages/simcore-sdk/src:/home/scu/packages
- ../packages:/home/scu/packages
depends_on:
- webclient
#--------------------------------------------------------------------
Expand Down
15 changes: 14 additions & 1 deletion services/sidecar/src/sidecar/sidecar.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,7 @@ def _create_shared_folders(self):
def _process_task_input(self, port, input_ports):
port_name = port['key']
port_value = port['value']
_LOGGER.debug("PROCESSING %s %s", port_name, port_value)
_LOGGER.debug(type(port_value))
if isinstance(port_value, str) and port_value.startswith("link."):
if port['type'] == 'file-url':
Expand Down Expand Up @@ -91,6 +92,9 @@ def _process_task_input(self, port, input_ports):
for oport in other_task.output:
if oport['key'] == other_output_port_id:
input_ports[port_name] = oport['value']
else:
_LOGGER.debug('Non link data %s : %s', port_name, port_value)
input_ports[port_name] = port_value

def _process_task_inputs(self):
""" Writes input key-value pairs into a dictionary
Expand All @@ -110,16 +114,25 @@ def _process_task_inputs(self):
_LOGGER.debug(port)
self._process_task_input(port, input_ports)

_LOGGER.debug('DUMPING json')
#dump json file
if input_ports:
file_name = os.path.join(self._executor.in_dir, 'input.json')
with open(file_name, 'w') as f:
json.dump(input_ports, f)

_LOGGER.debug('DUMPING DONE')

def _pull_image(self):
_LOGGER.debug('PULLING IMAGE')
_LOGGER.debug('reg %s user %s pwd %s', self._docker.registry, self._docker.registry_user,self._docker.registry_pwd )


self._docker.client.login(registry=self._docker.registry,
username=self._docker.registry_user, password=self._docker.registry_pwd)

_LOGGER.debug('img %s tag %s', self._docker.image_name, self._docker.image_tag)

self._docker.client.images.pull(self._docker.image_name, tag=self._docker.image_tag)

def _bg_job(self, task, log_file):
Expand Down Expand Up @@ -213,7 +226,7 @@ def _process_task_log(self):

def initialize(self, task):
self._task = task
self._docker.image_name = task.image['name']
self._docker.image_name = self._docker.registry_name + "/" + task.image['name']
self._docker.image_tag = task.image['tag']
self._executor.in_dir = os.path.join("/", "input", task.job_id)
self._executor.out_dir = os.path.join("/", "output", task.job_id)
Expand Down
1 change: 1 addition & 0 deletions services/sidecar/src/sidecar/sidecar_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ def __init__(self):
self._config = docker_config()
self.client = docker.from_env(version='auto')
self.registry = self._config.registry
self.registry_name = self._config.registry_name
self.registry_user = self._config.user
self.registry_pwd = self._config.pwd
self.image_name = ""
Expand Down
5 changes: 2 additions & 3 deletions services/web/Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -41,8 +41,7 @@ RUN apk add --no-cache \

ENV HOME /home/scu
ENV SIMCORE_WEB_OUTDIR $HOME/client
ENV PYTHONPATH "$HOME/server/src:$HOME/packages"

ENV PYTHONPATH "$HOME/server/src:$HOME/packages/simcore-sdk/src:$HOME/packages/s3wrapper/src"

WORKDIR /home/scu

Expand Down Expand Up @@ -91,7 +90,7 @@ RUN pip3 install --no-cache-dir -r requirements/prod.txt && \
rm -rf requirements

# 2. install 2nd party packages
COPY --chown=scu:scu packages/simcore-sdk/src packages
COPY --chown=scu:scu packages packages

# 3. install client
COPY --from=services_webclient:build --chown=scu:scu /home/scu/client/build-output client
Expand Down
21 changes: 20 additions & 1 deletion services/web/client/source/class/qxapp/components/form/Auto.js
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,8 @@
*
*/

/* eslint no-warning-comments: "off" */

qx.Class.define("qxapp.components.form.Auto", {
extend : qx.ui.form.Form,
include : [qx.locale.MTranslation],
Expand Down Expand Up @@ -366,6 +368,10 @@ qx.Class.define("qxapp.components.form.Auto", {
);
},
__addField: function(s) {
// FIXME: OM why null?
if (s === null) {
return;
}
let option = {
exposable: s.exposable
}; // for passing info into the form renderer
Expand All @@ -384,12 +390,21 @@ qx.Class.define("qxapp.components.form.Auto", {
}
s.set.value = s.defaultValue;
}
// FIXME: This should go away
if (s.value) {
if (!s.set) {
s.set = {};
}
s.set.value = s.value;
}
if (!s.widget) {
s.widget = {
string: "text",
integer: "spinner",
number: "spinner",
bool: "checkBox",
fileUrl: "fileButton"
"file-url": "fileButton",
"folder-url": "fileButton"
}[s.type];
}
let control;
Expand All @@ -405,6 +420,10 @@ qx.Class.define("qxapp.components.form.Auto", {
break;
case "spinner":
control = new qx.ui.form.Spinner();
control.set({
maximum: 10000,
minimum: -10000
});
setup = this.__setupSpinner;
break;
case "password":
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -238,7 +238,7 @@ qx.Class.define("qxapp.components.workbench.NodeBase", {
label.isInput = isInput;
label.portType = portData.type;

label.ui = new qx.ui.basic.Label(portData.label).set({
label.ui = new qx.ui.basic.Label(portData.key).set({
height: 16,
draggable: true,
droppable: true
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -208,7 +208,7 @@ qx.Class.define("qxapp.components.workbench.Workbench", {
var node = d["Node"];
var msg = d["Message"];
this.__updateLogger(node, msg);
});
}, this);
}
socket.emit("logger");

Expand All @@ -220,7 +220,7 @@ qx.Class.define("qxapp.components.workbench.Workbench", {
var node = d["Node"];
var progress = 100*Number.parseFloat(d["Progress"]).toFixed(4);
this.updateProgress(node, progress);
});
}, this);
}

if (this.getCanStart()) {
Expand Down Expand Up @@ -811,9 +811,10 @@ qx.Class.define("qxapp.components.workbench.Workbench", {
// post pipeline
let currentPipeline = this.__serializeData();
console.log(currentPipeline);
var req = new qx.io.request.Xhr();
var data = {};
data["pipeline_mockup_id"] = currentPipeline;
let req = new qx.io.request.Xhr();
let data = {};
data = currentPipeline;
data["pipeline_mockup_id"] = qxapp.utils.Utils.uuidv4();
req.set({
url: "/start_pipeline",
method: "POST",
Expand All @@ -832,7 +833,7 @@ qx.Class.define("qxapp.components.workbench.Workbench", {
},

__onPipelinesubmitted: function(e) {
var req = e.getTarget();
let req = e.getTarget();
console.debug("Everything went fine!!");
console.debug("status : ", req.getStatus());
console.debug("phase : ", req.getPhase());
Expand Down
Loading