Skip to content

Commit 4918210

Browse files
authored
Return a proper error on no ip available (#157)
1 parent 79a7226 commit 4918210

File tree

1 file changed

+24
-15
lines changed

1 file changed

+24
-15
lines changed

pkg/service/ipam-service.go

Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,11 @@ package service
33
import (
44
"context"
55
"errors"
6-
"fmt"
76
"log/slog"
87

98
"net/netip"
109

1110
"connectrpc.com/connect"
12-
"github.com/metal-stack/go-ipam"
1311
goipam "github.com/metal-stack/go-ipam"
1412
v1 "github.com/metal-stack/go-ipam/api/v1"
1513
"github.com/metal-stack/v"
@@ -43,6 +41,9 @@ func (i *IPAMService) CreatePrefix(ctx context.Context, req *connect.Request[v1.
4341
}
4442
resp, err := i.ipamer.NewPrefix(ctx, req.Msg.GetCidr())
4543
if err != nil {
44+
if errors.Is(err, goipam.ErrNotFound) {
45+
return nil, connect.NewError(connect.CodeNotFound, err)
46+
}
4647
i.log.Error("createprefix", "error", err)
4748
return nil, connect.NewError(connect.CodeInvalidArgument, err)
4849
}
@@ -62,6 +63,9 @@ func (i *IPAMService) DeletePrefix(ctx context.Context, req *connect.Request[v1.
6263
}
6364
resp, err := i.ipamer.DeletePrefix(ctx, req.Msg.GetCidr())
6465
if err != nil {
66+
if errors.Is(err, goipam.ErrNotFound) {
67+
return nil, connect.NewError(connect.CodeNotFound, err)
68+
}
6569
i.log.Error("deleteprefix", "error", err)
6670
return nil, connect.NewError(connect.CodeInvalidArgument, err)
6771
}
@@ -82,11 +86,11 @@ func (i *IPAMService) GetPrefix(ctx context.Context, req *connect.Request[v1.Get
8286
}
8387
resp, err := i.ipamer.PrefixFrom(ctx, req.Msg.GetCidr())
8488
if err != nil {
89+
if errors.Is(err, goipam.ErrNotFound) {
90+
return nil, connect.NewError(connect.CodeNotFound, err)
91+
}
8592
return nil, connect.NewError(connect.CodeInvalidArgument, err)
8693
}
87-
if resp == nil {
88-
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("prefix:%q not found", req.Msg.GetCidr()))
89-
}
9094

9195
return connect.NewResponse(
9296
&v1.GetPrefixResponse{
@@ -160,10 +164,11 @@ func (i *IPAMService) ReleaseChildPrefix(ctx context.Context, req *connect.Reque
160164
}
161165
prefix, err := i.ipamer.PrefixFrom(ctx, req.Msg.GetCidr())
162166
if err != nil {
163-
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("prefix:%q not parsable:%s", req.Msg.GetCidr(), err.Error()))
164-
}
165-
if prefix == nil {
166-
return nil, connect.NewError(connect.CodeNotFound, fmt.Errorf("prefix:%q not found", req.Msg.GetCidr()))
167+
if errors.Is(err, goipam.ErrNotFound) {
168+
return nil, connect.NewError(connect.CodeNotFound, err)
169+
}
170+
i.log.Error("releasechildprefix", "error", err)
171+
return nil, connect.NewError(connect.CodeInvalidArgument, err)
167172
}
168173

169174
err = i.ipamer.ReleaseChildPrefix(ctx, prefix)
@@ -191,14 +196,17 @@ func (i *IPAMService) AcquireIP(ctx context.Context, req *connect.Request[v1.Acq
191196
resp, err = i.ipamer.AcquireSpecificIP(ctx, req.Msg.GetPrefixCidr(), req.Msg.GetIp())
192197
if err != nil {
193198
i.log.Error("acquireip", "error", err)
194-
if errors.Is(err, ipam.ErrAlreadyAllocated) {
199+
if errors.Is(err, goipam.ErrAlreadyAllocated) {
195200
return nil, connect.NewError(connect.CodeAlreadyExists, err)
196201
}
197202
return nil, connect.NewError(connect.CodeInvalidArgument, err)
198203
}
199204
} else {
200205
resp, err = i.ipamer.AcquireIP(ctx, req.Msg.GetPrefixCidr())
201206
if err != nil {
207+
if errors.Is(err, goipam.ErrNoIPAvailable) {
208+
return nil, connect.NewError(connect.CodeNotFound, err)
209+
}
202210
i.log.Error("acquireip", "error", err)
203211
return nil, connect.NewError(connect.CodeInvalidArgument, err)
204212
}
@@ -229,7 +237,7 @@ func (i *IPAMService) ReleaseIP(ctx context.Context, req *connect.Request[v1.Rel
229237
resp, err := i.ipamer.ReleaseIP(ctx, ip)
230238
if err != nil {
231239
i.log.Error("releaseip", "error", err)
232-
if errors.Is(err, ipam.ErrNotFound) {
240+
if errors.Is(err, goipam.ErrNotFound) {
233241
return nil, connect.NewError(connect.CodeNotFound, err)
234242
}
235243
return nil, connect.NewError(connect.CodeInvalidArgument, err)
@@ -279,10 +287,11 @@ func (i *IPAMService) PrefixUsage(ctx context.Context, req *connect.Request[v1.P
279287
}
280288
p, err := i.ipamer.PrefixFrom(ctx, req.Msg.GetCidr())
281289
if err != nil {
282-
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("prefix:%q not parsable:%s", req.Msg.GetCidr(), err.Error()))
283-
}
284-
if p == nil {
285-
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("prefix:%q not found", req.Msg.GetCidr()))
290+
if errors.Is(err, goipam.ErrNotFound) {
291+
return nil, connect.NewError(connect.CodeNotFound, err)
292+
}
293+
i.log.Error("prefixusage", "error", err)
294+
return nil, connect.NewError(connect.CodeInvalidArgument, err)
286295
}
287296
u := p.Usage()
288297
return connect.NewResponse(

0 commit comments

Comments
 (0)