Exemple #1
0
    def deploy_to_openfaas(self) -> None:
        """Deploy this job's smart contract to OpenFaaS and update the faas_spec

            Returns:
                None, or throws exceptions.InternalServerError
        """
        _log.info("Deploying to OpenFaaS cluster")
        spec = self.get_openfaas_spec()
        requests_method = requests.post if self.model.task_type == "create" else requests.put

        response = requests_method(
            f"{FAAS_GATEWAY}/system/functions",
            headers={"Authorization": faas.get_faas_auth()},
            json=spec)
        _log.info(f"Deployment status: {response.status_code}")
        if response.status_code not in [200, 202]:
            _log.info(f"OpenFaaS deploy failure: {response.status_code}")
            self.model.set_state(state=self.end_error_state,
                                 msg="Failed message state")
            raise exceptions.ContractException(
                "Contract function deployment failure")

        _log.info("Saving faas_spec.json to storage")
        if os.environ["STORAGE_TYPE"].lower() == "disk":
            os.setuid(1000)
        storage.put_object_as_json(
            key=f"SMARTCONTRACT/{self.model.id}/faas_spec.json", value=spec)
Exemple #2
0
def main() -> "ContractJob":
    try:
        job = ContractJob(task_definition=json.loads(EVENT))
    except Exception:
        raise exceptions.ContractException("Uncaught error in contract job")

    try:
        if job.update_model is not None:
            job.update()
            change_to_read_user()
            job.model.save()
        elif job.model and job.model.task_type == "create":
            job.create()
            change_to_read_user()
            job.model.save()
        elif job.model and job.model.task_type == "delete":
            job.delete()
    except Exception:
        _log.exception("Uncaught exception raised in contract job")
        if job.update_model is not None:
            job.old_model.status = job.model.status
            job.model = job.old_model
        if job.model.status.get("state") != job.end_error_state:
            # If the exception has not been handled, set state
            job.model.set_state(job.end_error_state,
                                "Unexpected error updating contract")
        change_to_read_user()
        job.model.save()
        raise
    return job
Exemple #3
0
    def create_openfaas_secrets(self) -> None:
        """Creates secrets for openfaas functions

            Args:
                existing_model (obj, optional): The existing model for this contract if action is update

            Returns:
                None
        """
        existing_secrets = self.model.existing_secrets or []

        if self.update_model:
            new_secrets = self.update_model.secrets
        else:
            new_secrets = self.model.secrets

        for secret, value in new_secrets.items():
            secret_name = f"sc-{self.model.id}-{secret.lower()}"
            requests_method = requests.post if secret not in existing_secrets else requests.put

            _log.info(f"Creating secret: {secret_name} at {FAAS_GATEWAY}")
            response = requests_method(
                f"{FAAS_GATEWAY}/system/secrets", headers={"Authorization": faas.get_faas_auth()}, json={"name": secret_name, "value": value}
            )

            _log.info(f"Response: {response.status_code}")
            _log.info(f"Response Body: {response.text}")

            if response.status_code != 202:
                self.model.set_state(state=self.end_error_state, msg="Error creating contract secrets")
                raise exceptions.ContractException("Error creating contract secret")
            existing_secrets.append(secret.lower())

        self.model.existing_secrets = existing_secrets