From beae6fc923fe5da7e5f3eb9e83d39cdc57188da1 Mon Sep 17 00:00:00 2001 From: dcvan Date: Mon, 19 Mar 2018 22:06:11 -0400 Subject: [PATCH] finished issue #6 and passed basic tests --- container/job.py | 13 ++++++++++--- container/service.py | 10 +++++++--- util.py | 5 +++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/container/job.py b/container/job.py index 4daabf3..335c38e 100644 --- a/container/job.py +++ b/container/job.py @@ -1,4 +1,5 @@ -from container.base import Container, NetworkMode, Resources, ContainerState +from util import parse_container_short_id +from container.base import Container, NetworkMode, ContainerState # Limitations: # 1. Inefficient job state monitoring: Chronos does not have an API for per-job state @@ -72,14 +73,20 @@ def to_request(self): cpus=self.resources.cpus, mem=self.resources.mem, disk=self.resources.disk, shell=self.args is None, command = self.cmd if self.cmd else '', - environmentVariables=[dict(name=k, value=v) for k, v in self.env.items()], + environmentVariables=[dict(name=k, + value=parse_container_short_id(v, self.appliance)) + for k, v in self.env.items()], container=dict(type='DOCKER', image=self.image, network=self.network_mode.value, volumes=[v.to_request() for v in self.volumes], forcePullImage=self.force_pull_image)) if self.args: - r['arguments'] = self.args + r['arguments'] = [parse_container_short_id(a, self.appliance) + for a in self.args if str(a).strip()] + if self.cmd: + r['command'] = ' '.join([parse_container_short_id(p, self.appliance) + for p in self.cmd.split()]) parameters = [dict(key='privileged', value=self.is_privileged)] parameters += [dict(key='publish', value='%d:%d/%s'%(p.host_port, p.container_port, p.protocol)) diff --git a/container/service.py b/container/service.py index 1d76edc..4a8f50f 100644 --- a/container/service.py +++ b/container/service.py @@ -1,5 +1,6 @@ import json +from util import parse_container_short_id from container.base import Container, ContainerState, Endpoint, NetworkMode @@ -151,7 +152,8 @@ def to_save(self): def to_request(self): r = dict(id=str(self), instances=self.instances, **self.resources.to_request(), - env={k: str(v) for k, v in self.env.items()}, + env={k: parse_container_short_id(v, self.appliance) + for k, v in self.env.items()}, labels=self.labels, requirePorts=len(self.ports) > 0, acceptedResourceRoles=[ "slave_public", "*" ], @@ -165,9 +167,11 @@ def to_request(self): minimumHealthCapacity=self.minimum_capacity, maximumOverCapacity=self.maximum_capacity)) if self.cmd: - r['cmd'] = self.cmd + r['cmd'] = ' '.join([parse_container_short_id(p, self.appliance) + for p in self.cmd.split()]) if self.args: - r['args'] = self.args + r['args'] = [parse_container_short_id(a, self.appliance) + for a in self.args if str(a).strip()] # set network mode if self.network_mode == NetworkMode.HOST: r['networks'] = [dict(mode='host')] diff --git a/util.py b/util.py index c45893d..adef56e 100644 --- a/util.py +++ b/util.py @@ -1,3 +1,4 @@ +import re import sys import json import motor @@ -21,6 +22,10 @@ def message(msg): def error(msg): return dict(error=msg) +def parse_container_short_id(p, appliance): + return re.sub(r'(.*)\@([a-z0-9\.-]+)(.*)', + r'\1\2-%s.marathon.containerip.dcos.thisdcos.directory\3'%appliance, + str(p)) class Singleton(type): _instances = {}