github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/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/cloud" 18 "github.com/juju/juju/constraints" 19 "github.com/juju/juju/environs" 20 "github.com/juju/juju/environs/imagemetadata" 21 "github.com/juju/juju/environs/instances" 22 sstesting "github.com/juju/juju/environs/simplestreams/testing" 23 envtesting "github.com/juju/juju/environs/testing" 24 "github.com/juju/juju/jujuclient/jujuclienttesting" 25 "github.com/juju/juju/testing" 26 ) 27 28 // Use ShortAttempt to poll for short-term events. 29 var ShortAttempt = utils.AttemptStrategy{ 30 Total: 5 * time.Second, 31 Delay: 200 * time.Millisecond, 32 } 33 34 var Provider environs.EnvironProvider = GetProviderInstance() 35 var EnvironmentVariables = environmentVariables 36 37 var indexData = ` 38 { 39 "index": { 40 "com.ubuntu.cloud:released:joyent": { 41 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 42 "clouds": [ 43 { 44 "region": "{{.Region}}", 45 "endpoint": "{{.SdcEndpoint.URL}}" 46 } 47 ], 48 "cloudname": "joyent", 49 "datatype": "image-ids", 50 "format": "products:1.0", 51 "products": [ 52 "com.ubuntu.cloud:server:16.04:amd64", 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:16.04:amd64": { 73 "release": "trusty", 74 "version": "16.04", 75 "arch": "amd64", 76 "versions": { 77 "20160216": { 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-16.04-amd64-server-20160216", 86 "label": "release" 87 } 88 } 89 }, 90 "com.ubuntu.cloud:server:14.04:amd64": { 91 "release": "trusty", 92 "version": "14.04", 93 "arch": "amd64", 94 "versions": { 95 "20140214": { 96 "items": { 97 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 98 "region": "some-region", 99 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 100 "virt": "kvm" 101 } 102 }, 103 "pubname": "ubuntu-trusty-14.04-amd64-server-20140214", 104 "label": "release" 105 } 106 } 107 }, 108 "com.ubuntu.cloud:server:12.10:amd64": { 109 "release": "quantal", 110 "version": "12.10", 111 "arch": "amd64", 112 "versions": { 113 "20140214": { 114 "items": { 115 "11223344-0a0a-ee88-22ab-00aa11bb22cc": { 116 "region": "some-region", 117 "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc", 118 "virt": "kvm" 119 } 120 }, 121 "pubname": "ubuntu-quantal-12.10-amd64-server-20140214", 122 "label": "release" 123 } 124 } 125 }, 126 "com.ubuntu.cloud:server:13.04:amd64": { 127 "release": "raring", 128 "version": "13.04", 129 "arch": "amd64", 130 "versions": { 131 "20140214": { 132 "items": { 133 "11223344-0a0a-dd77-33cd-abcd1234e5f6": { 134 "region": "some-region", 135 "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6", 136 "virt": "kvm" 137 } 138 }, 139 "pubname": "ubuntu-raring-13.04-amd64-server-20140214", 140 "label": "release" 141 } 142 } 143 } 144 } 145 } 146 ` 147 148 func parseIndexData(creds *auth.Credentials) bytes.Buffer { 149 var metadata bytes.Buffer 150 151 t := template.Must(template.New("").Parse(indexData)) 152 if err := t.Execute(&metadata, creds); err != nil { 153 panic(fmt.Errorf("cannot generate index metdata: %v", err)) 154 } 155 156 return metadata 157 } 158 159 // Set Metadata requests to be served by the filecontent supplied. 160 func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) { 161 metadata := parseIndexData(creds) 162 files := map[string]string{ 163 "/streams/v1/index.json": metadata.String(), 164 "/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData, 165 } 166 sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil) 167 } 168 169 func UnregisterExternalTestImageMetadata() { 170 sstesting.SetRoundTripperFiles(nil, nil) 171 } 172 173 // RegisterMachinesEndpoint creates a fake endpoint so that 174 // machines api calls succeed. 175 func RegisterMachinesEndpoint() { 176 files := map[string]string{ 177 "/test/machines": "", 178 } 179 sstesting.SetRoundTripperFiles(files, nil) 180 } 181 182 // UnregisterMachinesEndpoint resets the machines endpoint. 183 func UnregisterMachinesEndpoint() { 184 sstesting.SetRoundTripperFiles(nil, nil) 185 } 186 187 func FindInstanceSpec( 188 e environs.Environ, series, arch, cons string, 189 imageMetadata []*imagemetadata.ImageMetadata, 190 ) (spec *instances.InstanceSpec, err error) { 191 env := e.(*joyentEnviron) 192 spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{ 193 Series: series, 194 Arches: []string{arch}, 195 Region: env.Ecfg().Region(), 196 Constraints: constraints.MustParse(cons), 197 }, imageMetadata) 198 return 199 } 200 201 func CredentialsAttributes(attrs testing.Attrs) map[string]string { 202 credentialAttrs := make(map[string]string) 203 for _, attr := range []string{"sdc-user", "sdc-key-id", "private-key"} { 204 if v, ok := attrs[attr]; ok && v != "" { 205 credentialAttrs[attr] = fmt.Sprintf("%v", v) 206 } 207 } 208 return credentialAttrs 209 } 210 211 // MakeConfig creates a functional environConfig for a test. 212 func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig { 213 env, err := environs.Prepare( 214 envtesting.BootstrapContext(c), 215 jujuclienttesting.NewMemStore(), 216 environs.PrepareParams{ 217 BaseConfig: attrs, 218 ControllerName: attrs["name"].(string), 219 CloudName: "joyent", 220 Credential: cloud.NewCredential( 221 cloud.UserPassAuthType, 222 CredentialsAttributes(attrs), 223 ), 224 }, 225 ) 226 c.Assert(err, jc.ErrorIsNil) 227 return env.(*joyentEnviron).Ecfg() 228 } 229 230 // MakeCredentials creates credentials for a test. 231 func MakeCredentials(c *gc.C, attrs testing.Attrs) *auth.Credentials { 232 creds, err := credentials(MakeConfig(c, attrs)) 233 c.Assert(err, jc.ErrorIsNil) 234 return creds 235 } 236 237 var GetPorts = getPorts 238 239 var CreateFirewallRuleAll = createFirewallRuleAll 240 241 var CreateFirewallRuleVm = createFirewallRuleVm