Move AddressManager to an internal package

This commit is contained in:
Hannes Hörl 2018-01-08 11:42:34 +00:00 committed by Gareth Smith
parent 40566a76e1
commit b786202c38
5 changed files with 70 additions and 81 deletions

View File

@ -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
}

View File

@ -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

View File

@ -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

View File

@ -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
}

View File

@ -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))
})
})
})