@@ -129,11 +129,11 @@ func (b *ecsAPIService) parse(ctx context.Context, project *types.Project, templ
129
129
if err != nil {
130
130
return r , err
131
131
}
132
- r . vpc , r . subnets , err = b .parseVPCExtension (ctx , project )
132
+ err = b .parseLoadBalancerExtension (ctx , project , & r )
133
133
if err != nil {
134
134
return r , err
135
135
}
136
- r . loadBalancer , r . loadBalancerType , err = b .parseLoadBalancerExtension (ctx , project )
136
+ err = b .parseVPCExtension (ctx , project , & r )
137
137
if err != nil {
138
138
return r , err
139
139
}
@@ -165,7 +165,7 @@ func (b *ecsAPIService) parseClusterExtension(ctx context.Context, project *type
165
165
return nil , nil
166
166
}
167
167
168
- func (b * ecsAPIService ) parseVPCExtension (ctx context.Context , project * types.Project ) ( string , [] awsResource , error ) {
168
+ func (b * ecsAPIService ) parseVPCExtension (ctx context.Context , project * types.Project , r * awsResources ) error {
169
169
var vpc string
170
170
if x , ok := project .Extensions [extensionVPC ]; ok {
171
171
vpc = x .(string )
@@ -177,57 +177,75 @@ func (b *ecsAPIService) parseVPCExtension(ctx context.Context, project *types.Pr
177
177
vpc = id [i + 1 :]
178
178
}
179
179
180
+ if r .vpc != "" {
181
+ if r .vpc != vpc {
182
+ return fmt .Errorf ("load balancer set by %s is attached to VPC %s" , extensionLoadBalancer , r .vpc )
183
+ }
184
+ return nil
185
+ }
186
+
180
187
err = b .aws .CheckVPC (ctx , vpc )
181
188
if err != nil {
182
- return "" , nil , err
189
+ return err
183
190
}
184
191
185
192
} else {
193
+ if r .vpc != "" {
194
+ return nil
195
+ }
196
+
186
197
defaultVPC , err := b .aws .GetDefaultVPC (ctx )
187
198
if err != nil {
188
- return "" , nil , err
199
+ return err
189
200
}
190
201
vpc = defaultVPC
191
202
}
192
203
193
204
subNets , err := b .aws .GetSubNets (ctx , vpc )
194
205
if err != nil {
195
- return "" , nil , err
206
+ return err
196
207
}
197
208
198
209
var publicSubNets []awsResource
199
210
for _ , subNet := range subNets {
200
- isPublic , err := b .aws .IsPublicSubnet (ctx , vpc , subNet .ID ())
211
+ isPublic , err := b .aws .IsPublicSubnet (ctx , subNet .ID ())
201
212
if err != nil {
202
- return "" , nil , err
213
+ return err
203
214
}
204
215
if isPublic {
205
216
publicSubNets = append (publicSubNets , subNet )
206
217
}
207
218
}
208
219
209
220
if len (publicSubNets ) < 2 {
210
- return "" , nil , fmt .Errorf ("VPC %s should have at least 2 associated public subnets in different availability zones" , vpc )
221
+ return fmt .Errorf ("VPC %s should have at least 2 associated public subnets in different availability zones" , vpc )
211
222
}
212
- return vpc , publicSubNets , nil
223
+
224
+ r .vpc = vpc
225
+ r .subnets = subNets
226
+ return nil
213
227
}
214
228
215
- func (b * ecsAPIService ) parseLoadBalancerExtension (ctx context.Context , project * types.Project ) ( awsResource , string , error ) {
229
+ func (b * ecsAPIService ) parseLoadBalancerExtension (ctx context.Context , project * types.Project , r * awsResources ) error {
216
230
if x , ok := project .Extensions [extensionLoadBalancer ]; ok {
217
231
nameOrArn := x .(string )
218
- loadBalancer , loadBalancerType , err := b .aws .ResolveLoadBalancer (ctx , nameOrArn )
232
+ loadBalancer , loadBalancerType , vpc , subnets , err := b .aws .ResolveLoadBalancer (ctx , nameOrArn )
219
233
if err != nil {
220
- return nil , "" , err
234
+ return err
221
235
}
222
236
223
237
required := getRequiredLoadBalancerType (project )
224
238
if loadBalancerType != required {
225
- return nil , "" , fmt .Errorf ("load balancer %q is of type %s, project require a %s" , nameOrArn , loadBalancerType , required )
239
+ return fmt .Errorf ("load balancer %q is of type %s, project require a %s" , nameOrArn , loadBalancerType , required )
226
240
}
227
241
228
- return loadBalancer , loadBalancerType , err
242
+ r .loadBalancer = loadBalancer
243
+ r .loadBalancerType = loadBalancerType
244
+ r .vpc = vpc
245
+ r .subnets = subnets
246
+ return err
229
247
}
230
- return nil , "" , nil
248
+ return nil
231
249
}
232
250
233
251
func (b * ecsAPIService ) parseExternalNetworks (ctx context.Context , project * types.Project ) (map [string ]string , error ) {
0 commit comments