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 }