def build_contract_image(self) -> None:
        """Build a smart contract to OpenFaaS"""
        self.docker = docker.from_env()
        self.docker_login_if_necessary()

        if self.update_model:
            self.model.image = self.update_model.image

        _log.info(f"Building OpenFaas image from {self.model.image}")

        try:
            _log.info(f"Pulling {self.model.image} and checking its size")
            self.pull_image(self.model.image)
        except docker.errors.APIError:
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker pull error")
            raise exceptions.BadImageError("Docker pull error")
        except exceptions.ContractImageTooLarge:
            _log.exception("Image too large")
            self.model.set_state(
                state=self.end_error_state,
                msg="Docker image exceeds 500MB size limitation")
            raise
        except exceptions.BadImageError:
            _log.exception("Bad image")
            self.model.set_state(state=self.end_error_state,
                                 msg="Bad docker image")
            raise

        try:
            dockerfile_path = self.create_dockerfile()
            _log.info(f"Building OpenFaaS image {self.faas_image}")
            self.docker.images.build(path=dockerfile_path,
                                     tag=self.faas_image,
                                     rm=True,
                                     timeout=30)
        except (docker.errors.APIError, docker.errors.BuildError):
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker build error")
            raise exceptions.BadImageError("Docker build error")

        _log.info(f"Pushing to ECR {self.faas_image}")
        try:
            # For on prem, the auth will need an abstraction layer so the customer can maintain a private registry for their contracts
            # For now, we default to using ECR auth. This works in minikube as the localhost:5000 registry is unauthenticated, so auth_config gets ignored.
            self.docker.images.push(f"{FAAS_REGISTRY}/customer-contracts",
                                    tag=self.model.id,
                                    auth_config=registry_interface.get_login())
            image = self.docker.images.get(self.faas_image)
            _log.debug(f"Built image attrs: {image.attrs}")
            self.previous_digest = self.model.image_digest
            self.model.image_digest = image.attrs["RepoDigests"][0].split(
                "@")[-1]
        except docker.errors.APIError:
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker push error")
            raise exceptions.BadImageError("Docker push error")
示例#2
0
    def build_contract_image(self) -> None:
        """Build a smart contract to OpenFaaS"""
        self.docker = docker.from_env()
        self.docker_login_if_necessary()

        if self.update_model:
            self.model.image = self.update_model.image

        _log.info(f"Building OpenFaas image from {self.model.image}")

        try:
            _log.info(f"Pulling {self.model.image} and checking its size")
            self.pull_image(self.model.image)
        except docker.errors.APIError:
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker pull error")
            raise exceptions.BadImageError("Docker pull error")
        except exceptions.ContractImageTooLarge:
            _log.exception("Image too large")
            self.model.set_state(
                state=self.end_error_state,
                msg="Docker image exceeds 500MB size limitation")
            raise
        except exceptions.BadImageError:
            _log.exception("Bad image")
            self.model.set_state(state=self.end_error_state,
                                 msg="Bad docker image")
            raise

        try:
            dockerfile_path = self.create_dockerfile()
            _log.info(f"Building OpenFaaS image {self.faas_image}")
            self.docker.images.build(path=dockerfile_path,
                                     tag=self.faas_image,
                                     rm=True,
                                     timeout=45,
                                     pull=True)
        except (docker.errors.APIError, docker.errors.BuildError):
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker build error")
            raise exceptions.BadImageError("Docker build error")

        _log.info(f"Pushing to docker registry {self.faas_image}")
        try:
            self.docker.images.push(f"{FAAS_REGISTRY}/customer-contracts",
                                    tag=self.model.id,
                                    auth_config=registry_interface.get_login())
            image = self.docker.images.get(self.faas_image)
            _log.debug(f"Built image attrs: {image.attrs}")
            self.previous_digest = self.model.image_digest
            self.model.image_digest = image.attrs["RepoDigests"][0].split(
                "@")[-1]
        except docker.errors.APIError:
            _log.exception("Docker error")
            self.model.set_state(state=self.end_error_state,
                                 msg="Docker push error")
            raise exceptions.BadImageError("Docker push error")