blob: b27c83703892cbf34a6464fddee5f304f3501dd9 [file] [log] [blame]
/**
* Licensed 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.aurora.scheduler.state;
import java.util.Optional;
import java.util.Set;
import java.util.function.Function;
import org.apache.aurora.gen.ScheduleStatus;
import org.apache.aurora.scheduler.storage.entities.IAssignedTask;
import org.apache.aurora.scheduler.storage.entities.ITaskConfig;
import org.apache.mesos.v1.Protos.AgentID;
import static org.apache.aurora.scheduler.storage.Storage.MutableStoreProvider;
/**
* A manager for the state of tasks. Most modifications to tasks should be made here, especially
* those that alter the {@link ScheduleStatus} of tasks.
*/
public interface StateManager {
/**
* Attempts to alter a task from its existing state to {@code newState}. If a {@code casState}
* (compare and swap) is provided, the transition will only performed if the task is currently
* in the state.
*
* @param taskId ID of the task to transition.
* @param casState State that the task must be in for the operation to proceed. If the task
* is found to not be in {@code casState}, no action is performed and
* {@code false} is returned. This can be useful when deferring asynchronous
* work, to perform a follow-up action iff the task has not changed since the
* decision to defer the action was mde.
* @param newState State to move the task to.
* @param auditMessage Message to include with the transition.
* @return {@link StateChangeResult}.
*
*/
StateChangeResult changeState(
MutableStoreProvider storeProvider,
String taskId,
Optional<ScheduleStatus> casState,
ScheduleStatus newState,
Optional<String> auditMessage);
/**
* Assigns a task to a specific slave.
* This will modify the task record to reflect the host assignment and return the updated record.
*
* @param storeProvider Storage provider.
* @param taskId ID of the task to mutate.
* @param slaveHost Host name that the task is being assigned to.
* @param slaveId ID of the slave that the task is being assigned to.
* @param resourceAssigner The resource assign operation.
* @return The updated task record, or {@code null} if the task was not found.
*/
IAssignedTask assignTask(
MutableStoreProvider storeProvider,
String taskId,
String slaveHost,
AgentID slaveId,
Function<IAssignedTask, IAssignedTask> resourceAssigner);
/**
* Inserts pending instances using {@code task} as their configuration. Tasks will immediately
* move into PENDING and will be eligible for scheduling.
*
* @param storeProvider Storage provider.
* @param task Task template.
* @param instanceIds Instance IDs to assign to new PENDING tasks.
*/
void insertPendingTasks(
MutableStoreProvider storeProvider,
ITaskConfig task,
Set<Integer> instanceIds);
/**
* Attempts to delete tasks from the task store.
* If the task is not currently in a state that is considered safe for deletion,
* side-effect actions will be performed to reconcile the state conflict.
*
* @param storeProvider Storage provider.
* @param taskIds IDs of tasks to delete.
*/
void deleteTasks(MutableStoreProvider storeProvider, Set<String> taskIds);
}