/*
 * Licensed to the Apache Software Foundation (ASF) under one or more
 * contributor license agreements.  See the NOTICE file distributed with
 * this work for additional information regarding copyright ownership.
 * The ASF licenses this file to You 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";

package skywalking.v3;

option java_multiple_files = true;
option java_package = "org.apache.skywalking.apm.network.language.agent.v3";
option csharp_namespace = "SkyWalking.NetworkProtocol.V3";
option go_package = "skywalking.apache.org/repo/goapi/collect/agent/configuration/v3";

import "common/Common.proto";

// Fetch the latest dynamic configurations of the service.
service ConfigurationDiscoveryService {
    // fetchConfigurations service requests the latest configuration.
    // Expect command of Commands is:
    //    command: CDS # meaning ConfigurationDiscoveryService's response
    //    args: Include string key and string value pair.
    //          The key depends on the agent implementation.
    //          The value is the latest value in String value. The watcher of key owner takes the responsibility to convert it to the correct type or format.
    //          One reserved key is `UUID`. The value would help reducing the traffic load between agent and OAP if there is no change.
    // Commands could be empty if no change detected based on ConfigurationSyncRequest.
    rpc fetchConfigurations (ConfigurationSyncRequest) returns (Commands) {
    }
}

message ConfigurationSyncRequest {
    // Current agent service name.
    string service = 1;

    // [Optional]
    // UUID is the unique id to represent the signature of the latest configuration.
    // The agent usually uses its bootstrap configuration running in default, and this id could be empty when doing the 1st round sync.
    // The agent could/is recommended to cache the UUID from the last command, and put it as the next round UUID parameter, 
    // then the OAP only returns the empty Commands if no configuration change happenned.
    string uuid = 2;
}
