From b786202c38c2506bd8a11ce4b70da1549643ccaf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Hannes=20H=C3=B6rl?= Date: Mon, 8 Jan 2018 11:42:34 +0000 Subject: [PATCH] Move AddressManager to an internal package --- pkg/framework/test/address_manager.go | 63 ------------------- pkg/framework/test/apiserver.go | 4 +- pkg/framework/test/etcd.go | 2 +- .../test/internal/address_manager.go | 53 ++++++++++++++++ .../{ => internal}/address_manager_test.go | 29 +++++---- 5 files changed, 70 insertions(+), 81 deletions(-) delete mode 100644 pkg/framework/test/address_manager.go create mode 100644 pkg/framework/test/internal/address_manager.go rename pkg/framework/test/{ => internal}/address_manager_test.go (69%) diff --git a/pkg/framework/test/address_manager.go b/pkg/framework/test/address_manager.go deleted file mode 100644 index 176aa2bea..000000000 --- a/pkg/framework/test/address_manager.go +++ /dev/null @@ -1,63 +0,0 @@ -package test - -import ( - "fmt" - "net" -) - -// AddressManager knows how to generate and remember a single address on some -// local interface for a service to listen on. -type AddressManager interface { - Initialize() (port int, resolvedAddress string, err error) - Host() (string, error) - Port() (int, error) -} - -//go:generate counterfeiter . AddressManager - -// DefaultAddressManager implements an AddressManager. It allocates a new address -// (interface & port) a process can bind and keeps track of that. -type DefaultAddressManager struct { - port int - host string -} - -// Initialize returns a address a process can listen on. It returns -// a tuple consisting of a free port and the hostname resolved to its IP. -func (d *DefaultAddressManager) Initialize() (port int, resolvedHost string, err error) { - if d.port != 0 { - return 0, "", fmt.Errorf("this DefaultAddressManager is already initialized") - } - addr, err := net.ResolveTCPAddr("tcp", "localhost:0") - if err != nil { - return - } - l, err := net.ListenTCP("tcp", addr) - if err != nil { - return - } - d.port = l.Addr().(*net.TCPAddr).Port - defer func() { - err = l.Close() - }() - d.host = addr.IP.String() - return d.port, d.host, nil -} - -// Port returns the port that this DefaultAddressManager is managing. Port returns an -// error if this DefaultAddressManager has not yet been initialized. -func (d *DefaultAddressManager) Port() (int, error) { - if d.port == 0 { - return 0, fmt.Errorf("this DefaultAdressManager has is not initialized yet") - } - return d.port, nil -} - -// Host returns the host that this DefaultAddressManager is managing. Host returns an -// error if this DefaultAddressManager has not yet been initialized. -func (d *DefaultAddressManager) Host() (string, error) { - if d.host == "" { - return "", fmt.Errorf("this DefaultAdressManager has is not initialized yet") - } - return d.host, nil -} diff --git a/pkg/framework/test/apiserver.go b/pkg/framework/test/apiserver.go index 85953e686..f905ab13b 100644 --- a/pkg/framework/test/apiserver.go +++ b/pkg/framework/test/apiserver.go @@ -16,7 +16,7 @@ import ( // APIServer knows how to run a kubernetes apiserver. type APIServer struct { // Address is the address, a host and a port, the ApiServer should listen on for client connections. - // If this is not specified, the DefaultAddressManager is used to determine this address. + // If this is not specified, we default to a random free port on localhost. Address *url.URL // Path is the path to the apiserver binary. If this is left as the empty @@ -116,7 +116,7 @@ func (s *APIServer) ensureInitialized() error { s.Path = internal.BinPathFinder("kube-apiserver") } if s.Address == nil { - am := &DefaultAddressManager{} + am := &internal.AddressManager{} port, host, err := am.Initialize() if err != nil { return err diff --git a/pkg/framework/test/etcd.go b/pkg/framework/test/etcd.go index 8ac3848b9..5464cf82c 100644 --- a/pkg/framework/test/etcd.go +++ b/pkg/framework/test/etcd.go @@ -90,7 +90,7 @@ func (e *Etcd) ensureInitialized() error { e.Path = internal.BinPathFinder("etcd") } if e.Address == nil { - am := &DefaultAddressManager{} + am := &internal.AddressManager{} port, host, err := am.Initialize() if err != nil { return err diff --git a/pkg/framework/test/internal/address_manager.go b/pkg/framework/test/internal/address_manager.go new file mode 100644 index 000000000..7ad4ab7ea --- /dev/null +++ b/pkg/framework/test/internal/address_manager.go @@ -0,0 +1,53 @@ +package internal + +import ( + "fmt" + "net" +) + +// AddressManager allocates a new address (interface & port) a process +// can bind and keeps track of that. +type AddressManager struct { + port int + host string +} + +// Initialize returns a address a process can listen on. It returns +// a tuple consisting of a free port and the hostname resolved to its IP. +func (d *AddressManager) Initialize() (port int, resolvedHost string, err error) { + if d.port != 0 { + return 0, "", fmt.Errorf("this AddressManager is already initialized") + } + addr, err := net.ResolveTCPAddr("tcp", "localhost:0") + if err != nil { + return + } + l, err := net.ListenTCP("tcp", addr) + if err != nil { + return + } + d.port = l.Addr().(*net.TCPAddr).Port + defer func() { + err = l.Close() + }() + d.host = addr.IP.String() + return d.port, d.host, nil +} + +// Port returns the port that this AddressManager is managing. Port returns an +// error if this AddressManager has not yet been initialized. +func (d *AddressManager) Port() (int, error) { + if d.port == 0 { + return 0, fmt.Errorf("this AdressManager is not initialized yet") + } + return d.port, nil +} + +// Host returns the host that this AddressManager is managing. Host returns an +// error if this AddressManager has not yet been initialized. +func (d *AddressManager) Host() (string, error) { + if d.host == "" { + return "", fmt.Errorf("this AdressManager is not initialized yet") + } + return d.host, nil +} diff --git a/pkg/framework/test/address_manager_test.go b/pkg/framework/test/internal/address_manager_test.go similarity index 69% rename from pkg/framework/test/address_manager_test.go rename to pkg/framework/test/internal/address_manager_test.go index e6b8aef2c..d487b4a7f 100644 --- a/pkg/framework/test/address_manager_test.go +++ b/pkg/framework/test/internal/address_manager_test.go @@ -1,7 +1,7 @@ -package test_test +package internal_test import ( - . "k8s.io/kubectl/pkg/framework/test" + . "k8s.io/kubectl/pkg/framework/test/internal" "fmt" "net" @@ -10,15 +10,15 @@ import ( . "github.com/onsi/gomega" ) -var _ = Describe("DefaultAddressManager", func() { - var defaultAddressManager *DefaultAddressManager +var _ = Describe("AddressManager", func() { + var addressManager *AddressManager BeforeEach(func() { - defaultAddressManager = &DefaultAddressManager{} + addressManager = &AddressManager{} }) Describe("Initialize", func() { It("returns a free port and an address to bind to", func() { - port, host, err := defaultAddressManager.Initialize() + port, host, err := addressManager.Initialize() Expect(err).NotTo(HaveOccurred()) Expect(host).To(Equal("127.0.0.1")) @@ -35,38 +35,37 @@ var _ = Describe("DefaultAddressManager", func() { Context("initialized multiple times", func() { It("fails", func() { - _, _, err := defaultAddressManager.Initialize() + _, _, err := addressManager.Initialize() Expect(err).NotTo(HaveOccurred()) - _, _, err = defaultAddressManager.Initialize() + _, _, err = addressManager.Initialize() Expect(err).To(MatchError(ContainSubstring("already initialized"))) }) }) }) Describe("Port", func() { It("returns an error if Initialize has not been called yet", func() { - _, err := defaultAddressManager.Port() + _, err := addressManager.Port() Expect(err).To(MatchError(ContainSubstring("not initialized yet"))) }) It("returns the same port as previously allocated by Initialize", func() { - expectedPort, _, err := defaultAddressManager.Initialize() + expectedPort, _, err := addressManager.Initialize() Expect(err).NotTo(HaveOccurred()) - actualPort, err := defaultAddressManager.Port() + actualPort, err := addressManager.Port() Expect(err).NotTo(HaveOccurred()) Expect(actualPort).To(Equal(expectedPort)) }) }) Describe("Host", func() { It("returns an error if Initialize has not been called yet", func() { - _, err := defaultAddressManager.Host() + _, err := addressManager.Host() Expect(err).To(MatchError(ContainSubstring("not initialized yet"))) }) It("returns the same port as previously allocated by Initialize", func() { - _, expectedHost, err := defaultAddressManager.Initialize() + _, expectedHost, err := addressManager.Initialize() Expect(err).NotTo(HaveOccurred()) - actualHost, err := defaultAddressManager.Host() + actualHost, err := addressManager.Host() Expect(err).NotTo(HaveOccurred()) Expect(actualHost).To(Equal(expectedHost)) }) - }) })