예제 #1
0
    def get_servers_for_playbook(self, playbook_id, suggested_servers,
                                 cluster_model):
        plugs = plugins.get_public_playbook_plugins()
        if playbook_id not in plugs:
            raise http_exceptions.UnknownPlaybookError(playbook_id)

        plug = plugs[playbook_id]()
        if plug.REQUIRED_SERVER_LIST:
            if not suggested_servers:
                raise http_exceptions.ServerListIsRequiredForPlaybookError(
                    playbook_id
                )

            servers = server.ServerModel.find_by_model_id(*suggested_servers)
            if not isinstance(servers, list):
                servers = [servers]
            if len(servers) != len(set(suggested_servers)):
                raise ValueError(
                    "All suggested servers were not found. "
                    "Suggested servers were {0}".format(suggested_servers))

            deleted_servers = [srv for srv in servers if srv.time_deleted]
            if deleted_servers:
                raise ValueError(
                    "Some servers were deleted: {0}".format(
                        ", ".join(srv.model_id for srv in deleted_servers)))
            return servers

        return cluster_model.server_list
예제 #2
0
    def post(self):
        cluster_model = self.get_cluster_model(self.request_json["cluster_id"])

        plugs = plugins.get_public_playbook_plugins()
        if self.request_json["playbook_id"] not in plugs:
            raise http_exceptions.UnknownPlaybookError(
                self.request_json["playbook_id"])
        plug = plugs[self.request_json["playbook_id"]]()

        servers_for_playbook = self.get_servers_for_playbook(
            plug,
            self.request_json["playbook_id"],
            self.request_json["server_ids"],
            cluster_model
        )
        try:
            plug.SERVER_LIST_POLICY.check(cluster_model, servers_for_playbook)
        except ValueError as exc:
            raise http_exceptions.ServerListPolicyViolation(
                self.request_json["playbook_id"],
                plug.SERVER_LIST_POLICY,
                exc
            )

        try:
            pcmodel = playbook_configuration.PlaybookConfigurationModel.create(
                name=self.request_json["name"],
                playbook_id=self.request_json["playbook_id"],
                cluster=cluster_model,
                servers=servers_for_playbook,
                initiator_id=self.initiator_id,
                hints=self.request_json["hints"]
            )
        except base_exceptions.UniqueConstraintViolationError as exc:
            LOG.warning(
                "Cannot create cluster %s (unique constraint "
                "violation)",
                self.request_json["name"]
            )
            raise http_exceptions.ImpossibleToCreateSuchModel() from exc
        except base_exceptions.ClusterMustBeDeployedError as exc:
            mid = cluster_model.model_id
            LOG.warning(
                "Attempt to create playbook configuration for not "
                "deployed cluster %s", mid)
            raise http_exceptions.ClusterMustBeDeployedError(mid) from exc

        LOG.info("Playbook configuration %s (%s) created by %s",
                 self.request_json["name"], pcmodel.model_id,
                 self.initiator_id)

        return pcmodel
예제 #3
0
    def post(self):
        cluster_model = self.get_cluster_model(self.request_json["cluster_id"])

        plugs = plugins.get_public_playbook_plugins()
        if self.request_json["playbook_id"] not in plugs:
            raise http_exceptions.UnknownPlaybookError(
                self.request_json["playbook_id"])
        plug = plugs[self.request_json["playbook_id"]]()

        servers_for_playbook = self.get_servers_for_playbook(
            plug, self.request_json["playbook_id"],
            self.request_json["server_ids"], cluster_model)
        try:
            plug.SERVER_LIST_POLICY.check(cluster_model, servers_for_playbook)
        except ValueError as exc:
            raise http_exceptions.ServerListPolicyViolation(
                self.request_json["playbook_id"], plug.SERVER_LIST_POLICY, exc)

        run_after = self.request_json.get("run", False)
        parameters = {
            "name": self.request_json["name"],
            "playbook_id": self.request_json["playbook_id"],
            "cluster_model": cluster_model,
            "servers": servers_for_playbook,
            "initiator_id": self.initiator_id,
            "hints": self.request_json["hints"]
        }
        with misc.created_playbook_configuration_model(
                **parameters, delete_on_fail=run_after) as model:
            response = model.make_api_structure()
            response["data"]["created_execution_id"] = None

            if run_after:
                with misc.created_execution_model(
                        model, self.initiator_id) as exc_model:
                    response["data"]["created_execution_id"] = \
                        exc_model.model_id

            return response