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