* Lift snapshot management out of the engine This PR is a prerequisite for parallelism by addressing a major problem that the engine has to deal with when performing parallel resource construction: parallel mutation of the global snapshot. This PR adds a `SnapshotManager` type that is responsible for maintaining and persisting the current resource snapshot. It serializes all reads and writes to the global snapshot and persists the snapshot to persistent storage upon every write. As a side-effect of this, the core engine no longer needs to know about snapshot management at all; all snapshot operations can be handled as callbacks on deployment events. This will greatly simplify the parallelization of the core engine. Worth noting is that the core engine will still need to be able to read the current snapshot, since it is interested in the dependency graphs contained within. The full implications of that are out of scope of this PR. Remove dead code, Steps no longer need a reference to the plan iterator that created them Fixing various issues that arise when bringing up pulumi-aws Line length broke the build Code review: remove dead field, fix yaml name error Rebase against master, provide implementation of StackPersister for cloud backend Code review feedback: comments on MutationStatus, style in snapshot.go Code review feedback: move SnapshotManager to pkg/backend, change engine to use an interface SnapshotManager Code review feedback: use a channel for synchronization Add a comment and a new test * Maintain two checkpoints, an immutable base and a mutable delta, and periodically merge the two to produce snapshots * Add a lot of tests - covers all of the non-error paths of BeginMutation and End * Fix a test resource provider * Add a few tests, fix a few issues * Rebase against master, fixed merge
46 lines
1.4 KiB
Go
46 lines
1.4 KiB
Go
// Copyright 2018, Pulumi Corporation. All rights reserved.
|
|
|
|
package engine
|
|
|
|
import (
|
|
"github.com/pulumi/pulumi/pkg/resource/deploy"
|
|
"github.com/pulumi/pulumi/pkg/resource/plugin"
|
|
"github.com/pulumi/pulumi/pkg/util/contract"
|
|
"github.com/pulumi/pulumi/pkg/workspace"
|
|
)
|
|
|
|
func Destroy(u UpdateInfo, manager SnapshotManager,
|
|
events chan<- Event, opts UpdateOptions) (ResourceChanges, error) {
|
|
contract.Require(u != nil, "u")
|
|
contract.Require(manager != nil, "manager")
|
|
|
|
defer func() { events <- cancelEvent() }()
|
|
|
|
ctx, err := newPlanContext(u, manager)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer ctx.Close()
|
|
|
|
emitter := makeEventEmitter(events, u)
|
|
return update(ctx, planOptions{
|
|
UpdateOptions: opts,
|
|
SourceFunc: newDestroySource,
|
|
Events: emitter,
|
|
Diag: newEventSink(emitter),
|
|
})
|
|
}
|
|
|
|
func newDestroySource(opts planOptions, proj *workspace.Project, pwd, main string,
|
|
target *deploy.Target, plugctx *plugin.Context) (deploy.Source, error) {
|
|
// For destroy, we consult the manifest for the plugin versions/ required to destroy it.
|
|
if target != nil && target.Snapshot != nil {
|
|
if err := plugctx.Host.EnsurePlugins(target.Snapshot.Manifest.Plugins); err != nil {
|
|
return nil, err
|
|
}
|
|
}
|
|
|
|
// Create a nil source. This simply returns "nothing" as the new state, which will cause the
|
|
// engine to destroy the entire existing state.
|
|
return deploy.NullSource, nil
|
|
}
|