From cfbdcec7d6e8d1fbbefe12cb14bbe0764100805f Mon Sep 17 00:00:00 2001 From: juanvallejo Date: Fri, 23 Sep 2016 10:21:20 -0400 Subject: [PATCH] make portallocator.ErrNotInRange a type --- pkg/kubectl/cmd/create_service.go | 4 ++-- pkg/kubectl/service_basic.go | 4 ++-- .../core/service/portallocator/allocator.go | 12 +++++++++--- .../core/service/portallocator/allocator_test.go | 13 ++++++++++--- .../core/service/portallocator/controller/repair.go | 2 +- 5 files changed, 24 insertions(+), 11 deletions(-) diff --git a/pkg/kubectl/cmd/create_service.go b/pkg/kubectl/cmd/create_service.go index 8a1459812d3..115f4c54a89 100644 --- a/pkg/kubectl/cmd/create_service.go +++ b/pkg/kubectl/cmd/create_service.go @@ -134,7 +134,7 @@ func NewCmdCreateServiceNodePort(f *cmdutil.Factory, cmdOut io.Writer) *cobra.Co cmdutil.AddValidateFlags(cmd) cmdutil.AddPrinterFlags(cmd) cmdutil.AddGeneratorFlags(cmd, cmdutil.ServiceNodePortGeneratorV1Name) - cmd.Flags().Int32("node-port", 0, "Port used to expose the service on each node in a cluster.") + cmd.Flags().Int("node-port", 0, "Port used to expose the service on each node in a cluster.") addPortFlags(cmd) return cmd } @@ -153,7 +153,7 @@ func CreateServiceNodePort(f *cmdutil.Factory, cmdOut io.Writer, cmd *cobra.Comm TCP: cmdutil.GetFlagStringSlice(cmd, "tcp"), Type: api.ServiceTypeNodePort, ClusterIP: "", - NodePort: cmdutil.GetFlagInt32(cmd, "node-port"), + NodePort: cmdutil.GetFlagInt(cmd, "node-port"), } default: return cmdutil.UsageError(cmd, fmt.Sprintf("Generator: %s not supported.", generatorName)) diff --git a/pkg/kubectl/service_basic.go b/pkg/kubectl/service_basic.go index c97c22ca12a..9f1c3d2b6e4 100644 --- a/pkg/kubectl/service_basic.go +++ b/pkg/kubectl/service_basic.go @@ -31,7 +31,7 @@ type ServiceCommonGeneratorV1 struct { TCP []string Type api.ServiceType ClusterIP string - NodePort int32 + NodePort int } type ServiceClusterIPGeneratorV1 struct { @@ -183,7 +183,7 @@ func (s ServiceCommonGeneratorV1) StructuredGenerate() (runtime.Object, error) { Port: port, TargetPort: targetPort, Protocol: api.Protocol("TCP"), - NodePort: s.NodePort, + NodePort: int32(s.NodePort), }) } diff --git a/pkg/registry/core/service/portallocator/allocator.go b/pkg/registry/core/service/portallocator/allocator.go index b84ad4378a9..8e3d42be08c 100644 --- a/pkg/registry/core/service/portallocator/allocator.go +++ b/pkg/registry/core/service/portallocator/allocator.go @@ -37,11 +37,18 @@ type Interface interface { var ( ErrFull = errors.New("range is full") - ErrNotInRange = errors.New("provided port is not in the valid range") ErrAllocated = errors.New("provided port is already allocated") ErrMismatchedNetwork = errors.New("the provided port range does not match the current port range") ) +type ErrNotInRange struct { + ValidPorts string +} + +func (e *ErrNotInRange) Error() string { + return fmt.Sprintf("provided port is not in the valid range. The range of valid ports is %s", e.ValidPorts) +} + type PortAllocator struct { portRange net.PortRange @@ -84,8 +91,7 @@ func (r *PortAllocator) Allocate(port int) error { if !ok { // include valid port range in error validPorts := r.portRange.String() - msg := fmt.Sprintf("Valid ports range is %s", validPorts) - return fmt.Errorf("%v. %s", ErrNotInRange, msg) + return &ErrNotInRange{validPorts} } allocated, err := r.alloc.Allocate(offset) diff --git a/pkg/registry/core/service/portallocator/allocator_test.go b/pkg/registry/core/service/portallocator/allocator_test.go index d060528b2ce..7386172b5e1 100644 --- a/pkg/registry/core/service/portallocator/allocator_test.go +++ b/pkg/registry/core/service/portallocator/allocator_test.go @@ -73,16 +73,23 @@ func TestAllocate(t *testing.T) { if err := r.Release(released); err != nil { t.Fatal(err) } - if err := r.Allocate(1); err != ErrNotInRange { + + err = r.Allocate(1) + if _, ok := err.(*ErrNotInRange); !ok { t.Fatal(err) } + if err := r.Allocate(10001); err != ErrAllocated { t.Fatal(err) } - if err := r.Allocate(20000); err != ErrNotInRange { + + err = r.Allocate(20000) + if _, ok := err.(*ErrNotInRange); !ok { t.Fatal(err) } - if err := r.Allocate(10201); err != ErrNotInRange { + + err = r.Allocate(10201) + if _, ok := err.(*ErrNotInRange); !ok { t.Fatal(err) } if f := r.Free(); f != 1 { diff --git a/pkg/registry/core/service/portallocator/controller/repair.go b/pkg/registry/core/service/portallocator/controller/repair.go index c91a9985ac6..b072fde703f 100644 --- a/pkg/registry/core/service/portallocator/controller/repair.go +++ b/pkg/registry/core/service/portallocator/controller/repair.go @@ -114,7 +114,7 @@ func (c *Repair) runOnce() error { // TODO: send event // port is broken, reallocate runtime.HandleError(fmt.Errorf("the port %d for service %s/%s was assigned to multiple services; please recreate", port, svc.Name, svc.Namespace)) - case portallocator.ErrNotInRange: + case err.(*portallocator.ErrNotInRange): // TODO: send event // port is broken, reallocate runtime.HandleError(fmt.Errorf("the port %d for service %s/%s is not within the port range %v; please recreate", port, svc.Name, svc.Namespace, c.portRange))