github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/cloudconfig/providerinit/providerinit.go (about)

     1  // Copyright 2013, 2015 Canonical Ltd.
     2  // Copyright 2015 Cloudbase Solutions SRL
     3  // Licensed under the AGPLv3, see LICENCE file for details.
     4  
     5  // This package offers userdata in a gzipped format to be used by different
     6  // cloud providers
     7  package providerinit
     8  
     9  import (
    10  	"github.com/juju/errors"
    11  	"github.com/juju/loggo"
    12  	"github.com/juju/utils/series"
    13  
    14  	"github.com/juju/juju/cloudconfig"
    15  	"github.com/juju/juju/cloudconfig/cloudinit"
    16  	"github.com/juju/juju/cloudconfig/instancecfg"
    17  	"github.com/juju/juju/cloudconfig/providerinit/renderers"
    18  )
    19  
    20  var logger = loggo.GetLogger("juju.cloudconfig.providerinit")
    21  
    22  func configureCloudinit(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig) (cloudconfig.UserdataConfig, error) {
    23  	// When bootstrapping, we only want to apt-get update/upgrade
    24  	// and setup the SSH keys. The rest we leave to cloudinit/sshinit.
    25  	udata, err := cloudconfig.NewUserdataConfig(icfg, cloudcfg)
    26  	if err != nil {
    27  		return nil, err
    28  	}
    29  	if icfg.Bootstrap {
    30  		err = udata.ConfigureBasic()
    31  		if err != nil {
    32  			return nil, err
    33  		}
    34  		return udata, nil
    35  	}
    36  	err = udata.Configure()
    37  	if err != nil {
    38  		return nil, err
    39  	}
    40  	return udata, nil
    41  }
    42  
    43  // ComposeUserData fills out the provided cloudinit configuration structure
    44  // so it is suitable for initialising a machine with the given configuration,
    45  // and then renders it and encodes it using the supplied renderer.
    46  // When calling ComposeUserData a encoding implementation must be chosen from
    47  // the providerinit/encoders package according to the need of the provider.
    48  //
    49  // If the provided cloudcfg is nil, a new one will be created internally.
    50  func ComposeUserData(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig, renderer renderers.ProviderRenderer) ([]byte, error) {
    51  	if cloudcfg == nil {
    52  		var err error
    53  		cloudcfg, err = cloudinit.New(icfg.Series)
    54  		if err != nil {
    55  			return nil, errors.Trace(err)
    56  		}
    57  	}
    58  	_, err := configureCloudinit(icfg, cloudcfg)
    59  	if err != nil {
    60  		return nil, errors.Trace(err)
    61  	}
    62  	operatingSystem, err := series.GetOSFromSeries(icfg.Series)
    63  	if err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  	udata, err := renderer.Render(cloudcfg, operatingSystem)
    67  	if err != nil {
    68  		return nil, errors.Trace(err)
    69  	}
    70  	logger.Tracef("Generated cloud init:\n%s", string(udata))
    71  	return udata, err
    72  }