github.com/altoros/juju-vmware@v0.0.0-20150312064031-f19ae857ccca/provider/joyent/export_test.go (about) 1 // Copyright 2013 Joyent Inc. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package joyent 5 6 import ( 7 "bytes" 8 "fmt" 9 "text/template" 10 "time" 11 12 "github.com/joyent/gosign/auth" 13 jc "github.com/juju/testing/checkers" 14 "github.com/juju/utils" 15 gc "gopkg.in/check.v1" 16 17 "github.com/juju/juju/constraints" 18 "github.com/juju/juju/environs" 19 "github.com/juju/juju/environs/config" 20 "github.com/juju/juju/environs/configstore" 21 "github.com/juju/juju/environs/imagemetadata" 22 "github.com/juju/juju/environs/instances" 23 "github.com/juju/juju/environs/jujutest" 24 "github.com/juju/juju/environs/storage" 25 envtesting "github.com/juju/juju/environs/testing" 26 "github.com/juju/juju/testing" 27 ) 28 29 // Use ShortAttempt to poll for short-term events. 30 var ShortAttempt = utils.AttemptStrategy{ 31 Total: 5 * time.Second, 32 Delay: 200 * time.Millisecond, 33 } 34 35 var Provider environs.EnvironProvider = GetProviderInstance() 36 var EnvironmentVariables = environmentVariables 37 38 var indexData = ` 39 { 40 "index": { 41 "com.ubuntu.cloud:released:joyent": { 42 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 43 "clouds": [ 44 { 45 "region": "{{.Region}}", 46 "endpoint": "{{.SdcEndpoint.URL}}" 47 } 48 ], 49 "cloudname": "joyent", 50 "datatype": "image-ids", 51 "format": "products:1.0", 52 "products": [ 53 "com.ubuntu.cloud:server:14.04:amd64", 54 "com.ubuntu.cloud:server:12.10:amd64", 55 "com.ubuntu.cloud:server:13.04:amd64" 56 ], 57 "path": "streams/v1/com.ubuntu.cloud:released:joyent.json" 58 } 59 }, 60 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 61 "format": "index:1.0" 62 } 63 ` 64 65 var imagesData = ` 66 { 67 "content_id": "com.ubuntu.cloud:released:joyent", 68 "format": "products:1.0", 69 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 70 "datatype": "image-ids", 71 "products": { 72 "com.ubuntu.cloud:server:14.04:amd64": { 73 "release": "trusty", 74 "version": "14.04", 75 "arch": "amd64", 76 "versions": { 77 "20140214": { 78 "items": { 79 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 80 "region": "some-region", 81 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 82 "virt": "kvm" 83 } 84 }, 85 "pubname": "ubuntu-trusty-14.04-amd64-server-20140214", 86 "label": "release" 87 } 88 } 89 }, 90 "com.ubuntu.cloud:server:12.10:amd64": { 91 "release": "quantal", 92 "version": "12.10", 93 "arch": "amd64", 94 "versions": { 95 "20140214": { 96 "items": { 97 "11223344-0a0a-ee88-22ab-00aa11bb22cc": { 98 "region": "some-region", 99 "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc", 100 "virt": "kvm" 101 } 102 }, 103 "pubname": "ubuntu-quantal-12.10-amd64-server-20140214", 104 "label": "release" 105 } 106 } 107 }, 108 "com.ubuntu.cloud:server:13.04:amd64": { 109 "release": "raring", 110 "version": "13.04", 111 "arch": "amd64", 112 "versions": { 113 "20140214": { 114 "items": { 115 "11223344-0a0a-dd77-33cd-abcd1234e5f6": { 116 "region": "some-region", 117 "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6", 118 "virt": "kvm" 119 } 120 }, 121 "pubname": "ubuntu-raring-13.04-amd64-server-20140214", 122 "label": "release" 123 } 124 } 125 } 126 } 127 } 128 ` 129 130 func parseIndexData(creds *auth.Credentials) bytes.Buffer { 131 var metadata bytes.Buffer 132 133 t := template.Must(template.New("").Parse(indexData)) 134 if err := t.Execute(&metadata, creds); err != nil { 135 panic(fmt.Errorf("cannot generate index metdata: %v", err)) 136 } 137 138 return metadata 139 } 140 141 // This provides the content for code accessing test://host/... URLs. This allows 142 // us to set the responses for things like the Metadata server, by pointing 143 // metadata requests at test://host/... 144 var testRoundTripper = &jujutest.ProxyRoundTripper{} 145 146 func init() { 147 testRoundTripper.RegisterForScheme("test") 148 } 149 150 var origImagesUrl = imagemetadata.DefaultBaseURL 151 152 // Set Metadata requests to be served by the filecontent supplied. 153 func UseExternalTestImageMetadata(creds *auth.Credentials) { 154 metadata := parseIndexData(creds) 155 files := map[string]string{ 156 "/streams/v1/index.json": metadata.String(), 157 "/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData, 158 } 159 testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil) 160 imagemetadata.DefaultBaseURL = "test://host" 161 } 162 163 func UnregisterExternalTestImageMetadata() { 164 testRoundTripper.Sub = nil 165 imagemetadata.DefaultBaseURL = origImagesUrl 166 } 167 168 // RegisterMachinesEndpoint creates a fake endpoint so that 169 // machines api calls succeed. 170 func RegisterMachinesEndpoint() { 171 files := map[string]string{ 172 "/test/machines": "", 173 } 174 testRoundTripper.Sub = jujutest.NewCannedRoundTripper(files, nil) 175 } 176 177 // UnregisterMachinesEndpoint resets the machines endpoint. 178 func UnregisterMachinesEndpoint() { 179 testRoundTripper.Sub = nil 180 } 181 182 func FindInstanceSpec(e environs.Environ, series, arch, cons string) (spec *instances.InstanceSpec, err error) { 183 env := e.(*joyentEnviron) 184 spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{ 185 Series: series, 186 Arches: []string{arch}, 187 Region: env.Ecfg().Region(), 188 Constraints: constraints.MustParse(cons), 189 }) 190 return 191 } 192 193 func ControlBucketName(e environs.Environ) string { 194 env := e.(*joyentEnviron) 195 return env.Storage().(*JoyentStorage).GetContainerName() 196 } 197 198 func CreateContainer(s *JoyentStorage) error { 199 return s.createContainer() 200 } 201 202 // MakeConfig creates a functional environConfig for a test. 203 func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig { 204 cfg, err := config.New(config.NoDefaults, attrs) 205 c.Assert(err, jc.ErrorIsNil) 206 env, err := environs.Prepare(cfg, envtesting.BootstrapContext(c), configstore.NewMem()) 207 c.Assert(err, jc.ErrorIsNil) 208 return env.(*joyentEnviron).Ecfg() 209 } 210 211 // MakeCredentials creates credentials for a test. 212 func MakeCredentials(c *gc.C, attrs testing.Attrs) *auth.Credentials { 213 creds, err := credentials(MakeConfig(c, attrs)) 214 c.Assert(err, jc.ErrorIsNil) 215 return creds 216 } 217 218 // MakeStorage creates an env storage for a test. 219 func MakeStorage(c *gc.C, attrs testing.Attrs) storage.Storage { 220 stor, err := newStorage(MakeConfig(c, attrs), "") 221 c.Assert(err, jc.ErrorIsNil) 222 return stor 223 } 224 225 var GetPorts = getPorts 226 227 var CreateFirewallRuleAll = createFirewallRuleAll 228 229 var CreateFirewallRuleVm = createFirewallRuleVm