/*
 * 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.app";

package nb.app;

import "core/ApplicationProto.proto";
import "core/ApplicationIdProto.proto";
import "app/ApplicationEnumsProto.proto";
import "security/PermissionProto.proto";

message getApplicationsRequest {
}

message getApplicationsReply {
    repeated .core.ApplicationProto application = 1;
}

message getIdRequest {
    string name = 1;
}

message getIdReply {
    .core.ApplicationIdProto application_id = 1;
}

message getApplicationRequest {
    .core.ApplicationIdProto application_id = 1;
}

message getApplicationReply {
    .core.ApplicationProto application = 1;
}

message getStateRequest {
    .core.ApplicationIdProto application_id = 1;
}

message getStateReply {
    .app.ApplicationStateProto state = 1;
}

message getPermissionsRequest {
    .core.ApplicationIdProto application_id = 1;
}

message getPermissionsReply {
    repeated .security.PermissionProto permission = 1;
}

service ApplicationService {
    rpc getApplications(getApplicationsRequest) returns (getApplicationsReply) {}
    rpc getId(getIdRequest) returns (getIdReply) {}
    rpc getApplication(getApplicationRequest) returns (getApplicationReply) {}
    rpc getState(getStateRequest) returns (getStateReply) {}
    rpc getPermissions(getPermissionsRequest) returns (getPermissionsReply) {}
}