pulumi/sdk/proto/provider.proto
joeduffy 5fb014e53c Explicitly track default properties
This changes the RPC interfaces between Lumi and provider ever so
slightly, so that we can track default properties explicitly.  This
is required to perform accurate diffing between inputs provided by
the developer, inputs provided by the system, and outputs.  This is
particularly important for default values that may be indeterminite,
such as those we use in the bridge to auto-generate unique IDs.
Otherwise, we fail to reapply defaults correctly, and trick the
provider into thinking that properties changed when they did not.

This is a small step towards pulumi/lumi#306, in which we will defer
even more responsibility for diffing semantics to the providers.
2017-07-31 18:26:15 -07:00

102 lines
4.4 KiB
Protocol Buffer

// Copyright 2016-2017, Pulumi Corporation. All rights reserved.
syntax = "proto3";
import "google/protobuf/empty.proto";
import "google/protobuf/struct.proto";
package lumirpc;
// ResourceProvider is a service that understands how to create, read, update, or delete resources for types defined
// within a single package. It is driven by the overall planning engine in response to resource diffs.
service ResourceProvider {
// Name names a given resource. Sometimes this will be assigned by a developer, and so the provider
// simply fetches it from the property bag; other times, the provider will assign this based on its own algorithm.
// In any case, resources with the same name must be safe to use interchangeably with one another.
rpc Name(NameRequest) returns (NameResponse) {}
// Check validates that the given property bag is valid for a resource of the given type.
rpc Check(CheckRequest) returns (CheckResponse) {}
// Diff checks what impacts a hypothetical update will have on the resource's properties.
rpc Diff(DiffRequest) returns (DiffResponse) {}
// Create allocates a new instance of the provided resource and returns its unique ID afterwards. (The input ID
// must be blank.) If this call fails, the resource must not have been created (i.e., it is "transacational").
rpc Create(CreateRequest) returns (CreateResponse) {}
// Get reads the instance state identified by ID, returning a populated resource object, or nil if not found.
rpc Get(GetRequest) returns (GetResponse) {}
// Update updates an existing resource with new values.
rpc Update(UpdateRequest) returns (UpdateResponse) {}
// Delete tears down an existing resource with the given ID. If it fails, the resource is assumed to still exist.
rpc Delete(DeleteRequest) returns (google.protobuf.Empty) {}
}
message NameRequest {
string type = 1; // the type token of the resource.
google.protobuf.Struct properties = 2; // the full properties to use for name creation.
}
message NameResponse {
string name = 1; // the name of the resource.
}
message CheckRequest {
string type = 1; // the type token of the resource.
google.protobuf.Struct properties = 2; // the full properties to use for validation.
}
message CheckResponse {
google.protobuf.Struct defaults = 1; // defaults to use, if any.
repeated CheckFailure failures = 2; // any validation failures that occurred.
}
message CheckFailure {
string property = 1; // the property that failed validation.
string reason = 2; // the reason that the property failed validation.
}
message DiffRequest {
string id = 1; // the ID of the resource to diff.
string type = 2; // the type token of the resource to diff.
google.protobuf.Struct olds = 3; // the old values of properties to diff.
google.protobuf.Struct news = 4; // the new values of properties to diff.
}
message DiffResponse {
repeated string replaces = 1; // if this update requires a replacement, the set of properties triggering it.
}
message CreateRequest {
string type = 1; // the type token of the resource.
google.protobuf.Struct properties = 2; // the properties to set during creation.
}
message CreateResponse {
string id = 1; // the ID of the resource created.
google.protobuf.Struct properties = 2; // any properties that were computed during creation.
}
message GetRequest {
string id = 1; // the ID of the resource to read.
string type = 2; // the type token of the resource.
}
message GetResponse {
google.protobuf.Struct properties = 1; // the properties read from the resource.
}
message UpdateRequest {
string id = 1; // the ID of the resource to update.
string type = 2; // the type token of the resource to update.
google.protobuf.Struct olds = 3; // the old values of properties to update.
google.protobuf.Struct news = 4; // the new values of properties to update.
}
message UpdateResponse {
google.protobuf.Struct properties = 1; // any properties that were computed during updating.
}
message DeleteRequest {
string id = 1; // the ID of the resource to delete.
string type = 2; // the type token of the resource to update.
google.protobuf.Struct properties = 3; // the current properties on the resource.
}