github.com/rogpeppe/juju@v0.0.0-20140613142852-6337964b789e/container/userdata.go (about) 1 // Copyright 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package container 5 6 import ( 7 "io/ioutil" 8 "path/filepath" 9 10 "github.com/juju/loggo" 11 12 coreCloudinit "github.com/juju/juju/cloudinit" 13 "github.com/juju/juju/environs/cloudinit" 14 ) 15 16 var ( 17 logger = loggo.GetLogger("juju.container") 18 ) 19 20 // WriteUserData generates the cloud init for the specified machine config, 21 // and writes the serialized form out to a cloud-init file in the directory 22 // specified. 23 func WriteUserData(machineConfig *cloudinit.MachineConfig, directory string) (string, error) { 24 userData, err := cloudInitUserData(machineConfig) 25 if err != nil { 26 logger.Errorf("failed to create user data: %v", err) 27 return "", err 28 } 29 return WriteCloudInitFile(directory, userData) 30 } 31 32 // WriteCloudInitFile writes the data out to a cloud-init file in the 33 // directory specified, and returns the filename. 34 func WriteCloudInitFile(directory string, userData []byte) (string, error) { 35 userDataFilename := filepath.Join(directory, "cloud-init") 36 if err := ioutil.WriteFile(userDataFilename, userData, 0644); err != nil { 37 logger.Errorf("failed to write user data: %v", err) 38 return "", err 39 } 40 return userDataFilename, nil 41 } 42 43 func cloudInitUserData(machineConfig *cloudinit.MachineConfig) ([]byte, error) { 44 cloudConfig := coreCloudinit.New() 45 err := cloudinit.Configure(machineConfig, cloudConfig) 46 if err != nil { 47 return nil, err 48 } 49 50 // Run ifconfig to get the addresses of the internal container at least 51 // logged in the host. 52 cloudConfig.AddRunCmd("ifconfig") 53 54 data, err := cloudConfig.Render() 55 if err != nil { 56 return nil, err 57 } 58 return data, nil 59 }