github.com/niedbalski/juju@v0.0.0-20190215020005-8ff100488e47/provider/openstack/series_test.go (about) 1 // Copyright 2012, 2013 Canonical Ltd. 2 // Licensed under the AGPLv3, see LICENCE file for details. 3 4 package openstack 5 6 import ( 7 "bytes" 8 "fmt" 9 "html/template" 10 "strings" 11 12 "github.com/juju/errors" 13 "github.com/juju/juju/core/constraints" 14 "github.com/juju/juju/environs" 15 "github.com/juju/juju/environs/imagemetadata" 16 "github.com/juju/juju/environs/instances" 17 "github.com/juju/juju/environs/simplestreams" 18 envstorage "github.com/juju/juju/environs/storage" 19 envtesting "github.com/juju/juju/environs/testing" 20 "github.com/juju/juju/network" 21 22 "gopkg.in/goose.v2/identity" 23 "gopkg.in/goose.v2/nova" 24 "gopkg.in/goose.v2/swift" 25 ) 26 27 // MetadataStorage returns a Storage instance which is used to store simplestreams metadata for tests. 28 func MetadataStorage(e environs.Environ) envstorage.Storage { 29 env := e.(*Environ) 30 ecfg := env.ecfg() 31 container := "juju-dist-test" 32 client, err := authClient(env.cloud, ecfg) 33 if err != nil { 34 panic(fmt.Errorf("cannot create %s container: %v", container, err)) 35 } 36 metadataStorage := &openstackstorage{ 37 containerName: container, 38 swift: swift.New(client), 39 } 40 41 // Ensure the container exists. 42 err = metadataStorage.makeContainer(container, swift.PublicRead) 43 if err != nil { 44 panic(fmt.Errorf("cannot create %s container: %v", container, err)) 45 } 46 return metadataStorage 47 } 48 49 func InstanceAddress(publicIP string, addresses map[string][]nova.IPAddress) string { 50 addr, _ := network.SelectPublicAddress(convertNovaAddresses(publicIP, addresses)) 51 return addr.Value 52 } 53 54 // Include images for arches currently supported. i386 is no longer 55 // supported, so it can be excluded. 56 var indexData = ` 57 { 58 "index": { 59 "com.ubuntu.cloud:released:openstack": { 60 "updated": "Wed, 01 May 2013 13:31:26 +0000", 61 "clouds": [ 62 { 63 "region": "{{.Region}}", 64 "endpoint": "{{.URL}}" 65 } 66 ], 67 "cloudname": "test", 68 "datatype": "image-ids", 69 "format": "products:1.0", 70 "products": [ 71 "com.ubuntu.cloud:server:18.04:s390x", 72 "com.ubuntu.cloud:server:18.04:amd64", 73 "com.ubuntu.cloud:server:18.04:arm64", 74 "com.ubuntu.cloud:server:18.04:ppc64el", 75 "com.ubuntu.cloud:server:16.04:s390x", 76 "com.ubuntu.cloud:server:16.04:amd64", 77 "com.ubuntu.cloud:server:16.04:arm64", 78 "com.ubuntu.cloud:server:16.04:ppc64el", 79 "com.ubuntu.cloud:server:14.04:s390x", 80 "com.ubuntu.cloud:server:14.04:amd64", 81 "com.ubuntu.cloud:server:14.04:arm64", 82 "com.ubuntu.cloud:server:14.04:ppc64el", 83 "com.ubuntu.cloud:server:12.10:amd64", 84 "com.ubuntu.cloud:server:13.04:amd64" 85 ], 86 "path": "image-metadata/products.json" 87 } 88 }, 89 "updated": "Wed, 01 May 2013 13:31:26 +0000", 90 "format": "index:1.0" 91 } 92 ` 93 94 var imagesData = ` 95 { 96 "content_id": "com.ubuntu.cloud:released:openstack", 97 "products": { 98 "com.ubuntu.cloud:server:18.04:amd64": { 99 "release": "trusty", 100 "version": "18.04", 101 "arch": "amd64", 102 "versions": { 103 "20121218": { 104 "items": { 105 "inst1": { 106 "root_store": "ebs", 107 "virt": "pv", 108 "region": "some-region", 109 "id": "1" 110 }, 111 "inst2": { 112 "root_store": "ebs", 113 "virt": "pv", 114 "region": "another-region", 115 "id": "2" 116 } 117 }, 118 "pubname": "ubuntu-trusty-18.04-amd64-server-20121218", 119 "label": "release" 120 }, 121 "20121111": { 122 "items": { 123 "inst3": { 124 "root_store": "ebs", 125 "virt": "pv", 126 "region": "some-region", 127 "id": "3" 128 } 129 }, 130 "pubname": "ubuntu-trusty-18.04-amd64-server-20121111", 131 "label": "release" 132 } 133 } 134 }, 135 "com.ubuntu.cloud:server:18.04:arm64": { 136 "release": "xenial", 137 "version": "18.04", 138 "arch": "arm64", 139 "versions": { 140 "20121111": { 141 "items": { 142 "inst1604arm64": { 143 "root_store": "ebs", 144 "virt": "pv", 145 "region": "some-region", 146 "id": "id-1604arm64" 147 } 148 }, 149 "pubname": "ubuntu-xenial-18.04-arm64-server-20121111", 150 "label": "release" 151 } 152 } 153 }, 154 "com.ubuntu.cloud:server:18.04:ppc64el": { 155 "release": "xenial", 156 "version": "18.04", 157 "arch": "ppc64el", 158 "versions": { 159 "20121111": { 160 "items": { 161 "inst1604ppc64el": { 162 "root_store": "ebs", 163 "virt": "pv", 164 "region": "some-region", 165 "id": "id-1604ppc64el" 166 } 167 }, 168 "pubname": "ubuntu-xenial-18.04-ppc64el-server-20121111", 169 "label": "release" 170 } 171 } 172 }, 173 "com.ubuntu.cloud:server:18.04:s390x": { 174 "release": "xenial", 175 "version": "18.04", 176 "arch": "s390x", 177 "versions": { 178 "20121111": { 179 "items": { 180 "inst1604s390x": { 181 "root_store": "ebs", 182 "virt": "pv", 183 "region": "some-region", 184 "id": "id-1604s390x" 185 } 186 }, 187 "pubname": "ubuntu-xenial-18.04-s390x-server-20121111", 188 "label": "release" 189 } 190 } 191 }, 192 "com.ubuntu.cloud:server:16.04:amd64": { 193 "release": "trusty", 194 "version": "16.04", 195 "arch": "amd64", 196 "versions": { 197 "20121218": { 198 "items": { 199 "inst1": { 200 "root_store": "ebs", 201 "virt": "pv", 202 "region": "some-region", 203 "id": "1" 204 }, 205 "inst2": { 206 "root_store": "ebs", 207 "virt": "pv", 208 "region": "another-region", 209 "id": "2" 210 } 211 }, 212 "pubname": "ubuntu-trusty-16.04-amd64-server-20121218", 213 "label": "release" 214 }, 215 "20121111": { 216 "items": { 217 "inst3": { 218 "root_store": "ebs", 219 "virt": "pv", 220 "region": "some-region", 221 "id": "3" 222 } 223 }, 224 "pubname": "ubuntu-trusty-16.04-amd64-server-20121111", 225 "label": "release" 226 } 227 } 228 }, 229 "com.ubuntu.cloud:server:16.04:arm64": { 230 "release": "xenial", 231 "version": "16.04", 232 "arch": "arm64", 233 "versions": { 234 "20121111": { 235 "items": { 236 "inst1604arm64": { 237 "root_store": "ebs", 238 "virt": "pv", 239 "region": "some-region", 240 "id": "id-1604arm64" 241 } 242 }, 243 "pubname": "ubuntu-xenial-16.04-arm64-server-20121111", 244 "label": "release" 245 } 246 } 247 }, 248 "com.ubuntu.cloud:server:16.04:ppc64el": { 249 "release": "xenial", 250 "version": "16.04", 251 "arch": "ppc64el", 252 "versions": { 253 "20121111": { 254 "items": { 255 "inst1604ppc64el": { 256 "root_store": "ebs", 257 "virt": "pv", 258 "region": "some-region", 259 "id": "id-1604ppc64el" 260 } 261 }, 262 "pubname": "ubuntu-xenial-16.04-ppc64el-server-20121111", 263 "label": "release" 264 } 265 } 266 }, 267 "com.ubuntu.cloud:server:14.04:amd64": { 268 "release": "trusty", 269 "version": "14.04", 270 "arch": "amd64", 271 "versions": { 272 "20121218": { 273 "items": { 274 "inst1": { 275 "root_store": "ebs", 276 "virt": "pv", 277 "region": "some-region", 278 "id": "1" 279 }, 280 "inst2": { 281 "root_store": "ebs", 282 "virt": "pv", 283 "region": "another-region", 284 "id": "2" 285 } 286 }, 287 "pubname": "ubuntu-trusty-14.04-amd64-server-20121218", 288 "label": "release" 289 }, 290 "20121111": { 291 "items": { 292 "inst3": { 293 "root_store": "ebs", 294 "virt": "pv", 295 "region": "some-region", 296 "id": "3" 297 } 298 }, 299 "pubname": "ubuntu-trusty-14.04-amd64-server-20121111", 300 "label": "release" 301 } 302 } 303 }, 304 "com.ubuntu.cloud:server:14.04:arm64": { 305 "release": "trusty", 306 "version": "14.04", 307 "arch": "arm64", 308 "versions": { 309 "20121111": { 310 "items": { 311 "inst33": { 312 "root_store": "ebs", 313 "virt": "pv", 314 "region": "some-region", 315 "id": "33" 316 } 317 }, 318 "pubname": "ubuntu-trusty-14.04-arm64-server-20121111", 319 "label": "release" 320 } 321 } 322 }, 323 "com.ubuntu.cloud:server:14.04:ppc64el": { 324 "release": "trusty", 325 "version": "14.04", 326 "arch": "ppc64el", 327 "versions": { 328 "20121111": { 329 "items": { 330 "inst33": { 331 "root_store": "ebs", 332 "virt": "pv", 333 "region": "some-region", 334 "id": "33" 335 } 336 }, 337 "pubname": "ubuntu-trusty-14.04-ppc64el-server-20121111", 338 "label": "release" 339 } 340 } 341 }, 342 "com.ubuntu.cloud:server:12.10:amd64": { 343 "release": "quantal", 344 "version": "12.10", 345 "arch": "amd64", 346 "versions": { 347 "20121218": { 348 "items": { 349 "inst3": { 350 "root_store": "ebs", 351 "virt": "pv", 352 "region": "region-1", 353 "id": "id-1" 354 }, 355 "inst4": { 356 "root_store": "ebs", 357 "virt": "pv", 358 "region": "region-2", 359 "id": "id-2" 360 } 361 }, 362 "pubname": "ubuntu-quantal-12.14-amd64-server-20121218", 363 "label": "release" 364 } 365 } 366 }, 367 "com.ubuntu.cloud:server:13.04:amd64": { 368 "release": "raring", 369 "version": "13.04", 370 "arch": "amd64", 371 "versions": { 372 "20121218": { 373 "items": { 374 "inst5": { 375 "root_store": "ebs", 376 "virt": "pv", 377 "region": "some-region", 378 "id": "id-y" 379 }, 380 "inst6": { 381 "root_store": "ebs", 382 "virt": "pv", 383 "region": "another-region", 384 "id": "id-z" 385 } 386 }, 387 "pubname": "ubuntu-raring-13.04-amd64-server-20121218", 388 "label": "release" 389 } 390 } 391 }, 392 "com.ubuntu.cloud:server:14.04:s390x": { 393 "release": "trusty", 394 "version": "14.04", 395 "arch": "s390x", 396 "versions": { 397 "20121218": { 398 "items": { 399 "inst5": { 400 "root_store": "ebs", 401 "virt": "pv", 402 "region": "some-region", 403 "id": "id-y" 404 }, 405 "inst6": { 406 "root_store": "ebs", 407 "virt": "pv", 408 "region": "another-region", 409 "id": "id-z" 410 } 411 }, 412 "pubname": "ubuntu-trusty-14.04-s390x-server-20121218", 413 "label": "release" 414 } 415 } 416 }, 417 "com.ubuntu.cloud:server:16.04:s390x": { 418 "release": "xenial", 419 "version": "16.04", 420 "arch": "s390x", 421 "versions": { 422 "20121218": { 423 "items": { 424 "inst5": { 425 "root_store": "ebs", 426 "virt": "pv", 427 "region": "some-region", 428 "id": "id-y" 429 }, 430 "inst6": { 431 "root_store": "ebs", 432 "virt": "pv", 433 "region": "another-region", 434 "id": "id-z" 435 } 436 }, 437 "pubname": "ubuntu-xenial-16.04-s390x-server-20121218", 438 "label": "release" 439 } 440 } 441 } 442 }, 443 "format": "products:1.0" 444 } 445 ` 446 447 const productMetadatafile = "image-metadata/products.json" 448 449 func UseTestImageData(stor envstorage.Storage, cred *identity.Credentials) { 450 // Put some image metadata files into the public storage. 451 t := template.Must(template.New("").Parse(indexData)) 452 var metadata bytes.Buffer 453 if err := t.Execute(&metadata, cred); err != nil { 454 panic(fmt.Errorf("cannot generate index metdata: %v", err)) 455 } 456 data := metadata.Bytes() 457 stor.Put(simplestreams.UnsignedIndex("v1", 1), bytes.NewReader(data), int64(len(data))) 458 stor.Put( 459 productMetadatafile, strings.NewReader(imagesData), int64(len(imagesData))) 460 461 envtesting.SignTestTools(stor) 462 } 463 464 func RemoveTestImageData(stor envstorage.Storage) { 465 stor.RemoveAll() 466 } 467 468 // DiscardSecurityGroup cleans up a security group, it is not an error to 469 // delete something that doesn't exist. 470 func DiscardSecurityGroup(e environs.Environ, name string) error { 471 env := e.(*Environ) 472 neutronClient := env.neutron() 473 groups, err := neutronClient.SecurityGroupByNameV2(name) 474 if err != nil || len(groups) == 0 { 475 if errors.IsNotFound(err) { 476 // Group already deleted, done 477 return nil 478 } 479 } 480 for _, group := range groups { 481 err = neutronClient.DeleteSecurityGroupV2(group.Id) 482 if err != nil { 483 return err 484 } 485 } 486 return nil 487 } 488 489 func FindInstanceSpec( 490 e environs.Environ, 491 series, arch, cons string, 492 imageMetadata []*imagemetadata.ImageMetadata, 493 ) (spec *instances.InstanceSpec, err error) { 494 env := e.(*Environ) 495 return findInstanceSpec(env, &instances.InstanceConstraint{ 496 Series: series, 497 Arches: []string{arch}, 498 Region: env.cloud.Region, 499 Constraints: constraints.MustParse(cons), 500 }, imageMetadata) 501 }