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