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 }