network_windows.go 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. // +build windows
  2. package libnetwork
  3. import (
  4. "runtime"
  5. "time"
  6. "github.com/Microsoft/hcsshim"
  7. "github.com/Sirupsen/logrus"
  8. "github.com/docker/libnetwork/drivers/windows"
  9. "github.com/docker/libnetwork/ipamapi"
  10. "github.com/docker/libnetwork/ipams/windowsipam"
  11. )
  12. func executeInCompartment(compartmentID uint32, x func()) {
  13. runtime.LockOSThread()
  14. if err := hcsshim.SetCurrentThreadCompartmentId(compartmentID); err != nil {
  15. logrus.Error(err)
  16. }
  17. defer func() {
  18. hcsshim.SetCurrentThreadCompartmentId(0)
  19. runtime.UnlockOSThread()
  20. }()
  21. x()
  22. }
  23. func (n *network) startResolver() {
  24. n.resolverOnce.Do(func() {
  25. logrus.Debugf("Launching DNS server for network", n.Name())
  26. options := n.Info().DriverOptions()
  27. hnsid := options[windows.HNSID]
  28. if hnsid == "" {
  29. return
  30. }
  31. hnsresponse, err := hcsshim.HNSNetworkRequest("GET", hnsid, "")
  32. if err != nil {
  33. logrus.Errorf("Resolver Setup/Start failed for container %s, %q", n.Name(), err)
  34. return
  35. }
  36. for _, subnet := range hnsresponse.Subnets {
  37. if subnet.GatewayAddress != "" {
  38. for i := 0; i < 3; i++ {
  39. resolver := NewResolver(subnet.GatewayAddress, false, "", n)
  40. logrus.Debugf("Binding a resolver on network %s gateway %s", n.Name(), subnet.GatewayAddress)
  41. executeInCompartment(hnsresponse.DNSServerCompartment, resolver.SetupFunc(53))
  42. if err = resolver.Start(); err != nil {
  43. logrus.Errorf("Resolver Setup/Start failed for container %s, %q", n.Name(), err)
  44. time.Sleep(1 * time.Second)
  45. } else {
  46. logrus.Debugf("Resolver bound successfully for network %s", n.Name())
  47. n.resolver = append(n.resolver, resolver)
  48. break
  49. }
  50. }
  51. }
  52. }
  53. })
  54. }
  55. func defaultIpamForNetworkType(networkType string) string {
  56. if windows.IsBuiltinLocalDriver(networkType) {
  57. return windowsipam.DefaultIPAM
  58. }
  59. return ipamapi.DefaultIPAM
  60. }