github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/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/os/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 != nil {
    30  		err = udata.ConfigureBasic()
    31  		if err != nil {
    32  			return nil, err
    33  		}
    34  		err = udata.ConfigureCustomOverrides()
    35  		if err != nil {
    36  			return nil, err
    37  		}
    38  		return udata, nil
    39  	}
    40  	err = udata.Configure()
    41  	if err != nil {
    42  		return nil, err
    43  	}
    44  	return udata, nil
    45  }
    46  
    47  // ComposeUserData fills out the provided cloudinit configuration structure
    48  // so it is suitable for initialising a machine with the given configuration,
    49  // and then renders it and encodes it using the supplied renderer.
    50  // When calling ComposeUserData a encoding implementation must be chosen from
    51  // the providerinit/encoders package according to the need of the provider.
    52  //
    53  // If the provided cloudcfg is nil, a new one will be created internally.
    54  func ComposeUserData(icfg *instancecfg.InstanceConfig, cloudcfg cloudinit.CloudConfig, renderer renderers.ProviderRenderer) ([]byte, error) {
    55  	if cloudcfg == nil {
    56  		var err error
    57  		cloudcfg, err = cloudinit.New(icfg.Series)
    58  		if err != nil {
    59  			return nil, errors.Trace(err)
    60  		}
    61  	}
    62  	_, err := configureCloudinit(icfg, cloudcfg)
    63  	if err != nil {
    64  		return nil, errors.Trace(err)
    65  	}
    66  	operatingSystem, err := series.GetOSFromSeries(icfg.Series)
    67  	if err != nil {
    68  		return nil, errors.Trace(err)
    69  	}
    70  	udata, err := renderer.Render(cloudcfg, operatingSystem)
    71  	if err != nil {
    72  		return nil, errors.Trace(err)
    73  	}
    74  	logger.Tracef("Generated cloud init:\n%s", string(udata))
    75  	return udata, err
    76  }