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  }