github.com/cloud-green/juju@v0.0.0-20151002100041-a00291338d3d/apiserver/client/instanceconfig.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 "errors" 8 "fmt" 9 10 "github.com/juju/juju/apiserver/common" 11 "github.com/juju/juju/apiserver/params" 12 "github.com/juju/juju/cloudconfig/instancecfg" 13 "github.com/juju/juju/environmentserver/authentication" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/state" 16 ) 17 18 // InstanceConfig returns information from the environment config that 19 // is needed for machine cloud-init (for non-state servers only). It 20 // is exposed for testing purposes. 21 // TODO(rog) fix environs/manual tests so they do not need to call this, or move this elsewhere. 22 func InstanceConfig(st *state.State, machineId, nonce, dataDir string) (*instancecfg.InstanceConfig, error) { 23 environConfig, err := st.EnvironConfig() 24 if err != nil { 25 return nil, err 26 } 27 28 // Get the machine so we can get its series and arch. 29 // If the Arch is not set in hardware-characteristics, 30 // an error is returned. 31 machine, err := st.Machine(machineId) 32 if err != nil { 33 return nil, err 34 } 35 hc, err := machine.HardwareCharacteristics() 36 if err != nil { 37 return nil, err 38 } 39 if hc.Arch == nil { 40 return nil, fmt.Errorf("arch is not set for %q", machine.Tag()) 41 } 42 43 // Find the appropriate tools information. 44 agentVersion, ok := environConfig.AgentVersion() 45 if !ok { 46 return nil, errors.New("no agent version set in environment configuration") 47 } 48 environment, err := st.Environment() 49 if err != nil { 50 return nil, err 51 } 52 urlGetter := common.NewToolsURLGetter(environment.UUID(), st) 53 toolsFinder := common.NewToolsFinder(st, st, urlGetter) 54 findToolsResult, err := toolsFinder.FindTools(params.FindToolsParams{ 55 Number: agentVersion, 56 MajorVersion: -1, 57 MinorVersion: -1, 58 Series: machine.Series(), 59 Arch: *hc.Arch, 60 }) 61 if err != nil { 62 return nil, err 63 } 64 if findToolsResult.Error != nil { 65 return nil, findToolsResult.Error 66 } 67 tools := findToolsResult.List[0] 68 69 // Find the API endpoints. 70 env, err := environs.New(environConfig) 71 if err != nil { 72 return nil, err 73 } 74 apiInfo, err := environs.APIInfo(env) 75 if err != nil { 76 return nil, err 77 } 78 79 auth := authentication.NewAuthenticator(st.MongoConnectionInfo(), apiInfo) 80 mongoInfo, apiInfo, err := auth.SetupAuthentication(machine) 81 if err != nil { 82 return nil, err 83 } 84 85 // Find requested networks. 86 networks, err := machine.RequestedNetworks() 87 if err != nil { 88 return nil, err 89 } 90 91 // Figure out if secure connections are supported. 92 info, err := st.StateServingInfo() 93 if err != nil { 94 return nil, err 95 } 96 secureServerConnection := info.CAPrivateKey != "" 97 icfg, err := instancecfg.NewInstanceConfig(machineId, nonce, env.Config().ImageStream(), machine.Series(), 98 secureServerConnection, networks, mongoInfo, apiInfo, 99 ) 100 if err != nil { 101 return nil, err 102 } 103 if dataDir != "" { 104 icfg.DataDir = dataDir 105 } 106 icfg.Tools = tools 107 err = instancecfg.FinishInstanceConfig(icfg, environConfig) 108 if err != nil { 109 return nil, err 110 } 111 return icfg, nil 112 }