e84c2d9388
This change remembers which properties were computed as outputs, or even just read back as default values, during a deployment. This information is required in the before/after comparison in order to perform an intelligent diff that doesn't flag, for example, the absence of "default" values in the after image as deletions (among other things). As I was in here, I also cleaned up the way the provider interface works, dealing with concrete resource types, making it feel a little richer and less like we're doing in-memory RPC.
61 lines
3.3 KiB
Go
61 lines
3.3 KiB
Go
// Licensed to Pulumi Corporation ("Pulumi") under one or more
|
|
// contributor license agreements. See the NOTICE file distributed with
|
|
// this work for additional information regarding copyright ownership.
|
|
// Pulumi 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.
|
|
|
|
package resource
|
|
|
|
import (
|
|
"io"
|
|
|
|
"github.com/pulumi/lumi/pkg/tokens"
|
|
)
|
|
|
|
// Provider presents a simple interface for orchestrating resource create, reead, update, and delete operations. Each
|
|
// provider understands how to handle all of the resource types within a single package.
|
|
//
|
|
// This interface hides some of the messiness of the underlying machinery, since providers are behind an RPC boundary.
|
|
//
|
|
// It is important to note that provider operations are not transactional. (Some providers might decide to offer
|
|
// transactional semantics, but such a provider is a rare treat.) As a result, failures in the operations below can
|
|
// range from benign to catastrophic (possibly leaving behind a corrupt resource). It is up to the provider to make a
|
|
// best effort to ensure catastrophies do not occur. The errors returned from mutating operations indicate both the
|
|
// underlying error condition in addition to a bit indicating whether the operation was successfully rolled back.
|
|
type Provider interface {
|
|
// Closer closes any underlying OS resources associated with this provider (like processes, RPC channels, etc).
|
|
io.Closer
|
|
// Pkg fetches this provider's package.
|
|
Pkg() tokens.Package
|
|
// Check validates that the given property bag is valid for a resource of the given type.
|
|
Check(res Resource) ([]CheckFailure, error)
|
|
// 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.
|
|
Name(res Resource) (tokens.QName, error)
|
|
// Create allocates a new instance of the provided resource and assigns its unique ID afterwards.
|
|
Create(res Resource) (State, error)
|
|
// Get reads the instance state identified by res, and copies it into the target resource object.
|
|
Get(res Resource) error
|
|
// InspectChange checks what impacts a hypothetical update will have on the resource's properties.
|
|
InspectChange(old Resource, new Resource) ([]string, PropertyMap, error)
|
|
// Update updates an existing resource with new values.
|
|
Update(ols Resource, new Resource) (State, error)
|
|
// Delete tears down an existing resource.
|
|
Delete(res Resource) (State, error)
|
|
}
|
|
|
|
// CheckFailure indicates that a call to check failed; it contains the property and reason for the failure.
|
|
type CheckFailure struct {
|
|
Property PropertyKey // the property that failed checking.
|
|
Reason string // the reason the property failed to check.
|
|
}
|