Move AddressManager to an internal package
This commit is contained in:
parent
40566a76e1
commit
b786202c38
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
}
|
||||
|
|
@ -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))
|
||||
})
|
||||
|
||||
})
|
||||
})
|
||||
Loading…
Reference in New Issue