// 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.

syntax = "proto2";

import "mesos/mesos.proto";

package mesos.slave;

option java_package = "org.apache.mesos";
option java_outer_classname = "Protos";


/**
 * The QoS Controller informs the slave that particular corrective
 * actions need to be made. Each corrective action contains
 * information about executor or task and the type of action to
 * perform.
 */
message QoSCorrection {
  // NOTE: In the future we can define more actions like
  // freeze and resize.
  enum Type {
    KILL = 1; // Terminate an executor.
  }

  // Kill action which will be performed on an executor.
  // NOTE: Framework ID and either executor id or executor id and container_id
  // must be set to kill a running container. In the latter case, the caller
  // can be assured that the kill request doesn't target a new executor reusing
  // an old executor id.
  // NOTE: In the future we may also kill individual tasks by
  // specifying an optional 'task_id'.
  message Kill {
    optional FrameworkID framework_id = 1;
    optional ExecutorID executor_id = 2;
    optional ContainerID container_id = 3;
  }

  required Type type = 1;
  optional Kill kill = 2;
}
