// Copyright 2016-2018, Pulumi Corporation.
//
// Licensed 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 = "proto3";

import "google/protobuf/empty.proto";

package pulumirpc;

// Engine is an auxiliary service offered to language and resource provider plugins. Its main purpose today is
// to serve as a common logging endpoint, but it also serves as a state storage mechanism for language hosts
// that can't store their own global state.
service Engine {
    // Log logs a global message in the engine, including errors and warnings.
    rpc Log(LogRequest) returns (google.protobuf.Empty) {}

    // GetRootResource gets the URN of the root resource, the resource that should be the root of all
    // otherwise-unparented resources.
    rpc GetRootResource(GetRootResourceRequest) returns (GetRootResourceResponse) {}

    // SetRootResource sets the URN of the root resource.
    rpc SetRootResource(SetRootResourceRequest) returns (SetRootResourceResponse) {}
}

// LogSeverity is the severity level of a log message.  Errors are fatal; all others are informational.
enum LogSeverity {
    DEBUG = 0;   // a debug-level message not displayed to end-users (the default).
    INFO = 1;    // an informational message printed to output during resource operations.
    WARNING = 2; // a warning to indicate that something went wrong.
    ERROR = 3;   // a fatal error indicating that the tool should stop processing subsequent resource operations.
}

message LogRequest {
    // the logging level of this message.
    LogSeverity severity = 1;

    // the contents of the logged message.
    string message = 2;

    // the (optional) resource urn this log is associated with.
    string urn = 3;

    // the (optional) stream id that a stream of log messages can be associated with. This allows
    // clients to not have to buffer a large set of log messages that they all want to be
    // conceptually connected.  Instead the messages can be sent as chunks (with the same stream id)
    // and the end display can show the messages as they arrive, while still stitching them together
    // into one total log message.
    //
    // 0/not-given means: do not associate with any stream.
    int32 streamId = 4;

    // Optional value indicating whether this is a status message.
    bool ephemeral = 5;
}

message GetRootResourceRequest {
    // empty.
}

message GetRootResourceResponse {
    // the URN of the root resource, or the empty string if one was not set.
    string urn = 1;
}

message SetRootResourceRequest {
    // the URN of the root resource, or the empty string.
    string urn = 1;
}

message SetRootResourceResponse {
    // empty.
}
