github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/libnetwork/drivers/windows/overlay/overlay_windows.go (about)

     1  package overlay
     2  
     3  //go:generate protoc -I.:../../Godeps/_workspace/src/github.com/gogo/protobuf  --gogo_out=import_path=github.com/docker/libnetwork/drivers/overlay,Mgogoproto/gogo.proto=github.com/gogo/protobuf/gogoproto:. overlay.proto
     4  
     5  import (
     6  	"encoding/json"
     7  	"net"
     8  	"sync"
     9  
    10  	"github.com/Microsoft/hcsshim"
    11  	"github.com/docker/libnetwork/datastore"
    12  	"github.com/docker/libnetwork/discoverapi"
    13  	"github.com/docker/libnetwork/driverapi"
    14  	"github.com/docker/libnetwork/netlabel"
    15  	"github.com/docker/libnetwork/types"
    16  	"github.com/sirupsen/logrus"
    17  )
    18  
    19  const (
    20  	networkType  = "overlay"
    21  	vethPrefix   = "veth"
    22  	vethLen      = 7
    23  	secureOption = "encrypted"
    24  )
    25  
    26  type driver struct {
    27  	config     map[string]interface{}
    28  	networks   networkTable
    29  	store      datastore.DataStore
    30  	localStore datastore.DataStore
    31  	once       sync.Once
    32  	joinOnce   sync.Once
    33  	sync.Mutex
    34  }
    35  
    36  // Init registers a new instance of overlay driver
    37  func Init(dc driverapi.DriverCallback, config map[string]interface{}) error {
    38  	c := driverapi.Capability{
    39  		DataScope:         datastore.GlobalScope,
    40  		ConnectivityScope: datastore.GlobalScope,
    41  	}
    42  
    43  	d := &driver{
    44  		networks: networkTable{},
    45  		config:   config,
    46  	}
    47  
    48  	if data, ok := config[netlabel.GlobalKVClient]; ok {
    49  		var err error
    50  		dsc, ok := data.(discoverapi.DatastoreConfigData)
    51  		if !ok {
    52  			return types.InternalErrorf("incorrect data in datastore configuration: %v", data)
    53  		}
    54  		d.store, err = datastore.NewDataStoreFromConfig(dsc)
    55  		if err != nil {
    56  			return types.InternalErrorf("failed to initialize data store: %v", err)
    57  		}
    58  	}
    59  
    60  	if data, ok := config[netlabel.LocalKVClient]; ok {
    61  		var err error
    62  		dsc, ok := data.(discoverapi.DatastoreConfigData)
    63  		if !ok {
    64  			return types.InternalErrorf("incorrect data in datastore configuration: %v", data)
    65  		}
    66  		d.localStore, err = datastore.NewDataStoreFromConfig(dsc)
    67  		if err != nil {
    68  			return types.InternalErrorf("failed to initialize local data store: %v", err)
    69  		}
    70  	}
    71  
    72  	d.restoreHNSNetworks()
    73  
    74  	return dc.RegisterDriver(networkType, d, c)
    75  }
    76  
    77  func (d *driver) restoreHNSNetworks() error {
    78  	logrus.Infof("Restoring existing overlay networks from HNS into docker")
    79  
    80  	hnsresponse, err := hcsshim.HNSListNetworkRequest("GET", "", "")
    81  	if err != nil {
    82  		return err
    83  	}
    84  
    85  	for _, v := range hnsresponse {
    86  		if v.Type != networkType {
    87  			continue
    88  		}
    89  
    90  		logrus.Infof("Restoring overlay network: %s", v.Name)
    91  		n := d.convertToOverlayNetwork(&v)
    92  		d.addNetwork(n)
    93  
    94  		//
    95  		// We assume that any network will be recreated on daemon restart
    96  		// and therefore don't restore hns endpoints for now
    97  		//
    98  		//n.restoreNetworkEndpoints()
    99  	}
   100  
   101  	return nil
   102  }
   103  
   104  func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network {
   105  	n := &network{
   106  		id:              v.Name,
   107  		hnsID:           v.Id,
   108  		driver:          d,
   109  		endpoints:       endpointTable{},
   110  		subnets:         []*subnet{},
   111  		providerAddress: v.ManagementIP,
   112  	}
   113  
   114  	for _, hnsSubnet := range v.Subnets {
   115  		vsidPolicy := &hcsshim.VsidPolicy{}
   116  		for _, policy := range hnsSubnet.Policies {
   117  			if err := json.Unmarshal([]byte(policy), &vsidPolicy); err == nil && vsidPolicy.Type == "VSID" {
   118  				break
   119  			}
   120  		}
   121  
   122  		gwIP := net.ParseIP(hnsSubnet.GatewayAddress)
   123  		localsubnet := &subnet{
   124  			vni:  uint32(vsidPolicy.VSID),
   125  			gwIP: &gwIP,
   126  		}
   127  
   128  		_, subnetIP, err := net.ParseCIDR(hnsSubnet.AddressPrefix)
   129  
   130  		if err != nil {
   131  			logrus.Errorf("Error parsing subnet address %s ", hnsSubnet.AddressPrefix)
   132  			continue
   133  		}
   134  
   135  		localsubnet.subnetIP = subnetIP
   136  
   137  		n.subnets = append(n.subnets, localsubnet)
   138  	}
   139  
   140  	return n
   141  }
   142  
   143  func (d *driver) Type() string {
   144  	return networkType
   145  }
   146  
   147  func (d *driver) IsBuiltIn() bool {
   148  	return true
   149  }
   150  
   151  // DiscoverNew is a notification for a new discovery event, such as a new node joining a cluster
   152  func (d *driver) DiscoverNew(dType discoverapi.DiscoveryType, data interface{}) error {
   153  	return types.NotImplementedErrorf("not implemented")
   154  }
   155  
   156  // DiscoverDelete is a notification for a discovery delete event, such as a node leaving a cluster
   157  func (d *driver) DiscoverDelete(dType discoverapi.DiscoveryType, data interface{}) error {
   158  	return types.NotImplementedErrorf("not implemented")
   159  }