From c653f03fe8fdbd01ca9210e11b58933aeefdc3c3 Mon Sep 17 00:00:00 2001 From: Madhu Venugopal Date: Sun, 31 May 2015 21:19:10 -0700 Subject: [PATCH] GetObject support Signed-off-by: Madhu Venugopal --- datastore/datastore.go | 11 ++++++++++ store.go | 46 ++++++++++++++++++++++++++++++++++-------- 2 files changed, 49 insertions(+), 8 deletions(-) diff --git a/datastore/datastore.go b/datastore/datastore.go index cc9f45d..cb37247 100644 --- a/datastore/datastore.go +++ b/datastore/datastore.go @@ -1,6 +1,7 @@ package datastore import ( + "encoding/json" "errors" "strings" @@ -10,6 +11,8 @@ import ( //DataStore exported type DataStore interface { + // GetObject gets data from datastore and unmarshals to the specified object + GetObject(key string, o interface{}) error // PutObject adds a new Record based on an object into the datastore PutObject(kvObject KV) error // PutObjectAtomic provides an atomic add and update operation for a Record @@ -118,3 +121,11 @@ func (ds *datastore) putObjectWithKey(kvObject KV, key ...string) error { } return ds.store.Put(Key(key...), kvObjValue, nil) } + +func (ds *datastore) GetObject(key string, o interface{}) error { + kvPair, err := ds.store.Get(key) + if err != nil { + return err + } + return json.Unmarshal(kvPair.Value, o) +} diff --git a/store.go b/store.go index 092d9fa..5cdcfde 100644 --- a/store.go +++ b/store.go @@ -6,6 +6,7 @@ import ( log "github.com/Sirupsen/logrus" "github.com/docker/libnetwork/datastore" + "github.com/docker/libnetwork/types" ) func (c *controller) initDataStore() error { @@ -23,13 +24,13 @@ func (c *controller) initDataStore() error { return c.watchStore() } -func (c *controller) newNetworkFromStore(n *network) { +func (c *controller) newNetworkFromStore(n *network) error { c.Lock() n.ctrlr = c c.Unlock() n.endpoints = endpointTable{} - c.addNetwork(n) + return c.addNetwork(n) } func (c *controller) addNetworkToStore(n *network) error { @@ -51,16 +52,34 @@ func (c *controller) addNetworkToStore(n *network) error { return cs.PutObject(n) } +func (c *controller) getNetworkFromStore(nid types.UUID) (*network, error) { + n := network{id: nid} + if err := c.store.GetObject(datastore.Key(n.Key()...), &n); err != nil { + return nil, err + } + return &n, nil +} + func (c *controller) newEndpointFromStore(ep *endpoint) { c.Lock() - defer c.Unlock() - n, ok := c.networks[ep.network.id] + c.Unlock() + if !ok { - log.Warnf("Network (%s) unavailable for endpoint=%s. ignoring endpoint update", ep.network.id, ep.name) - // TODO : Get Network from Store and call newNetworkFromStore - return + // Possibly the watch event for the network has not shown up yet + // Try to get network from the store + var err error + n, err = c.getNetworkFromStore(ep.network.id) + if err != nil { + log.Warnf("Network (%s) unavailable for endpoint=%s", ep.network.id, ep.name) + return + } + if err := c.newNetworkFromStore(n); err != nil { + log.Warnf("Failed to add Network (%s - %s) from store", n.name, n.id) + return + } } + ep.network = n _, err := n.EndpointByID(string(ep.id)) if _, ok := err.(ErrNoSuchEndpoint); ok { @@ -87,6 +106,14 @@ func (c *controller) addEndpointToStore(ep *endpoint) error { return cs.PutObject(ep) } +func (c *controller) getEndpointFromStore(eid types.UUID) (*endpoint, error) { + ep := endpoint{id: eid} + if err := c.store.GetObject(datastore.Key(ep.Key()...), &ep); err != nil { + return nil, err + } + return &ep, nil +} + func (c *controller) watchStore() error { c.Lock() cs := c.store @@ -123,7 +150,10 @@ func (c *controller) watchStore() error { continue } - c.newNetworkFromStore(&n) + if err = c.newNetworkFromStore(&n); err != nil { + log.Error(err) + continue + } } case eps := <-epPairs: for _, epe := range eps {