/**
 * 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
 * <p/>
 * http://www.apache.org/licenses/LICENSE-2.0
 * <p/>
 * 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.myriad.scheduler;

import javax.inject.Inject;
import org.apache.mesos.Protos.Status;
import org.apache.mesos.Protos.TaskID;
import org.apache.mesos.SchedulerDriver;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * The MyriadDriver class is a wrapper for the Mesos SchedulerDriver class. Accordingly, 
 * all public MyriadDriver methods delegate to the corresponding SchedulerDriver methods. 
 */
public class MyriadDriver {
  private static final Logger LOGGER = LoggerFactory.getLogger(MyriadDriver.class);

  private final SchedulerDriver driver;

  @Inject
  public MyriadDriver(SchedulerDriver driver) {
    this.driver = driver;
  }

  /**
   * Stops the underlying Mesos SchedulerDriver. If the failover flag is set to
   * false, Myriad will not reconnect to Mesos. Consequently, Mesos will unregister 
   * the Myriad framework and shutdown all the Myriad tasks and executors. If failover 
   * is set to true, all Myriad executors and tasks will remain running for a defined
   * period of time, allowing the MyriadScheduler to reconnect to Mesos.
   *
   * @param failover    Whether framework failover is expected.
   *
   * @return            The state of the driver after the call.
   *
   * @see Status
   */
  public Status stop(boolean failover) {
    LOGGER.info("Stopping driver");
    Status status = driver.stop(failover);
    LOGGER.info("Driver stopped with status: {}", status);
    return status;
  }

  /**
   * Starts the underlying Mesos SchedulerDriver. Note: this method must
   * be called before any other MyriadDriver methods are invoked.
   *
   * @return The state of the driver after the call.
   *
   * @see Status
   */
  public Status start() {
    LOGGER.info("Starting driver");
    Status status = driver.start();
    LOGGER.info("Driver started with status: {}", status);
    return status;
  }

  /**
   * Kills the specified task via the underlying Mesos SchedulerDriver. 
   * Important note from the Mesos documentation: "attempting to kill a 
   * task is currently not reliable. If, for example, a scheduler fails over
   * while it was attempting to kill a task it will need to retry in
   * the future Likewise, if unregistered / disconnected, the request
   * will be dropped (these semantics may be changed in the future)."
   *
   * @param taskId  The ID of the task to be killed.
   *
   * @return        The state of the driver after the call.
   * 
   * @see Status
   */  
  public Status kill(final TaskID taskId) {
    Status status = driver.killTask(taskId);
    LOGGER.info("Task {} killed with status: {}", taskId, status);
    return status;
  }

  /**
   * Aborts the underlying Mesos SchedulerDriver so that no more callbacks 
   * can be made to the MyriadScheduler. Note from Mesos documentation: 
   * The semantics of abort and stop have deliberately been separated so that 
   * code can detect an aborted driver and instantiate and start another driver 
   * if desired (from within the same process).
   *
   * @return The state of the driver after the call.
   * 
   * @see Status
   */  
  public Status abort() {
    LOGGER.info("Aborting driver");
    Status status = driver.abort();
    LOGGER.info("Aborted driver with status: {}", status);
    return status;
  }

  public SchedulerDriver getDriver() {
    return driver;
  }
}
