//
// 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";

package mesos.maintenance;

import "github.com/mesos/mesos-go/api/v1/lib/mesos.proto";
import "github.com/mesos/mesos-go/api/v1/lib/allocator/allocator.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";

option go_package = "maintenance";
option (gogoproto.benchgen_all) = true;
option (gogoproto.enum_stringer_all) = true;
option (gogoproto.equal_all) = true;
option (gogoproto.goproto_enum_prefix_all) = false;
option (gogoproto.goproto_enum_stringer_all) = false;
option (gogoproto.goproto_stringer_all) = false;
option (gogoproto.goproto_unrecognized_all) = false;
option (gogoproto.gostring_all) = true;
option (gogoproto.marshaler_all) = true;
option (gogoproto.populate_all) = true;
option (gogoproto.protosizer_all) = true;
option (gogoproto.stringer_all) =  true;
option (gogoproto.testgen_all) = true;
option (gogoproto.unmarshaler_all) = true;
option (gogoproto.verbose_equal_all) = true;

// This is an illustration of a maintenance `Schedule`:
//
//                                              This is a `Window`.
// Machine ^                                           |
//     ... |                                           v
//      12 |                                  +----------------+
//      11 |                                  |                |
//      10 |                                  +----------------+
//       9 |                       +----------------+
//       8 |                       |                |
//       7 |                       +----------------+
//       6 |           +----------------+
//       5 |           |                |
//       4 |           +----------------+
//       3 |   +-----------+
//       2 |   |           |
//       1 |   +-----------+
//         |
//         +-----------------------------------------------------~~~~->
//                          Downtime for maintenance


/**
 * A set of machines scheduled to go into maintenance
 * in the same `unavailability`.
 */
message Window {
  // Machines affected by this maintenance window.
  repeated MachineID machine_ids = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "MachineIDs"];

  // Interval during which this set of machines is expected to be down.
  required Unavailability unavailability = 2 [(gogoproto.nullable) = false];
}


/**
 * A list of maintenance windows.
 * For example, this may represent a rolling restart of agents.
 */
message Schedule {
  repeated Window windows = 1 [(gogoproto.nullable) = false];
}


/**
 * Represents the maintenance status of each machine in the cluster.
 * The lists correspond to the `MachineInfo.Mode` enumeration.
 */
message ClusterStatus {
  message DrainingMachine {
    required MachineID id = 1 [(gogoproto.nullable) = false, (gogoproto.customname) = "ID"];

    // A list of the most recent responses to inverse offers from frameworks
    // running on this draining machine.
    repeated allocator.InverseOfferStatus statuses = 2 [(gogoproto.nullable) = false];
  }

  repeated DrainingMachine draining_machines = 1 [(gogoproto.nullable) = false];
  repeated MachineID down_machines = 2 [(gogoproto.nullable) = false];
}
