@@ -16,12 +16,15 @@ import (
1616
1717 "github.com/BurntSushi/toml"
1818 "github.com/codegangsta/cli"
19+ "github.com/docker/docker/api/types/network"
1920 "github.com/docker/docker/opts"
2021 "github.com/docker/docker/pkg/discovery"
2122 "github.com/docker/docker/pkg/reexec"
22-
23- "github.com/docker/docker/api/types/network"
2423 "github.com/docker/docker/pkg/term"
24+ "github.com/gorilla/mux"
25+ "github.com/sirupsen/logrus"
26+ "golang.org/x/net/context"
27+
2528 "github.com/docker/libnetwork"
2629 "github.com/docker/libnetwork/api"
2730 "github.com/docker/libnetwork/cluster"
@@ -31,10 +34,9 @@ import (
3134 "github.com/docker/libnetwork/netlabel"
3235 "github.com/docker/libnetwork/netutils"
3336 "github.com/docker/libnetwork/options"
37+ "github.com/docker/libnetwork/provider"
38+ "github.com/docker/libnetwork/provider/cni/cniapi"
3439 "github.com/docker/libnetwork/types"
35- "github.com/gorilla/mux"
36- "github.com/sirupsen/logrus"
37- "golang.org/x/net/context"
3840)
3941
4042const (
@@ -43,11 +45,12 @@ const (
4345 // DefaultHTTPPort is the default http port used by dnet
4446 DefaultHTTPPort = 2389
4547 // DefaultUnixSocket exported
46- DefaultUnixSocket = "/var/run/dnet.sock"
47- cfgFileEnv = "LIBNETWORK_CFG"
48- defaultCfgFile = "/etc/default/libnetwork.toml"
49- defaultHeartbeat = time .Duration (10 ) * time .Second
50- ttlFactor = 2
48+ DefaultUnixSocket = "/var/run/dnet.sock"
49+ cfgFileEnv = "LIBNETWORK_CFG"
50+ defaultCfgFile = "/etc/default/libnetwork.toml"
51+ defaultHeartbeat = time .Duration (10 ) * time .Second
52+ ttlFactor = 2
53+ defaultProviderTimeout = 120 // default time to fetch state from provider
5154)
5255
5356var epConn * dnetConnection
@@ -241,7 +244,7 @@ func createDefaultNetwork(c libnetwork.NetworkController) {
241244}
242245
243246type dnetConnection struct {
244- conn * netutils.HttpConnection
247+ conn * netutils.HTTPConnection
245248 Orchestration * NetworkOrchestration
246249 configEvent chan cluster.ConfigEventType
247250}
@@ -254,7 +257,7 @@ type NetworkOrchestration struct {
254257 Peer string
255258}
256259
257- func (d * dnetConnection ) dnetDaemon (cfgFile string ) error {
260+ func (d * dnetConnection ) dnetDaemon (cfgFile string , provider string ) error {
258261 if err := startTestDriver (); err != nil {
259262 return fmt .Errorf ("failed to start test driver: %v" , err )
260263 }
@@ -264,10 +267,14 @@ func (d *dnetConnection) dnetDaemon(cfgFile string) error {
264267 if err == nil {
265268 cOptions , err = processConfig (cfg )
266269 if err != nil {
267- fmt .Errorf ("failed to process config: %v" , err )
270+ return fmt .Errorf ("failed to process config: %v" , err )
268271 }
269272 } else {
270- logrus .Errorf ("failed to parse config: %v" , err )
273+ return fmt .Errorf ("failed to parse config: %v" , err )
274+ }
275+
276+ if provider != "" {
277+ cfg .Daemon .Provider = attachDnetProvider (provider )
271278 }
272279
273280 bridgeConfig := options.Generic {
@@ -279,9 +286,19 @@ func (d *dnetConnection) dnetDaemon(cfgFile string) error {
279286
280287 cOptions = append (cOptions , config .OptionDriverConfig ("bridge" , bridgeOption ))
281288
289+ // If this is a restore ,then fetch active sandboxes from api server.
290+ if cfg .Daemon .Provider != nil {
291+ sbOptions , err := fetchActiveSandboxes (cfg .Daemon .Provider )
292+ if err != nil {
293+ return err
294+ }
295+ if sbOptions != nil {
296+ cOptions = append (cOptions , sbOptions )
297+ }
298+ }
282299 controller , err := libnetwork .New (cOptions ... )
283300 if err != nil {
284- fmt .Println ("Error starting dnetDaemon :" , err )
301+ fmt .Println ("Error starting DnetDaemon :" , err )
285302 return err
286303 }
287304 controller .SetClusterProvider (d )
@@ -440,7 +457,7 @@ func newDnetConnection(val string) (*dnetConnection, error) {
440457 }
441458
442459 return & dnetConnection {
443- & netutils.HttpConnection {
460+ & netutils.HTTPConnection {
444461 Proto : protoAddrParts [0 ],
445462 Addr : protoAddrParts [1 ],
446463 },
@@ -460,3 +477,34 @@ func ipamOption(bridgeName string) libnetwork.NetworkOption {
460477 }
461478 return nil
462479}
480+
481+ func attachDnetProvider (provider string ) provider.DnetProvider {
482+ switch provider {
483+ case "cni" :
484+ return cniapi .NewDnetCniClient ()
485+ default :
486+ return nil
487+ }
488+ }
489+
490+ func fetchActiveSandboxes (provider provider.DnetProvider ) (config.Option , error ) {
491+ x := time .Duration (2 * time .Second )
492+ var err error
493+ var sbOptions map [string ]interface {}
494+ for x < defaultProviderTimeout {
495+ sbOptions , err = provider .FetchActiveSandboxes ()
496+ if err == nil {
497+ goto success
498+ }
499+ logrus .Errorf ("Retry:failed to fetch active sandbox: %b" , err )
500+ time .Sleep (x * time .Second )
501+ x = x * 2
502+ }
503+ return nil , fmt .Errorf ("failed to fetch active sandbox: %b" , err )
504+ success:
505+ logrus .Infof ("Active sandboxes are: {%+v}" , sbOptions )
506+ if len (sbOptions ) != 0 {
507+ return config .OptionActiveSandboxes (sbOptions ), nil
508+ }
509+ return nil , nil
510+ }
0 commit comments