syntax = "proto3";
package context;


service ContextService {
  rpc GetTopology (Empty) returns (Topology) {}

  rpc AddLink(Link) returns (LinkId) {}
  rpc DeleteLink(LinkId) returns (Empty) {}
}

message Empty {

}

message Context {
  ContextId contextId= 1;
  Topology topo = 2;
  TeraFlowController ctl = 3;
}

message ContextId {
  Uuid contextUuid = 1;
}

message Topology {
  TopologyId topoId = 2;
  repeated Device device = 3;
  repeated Link link = 4; 
}

message Link {
  LinkId link_id = 1;
  repeated EndPointId endpointList = 2;
}

message TopologyId {
  ContextId contextId = 1;
  Uuid topoId = 2;
}

message Constraint {
  string constraint_type = 1;
  string constraint_value = 2;
}

message Device {
  DeviceId device_id = 1;
  string device_type = 2;
  DeviceConfig device_config = 3;
  DeviceOperationalStatus devOperationalStatus = 4;
  repeated EndPoint endpointList = 5;  
}

message DeviceConfig {
  string device_config = 1;
}

message EndPoint {
  EndPointId port_id = 1;
  string port_type = 2;
}

message EndPointId {
  TopologyId topoId = 1;
  DeviceId dev_id = 2;
  Uuid port_id = 3;
}

message DeviceId {
  Uuid device_id = 1;
}

message LinkId {
  Uuid link_id = 1;
}

message Uuid {
  string uuid = 1;
}

enum DeviceOperationalStatus {
  KEEP_STATUS = 0; // Do not change operational status of device (used in configure)
  DISABLED    = -1;
  ENABLED     = 1;
}

message TeraFlowController {
  ContextId ctl_id = 1;
  string ipaddress = 2;
}

message AuthenticationResult {
  ContextId ctl_id = 1;
  bool authenticated = 2;
}


