/* * 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 distribut * ed 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.topology; import java.util.List; import java.util.concurrent.Executor; import org.apache.ambari.server.topology.tasks.TopologyTask; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * Response to a host offer. */ final class HostOfferResponse { public enum Answer {ACCEPTED, DECLINED_PREDICATE, DECLINED_DONE} private static final Logger LOG = LoggerFactory.getLogger(HostOfferResponse.class); static final HostOfferResponse DECLINED_DUE_TO_PREDICATE = new HostOfferResponse(Answer.DECLINED_PREDICATE); static final HostOfferResponse DECLINED_DUE_TO_DONE = new HostOfferResponse(Answer.DECLINED_DONE); private final Answer answer; private final String hostGroupName; private final long hostRequestId; private final List<TopologyTask> tasks; static HostOfferResponse createAcceptedResponse(long hostRequestId, String hostGroupName, List<TopologyTask> tasks) { return new HostOfferResponse(Answer.ACCEPTED, hostRequestId, hostGroupName, tasks); } private HostOfferResponse(Answer answer) { this(answer, -1, null, null); } private HostOfferResponse(Answer answer, long hostRequestId, String hostGroupName, List<TopologyTask> tasks) { this.answer = answer; this.hostRequestId = hostRequestId; this.hostGroupName = hostGroupName; this.tasks = tasks; } public Answer getAnswer() { return answer; } public long getHostRequestId() { return hostRequestId; } //todo: for now assumes a host was added //todo: perhaps a topology modification object that modifies a passed in topology structure? public String getHostGroupName() { return hostGroupName; } void executeTasks(Executor executor, final String hostName, final ClusterTopology topology, final AmbariContext ambariContext) { if (answer != Answer.ACCEPTED) { LOG.warn("Attempted to execute tasks for declined host offer", answer); } else { executor.execute(new Runnable() { @Override public void run() { for (TopologyTask task : tasks) { LOG.info("Running task for accepted host offer for hostname = {}, task = {}", hostName, task.getType()); task.run(); } } }); } } }