OLD | NEW |
1 // Copyright 2016 The LUCI Authors. All rights reserved. | 1 // Copyright 2016 The LUCI Authors. All rights reserved. |
2 // Use of this source code is governed under the Apache License, Version 2.0 | 2 // Use of this source code is governed under the Apache License, Version 2.0 |
3 // that can be found in the LICENSE file. | 3 // that can be found in the LICENSE file. |
4 | 4 |
5 package main | 5 package main |
6 | 6 |
7 import ( | 7 import ( |
8 "io/ioutil" | 8 "io/ioutil" |
9 "path/filepath" | 9 "path/filepath" |
10 "strings" | 10 "strings" |
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
186 case *deploy.AppEngineModule_StaticModule_: | 186 case *deploy.AppEngineModule_StaticModule_: |
187 // A static module presents itself as an empty Python AppEngine
module. This | 187 // A static module presents itself as an empty Python AppEngine
module. This |
188 // doesn't actually need any Python code to support it. | 188 // doesn't actually need any Python code to support it. |
189 appYAML.Runtime = "python27" | 189 appYAML.Runtime = "python27" |
190 appYAML.APIVersion = "1" | 190 appYAML.APIVersion = "1" |
191 threadSafe := true | 191 threadSafe := true |
192 appYAML.ThreadSafe = &threadSafe | 192 appYAML.ThreadSafe = &threadSafe |
193 isStub = true | 193 isStub = true |
194 | 194 |
195 default: | 195 default: |
196 » » return nil, errors.Reason("unsupported runtime %(runtime)q").D("
runtime", aem.Runtime).Err() | 196 » » return nil, errors.Reason("unsupported runtime %q", aem.Runtime)
.Err() |
197 } | 197 } |
198 | 198 |
199 // Classic / Managed VM Properties | 199 // Classic / Managed VM Properties |
200 switch p := aem.GetParams().(type) { | 200 switch p := aem.GetParams().(type) { |
201 case *deploy.AppEngineModule_Classic: | 201 case *deploy.AppEngineModule_Classic: |
202 var icPrefix string | 202 var icPrefix string |
203 switch sc := p.Classic.GetScaling().(type) { | 203 switch sc := p.Classic.GetScaling().(type) { |
204 case nil: | 204 case nil: |
205 // (Automatic, default). | 205 // (Automatic, default). |
206 icPrefix = "F" | 206 icPrefix = "F" |
(...skipping 18 matching lines...) Expand all Loading... |
225 icPrefix = "B" | 225 icPrefix = "B" |
226 | 226 |
227 case *deploy.AppEngineModule_ClassicParams_ManualScaling_: | 227 case *deploy.AppEngineModule_ClassicParams_ManualScaling_: |
228 ms := sc.ManualScaling | 228 ms := sc.ManualScaling |
229 appYAML.ManualScaling = &gaeAppManualScalingParams{ | 229 appYAML.ManualScaling = &gaeAppManualScalingParams{ |
230 Instances: int(ms.Instances), | 230 Instances: int(ms.Instances), |
231 } | 231 } |
232 icPrefix = "B" | 232 icPrefix = "B" |
233 | 233 |
234 default: | 234 default: |
235 » » » return nil, errors.Reason("unknown scaling type %(type)T
").D("type", sc).Err() | 235 » » » return nil, errors.Reason("unknown scaling type %T", sc)
.Err() |
236 } | 236 } |
237 appYAML.InstanceClass = p.Classic.InstanceClass.AppYAMLString(ic
Prefix) | 237 appYAML.InstanceClass = p.Classic.InstanceClass.AppYAMLString(ic
Prefix) |
238 | 238 |
239 case *deploy.AppEngineModule_ManagedVm: | 239 case *deploy.AppEngineModule_ManagedVm: |
240 if scopes := p.ManagedVm.Scopes; len(scopes) > 0 { | 240 if scopes := p.ManagedVm.Scopes; len(scopes) > 0 { |
241 appYAML.BetaSettings = &gaeAppYAMLBetaSettings{ | 241 appYAML.BetaSettings = &gaeAppYAMLBetaSettings{ |
242 ServiceAccountScopes: strings.Join(scopes, ","), | 242 ServiceAccountScopes: strings.Join(scopes, ","), |
243 } | 243 } |
244 } | 244 } |
245 } | 245 } |
(...skipping 22 matching lines...) Expand all Loading... |
268 entry.StaticDir = staticMap[t.StaticBuildDir] | 268 entry.StaticDir = staticMap[t.StaticBuildDir] |
269 | 269 |
270 case *deploy.AppEngineModule_Handler_StaticFiles_: | 270 case *deploy.AppEngineModule_Handler_StaticFiles_: |
271 sf := t.StaticFiles | 271 sf := t.StaticFiles |
272 | 272 |
273 relDir := staticMap[sf.GetBuild()] | 273 relDir := staticMap[sf.GetBuild()] |
274 entry.Upload = filepath.Join(relDir, sf.Upload) | 274 entry.Upload = filepath.Join(relDir, sf.Upload) |
275 entry.StaticFiles = filepath.Join(relDir, sf.Url
Map) | 275 entry.StaticFiles = filepath.Join(relDir, sf.Url
Map) |
276 | 276 |
277 default: | 277 default: |
278 » » » » return nil, errors.Reason("don't know how to han
dle content %(content)T"). | 278 » » » » return nil, errors.Reason("don't know how to han
dle content %T", t). |
279 » » » » » D("content", t).D("url", handler.Url).Er
r() | 279 » » » » » InternalReason("url(%q)", handler.Url).E
rr() |
280 } | 280 } |
281 | 281 |
282 if entry.Script != "" && isStub { | 282 if entry.Script != "" && isStub { |
283 return nil, errors.Reason("stub module cannot ha
ve entry script").Err() | 283 return nil, errors.Reason("stub module cannot ha
ve entry script").Err() |
284 } | 284 } |
285 | 285 |
286 appYAML.Handlers[i] = &entry | 286 appYAML.Handlers[i] = &entry |
287 } | 287 } |
288 } | 288 } |
289 | 289 |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
331 | 331 |
332 for _, m := range cp.appEngineModules { | 332 for _, m := range cp.appEngineModules { |
333 for _, url := range m.resources.Dispatch { | 333 for _, url := range m.resources.Dispatch { |
334 dispatchYAML.Dispatch = append(dispatchYAML.Dispatch, &g
aeDispatchYAMLEntry{ | 334 dispatchYAML.Dispatch = append(dispatchYAML.Dispatch, &g
aeDispatchYAMLEntry{ |
335 Module: m.ModuleName, | 335 Module: m.ModuleName, |
336 URL: url, | 336 URL: url, |
337 }) | 337 }) |
338 } | 338 } |
339 } | 339 } |
340 if count := len(dispatchYAML.Dispatch); count > 10 { | 340 if count := len(dispatchYAML.Dispatch); count > 10 { |
341 » » return nil, errors.Reason("dispatch file has more than 10 routin
g rules (%(count)d)"). | 341 » » return nil, errors.Reason("dispatch file has more than 10 routin
g rules (%d)", count).Err() |
342 » » » D("count", count).Err() | |
343 } | 342 } |
344 return &dispatchYAML, nil | 343 return &dispatchYAML, nil |
345 } | 344 } |
346 | 345 |
347 func gaeBuildQueueYAML(cp *layoutDeploymentCloudProject) (*gaeQueueYAML, error)
{ | 346 func gaeBuildQueueYAML(cp *layoutDeploymentCloudProject) (*gaeQueueYAML, error)
{ |
348 var queueYAML gaeQueueYAML | 347 var queueYAML gaeQueueYAML |
349 | 348 |
350 for _, m := range cp.appEngineModules { | 349 for _, m := range cp.appEngineModules { |
351 for _, queue := range m.resources.TaskQueue { | 350 for _, queue := range m.resources.TaskQueue { |
352 entry := gaeQueueYAMLEntry{ | 351 entry := gaeQueueYAMLEntry{ |
353 Name: queue.Name, | 352 Name: queue.Name, |
354 } | 353 } |
355 switch t := queue.GetType().(type) { | 354 switch t := queue.GetType().(type) { |
356 case *deploy.AppEngineResources_TaskQueue_Push_: | 355 case *deploy.AppEngineResources_TaskQueue_Push_: |
357 push := t.Push | 356 push := t.Push |
358 | 357 |
359 entry.Target = m.ModuleName | 358 entry.Target = m.ModuleName |
360 entry.Mode = "push" | 359 entry.Mode = "push" |
361 entry.Rate = push.Rate | 360 entry.Rate = push.Rate |
362 entry.BucketSize = int(push.BucketSize) | 361 entry.BucketSize = int(push.BucketSize) |
363 entry.MaxConcurrentRequests = int(push.MaxConcur
rentRequests) | 362 entry.MaxConcurrentRequests = int(push.MaxConcur
rentRequests) |
364 entry.RetryParameters = &gaeQueueYAMLEntryRetryP
arameters{ | 363 entry.RetryParameters = &gaeQueueYAMLEntryRetryP
arameters{ |
365 TaskAgeLimit: push.RetryTaskAgeLimi
t, | 364 TaskAgeLimit: push.RetryTaskAgeLimi
t, |
366 MinBackoffSeconds: int(push.RetryMinBack
offSeconds), | 365 MinBackoffSeconds: int(push.RetryMinBack
offSeconds), |
367 MaxBackoffSeconds: int(push.RetryMaxBack
offSeconds), | 366 MaxBackoffSeconds: int(push.RetryMaxBack
offSeconds), |
368 MaxDoublings: int(push.RetryMaxDoub
lings), | 367 MaxDoublings: int(push.RetryMaxDoub
lings), |
369 } | 368 } |
370 | 369 |
371 default: | 370 default: |
372 » » » » return nil, errors.Reason("unknown task queue ty
pe %(type)T").D("type", t).Err() | 371 » » » » return nil, errors.Reason("unknown task queue ty
pe %T", t).Err() |
373 } | 372 } |
374 | 373 |
375 queueYAML.Queue = append(queueYAML.Queue, &entry) | 374 queueYAML.Queue = append(queueYAML.Queue, &entry) |
376 } | 375 } |
377 } | 376 } |
378 return &queueYAML, nil | 377 return &queueYAML, nil |
379 } | 378 } |
380 | 379 |
381 // loadIndexYAMLResource loads an AppEngine "index.yaml" file from the specified | 380 // loadIndexYAMLResource loads an AppEngine "index.yaml" file from the specified |
382 // filesystem path and translates it into AppEngineResources Index entries. | 381 // filesystem path and translates it into AppEngineResources Index entries. |
383 func loadIndexYAMLResource(path string) (*deploy.AppEngineResources, error) { | 382 func loadIndexYAMLResource(path string) (*deploy.AppEngineResources, error) { |
384 data, err := ioutil.ReadFile(path) | 383 data, err := ioutil.ReadFile(path) |
385 if err != nil { | 384 if err != nil { |
386 » » return nil, errors.Annotate(err).Reason("failed to load [%(path)
s]").D("path", path).Err() | 385 » » return nil, errors.Annotate(err, "failed to load [%s]", path).Er
r() |
387 } | 386 } |
388 | 387 |
389 var indexYAML gaeIndexYAML | 388 var indexYAML gaeIndexYAML |
390 if err := yaml.Unmarshal(data, &indexYAML); err != nil { | 389 if err := yaml.Unmarshal(data, &indexYAML); err != nil { |
391 » » return nil, errors.Annotate(err).Reason("could not load 'index.y
aml' from [%(path)s]"). | 390 » » return nil, errors.Annotate(err, "could not load 'index.yaml' fr
om [%s]", path).Err() |
392 » » » D("path", path).Err() | |
393 } | 391 } |
394 | 392 |
395 var res deploy.AppEngineResources | 393 var res deploy.AppEngineResources |
396 if len(indexYAML.Indexes) > 0 { | 394 if len(indexYAML.Indexes) > 0 { |
397 res.Index = make([]*deploy.AppEngineResources_Index, len(indexYA
ML.Indexes)) | 395 res.Index = make([]*deploy.AppEngineResources_Index, len(indexYA
ML.Indexes)) |
398 for i, idx := range indexYAML.Indexes { | 396 for i, idx := range indexYAML.Indexes { |
399 entry := deploy.AppEngineResources_Index{ | 397 entry := deploy.AppEngineResources_Index{ |
400 Kind: idx.Kind, | 398 Kind: idx.Kind, |
401 Ancestor: yesOrBoolToBool(idx.Ancestor), | 399 Ancestor: yesOrBoolToBool(idx.Ancestor), |
402 Property: make([]*deploy.AppEngineResources_Inde
x_Property, len(idx.Properties)), | 400 Property: make([]*deploy.AppEngineResources_Inde
x_Property, len(idx.Properties)), |
403 } | 401 } |
404 for pidx, idxProp := range idx.Properties { | 402 for pidx, idxProp := range idx.Properties { |
405 dir, err := deploy.IndexDirectionFromAppYAMLStri
ng(idxProp.Direction) | 403 dir, err := deploy.IndexDirectionFromAppYAMLStri
ng(idxProp.Direction) |
406 if err != nil { | 404 if err != nil { |
407 » » » » » return nil, errors.Annotate(err).Reason(
"could not identify direction for entry"). | 405 » » » » » return nil, errors.Annotate(err, "could
not identify direction for entry"). |
408 » » » » » » D("index", i).D("propertyIndex",
pidx).Err() | 406 » » » » » » InternalReason("index(%d)/proper
tyIndex(%d)", i, pidx).Err() |
409 } | 407 } |
410 | 408 |
411 entry.Property[pidx] = &deploy.AppEngineResource
s_Index_Property{ | 409 entry.Property[pidx] = &deploy.AppEngineResource
s_Index_Property{ |
412 Name: idxProp.Name, | 410 Name: idxProp.Name, |
413 Direction: dir, | 411 Direction: dir, |
414 } | 412 } |
415 } | 413 } |
416 | 414 |
417 res.Index[i] = &entry | 415 res.Index[i] = &entry |
418 } | 416 } |
(...skipping 13 matching lines...) Expand all Loading... |
432 func yesOrBoolToBool(v interface{}) bool { | 430 func yesOrBoolToBool(v interface{}) bool { |
433 switch t := v.(type) { | 431 switch t := v.(type) { |
434 case string: | 432 case string: |
435 return (t == "yes") | 433 return (t == "yes") |
436 case bool: | 434 case bool: |
437 return t | 435 return t |
438 default: | 436 default: |
439 return false | 437 return false |
440 } | 438 } |
441 } | 439 } |
OLD | NEW |