forked from cloudfoundry/cli
/
actor.go
87 lines (70 loc) · 2.42 KB
/
actor.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
81
82
83
84
85
86
87
// Package v7pushaction contains the business logic for orchestrating a V2 app
// push.
package v7pushaction
import (
"regexp"
)
// Warnings is a list of warnings returned back from the cloud controller
type Warnings []string
// Actor handles all business logic for Cloud Controller operations.
type Actor struct {
SharedActor SharedActor
V7Actor V7Actor
PreparePushPlanSequence []UpdatePushPlanFunc
ChangeApplicationSequence func(plan PushPlan) []ChangeApplicationFunc
TransformManifestSequence []HandleFlagOverrideFunc
startWithProtocol *regexp.Regexp
urlValidator *regexp.Regexp
}
const ProtocolRegexp = "^https?://|^tcp://"
const URLRegexp = "^(?:https?://|tcp://)?(?:(?:[\\w-]+\\.)|(?:[*]\\.))+\\w+(?:\\:\\d+)?(?:/.*)*(?:\\.\\w+)?$"
// NewActor returns a new actor.
func NewActor(v3Actor V7Actor, sharedActor SharedActor) *Actor {
actor := &Actor{
SharedActor: sharedActor,
V7Actor: v3Actor,
startWithProtocol: regexp.MustCompile(ProtocolRegexp),
urlValidator: regexp.MustCompile(URLRegexp),
}
actor.TransformManifestSequence = []HandleFlagOverrideFunc{
// app name override must come first, so it can trim the manifest
// from multiple apps down to just one
HandleAppNameOverride,
HandleInstancesOverride,
HandleStartCommandOverride,
// Type must come before endpoint because endpoint validates against type
HandleHealthCheckTypeOverride,
HandleHealthCheckEndpointOverride,
HandleHealthCheckTimeoutOverride,
HandleMemoryOverride,
HandleDiskOverride,
HandleNoRouteOverride,
HandleRandomRouteOverride,
HandleTaskOverride,
// this must come after all routing related transforms
HandleDefaultRouteOverride,
HandleDockerImageOverride,
HandleDockerUsernameOverride,
HandleStackOverride,
HandleBuildpacksOverride,
HandleStrategyOverride,
HandleAppPathOverride,
HandleDropletPathOverride,
}
actor.PreparePushPlanSequence = []UpdatePushPlanFunc{
SetDefaultBitsPathForPushPlan,
SetupDropletPathForPushPlan,
actor.SetupAllResourcesForPushPlan,
SetupDeploymentStrategyForPushPlan,
SetupNoStartForPushPlan,
SetupNoWaitForPushPlan,
SetupTaskAppForPushPlan,
}
actor.ChangeApplicationSequence = func(plan PushPlan) []ChangeApplicationFunc {
var sequence []ChangeApplicationFunc
sequence = append(sequence, actor.GetPrepareApplicationSourceSequence(plan)...)
sequence = append(sequence, actor.GetRuntimeSequence(plan)...)
return sequence
}
return actor
}