GetObject support

Signed-off-by: Madhu Venugopal <madhu@docker.com>
This commit is contained in:
Madhu Venugopal 2015-05-31 21:19:10 -07:00
parent dca35085f5
commit 8dcdbbabd0
2 changed files with 49 additions and 8 deletions

View File

@ -1,6 +1,7 @@
package datastore package datastore
import ( import (
"encoding/json"
"errors" "errors"
"strings" "strings"
@ -10,6 +11,8 @@ import (
//DataStore exported //DataStore exported
type DataStore interface { 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 adds a new Record based on an object into the datastore
PutObject(kvObject KV) error PutObject(kvObject KV) error
// PutObjectAtomic provides an atomic add and update operation for a Record // 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) 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)
}

View File

@ -6,6 +6,7 @@ import (
log "github.com/Sirupsen/logrus" log "github.com/Sirupsen/logrus"
"github.com/docker/libnetwork/datastore" "github.com/docker/libnetwork/datastore"
"github.com/docker/libnetwork/types"
) )
func (c *controller) initDataStore() error { func (c *controller) initDataStore() error {
@ -23,13 +24,13 @@ func (c *controller) initDataStore() error {
return c.watchStore() return c.watchStore()
} }
func (c *controller) newNetworkFromStore(n *network) { func (c *controller) newNetworkFromStore(n *network) error {
c.Lock() c.Lock()
n.ctrlr = c n.ctrlr = c
c.Unlock() c.Unlock()
n.endpoints = endpointTable{} n.endpoints = endpointTable{}
c.addNetwork(n) return c.addNetwork(n)
} }
func (c *controller) addNetworkToStore(n *network) error { func (c *controller) addNetworkToStore(n *network) error {
@ -51,16 +52,34 @@ func (c *controller) addNetworkToStore(n *network) error {
return cs.PutObject(n) 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) { func (c *controller) newEndpointFromStore(ep *endpoint) {
c.Lock() c.Lock()
defer c.Unlock()
n, ok := c.networks[ep.network.id] n, ok := c.networks[ep.network.id]
c.Unlock()
if !ok { if !ok {
log.Warnf("Network (%s) unavailable for endpoint=%s. ignoring endpoint update", ep.network.id, ep.name) // Possibly the watch event for the network has not shown up yet
// TODO : Get Network from Store and call newNetworkFromStore // 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 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 ep.network = n
_, err := n.EndpointByID(string(ep.id)) _, err := n.EndpointByID(string(ep.id))
if _, ok := err.(ErrNoSuchEndpoint); ok { if _, ok := err.(ErrNoSuchEndpoint); ok {
@ -87,6 +106,14 @@ func (c *controller) addEndpointToStore(ep *endpoint) error {
return cs.PutObject(ep) 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 { func (c *controller) watchStore() error {
c.Lock() c.Lock()
cs := c.store cs := c.store
@ -123,7 +150,10 @@ func (c *controller) watchStore() error {
continue continue
} }
c.newNetworkFromStore(&n) if err = c.newNetworkFromStore(&n); err != nil {
log.Error(err)
continue
}
} }
case eps := <-epPairs: case eps := <-epPairs:
for _, epe := range eps { for _, epe := range eps {