/*
 * 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/Command.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;
}
