# -*- coding: utf-8 -*- import base try: import docker except ImportError: import pip pip.main(['install', 'docker']) import docker class DockerAPI(object): def __init__(self): self.DCLIENT = docker.APIClient(base_url='unix://var/run/docker.sock',version='auto',timeout=10) self.DCLIENT2 = docker.from_env() def docker_login(self, registry, username, password, expected_error_message = None): if expected_error_message is "": expected_error_message = None try: self.DCLIENT.login(registry = registry, username=username, password=password) except docker.errors.APIError as err: if expected_error_message is not None: print( "docker login error:", str(err)) if str(err).lower().find(expected_error_message.lower()) < 0: raise Exception(r"Docker login: Return message {} is not as expected {}".format(str(err), expected_error_message)) else: raise Exception(r" Docker login failed, error is [{}]".format (err.message)) def docker_image_pull(self, image, tag = None, expected_error_message = None): if tag is not None: _tag = tag else: _tag = "latest" if expected_error_message is "": expected_error_message = None ret = "" try: ret = self.DCLIENT.pull(r'{}:{}'.format(image, _tag)) return ret except Exception as err: if expected_error_message is not None: print( "docker image pull error:", str(err)) if str(err).lower().find(expected_error_message.lower()) < 0: raise Exception(r"Pull image: Return message {} is not as expected {}".format(str(err), expected_error_message)) else: raise Exception(r" Docker pull image {} failed, error is [{}]".format (image, err.message)) else: if expected_error_message is not None: if str(ret).lower().find(expected_error_message.lower()) < 0: raise Exception(r" Failed to catch error [{}] when pull image {}, return message: {}".format (expected_error_message, image, str(ret))) else: if str(ret).lower().find("error".lower()) >= 0: raise Exception(r" It's was not suppose to catch error when pull image {}, return message is [{}]".format (image, ret)) def docker_image_tag(self, image, harbor_registry, tag = None): _tag = base._random_name("tag") if tag is not None: _tag = tag try: self.DCLIENT.tag(image, harbor_registry, _tag, force=True) return harbor_registry, _tag except docker.errors.APIError as e: raise Exception(r" Docker tag image {} failed, error is [{}]".format (image, e.message)) def docker_image_push(self, harbor_registry, tag, expected_error_message = None): caught_err = False ret = "" if expected_error_message is "": expected_error_message = None try: self.DCLIENT.push(harbor_registry, tag) return ret except Exception as err: caught_err = True if expected_error_message is not None: print( "docker image push error:", str(err)) if str(err).lower().find(expected_error_message.lower()) < 0: raise Exception(r"Push image: Return message {} is not as expected {}".format(str(err), expected_error_message)) else: raise Exception(r" Docker push image {} failed, error is [{}]".format (harbor_registry, err.message)) if caught_err == False: if expected_error_message is not None: if str(ret).lower().find(expected_error_message.lower()) < 0: raise Exception(r" Failed to catch error [{}] when push image {}, return message: {}". format (expected_error_message, harbor_registry, str(ret))) else: if str(ret).lower().find("errorDetail".lower()) >= 0: raise Exception(r" It's was not suppose to catch error when push image {}, return message is [{}]". format (harbor_registry, ret)) def docker_image_build(self, harbor_registry, tags=None, size=1, expected_error_message = None): caught_err = False ret = "" try: baseimage='busybox:latest' if not self.DCLIENT.images(name=baseimage): self.DCLIENT.pull(baseimage) c=self.DCLIENT.create_container(image='busybox:latest',command='dd if=/dev/urandom of=test bs=1M count=%d' % size ) self.DCLIENT.start(c) self.DCLIENT.wait(c) if not tags: tags=['latest'] firstrepo="%s:%s" % (harbor_registry, tags[0]) #self.DCLIENT.commit(c, firstrepo) self.DCLIENT2.containers.get(c).commit(harbor_registry, tags[0]) for tag in tags[1:]: repo="%s:%s" % (harbor_registry, tag) self.DCLIENT.tag(firstrepo, repo) for tag in tags: repo="%s:%s" % (harbor_registry, tag) self.DCLIENT.push(repo) print("build image %s with size %d" % (repo, size)) self.DCLIENT.remove_image(repo) self.DCLIENT.remove_container(c) self.DCLIENT.pull(repo) image = self.DCLIENT2.images.get(repo) return repo, image.id except Exception as err: caught_err = True if expected_error_message is not None: print( "docker image build error:", str(err)) if str(err).lower().find(expected_error_message.lower()) < 0: raise Exception(r"Push image: Return message {} is not as expected {}".format(str(err), expected_error_message)) else: raise Exception(r" Docker build image {} failed, error is [{}]".format (harbor_registry, err.message)) if caught_err == False: if expected_error_message is not None: if str(ret).lower().find(expected_error_message.lower()) < 0: raise Exception(r" Failed to catch error [{}] when build image {}, return message: {}". format (expected_error_message, harbor_registry, str(ret))) else: if str(ret).lower().find("errorDetail".lower()) >= 0: raise Exception(r" It's was not suppose to catch error when push image {}, return message is [{}]".format (harbor_registry, ret))