mirror of
https://github.com/coder/coder.git
synced 2025-07-03 16:13:58 +00:00
Closes https://github.com/coder/internal/issues/369 We can't know whether a replacement (i.e. drift of terraform state leading to a resource needing to be deleted/recreated) will take place apriori; we can only detect it at `plan` time, because the provider decides whether a resource must be replaced and it cannot be inferred through static analysis of the template. **This is likely to be the most common gotcha with using prebuilds, since it requires a slight template modification to use prebuilds effectively**, so let's head this off before it's an issue for customers. Drift details will now be logged in the workspace build logs:  Plus a notification will be sent to template admins when this situation arises:  A new metric - `coderd_prebuilt_workspaces_resource_replacements_total` - will also increment each time a workspace encounters replacements. We only track _that_ a resource replacement occurred, not how many. Just one is enough to ruin a prebuild, but we can't know apriori which replacement would cause this. For example, say we have 2 replacements: a `docker_container` and a `null_resource`; we don't know which one might cause an issue (or indeed if either would), so we just track the replacement. --------- Signed-off-by: Danny Kopping <dannykopping@gmail.com>
41 lines
1.3 KiB
Go
41 lines
1.3 KiB
Go
package prebuilds
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
"github.com/coder/coder/v2/coderd/database"
|
|
sdkproto "github.com/coder/coder/v2/provisionersdk/proto"
|
|
)
|
|
|
|
type NoopReconciler struct{}
|
|
|
|
func (NoopReconciler) Run(context.Context) {}
|
|
func (NoopReconciler) Stop(context.Context, error) {}
|
|
func (NoopReconciler) TrackResourceReplacement(context.Context, uuid.UUID, uuid.UUID, []*sdkproto.ResourceReplacement) {
|
|
}
|
|
func (NoopReconciler) ReconcileAll(context.Context) error { return nil }
|
|
func (NoopReconciler) SnapshotState(context.Context, database.Store) (*GlobalSnapshot, error) {
|
|
return &GlobalSnapshot{}, nil
|
|
}
|
|
func (NoopReconciler) ReconcilePreset(context.Context, PresetSnapshot) error { return nil }
|
|
func (NoopReconciler) CalculateActions(context.Context, PresetSnapshot) (*ReconciliationActions, error) {
|
|
return &ReconciliationActions{}, nil
|
|
}
|
|
|
|
var DefaultReconciler ReconciliationOrchestrator = NoopReconciler{}
|
|
|
|
type NoopClaimer struct{}
|
|
|
|
func (NoopClaimer) Claim(context.Context, uuid.UUID, string, uuid.UUID) (*uuid.UUID, error) {
|
|
// Not entitled to claim prebuilds in AGPL version.
|
|
return nil, ErrAGPLDoesNotSupportPrebuiltWorkspaces
|
|
}
|
|
|
|
func (NoopClaimer) Initiator() uuid.UUID {
|
|
return uuid.Nil
|
|
}
|
|
|
|
var DefaultClaimer Claimer = NoopClaimer{}
|