...
1 package registration
2
3 import (
4 "fmt"
5
6 "edge-infra.dev/pkg/edge/constants/api/cluster"
7 )
8
9 const DefaultLumperImage = "us-east1-docker.pkg.dev/ret-edge-pltf-infra/workloads/lumperctl:latest"
10
11 type Builder struct {
12 reg Registration
13 }
14
15 func NewBuilder() *Builder {
16 return &Builder{}
17 }
18
19
20 func (b *Builder) Build() (*Registration, error) {
21 if err := b.reg.Bff.Valid(); err != nil {
22 return nil, err
23 }
24 if err := b.reg.Cluster.Valid(); err != nil {
25 return nil, err
26 }
27 return &b.reg, nil
28 }
29
30
31 func (b *Builder) BootstrapBuild() (*Registration, error) {
32 if err := b.reg.Bff.Valid(); err != nil {
33 return nil, err
34 }
35 if err := b.reg.Cluster.ValidForBootstrapping(); err != nil {
36 return nil, err
37 }
38 return &b.reg, nil
39 }
40
41
42
43 func (b *Builder) APIEndpoint(endpoint string) *Builder {
44 b.reg.Bff.APIEndpoint = endpoint
45 return b
46 }
47
48 func (b *Builder) BearerToken(bearerToken string) *Builder {
49 b.reg.Bff.BearerToken = bearerToken
50 return b
51 }
52
53 func (b *Builder) BSLUserPassword(user, pwd string) *Builder {
54 b.reg.Bff.BSLUser = user
55 b.reg.Bff.BSLPassword = pwd
56 return b
57 }
58
59 func (b *Builder) TotpToken(token string) *Builder {
60 b.reg.Bff.TotpToken = token
61 return b
62 }
63
64 func (b *Builder) BSLOrganization(org string) *Builder {
65 b.reg.Bff.BSLOrganization = org
66 return b
67 }
68
69
70 func (b *Builder) Banner(banner string) *Builder {
71 b.reg.Cluster.Banner = banner
72 return b
73 }
74
75 func (b *Builder) BannerEdgeID(bannerEdgeID string) *Builder {
76 b.reg.Cluster.BannerEdgeID = bannerEdgeID
77 return b
78 }
79
80 func (b *Builder) Store(store string) *Builder {
81 b.reg.Cluster.Store = store
82 return b
83 }
84
85 func (b *Builder) ClusterType(clusterType string) *Builder {
86 b.reg.Cluster.ClusterType = clusterType
87 return b
88 }
89
90 func (b *Builder) ClusterEdgeID(clusterEdgeID string) *Builder {
91 b.reg.Cluster.ClusterEdgeID = clusterEdgeID
92 return b
93 }
94
95 func (b *Builder) ClusterCaHash(clusterCaHash string) *Builder {
96 b.reg.Cluster.ClusterCaHash = clusterCaHash
97 return b
98 }
99
100 func (b *Builder) ForceBootstrap(force bool) *Builder {
101 b.reg.Cluster.ForceBootstrap = force
102 return b
103 }
104
105
106
107 func (b *Builder) CreateBSLSite(createBSLSite bool) *Builder {
108 b.reg.Bff.CreateBSLSite = createBSLSite
109 return b
110 }
111
112 func (b *Builder) BSLSiteEuid(id string) *Builder {
113 b.reg.Bff.BSLSiteEuid = id
114 return b
115 }
116
117 func (b *Builder) BSLSiteLatitude(latitude float64) *Builder {
118 b.reg.Bff.BSLSiteLatitude = latitude
119 return b
120 }
121
122 func (b *Builder) BSLSiteLongitude(longitude float64) *Builder {
123 b.reg.Bff.BSLSiteLongitude = longitude
124 return b
125 }
126
127 func (b *Builder) BSLSiteReferenceID(referenceID string) *Builder {
128 b.reg.Bff.BSLSiteReferenceID = referenceID
129 return b
130 }
131
132 func (b *Builder) Fleet(fleet string) *Builder {
133 b.reg.Cluster.Fleet = fleet
134 return b
135 }
136
137 func (b *Builder) FleetVersion(fleetVersion string) *Builder {
138 b.reg.Cluster.FleetVersion = fleetVersion
139 return b
140 }
141
142
143 func (b *Builder) EdgeVersion(version string) *Builder {
144 b.reg.Bff.EdgeVersion = version
145 return b
146 }
147
148 func (b *Builder) MachineType(machineType string) *Builder {
149 b.reg.Cluster.MachineType = machineType
150 return b
151 }
152
153 func (b *Builder) Autoscale(autoscale bool) *Builder {
154 b.reg.Cluster.Autoscale = autoscale
155 return b
156 }
157
158 func (b *Builder) Location(location string) *Builder {
159 b.reg.Cluster.Location = location
160 return b
161 }
162
163 func (b *Builder) MinNodes(minNodes int) *Builder {
164 b.reg.Cluster.MinNodes = minNodes
165 return b
166 }
167
168 func (b *Builder) MaxNodes(maxNodes int) *Builder {
169 b.reg.Cluster.MaxNodes = maxNodes
170 return b
171 }
172
173
174
175 func (b BffConfig) Valid() error {
176 if b.APIEndpoint == "" {
177 return fmt.Errorf("backend api endpoint is not provided")
178 }
179 userPasswordProvided := b.BSLUser != "" && b.BSLPassword != ""
180 totpTokenProvided := b.TotpToken != ""
181 bearerTokenProvided := b.BearerToken != ""
182 if !userPasswordProvided && !totpTokenProvided && !bearerTokenProvided {
183 return fmt.Errorf("bsl user/password, bearer or totp token credentials not provided")
184 }
185 if userPasswordProvided && b.BSLOrganization == "" {
186 return fmt.Errorf("bsl organization is not provided")
187 }
188 if b.CreateBSLSite && b.BSLSiteEuid == "" {
189 if b.BSLSiteLatitude < -90 || b.BSLSiteLatitude > 90 {
190 return fmt.Errorf("provided bsl latitide is not within the range of -90.0 and 90.0")
191 }
192 if b.BSLSiteLongitude < -180 || b.BSLSiteLongitude > 180 {
193 return fmt.Errorf("provided bsl longitude is not within the range of -180.0 and 180.0")
194 }
195 }
196 if b.BSLOrganization == "" && !bearerTokenProvided {
197 return fmt.Errorf("BSL Banner not provided")
198 }
199 return nil
200 }
201
202 func (r ClusterInfo) Valid() error {
203 if r.Banner == "" {
204 return fmt.Errorf("banner is not provided")
205 }
206 if r.Store == "" {
207 return fmt.Errorf("store is not provided")
208 }
209 if r.ClusterType == "" {
210 return fmt.Errorf("cluster type is not provided")
211 }
212 if r.Fleet == "" {
213 return fmt.Errorf("fleetType type is not provided")
214 }
215 return nil
216 }
217
218 func (r ClusterInfo) ValidForBootstrapping() error {
219 if r.ClusterEdgeID == "" {
220 return fmt.Errorf("cluster edge id is not provided")
221 }
222 return nil
223 }
224
225 func (r ClusterInfo) IsGKE() bool {
226 return r.ClusterType == cluster.GKE
227 }
228
View as plain text