diff --git a/beat/core/dock.py b/beat/core/dock.py index 3959a5be16897dfa6748883916efabae8fa9b790..bc41427e2dd1740221f5af2dcbddde6e3f017a2e 100755 --- a/beat/core/dock.py +++ b/beat/core/dock.py @@ -68,7 +68,7 @@ class Host(object): self.client = docker.Client(**self.kwargs) - self.environments = self._discover_environments(raise_on_errors=True) + self.environments = self._discover_environments(raise_on_errors=False) # makes sure we can talk to the docker host assert self.ip @@ -165,11 +165,62 @@ class Host(object): "uniquely named. Fix this and re-start." % \ (tag or id, retval[key]['image'], key)) else: - logger.warn("Overriding **existing** environment `%s' image " \ - "with `%s' (it was `%s). To avoid this warning make " \ - "sure your docker images do not contain environments " \ - "with the same names", key, retval[key]['image'], - image['Id']) + new_version = None + previous_version = None + + parts = tag.split('/') + if len(parts) > 1: + parts = parts[-1].split(':') + if len(parts) > 1: + new_version = parts[-1] + + parts = retval[key]['tag'].split('/') + if len(parts) > 1: + parts = parts[-1].split(':') + if len(parts) > 1: + previous_version = parts[-1] + + replacement = False + keep = False + + if (new_version is not None) and (previous_version is not None): + if new_version == 'latest': + replacement = True + elif previous_version == 'latest': + keep = True + else: + try: + new_version = tuple([ int(x) for x in new_version.split('.') ]) + + try: + previous_version = tuple([ int(x) for x in previous_version.split('.') ]) + + if new_version > previous_version: + replacement = True + else: + keep = True + except: + replacement = True + + except: + keep = True + + elif new_version is not None: + replacement = True + elif previous_version is not None: + keep = True + + if replacement: + logger.debug("Overriding **existing** environment `%s' in image `%s'", key, retval[key]['tag']) + elif keep: + logger.debug("Environment `%s' already existing in image `%s', we'll keep it", key, retval[key]['tag']) + continue + else: + logger.warn("Overriding **existing** environment `%s' image " \ + "with `%s' (it was `%s). To avoid this warning make " \ + "sure your docker images do not contain environments " \ + "with the same names", key, retval[key]['image'], + image['Id']) retval[key] = description retval[key]['image'] = image['Id']