carlos / platform Public

Clone
git clone https://amadan.net/carlos/platform

Plain git — no account needed to clone.

Download

Download this file

1package provision
2
3import (
4 "context"
5 "errors"
6
7 "github.com/carlosframework/platform/internal/controlname"
8 "github.com/carlosframework/platform/internal/release"
9)
10
11type RetireRef struct {
12 Family, Account, App, Host, Name, By string
13 // Required by rollbacks: never retire a successor to the failed attempt.
14 Incarnation string
15}
16type ClaimRetirer interface {
17 RetireRecord(context.Context, RetireRef) error
18}
19type RetireOptions struct {
20 HostClaim bool
21 Claims ClaimRetirer
22}
23
24var ErrClaimRetirer = errors.New("provision: claim retirement unavailable")
25
26func RetireRecord(ctx context.Context, s release.Store, ref RetireRef, opt RetireOptions) error {
27 if !opt.HostClaim {
28 switch ref.Family {
29 case "instance":
30 return DeleteRecord(ctx, s, ref.Account, ref.App, ref.Host)
31 case "sidecar":
32 return DeleteSidecarRecord(ctx, s, ref.Account, ref.App, ref.Name)
33 default:
34 return ErrClaimRetirer
35 }
36 }
37 if opt.Claims == nil || !controlname.ValidAccount(ref.Account) || !controlname.ValidApp(ref.App) || !controlname.ValidHostShape(ref.Host) {
38 return ErrClaimRetirer
39 }
40 switch ref.Family {
41 case "instance":
42 if ref.Name != "" {
43 return ErrClaimRetirer
44 }
45 case "sidecar":
46 if !controlname.ValidLabel(ref.Name) || ref.Host != SidecarHost(ref.Name, ref.App, ref.Account) {
47 return ErrClaimRetirer
48 }
49 default:
50 return ErrClaimRetirer
51 }
52 return opt.Claims.RetireRecord(ctx, ref)
53}
54