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