/*
 * Copyright 2017-present Open Networking Foundation
 *
 * 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_package = "org.onosproject.grpc.nb.net.region";

package nb.net.region;

import "net/RegionProto.proto";

message getRegionsRequest {
}

message getRegionsReply {
    repeated .net.RegionProto region = 1;
}

message getRegionRequest {
    string regionId = 1;
}

message getRegionReply {
    .net.RegionProto region = 1;
}

message getRegionForDeviceRequest {
    string deviceId = 1;
}

message getRegionForDeviceReply {
    .net.RegionProto region = 1;
}

message getRegionDevicesRequest {
    string regionId = 1;
}

message getRegionDevicesReply {
    repeated string deviceId = 1;
}

message getRegionHostsRequest {
    string regionId = 1;
}

message getRegionHostsReply {
    repeated string hostId = 1;
}

service RegionService {
    rpc getRegions(getRegionsRequest) returns (getRegionsReply) {}
    rpc getRegion(getRegionRequest) returns (getRegionReply) {}
    rpc getRegionForDevice(getRegionForDeviceRequest) returns (getRegionForDeviceReply) {}
    rpc getRegionDevices(getRegionDevicesRequest) returns (getRegionDevicesReply) {}
    rpc getRegionHosts(getRegionHostsRequest) returns (getRegionHostsReply) {}
}