// Copyright 2019 The Chromium OS Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

syntax = "proto3";

package tls;

import "xmlrpc/xmlrpc.proto";

option go_package = "go.chromium.org/chromiumos/infra/proto/go/tls";

// Wiring APIs are implemented by TLS wiring providers for all low
// level access to lab services.
//
// It is expected that TLEs do not implement most of the methods.
// TLEs only need to implement the services that it wants to provide to clients.
//
// All clients should pass gRPC metadata key request_trace_id with one value.
// The value is a unique string that is associated with the method call in metrics.
// Clients that do not pass request_trace_id may be rejected so that they can be fixed.
service Wiring {
  // Open a port on the DUT for the caller.
  // The TLE attempts to keep this port open for the duration of the
  // RTD's runtime.
  // This RPC can be called repeatedly for the same RTD, DUT, and port.
  // On subsequent calls, the implementation should attempt to return the same address.
  // If the implementation lost and cannot reobtain the previous
  // address, it should return a new address.
  rpc OpenDutPort(OpenDutPortRequest) returns (OpenDutPortResponse);

  // SetDutPowerSupply sets the connected power state for the DUT.  It is
  // the caller's responsibility to wait for the effects of the call
  // to propagate, e.g. waiting in between calls to set the power OFF
  // and ON.
  rpc SetDutPowerSupply(SetDutPowerSupplyRequest) returns (SetDutPowerSupplyResponse);

  // CacheForDut caches some data to be accesible for the DUT.
  // This will be made available to the DUT via a returned URL.
  // The service will periodically return STATUS_CONTINUE messages to keep the stream alive.
  // Implementations should use a reasonable interval (e.g., one minute)
  // to ensure the stream does not time out.
  // The client should continue streaming replies until getting success or failure.
  //
  // Experimental
  rpc CacheForDut(CacheForDutRequest) returns (stream CacheForDutResponse);

  // CallServoXmlRpc performs an XML-RPC call against the servo connected to a DUT.
  //
  // This RPC mirrors the XML-RPC specification (http://xmlrpc.com/spec.md).
  //
  // Experimental
  rpc CallServoXmlRpc(CallServoXmlRpcRequest) returns (CallServoXmlRpcResponse);
}

message OpenDutPortRequest {
  // dut is some identifier for the DUT.
  // The DUT ID is passed to the RTD when it is started.
  // This could be the DUT hostname, but the caller should not be able
  // to use the hostname to SSH or otherwise interact with the DUT
  // directly.
  string dut = 1;
  // Port to open on the DUT.
  int32 dut_port = 2;
}
message OpenDutPortResponse {
  enum Status {
    STATUS_UNKNOWN = 0;
    STATUS_OK = 1;
    // STATUS_BAD_DUT indicates that the DUT is not known,
    // or the caller does not have access to it.
    STATUS_BAD_DUT = 2;
    // STATUS_DUT_UNREACHABLE indicates that the DUT is not reachable
    // over the network.
    STATUS_DUT_UNREACHABLE = 3;
  }
  Status status = 1;
  // address which is forwarded to the DUT, in the form host:port.
  // TLEs should return an IP address to avoid name resolution issues.
  // If TLEs return a hostname, they should ensure that the hostname is
  // resolveable by the RTD via standard name resolution facilities.
  string address = 2;
  // reason provides human friendly context for any error status.
  string reason = 3;
}

message SetDutPowerSupplyRequest {
  string dut = 1;
  enum State {
    STATE_UNKNOWN = 0;
    STATE_ON = 1;
    STATE_OFF = 2;
  }
  State state = 2;
}
message SetDutPowerSupplyResponse {
  enum Status {
    STATUS_UNKNOWN = 0;
    STATUS_OK = 1;
    // STATUS_BAD_DUT indicates that the DUT is not known,
    // or the caller does not have access to it.
    STATUS_BAD_DUT = 2;
    // STATUS_BAD_REQUEST indicates that the request was invalid,
    // e.g., passing an invalid state.
    STATUS_BAD_REQUEST = 3;
    STATUS_NO_RPM = 4;
    STATUS_RPM_ERROR = 5;
  }
  Status status = 1;
  // reason provides human friendly context for any error status.
  string reason = 2;
}

message CacheForDutRequest {
  // url identifies the resource to cache.
  // Only http, https, and gs are supported.
  string url = 1;
}
message CacheForDutResponse {
  enum Status {
    STATUS_UNKNOWN = 0;
    STATUS_OK = 1;
    STATUS_CONTINUE = 2;
    STATUS_NOT_FOUND = 3;
    STATUS_TIMEOUT = 4;
  }
  Status status = 1;
  // url is where the resource is cached at.
  // This should be accessible to the DUT.
  // If the host is a name, it should be resolveable by the DUT via
  // standard name resolution facilities.
  string url = 2;
  // reason provides human friendly context for any error status.
  string reason = 3;
}

message CallServoXmlRpcRequest {
  string dut = 1;
  string method = 2;
  repeated xmlrpc.Value args = 3;
}
message CallServoXmlRpcResponse {
  enum Status {
    STATUS_UNKNOWN = 0;
    STATUS_OK = 1;
    // STATUS_BAD_DUT indicates that the DUT is not known,
    // or the caller does not have access to it.
    STATUS_BAD_DUT = 2;
    // STATUS_NO_METHOD indicates that the requested method does not
    // exist.
    STATUS_NO_METHOD = 3;
    STATUS_NO_SERVO = 4;
    STATUS_SERVO_ERROR = 5;
  }
  Status status = 1;
  xmlrpc.Value value = 2;
  // fault indicates that the servo XML-RPC returned a fault.
  // The fault value is stored in the value field.
  bool fault = 3;
}
