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 }