blob: 40d142d64ff147ac83befc2f9b03b3f5ac174f4c [file] [log] [blame] [edit]
// Copyright (c) HashiCorp, Inc.
// SPDX-License-Identifier: BUSL-1.1
syntax = "proto3";
package terraform1.dependencies;
import "terraform1.proto";
service Dependencies {
// Opens a source bundle that was already extracted into the filesystem
// somewhere, returning an opaque source bundle handle that can be used for
// subsequent operations.
rpc OpenSourceBundle(OpenSourceBundle.Request) returns (OpenSourceBundle.Response);
// Closes a previously-opened source bundle, invalidating the given handle
// and therefore making it safe to delete or modify the bundle directory
// on disk.
rpc CloseSourceBundle(CloseSourceBundle.Request) returns (CloseSourceBundle.Response);
// Reads and parses an existing dependency lock file from the filesystem,
// returning a dependency locks handle.
//
// This function parses a user-provided source file, and so invalid content
// in that file is treated as diagnostics in a successful response rather
// than as an RPC error. Callers must check whether the dependency locks
// handle in the response is set (non-zero) before using it, and treat
// an unset handle as indicating a user error which is described in the
// accompanying diagnostics. Diagnostics can also be returned along with
// a valid handle, e.g. if there are non-blocking warning diagnostics.
rpc OpenDependencyLockFile(OpenDependencyLockFile.Request) returns (OpenDependencyLockFile.Response);
// Creates an in-memory-only dependency locks handle with a fixed set of
// dependency selections provided as arguments.
rpc CreateDependencyLocks(CreateDependencyLocks.Request) returns (CreateDependencyLocks.Response);
rpc CloseDependencyLocks(CloseDependencyLocks.Request) returns (CloseDependencyLocks.Response);
// Returns information about the provider version selections in a
// dependency locks object.
rpc GetLockedProviderDependencies(GetLockedProviderDependencies.Request) returns (GetLockedProviderDependencies.Response);
// Populates a new provider plugin cache directory in the local filesystem
// based on the provider version selections in a given dependency locks
// object.
//
// This particular RPC can only install already-selected provider packages
// recorded in a dependency locks object; it does not support "upgrading"
// provider selections to newer versions as a CLI user would do with
// "terraform init -upgrade", because there would be no way to then
// commit the updated locks to disk as a lock file.
rpc BuildProviderPluginCache(BuildProviderPluginCache.Request) returns (stream BuildProviderPluginCache.Event);
// Opens an existing local filesystem directory as a provider plugin cache
// directory, returning a plugin cache handle that can be used with other
// RPC operations.
rpc OpenProviderPluginCache(OpenProviderPluginCache.Request) returns (OpenProviderPluginCache.Response);
rpc CloseProviderPluginCache(CloseProviderPluginCache.Request) returns (CloseProviderPluginCache.Response);
// Returns information about the specific provider packages that are
// available in the given provider plugin cache.
rpc GetCachedProviders(GetCachedProviders.Request) returns (GetCachedProviders.Response);
// Returns information about the built-in providers that are compiled in
// to this Terraform Core server.
rpc GetBuiltInProviders(GetBuiltInProviders.Request) returns (GetBuiltInProviders.Response);
// Returns a description of the schema for a particular provider in a
// given provider plugin cache, or of a particular built-in provider
// known to this version of Terraform Core.
//
// WARNING: This operation requires executing the selected provider plugin,
// which therefore allows it to run arbitrary code as a child process of
// this Terraform Core server, with access to all of the same resources.
// This should typically be used only with providers explicitly selected
// in a dependency lock file, so users can control what external code
// has the potential to run in a context that probably has access to
// private source code and other sensitive information.
rpc GetProviderSchema(GetProviderSchema.Request) returns (GetProviderSchema.Response);
}
message OpenSourceBundle {
message Request {
string local_path = 1;
}
message Response {
int64 source_bundle_handle = 1;
}
}
message CloseSourceBundle {
message Request {
int64 source_bundle_handle = 1;
}
message Response {
}
}
message OpenDependencyLockFile {
message Request {
int64 source_bundle_handle = 1;
terraform1.SourceAddress source_address = 2;
}
message Response {
int64 dependency_locks_handle = 1;
repeated terraform1.Diagnostic diagnostics = 2;
}
}
message CreateDependencyLocks {
message Request {
// The provider selections to include in the locks object.
//
// A typical value would be the result of an earlier call to
// GetLockedProviderDependencies on some other locks object,
// e.g. if a caller needs to propagate a set of locks from one
// Terraform Core RPC server to another.
repeated terraform1.ProviderPackage provider_selections = 1;
}
message Response {
int64 dependency_locks_handle = 1;
}
}
message CloseDependencyLocks {
message Request {
int64 dependency_locks_handle = 1;
}
message Response {
}
}
message GetLockedProviderDependencies {
message Request {
int64 dependency_locks_handle = 1;
}
message Response {
repeated terraform1.ProviderPackage selected_providers = 1;
}
}
message BuildProviderPluginCache {
message Request {
string cache_dir = 1;
int64 dependency_locks_handle = 2;
repeated InstallMethod installation_methods = 3;
// If set, this populates the cache with plugins for a different
// platform than the one the Terraform Core RPC server is running on.
// If unset (empty) then the cache will be populated with packages
// for the same platform as Terraform Core was built for, if available.
//
// If this is set to a different platform than the Terraform Core RPC
// server's then the generated cache directory will appear empty to
// other operations on this server.
string override_platform = 4;
message InstallMethod {
oneof source {
bool direct = 1;
string local_mirror_dir = 2;
string network_mirror_url = 3;
}
repeated string include = 4;
repeated string exclude = 5;
}
}
message Event {
oneof event {
Pending pending = 1;
ProviderVersion already_installed = 2;
ProviderVersion built_in = 3;
ProviderConstraints query_begin = 4;
ProviderVersion query_success = 5;
ProviderWarnings query_warnings = 6;
FetchBegin fetch_begin = 7;
FetchComplete fetch_complete = 8;
terraform1.Diagnostic diagnostic = 9;
}
message Pending {
repeated ProviderConstraints expected = 1;
}
message ProviderConstraints {
string source_addr = 1;
string versions = 2;
}
message ProviderVersion {
string source_addr = 1;
string version = 2;
}
message ProviderWarnings {
string source_addr = 1;
repeated string warnings = 2;
}
message FetchBegin {
ProviderVersion provider_version = 1;
string location = 2;
}
message FetchComplete {
ProviderVersion provider_version = 1;
AuthResult auth_result = 2;
// If auth_result is one of the "_SIGNED" variants then this
// might contain a UI-oriented identifier for the key that
// signed the package. The exact format of this string is not
// guaranteed; do not attempt to parse it or make automated
// decisions based on it.
string key_id_for_display = 3;
enum AuthResult {
UNKNOWN = 0;
VERIFIED_CHECKSUM = 1;
OFFICIAL_SIGNED = 2;
PARTNER_SIGNED = 3;
SELF_SIGNED = 4;
}
}
}
}
message OpenProviderPluginCache {
message Request {
string cache_dir = 1;
// As with the field of the same name in BuildProviderPluginCache.Request.
//
// If this is set to anything other than this RPC server's native
// platform then any operations that require executing the provider
// plugin are likely to fail due to executable format errors or
// similar. However, it's valid to use the returned handle with
// GetCachedProviders, since it only analyzes the cache metadata
// and doesn't actually run the plugins inside.
string override_platform = 2;
}
message Response {
int64 provider_cache_handle = 1;
}
}
message CloseProviderPluginCache {
message Request {
int64 provider_cache_handle = 1;
}
message Response {
}
}
message GetCachedProviders {
message Request {
int64 provider_cache_handle = 1;
}
message Response {
repeated terraform1.ProviderPackage available_providers = 1;
}
}
message GetBuiltInProviders {
message Request {
}
message Response {
// The built-in providers that are compiled in to this Terraform Core
// server.
//
// This uses terraform1.ProviderPackage messages for consistency with the other
// operations which list providers, but built-in providers do not
// have version numbers nor hashes so those fields will always be
// unset in the result.
repeated terraform1.ProviderPackage available_providers = 1;
}
}
message GetProviderSchema {
message Request {
// The address of the provider to retrieve schema for, using the
// typical provider source address syntax.
//
// When requesting schema based on a terraform1.ProviderPackage message, populate
// this with its "source_addr" field.
string provider_addr = 1;
// The version number of the given provider to retrieve the schema
// of, which must have already been populated into the cache directory.
//
// Not supported for built-in providers because we can only access the
// single "version" of the provider that's compiled into this Terraform
// Core server, and so must be left unset or empty for those.
//
// When requesting schema based on a terraform1.ProviderPackage message, populate
// this with its "version" field.
string provider_version = 2;
// The handle for the previously-opened provider plugin cache to
// load the provider plugin from.
//
// Optional for built-in providers, but can still be specified in that
// case if desired so that callers can safely just send the handle they
// have in all cases and be naive about which providers are and are
// not built in.
int64 provider_cache_handle = 3;
}
message Response {
ProviderSchema schema = 1;
}
}
// ProviderSchema describes the full schema for a particular provider.
message ProviderSchema {
Schema provider_config = 1;
map<string, Schema> managed_resource_types = 2;
map<string, Schema> data_resource_types = 3;
}
// Schema describes a schema for an instance of a particular object, such as
// a resource type or a provider's overall configuration.
message Schema {
// Block is the top level configuration block for this schema.
Block block = 1;
message Block {
repeated Attribute attributes = 1;
repeated NestedBlock block_types = 2;
DocString description = 3;
bool deprecated = 4;
}
message Attribute {
string name = 1;
bytes type = 2;
Object nested_type = 10;
DocString description = 3;
bool required = 4;
bool optional = 5;
bool computed = 6;
bool sensitive = 7;
bool deprecated = 8;
}
message NestedBlock {
enum NestingMode {
INVALID = 0;
SINGLE = 1;
LIST = 2;
SET = 3;
MAP = 4;
GROUP = 5;
}
string type_name = 1;
Block block = 2;
NestingMode nesting = 3;
}
message Object {
enum NestingMode {
INVALID = 0;
SINGLE = 1;
LIST = 2;
SET = 3;
MAP = 4;
}
repeated Attribute attributes = 1;
NestingMode nesting = 3;
}
message DocString {
string description = 1;
Format format = 2;
enum Format {
PLAIN = 0;
MARKDOWN = 1;
}
}
}