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  }