github.com/mwhudson/juju@v0.0.0-20160512215208-90ff01f3497f/provider/openstack/image.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package openstack
     5  
     6  import (
     7  	"github.com/juju/juju/environs/imagemetadata"
     8  	"github.com/juju/juju/environs/instances"
     9  )
    10  
    11  // findInstanceSpec returns an image and instance type satisfying the constraint.
    12  // The instance type comes from querying the flavors supported by the deployment.
    13  func findInstanceSpec(
    14  	e *Environ,
    15  	ic *instances.InstanceConstraint,
    16  	imageMetadata []*imagemetadata.ImageMetadata,
    17  ) (*instances.InstanceSpec, error) {
    18  	// First construct all available instance types from the supported flavors.
    19  	nova := e.nova()
    20  	flavors, err := nova.ListFlavorsDetail()
    21  	if err != nil {
    22  		return nil, err
    23  	}
    24  	// Not all needed information is available in flavors,
    25  	// for e.g. architectures or virtualisation types.
    26  	// For these properties, we assume that all instance types support
    27  	// all values.
    28  	allInstanceTypes := []instances.InstanceType{}
    29  	for _, flavor := range flavors {
    30  		instanceType := instances.InstanceType{
    31  			Id:       flavor.Id,
    32  			Name:     flavor.Name,
    33  			Arches:   ic.Arches,
    34  			Mem:      uint64(flavor.RAM),
    35  			CpuCores: uint64(flavor.VCPUs),
    36  			RootDisk: uint64(flavor.Disk * 1024),
    37  			// tags not currently supported on openstack
    38  		}
    39  		if ic.Constraints.HasVirtType() {
    40  			// Instance Type virtual type depends on the virtual type of the selected image, i.e.
    41  			// picking an image with a virt type gives a machine with this virt type.
    42  			instanceType.VirtType = ic.Constraints.VirtType
    43  		}
    44  		allInstanceTypes = append(allInstanceTypes, instanceType)
    45  	}
    46  
    47  	images := instances.ImageMetadataToImages(imageMetadata)
    48  	spec, err := instances.FindInstanceSpec(images, ic, allInstanceTypes)
    49  	if err != nil {
    50  		return nil, err
    51  	}
    52  
    53  	// If instance constraints did not have a virtualisation type,
    54  	// but image metadata did, we will have an instance type
    55  	// with virtualisation type of an image.
    56  	if !ic.Constraints.HasVirtType() && spec.Image.VirtType != "" {
    57  		spec.InstanceType.VirtType = &spec.Image.VirtType
    58  	}
    59  	return spec, nil
    60  }