// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: MPL-2.0

syntax = "proto3";
package hashicorp.nomad.plugins.base.proto;
option go_package = "proto";

import "plugins/shared/hclspec/hcl_spec.proto";

// BasePlugin is the methods that all Nomad plugins must support.
service BasePlugin {

  // PluginInfo describes the type and version of a plugin.
  rpc PluginInfo(PluginInfoRequest) returns (PluginInfoResponse) {}

  // ConfigSchema returns the schema for parsing the plugins configuration.
  rpc ConfigSchema(ConfigSchemaRequest) returns (ConfigSchemaResponse) {}

  // SetConfig is used to set the configuration.
  rpc SetConfig(SetConfigRequest) returns (SetConfigResponse) {}
}

// PluginType enumerates the type of plugins Nomad supports
enum PluginType {
  UNKNOWN = 0;
  DRIVER = 2;
  DEVICE = 3;
}

// PluginInfoRequest is used to request the plugins basic information.
message PluginInfoRequest {}

// PluginInfoResponse returns basic information about the plugin such
// that Nomad can decide whether to load the plugin or not.
message PluginInfoResponse {
  // type indicates what type of plugin this is.
  PluginType type = 1;

  // plugin_api_versions indicates the versions of the Nomad Plugin API
  // this plugin supports.
  repeated string plugin_api_versions = 2;

  // plugin_version is the semver version of this individual plugin.
  // This is divorce from Nomad’s development and versioning.
  string plugin_version = 3;

  // name is the name of the plugin
  string name = 4;
}

// ConfigSchemaRequest is used to request the configurations schema.
message ConfigSchemaRequest {}

// ConfigSchemaResponse returns the plugins configuration schema.
message ConfigSchemaResponse {
  // spec is the plugins configuration schema
  hashicorp.nomad.plugins.shared.hclspec.Spec spec = 1;
}

// SetConfigRequest is used to set the configuration
message SetConfigRequest {
  // msgpack_config is the configuration encoded as MessagePack.
  bytes msgpack_config = 1;

  // nomad_config is the nomad client configuration sent to all plugins.
  NomadConfig nomad_config = 2;

  // plugin_api_version is the api version to use.
  string plugin_api_version = 3;
}

// NomadConfig is the client configuration sent to all plugins
message NomadConfig {
    // driver specific configuration sent to all plugins
    NomadDriverConfig driver = 1;
}

// NomadDriverConfig is the driver specific client configuration sent to all
// driver plugins
message NomadDriverConfig {
    // ClientMaxPort is the upper range of the ports that the client uses for
    // communicating with plugin subsystems over loopback
    // buf:lint:ignore FIELD_LOWER_SNAKE_CASE
    uint32 ClientMaxPort = 1;

    // ClientMinPort is the lower range of the ports that the client uses for
    // communicating with plugin subsystems over loopback
    // buf:lint:ignore FIELD_LOWER_SNAKE_CASE
    uint32 ClientMinPort = 2;
}

// SetConfigResponse is used to respond to setting the configuration
message SetConfigResponse {}
