github.com/mhilton/juju-juju@v0.0.0-20150901100907-a94dd2c73455/container/testing/common.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package testing
     5  
     6  import (
     7  	"io/ioutil"
     8  	"os"
     9  	"path/filepath"
    10  
    11  	"github.com/juju/errors"
    12  	"github.com/juju/loggo"
    13  	"github.com/juju/names"
    14  	jc "github.com/juju/testing/checkers"
    15  	gc "gopkg.in/check.v1"
    16  
    17  	"github.com/juju/juju/cloudconfig/instancecfg"
    18  	"github.com/juju/juju/container"
    19  	"github.com/juju/juju/container/lxc"
    20  	"github.com/juju/juju/environs/config"
    21  	"github.com/juju/juju/environs/imagemetadata"
    22  	"github.com/juju/juju/instance"
    23  	jujutesting "github.com/juju/juju/juju/testing"
    24  	"github.com/juju/juju/provider/dummy"
    25  	"github.com/juju/juju/tools"
    26  	"github.com/juju/juju/version"
    27  )
    28  
    29  var logger = loggo.GetLogger("juju.container.testing")
    30  
    31  func MockMachineConfig(machineId string) (*instancecfg.InstanceConfig, error) {
    32  
    33  	stateInfo := jujutesting.FakeStateInfo(machineId)
    34  	apiInfo := jujutesting.FakeAPIInfo(machineId)
    35  	instanceConfig, err := instancecfg.NewInstanceConfig(machineId, "fake-nonce", imagemetadata.ReleasedStream, "quantal", true, nil, stateInfo, apiInfo)
    36  	if err != nil {
    37  		return nil, err
    38  	}
    39  	instanceConfig.Tools = &tools.Tools{
    40  		Version: version.MustParseBinary("2.3.4-quantal-amd64"),
    41  		URL:     "http://tools.testing.invalid/2.3.4-quantal-amd64.tgz",
    42  	}
    43  
    44  	return instanceConfig, nil
    45  }
    46  
    47  func CreateContainer(c *gc.C, manager container.Manager, machineId string) instance.Instance {
    48  	instanceConfig, err := MockMachineConfig(machineId)
    49  	c.Assert(err, jc.ErrorIsNil)
    50  
    51  	envConfig, err := config.New(config.NoDefaults, dummy.SampleConfig())
    52  	c.Assert(err, jc.ErrorIsNil)
    53  	instanceConfig.Config = envConfig
    54  	return CreateContainerWithMachineConfig(c, manager, instanceConfig)
    55  }
    56  
    57  func CreateContainerWithMachineConfig(
    58  	c *gc.C,
    59  	manager container.Manager,
    60  	instanceConfig *instancecfg.InstanceConfig,
    61  ) instance.Instance {
    62  
    63  	networkConfig := container.BridgeNetworkConfig("nic42", 0, nil)
    64  	storageConfig := &container.StorageConfig{}
    65  	return CreateContainerWithMachineAndNetworkAndStorageConfig(c, manager, instanceConfig, networkConfig, storageConfig)
    66  }
    67  
    68  func CreateContainerWithMachineAndNetworkAndStorageConfig(
    69  	c *gc.C,
    70  	manager container.Manager,
    71  	instanceConfig *instancecfg.InstanceConfig,
    72  	networkConfig *container.NetworkConfig,
    73  	storageConfig *container.StorageConfig,
    74  ) instance.Instance {
    75  
    76  	if networkConfig != nil && len(networkConfig.Interfaces) > 0 {
    77  		name := "test-" + names.NewMachineTag(instanceConfig.MachineId).String()
    78  		EnsureLXCRootFSEtcNetwork(c, name)
    79  	}
    80  	inst, hardware, err := manager.CreateContainer(instanceConfig, "quantal", networkConfig, storageConfig)
    81  	c.Assert(err, jc.ErrorIsNil)
    82  	c.Assert(hardware, gc.NotNil)
    83  	c.Assert(hardware.String(), gc.Not(gc.Equals), "")
    84  	return inst
    85  }
    86  
    87  func EnsureLXCRootFSEtcNetwork(c *gc.C, containerName string) {
    88  	// Pre-create the mock rootfs dir for the container and
    89  	// /etc/network/ inside it, where the interfaces file will be
    90  	// pre-rendered (unless AUFS is used).
    91  	etcNetwork := filepath.Join(lxc.LxcContainerDir, containerName, "rootfs", "etc", "network")
    92  	logger.Debugf("ensuring root fs /etc/network in %s", etcNetwork)
    93  	err := os.MkdirAll(etcNetwork, 0755)
    94  	c.Assert(err, jc.ErrorIsNil)
    95  	err = ioutil.WriteFile(filepath.Join(etcNetwork, "interfaces"), []byte("#empty"), 0644)
    96  	c.Assert(err, jc.ErrorIsNil)
    97  }
    98  
    99  func AssertCloudInit(c *gc.C, filename string) []byte {
   100  	c.Assert(filename, jc.IsNonEmptyFile)
   101  	data, err := ioutil.ReadFile(filename)
   102  	c.Assert(err, jc.ErrorIsNil)
   103  	c.Assert(string(data), jc.HasPrefix, "#cloud-config\n")
   104  	return data
   105  }
   106  
   107  // CreateContainerTest tries to create a container and returns any errors encountered along the
   108  // way
   109  func CreateContainerTest(c *gc.C, manager container.Manager, machineId string) (instance.Instance, error) {
   110  	instanceConfig, err := MockMachineConfig(machineId)
   111  	if err != nil {
   112  		return nil, errors.Trace(err)
   113  	}
   114  
   115  	envConfig, err := config.New(config.NoDefaults, dummy.SampleConfig())
   116  	if err != nil {
   117  		return nil, errors.Trace(err)
   118  	}
   119  	instanceConfig.Config = envConfig
   120  
   121  	network := container.BridgeNetworkConfig("nic42", 0, nil)
   122  	storage := &container.StorageConfig{}
   123  
   124  	inst, hardware, err := manager.CreateContainer(instanceConfig, "quantal", network, storage)
   125  
   126  	if err != nil {
   127  		return nil, errors.Trace(err)
   128  	}
   129  	if hardware == nil {
   130  		return nil, errors.New("nil hardware characteristics")
   131  	}
   132  	if hardware.String() == "" {
   133  		return nil, errors.New("empty hardware characteristics")
   134  	}
   135  	return inst, nil
   136  
   137  }
   138  
   139  // FakeLxcURLScript is used to replace ubuntu-cloudimg-query in tests.
   140  var FakeLxcURLScript = `#!/bin/bash
   141  echo -n test://cloud-images/$1-$2-$3.tar.gz`
   142  
   143  // MockURLGetter implements ImageURLGetter.
   144  type MockURLGetter struct{}
   145  
   146  func (ug *MockURLGetter) ImageURL(kind instance.ContainerType, series, arch string) (string, error) {
   147  	return "imageURL", nil
   148  }
   149  
   150  func (ug *MockURLGetter) CACert() []byte {
   151  	return []byte("cert")
   152  }