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  }