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