github.com/axw/juju@v0.0.0-20161005053422-4bd6544d08d4/state/constraints.go (about)

     1  // Copyright 2013 Canonical Ltd.
     2  // Licensed under the AGPLv3, see LICENCE file for details.
     3  
     4  package state
     5  
     6  import (
     7  	"fmt"
     8  
     9  	"github.com/juju/errors"
    10  	"gopkg.in/mgo.v2"
    11  	"gopkg.in/mgo.v2/bson"
    12  	"gopkg.in/mgo.v2/txn"
    13  
    14  	"github.com/juju/juju/constraints"
    15  	"github.com/juju/juju/instance"
    16  )
    17  
    18  // constraintsDoc is the mongodb representation of a constraints.Value.
    19  type constraintsDoc struct {
    20  	ModelUUID    string `bson:"model-uuid"`
    21  	Arch         *string
    22  	CpuCores     *uint64
    23  	CpuPower     *uint64
    24  	Mem          *uint64
    25  	RootDisk     *uint64
    26  	InstanceType *string
    27  	Container    *instance.ContainerType
    28  	Tags         *[]string
    29  	Spaces       *[]string
    30  	VirtType     *string
    31  }
    32  
    33  func (doc constraintsDoc) value() constraints.Value {
    34  	result := constraints.Value{
    35  		Arch:         doc.Arch,
    36  		CpuCores:     doc.CpuCores,
    37  		CpuPower:     doc.CpuPower,
    38  		Mem:          doc.Mem,
    39  		RootDisk:     doc.RootDisk,
    40  		InstanceType: doc.InstanceType,
    41  		Container:    doc.Container,
    42  		Tags:         doc.Tags,
    43  		Spaces:       doc.Spaces,
    44  		VirtType:     doc.VirtType,
    45  	}
    46  	return result
    47  }
    48  
    49  func newConstraintsDoc(st *State, cons constraints.Value) constraintsDoc {
    50  	result := constraintsDoc{
    51  		Arch:         cons.Arch,
    52  		CpuCores:     cons.CpuCores,
    53  		CpuPower:     cons.CpuPower,
    54  		Mem:          cons.Mem,
    55  		RootDisk:     cons.RootDisk,
    56  		InstanceType: cons.InstanceType,
    57  		Container:    cons.Container,
    58  		Tags:         cons.Tags,
    59  		Spaces:       cons.Spaces,
    60  		VirtType:     cons.VirtType,
    61  	}
    62  	return result
    63  }
    64  
    65  func createConstraintsOp(st *State, id string, cons constraints.Value) txn.Op {
    66  	return txn.Op{
    67  		C:      constraintsC,
    68  		Id:     id,
    69  		Assert: txn.DocMissing,
    70  		Insert: newConstraintsDoc(st, cons),
    71  	}
    72  }
    73  
    74  func setConstraintsOp(st *State, id string, cons constraints.Value) txn.Op {
    75  	return txn.Op{
    76  		C:      constraintsC,
    77  		Id:     id,
    78  		Assert: txn.DocExists,
    79  		Update: bson.D{{"$set", newConstraintsDoc(st, cons)}},
    80  	}
    81  }
    82  
    83  func removeConstraintsOp(st *State, id string) txn.Op {
    84  	return txn.Op{
    85  		C:      constraintsC,
    86  		Id:     id,
    87  		Remove: true,
    88  	}
    89  }
    90  
    91  func readConstraints(st *State, id string) (constraints.Value, error) {
    92  	constraintsCollection, closer := st.getCollection(constraintsC)
    93  	defer closer()
    94  
    95  	doc := constraintsDoc{}
    96  	if err := constraintsCollection.FindId(id).One(&doc); err == mgo.ErrNotFound {
    97  		return constraints.Value{}, errors.NotFoundf("constraints")
    98  	} else if err != nil {
    99  		return constraints.Value{}, err
   100  	}
   101  	return doc.value(), nil
   102  }
   103  
   104  func writeConstraints(st *State, id string, cons constraints.Value) error {
   105  	ops := []txn.Op{setConstraintsOp(st, id, cons)}
   106  	if err := st.runTransaction(ops); err != nil {
   107  		return fmt.Errorf("cannot set constraints: %v", err)
   108  	}
   109  	return nil
   110  }