blob: 1e6dd3aa72869c452ba7f910bccc842e54376415 [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.updater;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
import com.google.common.base.MoreObjects;
import com.google.common.collect.ImmutableSet;
import org.apache.aurora.scheduler.updater.StateEvaluator.Failure;
import static java.util.Objects.requireNonNull;
/**
* Side-effect resulting from evaluating an instance during a job update. Side-effects include
* actions that should be performed as well as status changes of the instance monitor.
*/
public class SideEffect {
private final Optional<InstanceAction> action;
private final Set<InstanceUpdateStatus> statusChanges;
private final Optional<Failure> failure;
/**
* Creates a new side-effect.
*
* @param action Action to be taken on the instance, if necessary.
* @param statusChanges Any status changes to the instance monitor.
* @param failure The failure encountered, if any.
*/
public SideEffect(
Optional<InstanceAction> action,
Set<InstanceUpdateStatus> statusChanges,
Optional<Failure> failure) {
this.action = requireNonNull(action);
this.statusChanges = requireNonNull(statusChanges);
this.failure = requireNonNull(failure);
}
/**
* Gets the action that should be performed with this side-effect, if any.
*
* @return The action associated with this side-effect.
*/
public Optional<InstanceAction> getAction() {
return action;
}
/**
* Gets the status changes that the instance underwent while being evaluated.
*
* @return Instance updater status changes.
*/
public Set<InstanceUpdateStatus> getStatusChanges() {
return statusChanges;
}
/**
* Gets the failure observed during evaluation, if there was one.
*
* @return Instance failure.
*/
public Optional<Failure> getFailure() {
return failure;
}
/**
* Tests whether any of multiple side-effects contain {@link #getAction() actions} to be
* performed.
*
* @param sideEffects Side-effects to inspect for actions.
* @return {@code true} if at least one of the side-effects contains an action to perform,
* otherwise {@code false}.
*/
public static boolean hasActions(Iterable<SideEffect> sideEffects) {
for (SideEffect sideEffect : sideEffects) {
if (sideEffect.getAction().isPresent()) {
return true;
}
}
return false;
}
@Override
public boolean equals(Object o) {
if (!(o instanceof SideEffect)) {
return false;
}
SideEffect other = (SideEffect) o;
return Objects.equals(other.getAction(), getAction())
&& Objects.equals(other.getStatusChanges(), getStatusChanges());
}
@Override
public int hashCode() {
return Objects.hash(getAction(), getStatusChanges());
}
@Override
public String toString() {
return MoreObjects.toStringHelper(this)
.add("action", getAction())
.add("statusChanges", getStatusChanges())
.toString();
}
/**
* The status of an instance being updated as part of a one-way job update.
*/
public enum InstanceUpdateStatus {
/**
* The instance has not yet been modified by the update.
*/
IDLE,
/**
* The instance is being modified to reach the target state of the one-way update.
*/
WORKING,
/**
* The instance updated successfully and is no longer being monitored.
*/
SUCCEEDED,
/**
* The instance failed to update and is no longer being monitored.
*/
FAILED;
public static final Set<InstanceUpdateStatus> TERMINAL_STATUSES =
ImmutableSet.of(SUCCEEDED, FAILED);
}
}