Avoid adding local reserved networks (bridge, none, host) to the datastore

Signed-off-by: Madhu Venugopal <madhu@docker.com>
This commit is contained in:
Madhu Venugopal 2015-05-13 14:12:57 -07:00
parent 87161e8935
commit 594361552e
2 changed files with 28 additions and 1 deletions

View File

@ -47,6 +47,7 @@ package libnetwork
import (
"encoding/json"
"errors"
"fmt"
"sync"
@ -60,6 +61,9 @@ import (
"github.com/docker/swarm/pkg/store"
)
// TODO: Move it to error.go once the error refactoring is done
var ErrInvalidDatastore = errors.New("Datastore is not initialized")
// NetworkController provides the interface for controller instance which manages
// networks.
type NetworkController interface {
@ -198,6 +202,9 @@ func (c *controller) NewNetwork(networkType, name string, options ...NetworkOpti
}
network.processOptions(options...)
if err := c.addNetworkToStore(network); err != nil {
return nil, err
}
// Create the network
if err := d.CreateNetwork(network.id, network.generic); err != nil {
return nil, err
@ -206,7 +213,6 @@ func (c *controller) NewNetwork(networkType, name string, options ...NetworkOpti
// Store the network handler in controller
c.Lock()
c.networks[network.id] = network
c.store.PutObjectAtomic(network)
c.Unlock()
return network, nil
@ -226,6 +232,16 @@ func (c *controller) newNetworkFromStore(n *network) {
// TODO : Populate n.endpoints back from endpoint dbstore
}
func (c *controller) addNetworkToStore(n *network) error {
if IsReservedNetwork(n.Name()) {
return nil
}
if c.store == nil {
return ErrInvalidDatastore
}
return c.store.PutObjectAtomic(n)
}
func (c *controller) watchNewNetworks() {
c.Lock()
store = c.store

View File

@ -2,6 +2,7 @@ package libnetwork
import (
"encoding/json"
"strings"
"sync"
"github.com/docker/docker/pkg/stringid"
@ -254,3 +255,13 @@ func (n *network) EndpointByID(id string) (Endpoint, error) {
}
return nil, ErrNoSuchEndpoint(id)
}
func IsReservedNetwork(name string) bool {
reserved := []string{"bridge", "none", "host"}
for _, r := range reserved {
if strings.EqualFold(r, name) {
return true
}
}
return false
}