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

     1  // Copyright 2015 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package cloudsigma
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/altoros/gosigma"
    10  
    11  	"github.com/juju/juju/constraints"
    12  	"github.com/juju/juju/environs/imagemetadata"
    13  )
    14  
    15  type sigmaConstraints struct {
    16  	driveTemplate string
    17  	driveSize     uint64
    18  	cores         uint64 //number of cpu cores
    19  	power         uint64 //cpu power in MHz
    20  	mem           uint64 //memory size in GB
    21  }
    22  
    23  const (
    24  	defaultCPUPower = 2000
    25  	defaultDriveGB  = 5
    26  	defaultMemoryGB = 2
    27  )
    28  
    29  // newConstraints creates new CloudSigma constraints from juju common constraints
    30  func newConstraints(bootstrap bool, jc constraints.Value, img *imagemetadata.ImageMetadata) *sigmaConstraints {
    31  	var sc = sigmaConstraints{
    32  		driveTemplate: img.Id,
    33  	}
    34  
    35  	if size := jc.RootDisk; bootstrap && size == nil {
    36  		sc.driveSize = defaultDriveGB * gosigma.Gigabyte
    37  	} else if size != nil {
    38  		sc.driveSize = *size * gosigma.Megabyte
    39  	}
    40  
    41  	if c := jc.CpuCores; c != nil {
    42  		sc.cores = *c
    43  	} else {
    44  		sc.cores = 1
    45  	}
    46  
    47  	if p := jc.CpuPower; p != nil {
    48  		sc.power = *p
    49  	} else {
    50  		if sc.cores == 1 {
    51  			// The default of cpu power is 2000 Mhz
    52  			sc.power = defaultCPUPower
    53  		} else {
    54  			// The maximum amount of cpu per smp is 2300
    55  			sc.power = sc.cores * defaultCPUPower
    56  		}
    57  	}
    58  
    59  	if m := jc.Mem; m != nil {
    60  		sc.mem = *m * gosigma.Megabyte
    61  	} else {
    62  		sc.mem = defaultMemoryGB * gosigma.Gigabyte
    63  	}
    64  
    65  	return &sc
    66  }
    67  
    68  func (c *sigmaConstraints) String() string {
    69  	s := fmt.Sprintf("template=%s,drive=%dG", c.driveTemplate, c.driveSize/gosigma.Gigabyte)
    70  	if c.cores > 0 {
    71  		s += fmt.Sprintf(",cores=%d", c.cores)
    72  	}
    73  	if c.power > 0 {
    74  		s += fmt.Sprintf(",power=%d", c.power)
    75  	}
    76  	if c.mem > 0 {
    77  		s += fmt.Sprintf(",mem=%dG", c.mem/gosigma.Gigabyte)
    78  	}
    79  	return s
    80  }