diff --git a/daemon/net_plugin.go b/daemon/net_plugin.go new file mode 100644 index 0000000000000..285774b81cca9 --- /dev/null +++ b/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) +} diff --git a/plugins/repository.go b/plugins/repository.go index 7e00e1ab4a86d..58313ba72c24b 100644 --- a/plugins/repository.go +++ b/plugins/repository.go @@ -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 @@ -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() @@ -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) } @@ -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