package plugin import ( "fmt" "net" "net/http" "time" docker "github.com/docker/docker/client" "github.com/gorilla/handlers" "git.ivasoft.cz/sw/docker-bridge-overlay/pkg/util" ) // Plugin is the routable bridge network plugin type Plugin struct { awaitTimeout time.Duration docker *docker.Client server http.Server epToCtrNameGuess map[string]string } // NewPlugin creates a new Plugin func NewPlugin(awaitTimeout time.Duration) (*Plugin, error) { client, err := docker.NewClient("unix:///run/docker.sock", "v1.13.1", nil, nil) if err != nil { return nil, fmt.Errorf("failed to create docker client: %w", err) } p := Plugin{ awaitTimeout: awaitTimeout, docker: client, epToCtrNameGuess: make(map[string]string), } mux := http.NewServeMux() mux.HandleFunc("/NetworkDriver.GetCapabilities", p.apiGetCapabilities) mux.HandleFunc("/NetworkDriver.CreateNetwork", p.apiCreateNetwork) mux.HandleFunc("/NetworkDriver.DeleteNetwork", p.apiDeleteNetwork) mux.HandleFunc("/NetworkDriver.CreateEndpoint", p.apiCreateEndpoint) mux.HandleFunc("/NetworkDriver.EndpointOperInfo", p.apiEndpointOperInfo) mux.HandleFunc("/NetworkDriver.DeleteEndpoint", p.apiDeleteEndpoint) mux.HandleFunc("/NetworkDriver.Join", p.apiJoin) mux.HandleFunc("/NetworkDriver.Leave", p.apiLeave) p.server = http.Server{ Handler: handlers.CustomLoggingHandler(nil, mux, util.WriteAccessLog), } return &p, nil } // Listen starts the plugin server func (p *Plugin) Listen(bindSock string) error { l, err := net.Listen("unix", bindSock) if err != nil { return err } return p.server.Serve(l) } // Close stops the plugin server func (p *Plugin) Close() error { if err := p.docker.Close(); err != nil { return fmt.Errorf("failed to close docker client: %w", err) } if err := p.server.Close(); err != nil { return fmt.Errorf("failed to close http server: %w", err) } return nil }