/*
#######################################################################################
# Copyright ETSI Contributors and Others.
#
# 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";

option java_multiple_files = true;
option java_package = "com.etsi.osm.lcm.osm_ee";
option java_outer_classname = "GrpcExecutor";
option objc_class_prefix = "OEE";

package osm_ee;

service FrontendExecutor {

    // Execute action leaving open a channel for notifications
    rpc RunPrimitive (PrimitiveRequest) returns (stream PrimitiveReply) {}

    // Sends a greeting
    rpc GetSshKey (SshKeyRequest) returns (SshKeyReply) {}
}

// Request parameters
message PrimitiveRequest {
    string id=1;
    string name=2;
    string params=3;
}

message PrimitiveReply {
    string status=1;
    string detailed_message=2;
}

// The request message containing the user's name.
message SshKeyRequest {
  // empty
}

// The response message containing the greetings
message SshKeyReply {
  string message = 1;
}
