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 }