-
Notifications
You must be signed in to change notification settings - Fork 55
/
manifest.go
80 lines (68 loc) · 2.43 KB
/
manifest.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
package actions
import (
"context"
"fmt"
"code.cloudfoundry.org/korifi/api/actions/manifest"
"code.cloudfoundry.org/korifi/api/actions/shared"
"code.cloudfoundry.org/korifi/api/authorization"
apierrors "code.cloudfoundry.org/korifi/api/errors"
"code.cloudfoundry.org/korifi/api/payloads"
)
//counterfeiter:generate -o fake -fake-name StateCollector . StateCollector
type StateCollector interface {
CollectState(ctx context.Context, authInfo authorization.Info, appName, spaceGUID string) (manifest.AppState, error)
}
//counterfeiter:generate -o fake -fake-name Normalizer . Normalizer
type Normalizer interface {
Normalize(appInfo payloads.ManifestApplication, appState manifest.AppState) payloads.ManifestApplication
}
//counterfeiter:generate -o fake -fake-name Applier . Applier
type Applier interface {
Apply(ctx context.Context, authInfo authorization.Info, spaceGUID string, appInfo payloads.ManifestApplication, appState manifest.AppState) error
}
type Manifest struct {
domainRepo shared.CFDomainRepository
defaultDomainName string
stateCollector StateCollector
normalizer Normalizer
applier Applier
}
func NewManifest(domainRepo shared.CFDomainRepository, defaultDomainName string, stateCollector StateCollector, normalizer Normalizer, applier Applier,
) *Manifest {
return &Manifest{
domainRepo: domainRepo,
defaultDomainName: defaultDomainName,
stateCollector: stateCollector,
normalizer: normalizer,
applier: applier,
}
}
func (a *Manifest) Apply(ctx context.Context, authInfo authorization.Info, spaceGUID string, manifesto payloads.Manifest) error {
err := a.ensureDefaultDomainConfigured(ctx, authInfo)
if err != nil {
return err
}
for _, appInfo := range manifesto.Applications {
appState, err := a.stateCollector.CollectState(ctx, authInfo, appInfo.Name, spaceGUID)
if err != nil {
return err
}
appInfo = a.normalizer.Normalize(appInfo, appState)
err = a.applier.Apply(ctx, authInfo, spaceGUID, appInfo, appState)
if err != nil {
return err
}
}
return nil
}
func (a *Manifest) ensureDefaultDomainConfigured(ctx context.Context, authInfo authorization.Info) error {
_, err := a.domainRepo.GetDomainByName(ctx, authInfo, a.defaultDomainName)
if err != nil {
return apierrors.AsUnprocessableEntity(
err,
fmt.Sprintf("The configured default domain %q was not found", a.defaultDomainName),
apierrors.NotFoundError{},
)
}
return nil
}