Skip to content

Commit

Permalink
Merge pull request moby#9 from squaremo/net_driver_plugins
Browse files Browse the repository at this point in the history
Net driver plugins
  • Loading branch information
squaremo committed Apr 14, 2015
2 parents ef48128 + 5c1f47f commit e4394b0
Show file tree
Hide file tree
Showing 2 changed files with 73 additions and 7 deletions.
53 changes: 53 additions & 0 deletions daemon/net_plugin.go
@@ -0,0 +1,53 @@
package daemon

import (
"encoding/json"
"fmt"
"github.com/docker/docker/daemon/execdriver"
"github.com/docker/docker/plugins"
)

type netDriver struct {
plugin *plugins.Plugin
}

func (driver *netDriver) Create(network *Network) error {
reader, err := driver.plugin.Call("PUT", "/net/", network)
defer reader.Close()
return err
}

func (driver *netDriver) Destroy(network *Network) error {
path := fmt.Sprintf("/net/%s", network.ID)
reader, err := driver.plugin.Call("DELETE", path, nil)
defer reader.Close()
return err
}

func (driver *netDriver) Plug(network *Network, endpoint *Endpoint) (*execdriver.NetworkInterface, error) {
path := fmt.Sprintf("/net/%s/", network.ID)
reader, err := driver.plugin.Call("POST", path, endpoint)
defer reader.Close()
if err != nil {
return nil, err
}

var iface execdriver.NetworkInterface
return &iface, json.NewDecoder(reader).Decode(&iface)
}

func (driver *netDriver) Unplug(network *Network, endpoint *Endpoint) error {
path := fmt.Sprintf("/net/%s/%s", network.ID, endpoint.ID)
reader, err := driver.plugin.Call("DELETE", path, nil)
defer reader.Close()
return err
}

func registerNet(name string, plugin *plugins.Plugin) error {
RegisterNetworkDriver(name, &netDriver{plugin: plugin})
return nil
}

func init() {
plugins.Repo.AddType("net", registerNet)
}
27 changes: 20 additions & 7 deletions plugins/repository.go
Expand Up @@ -10,8 +10,11 @@ var Repo = NewRepository()

var ErrNotRegistered = errors.New("plugin type is not registered")

type RegisterFunc func(string, *Plugin) error

type Repository struct {
plugins map[string]Plugins
supported map[string]RegisterFunc
plugins map[string]Plugins
}

type Plugins []*Plugin
Expand All @@ -28,16 +31,21 @@ func (repository *Repository) GetPlugins(kind string) (Plugins, error) {
return plugins, nil
}

var supportedPluginTypes = map[string]struct{}{
"volume": {},
}

func NewRepository() *Repository {
return &Repository{
plugins: make(map[string]Plugins),
plugins: make(map[string]Plugins),
supported: make(map[string]RegisterFunc),
}
}

func (repository *Repository) AddType(kind string, register RegisterFunc) error {
if _, exists := repository.supported[kind]; exists {
return fmt.Errorf("Registration for plugin kind '%s' already added", kind)
}
repository.supported[kind] = register
return nil
}

func (repository *Repository) RegisterPlugin(addr string) error {
plugin := &Plugin{addr: addr}
resp, err := plugin.handshake()
Expand All @@ -46,7 +54,11 @@ func (repository *Repository) RegisterPlugin(addr string) error {
}

for _, interest := range resp.InterestedIn {
if _, exists := supportedPluginTypes[interest]; !exists {
var (
register RegisterFunc
exists bool
)
if register, exists = repository.supported[interest]; !exists {
return fmt.Errorf("plugin type %s is not supported", interest)
}

Expand All @@ -55,6 +67,7 @@ func (repository *Repository) RegisterPlugin(addr string) error {
}
plugin.kind = interest
repository.plugins[interest] = append(repository.plugins[interest], plugin)
register(resp.Name, plugin)
}

return nil
Expand Down

0 comments on commit e4394b0

Please sign in to comment.