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 "fmt" | 8 "fmt" |
9 "strconv" | 9 "strconv" |
10 "strings" | 10 "strings" |
(...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
79 switch dep, comp, err := a.layout.getDeploymentComponent(name); { | 79 switch dep, comp, err := a.layout.getDeploymentComponent(name); { |
80 case err != nil: | 80 case err != nil: |
81 return nil, err | 81 return nil, err |
82 | 82 |
83 case comp != nil: | 83 case comp != nil: |
84 mApp.dp.addProjectComponent(comp) | 84 mApp.dp.addProjectComponent(comp) |
85 err := a.runWork(c, func(w *work) error { | 85 err := a.runWork(c, func(w *work) error { |
86 return mApp.dp.initialize(w, &a.layout) | 86 return mApp.dp.initialize(w, &a.layout) |
87 }) | 87 }) |
88 if err != nil { | 88 if err != nil { |
89 » » » return nil, errors.Annotate(err).Reason("failed to initi
alize deployment plan").Err() | 89 » » » return nil, errors.Annotate(err, "failed to initialize d
eployment plan").Err() |
90 } | 90 } |
91 | 91 |
92 switch comp.GetComponent().(type) { | 92 switch comp.GetComponent().(type) { |
93 case *deploy.Component_AppengineModule: | 93 case *deploy.Component_AppengineModule: |
94 break | 94 break |
95 case *deploy.Component_GkePod: | 95 case *deploy.Component_GkePod: |
96 mApp.subcommands = append(mApp.subcommands, []*subcomman
ds.Command{ | 96 mApp.subcommands = append(mApp.subcommands, []*subcomman
ds.Command{ |
97 { | 97 { |
98 UsageLine: "kubectl <args...>", | 98 UsageLine: "kubectl <args...>", |
99 ShortDesc: "run a kubectl command", | 99 ShortDesc: "run a kubectl command", |
(...skipping 29 matching lines...) Expand all Loading... |
129 default: | 129 default: |
130 break | 130 break |
131 } | 131 } |
132 | 132 |
133 default: | 133 default: |
134 mApp.dp.addDeployment(dep) | 134 mApp.dp.addDeployment(dep) |
135 err := a.runWork(c, func(w *work) error { | 135 err := a.runWork(c, func(w *work) error { |
136 return mApp.dp.initialize(w, &a.layout) | 136 return mApp.dp.initialize(w, &a.layout) |
137 }) | 137 }) |
138 if err != nil { | 138 if err != nil { |
139 » » » return nil, errors.Annotate(err).Reason("failed to initi
alize deployment plan").Err() | 139 » » » return nil, errors.Annotate(err, "failed to initialize d
eployment plan").Err() |
140 } | 140 } |
141 | 141 |
142 if cp := dep.cloudProject; cp != nil { | 142 if cp := dep.cloudProject; cp != nil { |
143 mApp.subcommands = append(mApp.subcommands, &subcommands
.Command{ | 143 mApp.subcommands = append(mApp.subcommands, &subcommands
.Command{ |
144 UsageLine: "update_appengine", | 144 UsageLine: "update_appengine", |
145 ShortDesc: "update AppEngine parameters", | 145 ShortDesc: "update AppEngine parameters", |
146 LongDesc: "Update AppEngine cron, dispatch, ind
ex, and queue configurations.", | 146 LongDesc: "Update AppEngine cron, dispatch, ind
ex, and queue configurations.", |
147 CommandRun: func() subcommands.CommandRun { | 147 CommandRun: func() subcommands.CommandRun { |
148 return &updateGAECommandRun{ | 148 return &updateGAECommandRun{ |
149 project: cp, | 149 project: cp, |
(...skipping 25 matching lines...) Expand all Loading... |
175 bp, err := getPodBindingForCluster(cmd.comp, cmd.cluster) | 175 bp, err := getPodBindingForCluster(cmd.comp, cmd.cluster) |
176 if err != nil { | 176 if err != nil { |
177 logError(c, err, "Failed to identify cluster.") | 177 logError(c, err, "Failed to identify cluster.") |
178 return 1 | 178 return 1 |
179 } | 179 } |
180 | 180 |
181 var rv int | 181 var rv int |
182 err = a.runWork(c, func(w *work) error { | 182 err = a.runWork(c, func(w *work) error { |
183 kubeCtx, err := getContainerEngineKubernetesContext(w, bp.cluste
r) | 183 kubeCtx, err := getContainerEngineKubernetesContext(w, bp.cluste
r) |
184 if err != nil { | 184 if err != nil { |
185 » » » return errors.Annotate(err).Err() | 185 » » » return errors.Annotate(err, "").Err() |
186 } | 186 } |
187 | 187 |
188 kubectl, err := w.tools.kubectl(kubeCtx) | 188 kubectl, err := w.tools.kubectl(kubeCtx) |
189 if err != nil { | 189 if err != nil { |
190 » » » return errors.Annotate(err).Err() | 190 » » » return errors.Annotate(err, "").Err() |
191 } | 191 } |
192 | 192 |
193 rv, err = kubectl.exec(args...).forwardOutput().run(w) | 193 rv, err = kubectl.exec(args...).forwardOutput().run(w) |
194 return err | 194 return err |
195 }) | 195 }) |
196 if err != nil { | 196 if err != nil { |
197 logError(c, err, "Failed to run kubectl command.") | 197 logError(c, err, "Failed to run kubectl command.") |
198 if rv == 0 { | 198 if rv == 0 { |
199 rv = 1 | 199 rv = 1 |
200 } | 200 } |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
245 if cmd.dryRun { | 245 if cmd.dryRun { |
246 log.Infof(c, "(Dry run) Generated 'gcloud' command: gcloud %s",
strings.Join(gcloudArgs, " ")) | 246 log.Infof(c, "(Dry run) Generated 'gcloud' command: gcloud %s",
strings.Join(gcloudArgs, " ")) |
247 return 0 | 247 return 0 |
248 } | 248 } |
249 | 249 |
250 var rv int | 250 var rv int |
251 err = a.runWork(c, func(w *work) (err error) { | 251 err = a.runWork(c, func(w *work) (err error) { |
252 cloudProjectName := bp.pod.comp.dep.cloudProject.Name | 252 cloudProjectName := bp.pod.comp.dep.cloudProject.Name |
253 gcloud, err := w.tools.gcloud(cloudProjectName) | 253 gcloud, err := w.tools.gcloud(cloudProjectName) |
254 if err != nil { | 254 if err != nil { |
255 » » » return errors.Annotate(err).Err() | 255 » » » return errors.Annotate(err, "").Err() |
256 } | 256 } |
257 | 257 |
258 if rv, err = gcloud.exec(gcloudArgs[0], gcloudArgs[1:]...).run(w
); err != nil { | 258 if rv, err = gcloud.exec(gcloudArgs[0], gcloudArgs[1:]...).run(w
); err != nil { |
259 » » » return errors.Annotate(err).Reason("failed to run 'gclou
d' command").Err() | 259 » » » return errors.Annotate(err, "failed to run 'gcloud' comm
and").Err() |
260 } | 260 } |
261 return nil | 261 return nil |
262 }) | 262 }) |
263 if err != nil { | 263 if err != nil { |
264 logError(c, err, "Failed to run gcloud command.") | 264 logError(c, err, "Failed to run gcloud command.") |
265 if rv == 0 { | 265 if rv == 0 { |
266 rv = 1 | 266 rv = 1 |
267 } | 267 } |
268 } | 268 } |
269 return rv | 269 return rv |
270 } | 270 } |
271 | 271 |
272 func getPodBindingForCluster(comp *layoutDeploymentComponent, cluster string) (*
layoutDeploymentGKEPodBinding, error) { | 272 func getPodBindingForCluster(comp *layoutDeploymentComponent, cluster string) (*
layoutDeploymentGKEPodBinding, error) { |
273 var bp *layoutDeploymentGKEPodBinding | 273 var bp *layoutDeploymentGKEPodBinding |
274 switch { | 274 switch { |
275 case cluster != "": | 275 case cluster != "": |
276 cluster := comp.dep.cloudProject.gkeClusters[cluster] | 276 cluster := comp.dep.cloudProject.gkeClusters[cluster] |
277 if cluster == nil { | 277 if cluster == nil { |
278 » » » return nil, errors.Reason("invalid GKE cluster name: %(n
ame)q"). | 278 » » » return nil, errors.Reason("invalid GKE cluster name: %q"
, cluster).Err() |
279 » » » » D("name", cluster). | |
280 » » » » Err() | |
281 } | 279 } |
282 for _, gkeBP := range comp.gkePods { | 280 for _, gkeBP := range comp.gkePods { |
283 if gkeBP.cluster == cluster { | 281 if gkeBP.cluster == cluster { |
284 bp = gkeBP | 282 bp = gkeBP |
285 break | 283 break |
286 } | 284 } |
287 } | 285 } |
288 | 286 |
289 case len(comp.gkePods) == 0: | 287 case len(comp.gkePods) == 0: |
290 return nil, errors.New("pod is not bound to any clusters") | 288 return nil, errors.New("pod is not bound to any clusters") |
291 | 289 |
292 case len(comp.gkePods) == 1: | 290 case len(comp.gkePods) == 1: |
293 bp = comp.gkePods[0] | 291 bp = comp.gkePods[0] |
294 | 292 |
295 default: | 293 default: |
296 clusters := make([]string, len(comp.gkePods)) | 294 clusters := make([]string, len(comp.gkePods)) |
297 for i, cluster := range comp.gkePods { | 295 for i, cluster := range comp.gkePods { |
298 clusters[i] = fmt.Sprintf("- %s", cluster.cluster.Name) | 296 clusters[i] = fmt.Sprintf("- %s", cluster.cluster.Name) |
299 } | 297 } |
300 | 298 |
301 return nil, errors.Reason("the Kubernetes pod is bound to multip
le clusters. Specify one with -cluster"). | 299 return nil, errors.Reason("the Kubernetes pod is bound to multip
le clusters. Specify one with -cluster"). |
302 » » » D("clusters", clusters). | 300 » » » InternalReason("clusters(%v)", clusters).Err() |
303 » » » Err() | |
304 } | 301 } |
305 if bp == nil { | 302 if bp == nil { |
306 return nil, errors.New("Could not identify cluster for pod.") | 303 return nil, errors.New("Could not identify cluster for pod.") |
307 } | 304 } |
308 return bp, nil | 305 return bp, nil |
309 } | 306 } |
310 | 307 |
311 //////////////////////////////////////////////////////////////////////////////// | 308 //////////////////////////////////////////////////////////////////////////////// |
312 // Manage / GAE | 309 // Manage / GAE |
313 //////////////////////////////////////////////////////////////////////////////// | 310 //////////////////////////////////////////////////////////////////////////////// |
(...skipping 21 matching lines...) Expand all Loading... |
335 err := a.runWork(c, func(w *work) error { | 332 err := a.runWork(c, func(w *work) error { |
336 a.dp.params.stage = deployCommit | 333 a.dp.params.stage = deployCommit |
337 return a.dp.deploy(w) | 334 return a.dp.deploy(w) |
338 }) | 335 }) |
339 if err != nil { | 336 if err != nil { |
340 logError(c, err, "Failed to update GAE parameters.") | 337 logError(c, err, "Failed to update GAE parameters.") |
341 return 1 | 338 return 1 |
342 } | 339 } |
343 return rv | 340 return rv |
344 } | 341 } |
OLD | NEW |