github.com/makyo/juju@v0.0.0-20160425123129-2608902037e9/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:14.04:amd64", 53 "com.ubuntu.cloud:server:12.10:amd64", 54 "com.ubuntu.cloud:server:13.04:amd64" 55 ], 56 "path": "streams/v1/com.ubuntu.cloud:released:joyent.json" 57 } 58 }, 59 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 60 "format": "index:1.0" 61 } 62 ` 63 64 var imagesData = ` 65 { 66 "content_id": "com.ubuntu.cloud:released:joyent", 67 "format": "products:1.0", 68 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 69 "datatype": "image-ids", 70 "products": { 71 "com.ubuntu.cloud:server:14.04:amd64": { 72 "release": "trusty", 73 "version": "14.04", 74 "arch": "amd64", 75 "versions": { 76 "20140214": { 77 "items": { 78 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 79 "region": "some-region", 80 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 81 "virt": "kvm" 82 } 83 }, 84 "pubname": "ubuntu-trusty-14.04-amd64-server-20140214", 85 "label": "release" 86 } 87 } 88 }, 89 "com.ubuntu.cloud:server:12.10:amd64": { 90 "release": "quantal", 91 "version": "12.10", 92 "arch": "amd64", 93 "versions": { 94 "20140214": { 95 "items": { 96 "11223344-0a0a-ee88-22ab-00aa11bb22cc": { 97 "region": "some-region", 98 "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc", 99 "virt": "kvm" 100 } 101 }, 102 "pubname": "ubuntu-quantal-12.10-amd64-server-20140214", 103 "label": "release" 104 } 105 } 106 }, 107 "com.ubuntu.cloud:server:13.04:amd64": { 108 "release": "raring", 109 "version": "13.04", 110 "arch": "amd64", 111 "versions": { 112 "20140214": { 113 "items": { 114 "11223344-0a0a-dd77-33cd-abcd1234e5f6": { 115 "region": "some-region", 116 "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6", 117 "virt": "kvm" 118 } 119 }, 120 "pubname": "ubuntu-raring-13.04-amd64-server-20140214", 121 "label": "release" 122 } 123 } 124 } 125 } 126 } 127 ` 128 129 func parseIndexData(creds *auth.Credentials) bytes.Buffer { 130 var metadata bytes.Buffer 131 132 t := template.Must(template.New("").Parse(indexData)) 133 if err := t.Execute(&metadata, creds); err != nil { 134 panic(fmt.Errorf("cannot generate index metdata: %v", err)) 135 } 136 137 return metadata 138 } 139 140 // Set Metadata requests to be served by the filecontent supplied. 141 func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) { 142 metadata := parseIndexData(creds) 143 files := map[string]string{ 144 "/streams/v1/index.json": metadata.String(), 145 "/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData, 146 } 147 sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil) 148 } 149 150 func UnregisterExternalTestImageMetadata() { 151 sstesting.SetRoundTripperFiles(nil, nil) 152 } 153 154 // RegisterMachinesEndpoint creates a fake endpoint so that 155 // machines api calls succeed. 156 func RegisterMachinesEndpoint() { 157 files := map[string]string{ 158 "/test/machines": "", 159 } 160 sstesting.SetRoundTripperFiles(files, nil) 161 } 162 163 // UnregisterMachinesEndpoint resets the machines endpoint. 164 func UnregisterMachinesEndpoint() { 165 sstesting.SetRoundTripperFiles(nil, nil) 166 } 167 168 func FindInstanceSpec( 169 e environs.Environ, series, arch, cons string, 170 imageMetadata []*imagemetadata.ImageMetadata, 171 ) (spec *instances.InstanceSpec, err error) { 172 env := e.(*joyentEnviron) 173 spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{ 174 Series: series, 175 Arches: []string{arch}, 176 Region: env.Ecfg().Region(), 177 Constraints: constraints.MustParse(cons), 178 }, imageMetadata) 179 return 180 } 181 182 func CredentialsAttributes(attrs testing.Attrs) map[string]string { 183 credentialAttrs := make(map[string]string) 184 for _, attr := range []string{"sdc-user", "sdc-key-id", "private-key"} { 185 if v, ok := attrs[attr]; ok && v != "" { 186 credentialAttrs[attr] = fmt.Sprintf("%v", v) 187 } 188 } 189 return credentialAttrs 190 } 191 192 // MakeConfig creates a functional environConfig for a test. 193 func MakeConfig(c *gc.C, attrs testing.Attrs) *environConfig { 194 env, err := environs.Prepare( 195 envtesting.BootstrapContext(c), 196 jujuclienttesting.NewMemStore(), 197 environs.PrepareParams{ 198 BaseConfig: attrs, 199 ControllerName: attrs["name"].(string), 200 CloudName: "joyent", 201 Credential: cloud.NewCredential( 202 cloud.UserPassAuthType, 203 CredentialsAttributes(attrs), 204 ), 205 }, 206 ) 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 var GetPorts = getPorts 219 220 var CreateFirewallRuleAll = createFirewallRuleAll 221 222 var CreateFirewallRuleVm = createFirewallRuleVm