github.com/mattyw/juju@v0.0.0-20140610034352-732aecd63861/state/apiserver/client/machineconfig.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package client 5 6 import ( 7 "fmt" 8 9 "github.com/juju/juju/constraints" 10 "github.com/juju/juju/environs" 11 "github.com/juju/juju/environs/cloudinit" 12 envtools "github.com/juju/juju/environs/tools" 13 "github.com/juju/juju/state" 14 "github.com/juju/juju/tools" 15 ) 16 17 func findInstanceTools(env environs.Environ, series, arch string) (*tools.Tools, error) { 18 agentVersion, ok := env.Config().AgentVersion() 19 if !ok { 20 return nil, fmt.Errorf("no agent version set in environment configuration") 21 } 22 possibleTools, err := envtools.FindInstanceTools(env, agentVersion, series, &arch) 23 if err != nil { 24 return nil, err 25 } 26 return possibleTools[0], nil 27 } 28 29 // MachineConfig returns information from the environment config that is 30 // needed for machine cloud-init (for non-state servers only). 31 // It is exposed for testing purposes. 32 // TODO(rog) fix environs/manual tests so they do not need to 33 // call this, or move this elsewhere. 34 func MachineConfig(st *state.State, machineId, nonce, dataDir string) (*cloudinit.MachineConfig, error) { 35 environConfig, err := st.EnvironConfig() 36 if err != nil { 37 return nil, err 38 } 39 40 // Get the machine so we can get its series and arch. 41 // If the Arch is not set in hardware-characteristics, 42 // an error is returned. 43 machine, err := st.Machine(machineId) 44 if err != nil { 45 return nil, err 46 } 47 hc, err := machine.HardwareCharacteristics() 48 if err != nil { 49 return nil, err 50 } 51 if hc.Arch == nil { 52 return nil, fmt.Errorf("arch is not set for %q", machine.Tag()) 53 } 54 55 // Find the appropriate tools information. 56 env, err := environs.New(environConfig) 57 if err != nil { 58 return nil, err 59 } 60 tools, err := findInstanceTools(env, machine.Series(), *hc.Arch) 61 if err != nil { 62 return nil, err 63 } 64 65 // Find the secrets and API endpoints. 66 auth, err := environs.NewEnvironAuthenticator(env) 67 if err != nil { 68 return nil, err 69 } 70 stateInfo, apiInfo, err := auth.SetupAuthentication(machine) 71 if err != nil { 72 return nil, err 73 } 74 75 // Find requested networks. 76 networks, err := machine.RequestedNetworks() 77 if err != nil { 78 return nil, err 79 } 80 81 mcfg := environs.NewMachineConfig(machineId, nonce, networks, stateInfo, apiInfo) 82 if dataDir != "" { 83 mcfg.DataDir = dataDir 84 } 85 mcfg.Tools = tools 86 err = environs.FinishMachineConfig(mcfg, environConfig, constraints.Value{}) 87 if err != nil { 88 return nil, err 89 } 90 return mcfg, nil 91 }