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  }