github.com/Prakhar-Agarwal-byte/moby@v0.0.0-20231027092010-a14e3e8ab87e/libnetwork/drivers/windows/overlay/overlay_windows.go (about)

     1  package overlay
     2  
     3  //go:generate protoc -I=. -I=../../../../vendor/ --gogo_out=import_path=github.com/Prakhar-Agarwal-byte/moby/libnetwork/drivers/overlay:. overlay.proto
     4  
     5  import (
     6  	"context"
     7  	"encoding/json"
     8  	"net"
     9  	"sync"
    10  
    11  	"github.com/Microsoft/hcsshim"
    12  	"github.com/containerd/log"
    13  	"github.com/Prakhar-Agarwal-byte/moby/libnetwork/driverapi"
    14  	"github.com/Prakhar-Agarwal-byte/moby/libnetwork/scope"
    15  )
    16  
    17  const (
    18  	NetworkType = "overlay"
    19  )
    20  
    21  type driver struct {
    22  	networks networkTable
    23  	sync.Mutex
    24  }
    25  
    26  // Register registers a new instance of the overlay driver.
    27  func Register(r driverapi.Registerer) error {
    28  	d := &driver{
    29  		networks: networkTable{},
    30  	}
    31  
    32  	d.restoreHNSNetworks()
    33  
    34  	return r.RegisterDriver(NetworkType, d, driverapi.Capability{
    35  		DataScope:         scope.Global,
    36  		ConnectivityScope: scope.Global,
    37  	})
    38  }
    39  
    40  func (d *driver) restoreHNSNetworks() error {
    41  	log.G(context.TODO()).Infof("Restoring existing overlay networks from HNS into docker")
    42  
    43  	hnsresponse, err := hcsshim.HNSListNetworkRequest("GET", "", "")
    44  	if err != nil {
    45  		return err
    46  	}
    47  
    48  	for _, v := range hnsresponse {
    49  		if v.Type != NetworkType {
    50  			continue
    51  		}
    52  
    53  		log.G(context.TODO()).Infof("Restoring overlay network: %s", v.Name)
    54  		n := d.convertToOverlayNetwork(&v)
    55  		d.addNetwork(n)
    56  
    57  		//
    58  		// We assume that any network will be recreated on daemon restart
    59  		// and therefore don't restore hns endpoints for now
    60  		//
    61  		// n.restoreNetworkEndpoints()
    62  	}
    63  
    64  	return nil
    65  }
    66  
    67  func (d *driver) convertToOverlayNetwork(v *hcsshim.HNSNetwork) *network {
    68  	n := &network{
    69  		id:              v.Name,
    70  		hnsID:           v.Id,
    71  		driver:          d,
    72  		endpoints:       endpointTable{},
    73  		subnets:         []*subnet{},
    74  		providerAddress: v.ManagementIP,
    75  	}
    76  
    77  	for _, hnsSubnet := range v.Subnets {
    78  		vsidPolicy := &hcsshim.VsidPolicy{}
    79  		for _, policy := range hnsSubnet.Policies {
    80  			if err := json.Unmarshal([]byte(policy), &vsidPolicy); err == nil && vsidPolicy.Type == "VSID" {
    81  				break
    82  			}
    83  		}
    84  
    85  		gwIP := net.ParseIP(hnsSubnet.GatewayAddress)
    86  		localsubnet := &subnet{
    87  			vni:  uint32(vsidPolicy.VSID),
    88  			gwIP: &gwIP,
    89  		}
    90  
    91  		_, subnetIP, err := net.ParseCIDR(hnsSubnet.AddressPrefix)
    92  		if err != nil {
    93  			log.G(context.TODO()).Errorf("Error parsing subnet address %s ", hnsSubnet.AddressPrefix)
    94  			continue
    95  		}
    96  
    97  		localsubnet.subnetIP = subnetIP
    98  
    99  		n.subnets = append(n.subnets, localsubnet)
   100  	}
   101  
   102  	return n
   103  }
   104  
   105  func (d *driver) Type() string {
   106  	return NetworkType
   107  }
   108  
   109  func (d *driver) IsBuiltIn() bool {
   110  	return true
   111  }