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")
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")