//go:build windows // +build windows package libnetwork import ( "runtime" "time" "github.com/Microsoft/hcsshim" "github.com/docker/docker/libnetwork/drivers/windows" "github.com/docker/docker/libnetwork/ipamapi" "github.com/docker/docker/libnetwork/ipams/windowsipam" "github.com/sirupsen/logrus" ) func executeInCompartment(compartmentID uint32, x func()) { runtime.LockOSThread() if err := hcsshim.SetCurrentThreadCompartmentId(compartmentID); err != nil { logrus.Error(err) } defer func() { hcsshim.SetCurrentThreadCompartmentId(0) runtime.UnlockOSThread() }() x() } func (n *network) startResolver() { if n.networkType == "ics" { return } n.resolverOnce.Do(func() { logrus.Debugf("Launching DNS server for network %q", n.Name()) options := n.Info().DriverOptions() hnsid := options[windows.HNSID] if hnsid == "" { return } hnsresponse, err := hcsshim.HNSNetworkRequest("GET", hnsid, "") if err != nil { logrus.Errorf("Resolver Setup/Start failed for container %s, %q", n.Name(), err) return } for _, subnet := range hnsresponse.Subnets { if subnet.GatewayAddress != "" { for i := 0; i < 3; i++ { resolver := NewResolver(subnet.GatewayAddress, false, n) logrus.Debugf("Binding a resolver on network %s gateway %s", n.Name(), subnet.GatewayAddress) executeInCompartment(hnsresponse.DNSServerCompartment, resolver.SetupFunc(53)) if err = resolver.Start(); err != nil { logrus.Errorf("Resolver Setup/Start failed for container %s, %q", n.Name(), err) time.Sleep(1 * time.Second) } else { logrus.Debugf("Resolver bound successfully for network %s", n.Name()) n.resolver = append(n.resolver, resolver) break } } } } }) } func defaultIpamForNetworkType(networkType string) string { if windows.IsBuiltinLocalDriver(networkType) { return windowsipam.DefaultIPAM } return ipamapi.DefaultIPAM }