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 }