/**
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.ambari.server.actionmanager;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.agent.CommandReport;
import org.apache.ambari.server.agent.ExecutionCommand;
import org.apache.ambari.server.orm.entities.HostRoleCommandEntity;
import org.apache.ambari.server.orm.entities.RequestEntity;
public interface ActionDBAccessor {
/**
* Given an action id of the form requestId-stageId, retrieve the Stage
*/
Stage getStage(String actionId);
/**
* Get all stages associated with a single request id
*/
List<Stage> getAllStages(long requestId);
/**
* Gets the request entity by id. Will not load the entire
* Request/Stage/HostRoleCommand object hierarchy.
*/
RequestEntity getRequestEntity(long requestId);
/**
* Get request object by id. USE WITH CAUTION! This method will
* result in loading the full object hierarchy, and can be expensive to
* construct.
* @param requestId the request id
* @return the Request instance, with all Stages and HostRoleCommands constructed
* from the database
*/
Request getRequest(long requestId);
/**
* Abort all outstanding operations associated with the given request. This
* method uses the {@link HostRoleStatus#SCHEDULED_STATES} to determine which
* {@link HostRoleCommand} instances to abort.
*
* Returns the list of the aborted operations.
*/
Collection<HostRoleCommandEntity> abortOperation(long requestId);
/**
* Mark the task as to have timed out
*/
void timeoutHostRole(String host, long requestId, long stageId, String role);
/**
* Mark the task as to have timed out
*/
void timeoutHostRole(String host, long requestId, long stageId, String role,
boolean skipSupported, boolean hostUnknownState);
/**
* Returns the next stage which is in-progress for every in-progress request
* in the system. Since stages are always synchronous, there is no reason to
* return more than the most recent stage per request. Returning every single
* stage in the requesrt would be extremely inffecient and wasteful. However,
* since requests can run in parallel, this method must return the most recent
* stage for every request. The results will be sorted by request ID.
* <p/>
* Use {@link #getCommandsInProgressCount()} in order to determine if there
* are stages that are in progress before getting the stages from this method.
*
* @see HostRoleStatus#IN_PROGRESS_STATUSES
*/
List<Stage> getFirstStageInProgressPerRequest();
/**
* Returns all the pending stages in a request, including queued and not-queued. A stage is
* considered in progress if it is in progress for any host.
* <p/>
* The results will be sorted by stage ID making this call
* expensive in some scenarios. Use {@link #getCommandsInProgressCount()} in
* order to determine if there are stages that are in progress before getting
* the stages from this method.
*
* @see HostRoleStatus#IN_PROGRESS_STATUSES
*/
List<Stage> getStagesInProgressForRequest(Long requestId);
/**
* Gets the number of commands in progress.
*
* @return the number of commands in progress.
*/
int getCommandsInProgressCount();
/**
* Persists all tasks for a given request
*
* @param request
* request object
*/
void persistActions(Request request) throws AmbariException;
void startRequest(long requestId);
void endRequest(long requestId);
/**
* Updates request with link to source schedule
*/
void setSourceScheduleForRequest(long requestId, long scheduleId);
/**
* Update tasks according to command reports
*/
void updateHostRoleStates(Collection<CommandReport> reports);
/**
* For the given host, update all the tasks based on the command report
*/
void updateHostRoleState(String hostname, long requestId,
long stageId, String role, CommandReport report);
/**
* Mark the task as to have been aborted
*/
void abortHostRole(String host, long requestId, long stageId, String role);
/**
* Mark the task as to have been aborted. Reason should be specified manually.
*/
void abortHostRole(String host, long requestId, long stageId,
String role, String reason);
/**
* Return the last persisted Request ID as seen when the DBAccessor object
* was initialized.
* Value should remain unchanged through the lifetime of the object instance.
*
* @return Request Id seen at init time
*/
long getLastPersistedRequestIdWhenInitialized();
/**
* Bulk update scheduled commands
*/
void bulkHostRoleScheduled(Stage s, List<ExecutionCommand> commands);
/**
* Bulk abort commands
*/
void bulkAbortHostRole(Stage s, Map<ExecutionCommand, String> commands);
/**
* Updates scheduled stage.
*/
void hostRoleScheduled(Stage s, String hostname, String roleStr);
/**
* Given a request id, get all the tasks that belong to this request
*/
List<HostRoleCommand> getRequestTasks(long requestId);
/**
* Given a list of request ids, get all the tasks that belong to these requests
*/
List<HostRoleCommand> getAllTasksByRequestIds(Collection<Long> requestIds);
/**
* Given a list of task ids, get all the host role commands
*/
Collection<HostRoleCommand> getTasks(Collection<Long> taskIds);
/**
* Get a List of host role commands where the host, role and status are as specified
*/
List<HostRoleCommand> getTasksByHostRoleAndStatus(String hostname, String role, HostRoleStatus status);
/**
* Get a List of host role commands where the role and status are as specified
*/
List<HostRoleCommand> getTasksByRoleAndStatus(String role, HostRoleStatus status);
/**
* Gets the host role command corresponding to the task id
*/
HostRoleCommand getTask(long taskId);
/**
* Get first or last maxResults requests that are in the specified status
*
* @param status
* Desired request status
* @param maxResults
* maximal number of returned id's
* @param ascOrder
* defines sorting order for database query result
* @return First or last maxResults request id's if ascOrder is true or false,
* respectively
*/
List<Long> getRequestsByStatus(RequestStatus status, int maxResults, boolean ascOrder);
/**
* Gets request contexts associated with the list of request id
*/
Map<Long, String> getRequestContext(List<Long> requestIds);
/**
* Gets the request context associated with the request id
*/
String getRequestContext(long requestId);
/**
* Gets request objects by ids
*/
List<Request> getRequests(Collection<Long> requestIds);
/**
* Resubmits a series of tasks
* @param taskIds
*/
void resubmitTasks(List<Long> taskIds);
}