/* This Protocol Buffer has been updated for supporting TOSCA-based objects.
 * The only granularity for executing CRUD operations is at the TopologyTemplate level.
 *
 * The names of the objects are assigned according to the TOSCA standard, and can be
 * mapped as follows in the Verigraph domain:
 * TopologyTemplate -> Graph
 * NodeTemplate -> Node
 * RelationshipTemplate -> Neighbour (partial)
*/

syntax = "proto3";

package verigraph;

option java_multiple_files = true;
option java_package = "it.polito.verigraph.grpc";
option java_outer_classname = "VerigraphProto";

/** gRPC */
service Verigraph {
  // Obtains a list of graphs
  rpc GetGraphs (GetRequest) returns (stream GraphGrpc) {}
  // Obtains a graph
  rpc GetGraph (RequestID) returns (GraphGrpc) {}
  // Obtains a list of Nodes
  rpc GetNodes (RequestID) returns (stream NodeGrpc) {}
  // Obtains a node
  rpc GetNode (RequestID) returns (NodeGrpc) {}
  // Obtains a list of Neighbours
  rpc GetNeighbours (RequestID) returns (stream NeighbourGrpc) {}
  // Obtains a Neighbour
  rpc GetNeighbour (RequestID) returns (NeighbourGrpc) {}

  // Creates a graph
  rpc CreateGraph (GraphGrpc) returns (NewGraph) {}
  // Delete a graph
  rpc DeleteGraph (RequestID) returns (Status) {}
  // Updates a graph
  rpc UpdateGraph (GraphGrpc) returns (NewGraph) {}
  // Verify a policy
  rpc VerifyPolicy (Policy) returns (VerificationGrpc) {}

  // Creates a Node
  rpc CreateNode (NodeGrpc) returns (NewNode) {}
  // Delete a Node
  rpc DeleteNode (RequestID) returns (Status) {}
  // Updates a Node
  rpc UpdateNode (NodeGrpc) returns (NewNode) {}
  // Configures a Node
  rpc ConfigureNode (ConfigurationGrpc) returns (Status) {}

  // Creates a neighbour
  rpc CreateNeighbour (NeighbourGrpc) returns (NewNeighbour) {}
  // Delete a neighbour
  rpc DeleteNeighbour (RequestID) returns (Status) {}
  // Updates a neighbour
  rpc UpdateNeighbour (NeighbourGrpc) returns (NewNeighbour) {}

  /** TOSCA gRPC */
  // Obtain a list of topology templates
  rpc GetTopologyTemplates (GetRequest) returns (stream TopologyTemplateGrpc) {}
  // Obtain a topology template
  rpc GetTopologyTemplate (ToscaRequestID) returns (TopologyTemplateGrpc) {}
  // Create a TopologyTemplate
  rpc CreateTopologyTemplate (TopologyTemplateGrpc) returns (NewTopologyTemplate) {}
  // Delete a TopologyTemplate
  rpc DeleteTopologyTemplate (ToscaRequestID) returns (Status) {}
  // Update a TopologyTemplate
  rpc UpdateTopologyTemplate (TopologyTemplateGrpc) returns (NewTopologyTemplate) {}
  // Verify a ToscaPolicy
  rpc VerifyToscaPolicy (ToscaPolicy) returns (ToscaVerificationGrpc) {}
}


/** Messages */
message GetRequest {
}

message RequestID {
  int64 idGraph = 1;
  int64 idNode = 2;
  int64 idNeighbour = 3;
}

message Policy{
int64 idGraph = 1;
string source = 2;
  string destination = 3;
  enum PolicyType {
   reachability = 0;
   isolation = 1;
   traversal = 2;
}
PolicyType type = 4;
string middlebox = 5;
}

message ConfigurationGrpc{
int64 idGraph = 1;
int64 idNode = 2;
string description = 3;
string configuration = 4;
string id = 5;
}

message NodeGrpc{
int64 idGraph = 1;
string name = 2;
int64 id = 3;//long
enum FunctionalType {
antispam = 0;
   cache = 1;
   dpi = 2;
   endhost = 3;
   endpoint = 4;
   fieldmodifier = 5;
   firewall = 6;
   mailclient = 7;
   mailserver = 8;
   nat = 9;
   vpnaccess = 10;
   vpnexit = 11;
   webclient = 12;
   webserver = 13;
}
FunctionalType functional_type = 4;
repeated NeighbourGrpc neighbour = 5;
ConfigurationGrpc configuration = 6;
string errorMessage = 7;
}

message GraphGrpc{
int64 id = 1;//long
repeated NodeGrpc node = 2;
string errorMessage = 3;
}

message NeighbourGrpc{
int64 idGraph = 1;
  int64 idNode = 2;
string name = 3;
  int64 id = 4;//long
  string errorMessage = 5;
}

message NewGraph{
bool success = 1;
GraphGrpc graph = 2;
string errorMessage = 3;
}

message NewNode{
bool success = 1;
NodeGrpc node = 2;
string errorMessage = 3;
}

message NewNeighbour{
bool success = 1;
NeighbourGrpc neighbour = 2;
string errorMessage = 3;
}

message TestGrpc {
  repeated NodeGrpc node = 1;
  string result = 2;
}

message VerificationGrpc{
bool successOfOperation = 1;
string result = 2;
string comment = 3;
repeated TestGrpc test = 4;
string errorMessage = 5;
}

message Status{
bool success = 1;
string errorMessage = 2;
}

/** TOSCA Messages */
message ToscaRequestID {
  string idTopologyTemplate = 1;
}

message TopologyTemplateGrpc{
  string id = 1;
  string name = 2;
  repeated NodeTemplateGrpc nodeTemplate = 3;
  repeated RelationshipTemplateGrpc relationshipTemplate = 4;
  string errorMessage = 5;
}

message NewTopologyTemplate{
  bool success = 1;
  TopologyTemplateGrpc topologyTemplate = 2;
  string errorMessage = 3;
}

message NodeTemplateGrpc{
  string id = 1;
  string name = 2;
  enum Type {
    antispam = 0;
    cache = 1;
    dpi = 2;
    endhost = 3;
    endpoint = 4;
    fieldmodifier = 5;
    firewall = 6;
    mailclient = 7;
    mailserver = 8;
    nat = 9;
    vpnaccess = 10;
    vpnexit = 11;
    webclient = 12;
    webserver = 13;
  }
  Type type = 3;
  ToscaConfigurationGrpc configuration = 4;
  string errorMessage = 5;
}

message RelationshipTemplateGrpc{
  string idSourceNodeTemplate = 1;
  string idTargetNodeTemplate = 2;
  string id = 3;
  string name = 4;
  string errorMessage = 5;
}

message ToscaPolicy{
  string idTopologyTemplate = 1;
  string source = 2;
  string destination = 3;
  enum PolicyType {
    reachability = 0;
    isolation = 1;
    traversal = 2;
  }
  PolicyType type = 4;
  string middlebox = 5;
}

message ToscaConfigurationGrpc{
  string id = 1;
  string description = 2;
  string configuration = 3;
}

message ToscaTestGrpc {
  repeated NodeTemplateGrpc nodeTemplate = 1;
  string result = 2;
}

message ToscaVerificationGrpc{
  bool successOfOperation = 1;
  string result = 2;
  string comment = 3;
  repeated ToscaTestGrpc test = 4;
  string errorMessage = 5;
}