//  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 heron.proto.system;

option java_package = "org.apache.heron.proto.system";
option java_outer_classname = "PhysicalPlans";

import "topology.proto";

// This file defines the physical plan of a topology.
// It reflects the dynamic running state of a topology.

message StMgr {
  required string id = 1;
  required string host_name = 2;
  // This is the data port for communication
  // accross the containers(i.e. peer stmgrs)
  required int32  data_port = 3;
  // This is the port for communication
  // within the container(i.e. local instances)
  optional int32  local_data_port = 8;
  required string local_endpoint = 4;
  optional string cwd = 5; // current working directory
  optional int32 pid = 6; // PID of process

  // Http port to connect to heron-shell.
  // The port is not used by stmgr itself, except to
  // pass it on to tmaster to be included in pplan.
  optional int32 shell_port = 7;
}

message InstanceInfo {
  required int32 task_id = 1; // global
  required int32 component_index = 2; // specific to this component
  required string component_name = 3;
  repeated string params = 4;
  // the port a remote debugger can be attached to for this instance.  Currently JVM instances only
  optional int32 remote_debugger_port = 5;
}

message Instance {
  required string instance_id = 1;
  required string stmgr_id = 2;
  required InstanceInfo info = 3;
}

message PhysicalPlan {
  // Note that heron.proto.api.Topology, included in PhysicalPlan,
  // reflect the actual dynamic running state of the topology.
  // Query this value guarantees the correct running state of the topology.
  required heron.proto.api.Topology topology = 1;
  repeated StMgr stmgrs = 2;
  repeated Instance instances = 3;
}
