github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/joyent/series_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package joyent 5 6 import ( 7 "bytes" 8 "fmt" 9 "html/template" 10 11 "github.com/joyent/gosign/auth" 12 gc "gopkg.in/check.v1" 13 14 "github.com/juju/juju/cloud" 15 "github.com/juju/juju/core/constraints" 16 "github.com/juju/juju/environs" 17 "github.com/juju/juju/environs/imagemetadata" 18 "github.com/juju/juju/environs/instances" 19 sstesting "github.com/juju/juju/environs/simplestreams/testing" 20 jc "github.com/juju/testing/checkers" 21 ) 22 23 var indexData = ` 24 { 25 "index": { 26 "com.ubuntu.cloud:released:joyent": { 27 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 28 "clouds": [ 29 { 30 "region": "{{.Region}}", 31 "endpoint": "{{.SdcEndpoint.URL}}" 32 } 33 ], 34 "cloudname": "joyent", 35 "datatype": "image-ids", 36 "format": "products:1.0", 37 "products": [ 38 "com.ubuntu.cloud:server:18.04:amd64", 39 "com.ubuntu.cloud:server:16.04:amd64", 40 "com.ubuntu.cloud:server:14.04:amd64", 41 "com.ubuntu.cloud:server:12.10:amd64", 42 "com.ubuntu.cloud:server:13.04:amd64" 43 ], 44 "path": "streams/v1/com.ubuntu.cloud:released:joyent.json" 45 } 46 }, 47 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 48 "format": "index:1.0" 49 } 50 ` 51 52 var imagesData = ` 53 { 54 "content_id": "com.ubuntu.cloud:released:joyent", 55 "format": "products:1.0", 56 "updated": "Fri, 14 Feb 2014 13:39:35 +0000", 57 "datatype": "image-ids", 58 "products": { 59 "com.ubuntu.cloud:server:18.04:amd64": { 60 "release": "trusty", 61 "version": "18.04", 62 "arch": "amd64", 63 "versions": { 64 "20160216": { 65 "items": { 66 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 67 "region": "some-region", 68 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 69 "virt": "kvm" 70 } 71 }, 72 "pubname": "ubuntu-trusty-16.04-amd64-server-20160216", 73 "label": "release" 74 } 75 } 76 }, 77 "com.ubuntu.cloud:server:16.04:amd64": { 78 "release": "trusty", 79 "version": "16.04", 80 "arch": "amd64", 81 "versions": { 82 "20160216": { 83 "items": { 84 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 85 "region": "some-region", 86 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 87 "virt": "kvm" 88 } 89 }, 90 "pubname": "ubuntu-trusty-16.04-amd64-server-20160216", 91 "label": "release" 92 } 93 } 94 }, 95 "com.ubuntu.cloud:server:14.04:amd64": { 96 "release": "trusty", 97 "version": "14.04", 98 "arch": "amd64", 99 "versions": { 100 "20140214": { 101 "items": { 102 "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f": { 103 "region": "some-region", 104 "id": "11223344-0a0a-ff99-11bb-0a1b2c3d4e5f", 105 "virt": "kvm" 106 } 107 }, 108 "pubname": "ubuntu-trusty-14.04-amd64-server-20140214", 109 "label": "release" 110 } 111 } 112 }, 113 "com.ubuntu.cloud:server:12.10:amd64": { 114 "release": "quantal", 115 "version": "12.10", 116 "arch": "amd64", 117 "versions": { 118 "20140214": { 119 "items": { 120 "11223344-0a0a-ee88-22ab-00aa11bb22cc": { 121 "region": "some-region", 122 "id": "11223344-0a0a-ee88-22ab-00aa11bb22cc", 123 "virt": "kvm" 124 } 125 }, 126 "pubname": "ubuntu-quantal-12.10-amd64-server-20140214", 127 "label": "release" 128 } 129 } 130 }, 131 "com.ubuntu.cloud:server:13.04:amd64": { 132 "release": "raring", 133 "version": "13.04", 134 "arch": "amd64", 135 "versions": { 136 "20140214": { 137 "items": { 138 "11223344-0a0a-dd77-33cd-abcd1234e5f6": { 139 "region": "some-region", 140 "id": "11223344-0a0a-dd77-33cd-abcd1234e5f6", 141 "virt": "kvm" 142 } 143 }, 144 "pubname": "ubuntu-raring-13.04-amd64-server-20140214", 145 "label": "release" 146 } 147 } 148 } 149 } 150 } 151 ` 152 153 func parseIndexData(creds *auth.Credentials) bytes.Buffer { 154 var metadata bytes.Buffer 155 156 t := template.Must(template.New("").Parse(indexData)) 157 if err := t.Execute(&metadata, creds); err != nil { 158 panic(fmt.Errorf("cannot generate index metdata: %v", err)) 159 } 160 161 return metadata 162 } 163 164 // Set Metadata requests to be served by the filecontent supplied. 165 func UseExternalTestImageMetadata(c *gc.C, creds *auth.Credentials) { 166 metadata := parseIndexData(creds) 167 files := map[string]string{ 168 "/streams/v1/index.json": metadata.String(), 169 "/streams/v1/com.ubuntu.cloud:released:joyent.json": imagesData, 170 } 171 sstesting.SetRoundTripperFiles(sstesting.AddSignedFiles(c, files), nil) 172 } 173 174 func UnregisterExternalTestImageMetadata() { 175 sstesting.SetRoundTripperFiles(nil, nil) 176 } 177 178 // RegisterMachinesEndpoint creates a fake endpoint so that 179 // machines api calls succeed. 180 func RegisterMachinesEndpoint() { 181 files := map[string]string{ 182 "/test/machines": "", 183 } 184 sstesting.SetRoundTripperFiles(files, nil) 185 } 186 187 // UnregisterMachinesEndpoint resets the machines endpoint. 188 func UnregisterMachinesEndpoint() { 189 sstesting.SetRoundTripperFiles(nil, nil) 190 } 191 192 func FindInstanceSpec( 193 e environs.Environ, series, arch, cons string, 194 imageMetadata []*imagemetadata.ImageMetadata, 195 ) (spec *instances.InstanceSpec, err error) { 196 env := e.(*joyentEnviron) 197 spec, err = env.FindInstanceSpec(&instances.InstanceConstraint{ 198 Series: series, 199 Arches: []string{arch}, 200 Region: env.cloud.Region, 201 Constraints: constraints.MustParse(cons), 202 }, imageMetadata) 203 return 204 } 205 206 // MakeCredentials creates credentials for a test. 207 func MakeCredentials(c *gc.C, endpoint string, cloudCredential cloud.Credential) *auth.Credentials { 208 creds, err := credentials(environs.CloudSpec{ 209 Endpoint: endpoint, 210 Credential: &cloudCredential, 211 }) 212 c.Assert(err, jc.ErrorIsNil) 213 return creds 214 }