Rietveld Code Review Tool
Help | Bug tracker | Discussion group | Source code | Sign in
(453)

Side by Side Diff: environs/ec2/ec2.go

Issue 6500052: environs: add BootstrapConfig
Patch Set: environs: add BootstrapConfig Created 5 years, 4 months ago
Left:
Right:
Use n/p to move between diff chunks; N/P to move between comments. Please Sign in to add in-line comments.
Jump to:
View unified diff | Download patch
OLDNEW
1 package ec2 1 package ec2
2 2
3 import ( 3 import (
4 "fmt" 4 "fmt"
5 "io/ioutil" 5 "io/ioutil"
6 "launchpad.net/goamz/aws" 6 "launchpad.net/goamz/aws"
7 "launchpad.net/goamz/ec2" 7 "launchpad.net/goamz/ec2"
8 "launchpad.net/goamz/s3" 8 "launchpad.net/goamz/s3"
9 "launchpad.net/juju-core/environs" 9 "launchpad.net/juju-core/environs"
10 "launchpad.net/juju-core/environs/cloudinit" 10 "launchpad.net/juju-core/environs/cloudinit"
(...skipping 105 matching lines...) Expand 10 before | Expand all | Expand 10 after
116 m := make(map[string]interface{}) 116 m := make(map[string]interface{})
117 ecfg, err := providerInstance.newConfig(cfg) 117 ecfg, err := providerInstance.newConfig(cfg)
118 if err != nil { 118 if err != nil {
119 return nil, err 119 return nil, err
120 } 120 }
121 m["access-key"] = ecfg.accessKey() 121 m["access-key"] = ecfg.accessKey()
122 m["secret-key"] = ecfg.secretKey() 122 m["secret-key"] = ecfg.secretKey()
123 return m, nil 123 return m, nil
124 } 124 }
125 125
126 func (environProvider) publicAttrs(cfg *config.Config) (map[string]interface{}, error) {
127 m := make(map[string]interface{})
128 ecfg, err := providerInstance.newConfig(cfg)
129 if err != nil {
130 return nil, err
131 }
132 for k, v := range ecfg.UnknownAttrs() {
133 m[k] = v
134 }
135 secret, err := providerInstance.SecretAttrs(cfg)
136 if err != nil {
137 return nil, err
138 }
139 for k, _ := range secret {
140 delete(m, k)
141 }
142 return m, nil
143 }
144
145 func (environProvider) PublicAddress() (string, error) { 126 func (environProvider) PublicAddress() (string, error) {
146 return fetchMetadata("public-hostname") 127 return fetchMetadata("public-hostname")
147 } 128 }
148 129
149 func (environProvider) PrivateAddress() (string, error) { 130 func (environProvider) PrivateAddress() (string, error) {
150 return fetchMetadata("local-hostname") 131 return fetchMetadata("local-hostname")
151 } 132 }
152 133
153 func (e *environ) Config() *config.Config { 134 func (e *environ) Config() *config.Config {
154 return e.ecfg().Config 135 return e.ecfg().Config
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
233 } 214 }
234 if _, notFound := err.(*environs.NotFoundError); !notFound { 215 if _, notFound := err.(*environs.NotFoundError); !notFound {
235 return fmt.Errorf("cannot query old bootstrap state: %v", err) 216 return fmt.Errorf("cannot query old bootstrap state: %v", err)
236 } 217 }
237 var tools *state.Tools 218 var tools *state.Tools
238 if uploadTools { 219 if uploadTools {
239 tools, err = environs.PutTools(e.Storage(), nil) 220 tools, err = environs.PutTools(e.Storage(), nil)
240 if err != nil { 221 if err != nil {
241 return fmt.Errorf("cannot upload tools: %v", err) 222 return fmt.Errorf("cannot upload tools: %v", err)
242 } 223 }
224 } else {
225 flags := environs.HighestVersion|environs.CompatVersion
226 tools, err = environs.FindTools(e, version.Current, flags)
227 if err != nil {
228 return fmt.Errorf("cannot find tools: %v", err)
229 }
243 } 230 }
244 231 » config, err := environs.BootstrapConfig(providerInstance, e.Config(), to ols)
245 » config, err := providerInstance.publicAttrs(e.Config())
246 if err != nil { 232 if err != nil {
247 return fmt.Errorf("unable to determine inital configuration: %v" , err) 233 return fmt.Errorf("unable to determine inital configuration: %v" , err)
248 } 234 }
249 inst, err := e.startInstance(0, nil, tools, true, config) 235 inst, err := e.startInstance(0, nil, tools, true, config)
250 if err != nil { 236 if err != nil {
251 return fmt.Errorf("cannot start bootstrap instance: %v", err) 237 return fmt.Errorf("cannot start bootstrap instance: %v", err)
252 } 238 }
253 err = e.saveState(&bootstrapState{ 239 err = e.saveState(&bootstrapState{
254 ZookeeperInstances: []string{inst.Id()}, 240 ZookeeperInstances: []string{inst.Id()},
255 }) 241 })
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
304 // AssignmentPolicy for EC2 is to deploy units only on machines without other 290 // AssignmentPolicy for EC2 is to deploy units only on machines without other
305 // units already assigned, and to launch new machines as required. 291 // units already assigned, and to launch new machines as required.
306 func (e *environ) AssignmentPolicy() state.AssignmentPolicy { 292 func (e *environ) AssignmentPolicy() state.AssignmentPolicy {
307 return state.AssignUnused 293 return state.AssignUnused
308 } 294 }
309 295
310 func (e *environ) StartInstance(machineId int, info *state.Info, tools *state.To ols) (environs.Instance, error) { 296 func (e *environ) StartInstance(machineId int, info *state.Info, tools *state.To ols) (environs.Instance, error) {
311 return e.startInstance(machineId, info, tools, false, nil) 297 return e.startInstance(machineId, info, tools, false, nil)
312 } 298 }
313 299
314 func (e *environ) userData(machineId int, info *state.Info, tools *state.Tools, master bool, config map[string]interface{}) ([]byte, error) { 300 func (e *environ) userData(machineId int, info *state.Info, tools *state.Tools, master bool, config *config.Config) ([]byte, error) {
315 cfg := &cloudinit.MachineConfig{ 301 cfg := &cloudinit.MachineConfig{
316 Provisioner: master, 302 Provisioner: master,
317 StateServer: master, 303 StateServer: master,
318 StateInfo: info, 304 StateInfo: info,
319 InstanceIdAccessor: "$(curl http://169.254.169.254/1.0/meta-data /instance-id)", 305 InstanceIdAccessor: "$(curl http://169.254.169.254/1.0/meta-data /instance-id)",
320 ProviderType: "ec2", 306 ProviderType: "ec2",
321 Tools: tools, 307 Tools: tools,
322 MachineId: machineId, 308 MachineId: machineId,
323 AuthorizedKeys: e.ecfg().AuthorizedKeys(), 309 AuthorizedKeys: e.ecfg().AuthorizedKeys(),
324 Config: config, 310 Config: config,
325 } 311 }
326 cloudcfg, err := cloudinit.New(cfg) 312 cloudcfg, err := cloudinit.New(cfg)
327 if err != nil { 313 if err != nil {
328 return nil, err 314 return nil, err
329 } 315 }
330 return cloudcfg.Render() 316 return cloudcfg.Render()
331 } 317 }
332 318
333 // startInstance is the internal version of StartInstance, used by Bootstrap 319 // startInstance is the internal version of StartInstance, used by Bootstrap
334 // as well as via StartInstance itself. If master is true, a bootstrap 320 // as well as via StartInstance itself. If master is true, a bootstrap
335 // instance will be started. 321 // instance will be started.
336 func (e *environ) startInstance(machineId int, info *state.Info, tools *state.To ols, master bool, config map[string]interface{}) (environs.Instance, error) { 322 func (e *environ) startInstance(machineId int, info *state.Info, tools *state.To ols, master bool, config *config.Config) (environs.Instance, error) {
337 if tools == nil { 323 if tools == nil {
338 var err error 324 var err error
339 » » tools, err = environs.FindTools(e, version.Current) 325 » » flags := environs.HighestVersion|environs.CompatVersion
326 » » tools, err = environs.FindTools(e, version.Current, flags)
340 if err != nil { 327 if err != nil {
341 return nil, err 328 return nil, err
342 } 329 }
343 } 330 }
344 log.Printf("environs/ec2: starting machine %d in %q running tools versio n %q from %q", machineId, e.name, tools.Binary, tools.URL) 331 log.Printf("environs/ec2: starting machine %d in %q running tools versio n %q from %q", machineId, e.name, tools.Binary, tools.URL)
345 spec, err := findInstanceSpec(&instanceConstraint{ 332 spec, err := findInstanceSpec(&instanceConstraint{
346 series: tools.Series, 333 series: tools.Series,
347 arch: tools.Arch, 334 arch: tools.Arch,
348 region: e.ecfg().region(), 335 region: e.ecfg().region(),
349 }) 336 })
(...skipping 483 matching lines...) Expand 10 before | Expand all | Expand 10 after
833 } 820 }
834 var data []byte 821 var data []byte
835 data, err = ioutil.ReadAll(resp.Body) 822 data, err = ioutil.ReadAll(resp.Body)
836 if err != nil { 823 if err != nil {
837 continue 824 continue
838 } 825 }
839 return strings.TrimSpace(string(data)), nil 826 return strings.TrimSpace(string(data)), nil
840 } 827 }
841 return 828 return
842 } 829 }
OLDNEW

Powered by Google App Engine
RSS Feeds Recent Issues | This issue
This is Rietveld 204d58d