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

option java_package = "org.apache.tez.test.service.rpc";
option java_outer_classname = "TezTestServiceProtocolProtos";
option java_generic_services = true;
option java_generate_equals_and_hash = true;

import "DAGApiRecords.proto";

message IOSpecProto {
  optional string connected_vertex_name = 1;
  optional TezEntityDescriptorProto io_descriptor = 2;
  optional int32 physical_edge_count = 3;
}

message GroupInputSpecProto {
  optional string group_name = 1;
  repeated string group_vertices = 2;
  optional TezEntityDescriptorProto merged_input_descriptor = 3;
}

message TaskSpecProto {
  optional string task_attempt_id_string = 1;
  optional string dag_name = 2;
  optional string vertex_name = 3;
  optional TezEntityDescriptorProto processor_descriptor = 4;
  repeated IOSpecProto input_specs = 5;
  repeated IOSpecProto output_specs = 6;
  repeated GroupInputSpecProto grouped_input_specs = 7;
  optional int32 vertex_parallelism = 8;
}


message SubmitWorkRequestProto {
  optional string container_id_string = 1;
  optional string am_host = 2;
  optional int32 am_port = 3;
  optional string token_identifier = 4;
  optional bytes credentials_binary = 5;
  optional string user = 6;
  optional string application_id_string = 7;
  optional int32 app_attempt_number = 8;
  optional TaskSpecProto task_spec = 9;
}

message SubmitWorkResponseProto {
}



message RunContainerRequestProto {
  optional string container_id_string = 1;
  optional string am_host = 2;
  optional int32 am_port = 3;
  optional string token_identifier = 4;
  optional bytes credentials_binary = 5;
  optional string user = 6;
  optional string application_id_string = 7;
  optional int32 app_attempt_number = 8;
}

message RunContainerResponseProto {
}

service TezTestServiceProtocol {
  rpc runContainer(RunContainerRequestProto) returns (RunContainerResponseProto);
  rpc submitWork(SubmitWorkRequestProto) returns (SubmitWorkResponseProto);
}
