From 09ae32e0f0810d7d5a90d406b15fc88d1da7ab4d Mon Sep 17 00:00:00 2001
From: Viliam Lorinc <viliam.lorinc@t-systems.com>
Date: Mon, 18 Sep 2023 16:07:10 +0200
Subject: [PATCH 1/5] change the handling of ignored errors

---
 client/client.go | 238 +++++++++++++++++++++++------------------------
 errors/errors.go |  17 ++--
 2 files changed, 130 insertions(+), 125 deletions(-)

diff --git a/client/client.go b/client/client.go
index 1a48ac3..255f433 100644
--- a/client/client.go
+++ b/client/client.go
@@ -26,55 +26,55 @@ import (
 )
 
 type Client interface {
-	GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-	CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-	DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-
-	ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error)
-	CreateLoadBalancerPrefix(ctx context.Context, prefix *api.LoadBalancerPrefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error)
-	DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error)
-
-	ListLoadBalancerTargets(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTargetList, error)
-	CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error)
-	DeleteLoadBalancerTarget(ctx context.Context, id string, targetIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error)
-
-	GetInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-	ListInterfaces(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.InterfaceList, error)
-	CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-	DeleteInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-
-	GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-	CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-	DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-
-	ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error)
-	CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error)
-	DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error)
-
-	ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...errors.IgnoredErrors) (*api.RouteList, error)
-	CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error)
-	DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error)
-
-	GetNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-
-	CreateNeighborNat(ctx context.Context, nat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error)
-	ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-	DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error)
-	ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-
-	ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRuleList, error)
-	CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-	GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-	DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-
-	CheckInitialized(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error)
-	Initialize(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error)
-	GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error)
-	ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error)
-	GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...errors.IgnoredErrors) (*api.Version, error)
+	GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+	CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+	DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+
+	ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error)
+	CreateLoadBalancerPrefix(ctx context.Context, prefix *api.LoadBalancerPrefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error)
+	DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error)
+
+	ListLoadBalancerTargets(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.LoadBalancerTargetList, error)
+	CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error)
+	DeleteLoadBalancerTarget(ctx context.Context, id string, targetIP *netip.Addr, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error)
+
+	GetInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error)
+	ListInterfaces(ctx context.Context, ignoredErrors ...[]int32) (*api.InterfaceList, error)
+	CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...[]int32) (*api.Interface, error)
+	DeleteInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error)
+
+	GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+	CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+	DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+
+	ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error)
+	CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error)
+	DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error)
+
+	ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...[]int32) (*api.RouteList, error)
+	CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...[]int32) (*api.Route, error)
+	DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Route, error)
+
+	GetNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error)
+	CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[]int32) (*api.Nat, error)
+	DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error)
+	ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error)
+
+	CreateNeighborNat(ctx context.Context, nat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error)
+	ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...[]int32) (*api.NatList, error)
+	DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error)
+	ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error)
+
+	ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.FirewallRuleList, error)
+	CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+	GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+	DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+
+	CheckInitialized(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error)
+	Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error)
+	GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error)
+	ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error)
+	GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...[]int32) (*api.Version, error)
 }
 
 type client struct {
@@ -85,7 +85,7 @@ func NewClient(protoClient dpdkproto.DPDKonmetalClient) Client {
 	return &client{protoClient}
 }
 
-func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	res, err := c.DPDKonmetalClient.GetLoadBalancer(ctx, &dpdkproto.GetLoadBalancerRequest{
 		LoadbalancerId: []byte(id),
 	})
@@ -98,12 +98,12 @@ func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors .
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoLoadBalancerToLoadBalancer(res, id)
 }
 
-func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	var lbPorts = make([]*dpdkproto.LbPort, 0, len(lb.Spec.Lbports))
 	for _, p := range lb.Spec.Lbports {
 		lbPort := &dpdkproto.LbPort{Port: p.Port, Protocol: dpdkproto.Protocol(p.Protocol)}
@@ -124,7 +124,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -137,7 +137,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 	return retLoadBalancer, nil
 }
 
-func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancer(ctx, &dpdkproto.DeleteLoadBalancerRequest{
 		LoadbalancerId: []byte(id),
 	})
@@ -150,12 +150,12 @@ func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredError
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLoadBalancer, nil
 }
 
-func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error) {
+func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error) {
 	res, err := c.DPDKonmetalClient.ListLoadBalancerPrefixes(ctx, &dpdkproto.ListLoadBalancerPrefixesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -182,7 +182,7 @@ func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID strin
 	}, nil
 }
 
-func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.LoadBalancerPrefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error) {
+func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.LoadBalancerPrefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error) {
 	res, err := c.DPDKonmetalClient.CreateLoadBalancerPrefix(ctx, &dpdkproto.CreateLoadBalancerPrefixRequest{
 		InterfaceId: []byte(lbprefix.InterfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -202,7 +202,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -212,7 +212,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 	return retLBPrefix, nil
 }
 
-func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error) {
+func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancerPrefix(ctx, &dpdkproto.DeleteLoadBalancerPrefixRequest{
 		InterfaceId: []byte(interfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -230,12 +230,12 @@ func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID strin
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLBPrefix, nil
 }
 
-func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTargetList, error) {
+func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID string, ignoredErrors ...[]int32) (*api.LoadBalancerTargetList, error) {
 	res, err := c.DPDKonmetalClient.ListLoadBalancerTargets(ctx, &dpdkproto.ListLoadBalancerTargetsRequest{
 		LoadbalancerId: []byte(loadBalancerID),
 	})
@@ -245,7 +245,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	if res.GetStatus().GetCode() != 0 {
 		return &api.LoadBalancerTargetList{
 			TypeMeta: api.TypeMeta{Kind: api.LoadBalancerTargetListKind},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	lbtargets := make([]api.LoadBalancerTarget, len(res.GetTargetIps()))
@@ -269,7 +269,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	}, nil
 }
 
-func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error) {
+func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error) {
 	res, err := c.DPDKonmetalClient.CreateLoadBalancerTarget(ctx, &dpdkproto.CreateLoadBalancerTargetRequest{
 		LoadbalancerId: []byte(lbtarget.LoadBalancerTargetMeta.LoadbalancerID),
 		TargetIp:       api.NetIPAddrToProtoIpAddress(*lbtarget.Spec.TargetIP),
@@ -283,13 +283,13 @@ func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.Loa
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retLBTarget.Spec = lbtarget.Spec
 	return retLBTarget, nil
 }
 
-func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targetIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error) {
+func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targetIP *netip.Addr, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancerTarget(ctx, &dpdkproto.DeleteLoadBalancerTargetRequest{
 		LoadbalancerId: []byte(lbid),
 		TargetIp:       api.NetIPAddrToProtoIpAddress(*targetIP),
@@ -303,12 +303,12 @@ func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targ
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLBTarget, nil
 }
 
-func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error) {
 	res, err := c.DPDKonmetalClient.GetInterface(ctx, &dpdkproto.GetInterfaceRequest{
 		InterfaceId: []byte(id),
 	})
@@ -319,12 +319,12 @@ func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...e
 		return &api.Interface{
 			TypeMeta:      api.TypeMeta{Kind: api.InterfaceKind},
 			InterfaceMeta: api.InterfaceMeta{ID: id},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoInterfaceToInterface(res.GetInterface())
 }
 
-func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.InterfaceList, error) {
+func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...[]int32) (*api.InterfaceList, error) {
 	res, err := c.DPDKonmetalClient.ListInterfaces(ctx, &dpdkproto.ListInterfacesRequest{})
 	if err != nil {
 		return nil, err
@@ -347,7 +347,7 @@ func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...errors.Ign
 	}, nil
 }
 
-func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...[]int32) (*api.Interface, error) {
 	req := dpdkproto.CreateInterfaceRequest{
 		InterfaceType: dpdkproto.InterfaceType_VIRTUAL,
 		InterfaceId:   []byte(iface.ID),
@@ -372,7 +372,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors)
+		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -392,7 +392,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 	return retInterface, nil
 }
 
-func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error) {
 	res, err := c.DPDKonmetalClient.DeleteInterface(ctx, &dpdkproto.DeleteInterfaceRequest{
 		InterfaceId: []byte(id),
 	})
@@ -405,12 +405,12 @@ func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors .
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors)
+		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retInterface, nil
 }
 
-func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.GetVip(ctx, &dpdkproto.GetVipRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -421,12 +421,12 @@ func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredEr
 		return &api.VirtualIP{
 			TypeMeta:      api.TypeMeta{Kind: api.VirtualIPKind},
 			VirtualIPMeta: api.VirtualIPMeta{InterfaceID: interfaceID},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoVirtualIPToVirtualIP(interfaceID, res)
 }
 
-func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.CreateVip(ctx, &dpdkproto.CreateVipRequest{
 		InterfaceId: []byte(virtualIP.InterfaceID),
 		VipIp:       api.NetIPAddrToProtoIpAddress(*virtualIP.Spec.IP),
@@ -443,7 +443,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -453,7 +453,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 	return retVirtualIP, nil
 }
 
-func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.DeleteVip(ctx, &dpdkproto.DeleteVipRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -466,12 +466,12 @@ func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignore
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retVirtualIP, nil
 }
 
-func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error) {
+func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error) {
 	res, err := c.DPDKonmetalClient.ListPrefixes(ctx, &dpdkproto.ListPrefixesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -497,7 +497,7 @@ func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredEr
 	}, nil
 }
 
-func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error) {
+func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error) {
 	res, err := c.DPDKonmetalClient.CreatePrefix(ctx, &dpdkproto.CreatePrefixRequest{
 		InterfaceId: []byte(prefix.InterfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -516,7 +516,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	}
 
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -526,7 +526,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	return retPrefix, nil
 }
 
-func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error) {
+func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error) {
 	res, err := c.DPDKonmetalClient.DeletePrefix(ctx, &dpdkproto.DeletePrefixRequest{
 		InterfaceId: []byte(interfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -544,12 +544,12 @@ func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *n
 		Status:     api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retPrefix, nil
 }
 
-func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error) {
+func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...[]int32) (*api.Route, error) {
 	res, err := c.DPDKonmetalClient.CreateRoute(ctx, &dpdkproto.CreateRouteRequest{
 		Vni: route.VNI,
 		Route: &dpdkproto.Route{
@@ -574,13 +574,13 @@ func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredError
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors)
+		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retRoute.Spec = route.Spec
 	return retRoute, nil
 }
 
-func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error) {
+func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Route, error) {
 	res, err := c.DPDKonmetalClient.DeleteRoute(ctx, &dpdkproto.DeleteRouteRequest{
 		Vni: vni,
 		Route: &dpdkproto.Route{
@@ -604,12 +604,12 @@ func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Pref
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors)
+		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retRoute, nil
 }
 
-func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...errors.IgnoredErrors) (*api.RouteList, error) {
+func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...[]int32) (*api.RouteList, error) {
 	res, err := c.DPDKonmetalClient.ListRoutes(ctx, &dpdkproto.ListRoutesRequest{
 		Vni: vni,
 	})
@@ -635,7 +635,7 @@ func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...er
 	}, nil
 }
 
-func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.GetNat(ctx, &dpdkproto.GetNatRequest{InterfaceId: []byte(interfaceID)})
 	if err != nil {
 		return &api.Nat{}, err
@@ -644,12 +644,12 @@ func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors .
 		return &api.Nat{
 			TypeMeta: api.TypeMeta{Kind: api.NatKind},
 			NatMeta:  api.NatMeta{InterfaceID: interfaceID},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoNatToNat(res, interfaceID)
 }
 
-func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.CreateNat(ctx, &dpdkproto.CreateNatRequest{
 		InterfaceId: []byte(nat.NatMeta.InterfaceID),
 		NatIp:       api.NetIPAddrToProtoIpAddress(*nat.Spec.NatIP),
@@ -665,7 +665,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...e
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors)
+		return retNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -678,7 +678,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...e
 	return retNat, nil
 }
 
-func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.DeleteNat(ctx, &dpdkproto.DeleteNatRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -691,16 +691,16 @@ func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredError
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors)
+		return retNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retNat, nil
 }
 
-func (c *client) ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error) {
 	return c.ListNats(ctx, natIP, "local", ignoredErrors...)
 }
 
-func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error) {
+func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error) {
 
 	res, err := c.DPDKonmetalClient.CreateNeighborNat(ctx, &dpdkproto.CreateNeighborNatRequest{
 		NatIp:         api.NetIPAddrToProtoIpAddress(*nNat.NatIP),
@@ -718,13 +718,13 @@ func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, i
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retnNat, errors.GetError(res.Status, ignoredErrors)
+		return retnNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retnNat.Spec = nNat.Spec
 	return retnNat, nil
 }
 
-func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...[]int32) (*api.NatList, error) {
 	var nType int32
 	switch strings.ToLower(natType) {
 	case "local", "1":
@@ -803,7 +803,7 @@ func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string
 	}, nil
 }
 
-func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error) {
+func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error) {
 	res, err := c.DPDKonmetalClient.DeleteNeighborNat(ctx, &dpdkproto.DeleteNeighborNatRequest{
 		NatIp:   api.NetIPAddrToProtoIpAddress(*neigbhorNat.NatIP),
 		Vni:     neigbhorNat.Spec.Vni,
@@ -819,16 +819,16 @@ func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.Neighbo
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return nnat, errors.GetError(res.Status, ignoredErrors)
+		return nnat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return nnat, nil
 }
 
-func (c *client) ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error) {
 	return c.ListNats(ctx, natIP, "neigh", ignoredErrors...)
 }
 
-func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRuleList, error) {
+func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.FirewallRuleList, error) {
 	res, err := c.DPDKonmetalClient.ListFirewallRules(ctx, &dpdkproto.ListFirewallRulesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -853,7 +853,7 @@ func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, igno
 	}, nil
 }
 
-func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	var action, direction uint8
 
 	switch strings.ToLower(fwRule.Spec.FirewallAction) {
@@ -907,13 +907,13 @@ func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRul
 		Spec:             api.FirewallRuleSpec{RuleID: fwRule.Spec.RuleID},
 		Status:           api.ProtoStatusToStatus(res.Status)}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors)
+		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retFwrule.Spec = fwRule.Spec
 	return retFwrule, nil
 }
 
-func (c *client) GetFirewallRule(ctx context.Context, ruleID string, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) GetFirewallRule(ctx context.Context, ruleID string, interfaceID string, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	res, err := c.DPDKonmetalClient.GetFirewallRule(ctx, &dpdkproto.GetFirewallRuleRequest{
 		InterfaceId: []byte(interfaceID),
 		RuleId:      []byte(ruleID),
@@ -927,13 +927,13 @@ func (c *client) GetFirewallRule(ctx context.Context, ruleID string, interfaceID
 			FirewallRuleMeta: api.FirewallRuleMeta{InterfaceID: interfaceID},
 			Spec:             api.FirewallRuleSpec{RuleID: ruleID},
 			Status:           api.ProtoStatusToStatus(res.Status),
-		}, errors.GetError(res.Status, ignoredErrors)
+		}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	return api.ProtoFwRuleToFwRule(res.Rule, interfaceID)
 }
 
-func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	res, err := c.DPDKonmetalClient.DeleteFirewallRule(ctx, &dpdkproto.DeleteFirewallRuleRequest{
 		InterfaceId: []byte(interfaceID),
 		RuleId:      []byte(ruleID),
@@ -948,12 +948,12 @@ func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, rul
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors)
+		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retFwrule, nil
 }
 
-func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error) {
+func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error) {
 	res, err := c.DPDKonmetalClient.CheckInitialized(ctx, &dpdkproto.CheckInitializedRequest{})
 	if err != nil {
 		return &api.Initialized{}, err
@@ -963,13 +963,13 @@ func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...errors.I
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInitialized, errors.GetError(res.Status, ignoredErrors)
+		return retInitialized, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retInitialized.Spec.UUID = res.Uuid
 	return retInitialized, nil
 }
 
-func (c *client) Initialize(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error) {
+func (c *client) Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error) {
 	res, err := c.DPDKonmetalClient.Initialize(ctx, &dpdkproto.InitializeRequest{})
 	if err != nil {
 		return &api.Initialized{}, err
@@ -979,13 +979,13 @@ func (c *client) Initialize(ctx context.Context, ignoredErrors ...errors.Ignored
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInit, errors.GetError(res.Status, ignoredErrors)
+		return retInit, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retInit.Spec.UUID = res.Uuid
 	return retInit, nil
 }
 
-func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error) {
+func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error) {
 	res, err := c.DPDKonmetalClient.CheckVniInUse(ctx, &dpdkproto.CheckVniInUseRequest{
 		Vni:  vni,
 		Type: dpdkproto.VniType(vniType),
@@ -999,13 +999,13 @@ func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredE
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors)
+		return retVni, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retVni.Spec.InUse = res.InUse
 	return retVni, nil
 }
 
-func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error) {
+func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error) {
 	res, err := c.DPDKonmetalClient.ResetVni(ctx, &dpdkproto.ResetVniRequest{
 		Vni:  vni,
 		Type: dpdkproto.VniType(vniType),
@@ -1019,12 +1019,12 @@ func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignore
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors)
+		return retVni, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retVni, nil
 }
 
-func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...errors.IgnoredErrors) (*api.Version, error) {
+func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...[]int32) (*api.Version, error) {
 	version.ClientProtocol = strings.TrimSpace(dpdkproto.GeneratedFrom)
 	res, err := c.DPDKonmetalClient.GetVersion(ctx, &dpdkproto.GetVersionRequest{
 		ClientProtocol: version.ClientProtocol,
@@ -1036,7 +1036,7 @@ func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredEr
 	}
 	version.Status = api.ProtoStatusToStatus(res.Status)
 	if res.GetStatus().GetCode() != 0 {
-		return version, errors.GetError(res.Status, ignoredErrors)
+		return version, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	version.Spec.ServiceProtocol = res.ServiceProtocol
 	version.Spec.ServiceVersion = res.ServiceVersion
diff --git a/errors/errors.go b/errors/errors.go
index c0ad1e9..9a1798a 100644
--- a/errors/errors.go
+++ b/errors/errors.go
@@ -66,10 +66,6 @@ const (
 	StatusErrorString = "rpc error"
 )
 
-type IgnoredErrors struct {
-	Codes []int32
-}
-
 type StatusError struct {
 	errorCode int32
 	message   string
@@ -97,12 +93,13 @@ func NewStatusError(errorCode int32, message string) *StatusError {
 	}
 }
 
-func GetError(status *dpdkproto.Status, ignoredErrors []IgnoredErrors) error {
+// Ignore requested status errors
+func GetError(status *dpdkproto.Status, ignoredErrors []int32) error {
 	if status.Code == 0 {
 		return nil
 	}
 	if len(ignoredErrors) > 0 {
-		for _, ignoredError := range ignoredErrors[0].Codes {
+		for _, ignoredError := range ignoredErrors {
 			if status.Code == ignoredError {
 				return nil
 			}
@@ -131,3 +128,11 @@ func IgnoreStatusErrorCode(err error, errorCodes ...int32) error {
 	}
 	return err
 }
+
+// Create array of status error codes to be ignored
+func Ignore(errorCodes ...int32) []int32 {
+	arr := make([]int32, 0, len(errorCodes))
+	arr = append(arr, errorCodes...)
+
+	return arr
+}

From d35c3ad0c794d55ba259955507df7f38aeb1fbe0 Mon Sep 17 00:00:00 2001
From: Viliam Lorinc <viliam.lorinc@t-systems.com>
Date: Tue, 19 Sep 2023 12:51:09 +0200
Subject: [PATCH 2/5] fix empty ignoredErrors handling

---
 client/client.go | 62 ++++++++++++++++++++++++------------------------
 errors/errors.go |  4 ++--
 2 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/client/client.go b/client/client.go
index 255f433..7154e12 100644
--- a/client/client.go
+++ b/client/client.go
@@ -98,7 +98,7 @@ func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors .
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoLoadBalancerToLoadBalancer(res, id)
 }
@@ -124,7 +124,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -150,7 +150,7 @@ func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredError
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLoadBalancer, nil
 }
@@ -202,7 +202,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -230,7 +230,7 @@ func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID strin
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLBPrefix, nil
 }
@@ -245,7 +245,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	if res.GetStatus().GetCode() != 0 {
 		return &api.LoadBalancerTargetList{
 			TypeMeta: api.TypeMeta{Kind: api.LoadBalancerTargetListKind},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	lbtargets := make([]api.LoadBalancerTarget, len(res.GetTargetIps()))
@@ -283,7 +283,7 @@ func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.Loa
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
 	}
 	retLBTarget.Spec = lbtarget.Spec
 	return retLBTarget, nil
@@ -303,7 +303,7 @@ func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targ
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLBTarget, nil
 }
@@ -319,7 +319,7 @@ func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...[
 		return &api.Interface{
 			TypeMeta:      api.TypeMeta{Kind: api.InterfaceKind},
 			InterfaceMeta: api.InterfaceMeta{ID: id},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoInterfaceToInterface(res.GetInterface())
 }
@@ -372,7 +372,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
+		return retInterface, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -405,7 +405,7 @@ func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors .
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
+		return retInterface, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retInterface, nil
 }
@@ -421,7 +421,7 @@ func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredEr
 		return &api.VirtualIP{
 			TypeMeta:      api.TypeMeta{Kind: api.VirtualIPKind},
 			VirtualIPMeta: api.VirtualIPMeta{InterfaceID: interfaceID},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoVirtualIPToVirtualIP(interfaceID, res)
 }
@@ -443,7 +443,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -466,7 +466,7 @@ func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignore
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retVirtualIP, nil
 }
@@ -516,7 +516,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	}
 
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -544,7 +544,7 @@ func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *n
 		Status:     api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retPrefix, nil
 }
@@ -574,7 +574,7 @@ func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredError
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
+		return retRoute, errors.GetError(res.Status, ignoredErrors)
 	}
 	retRoute.Spec = route.Spec
 	return retRoute, nil
@@ -604,7 +604,7 @@ func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Pref
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
+		return retRoute, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retRoute, nil
 }
@@ -644,7 +644,7 @@ func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors .
 		return &api.Nat{
 			TypeMeta: api.TypeMeta{Kind: api.NatKind},
 			NatMeta:  api.NatMeta{InterfaceID: interfaceID},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoNatToNat(res, interfaceID)
 }
@@ -665,7 +665,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retNat, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -691,7 +691,7 @@ func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredError
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retNat, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retNat, nil
 }
@@ -718,7 +718,7 @@ func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, i
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retnNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retnNat, errors.GetError(res.Status, ignoredErrors)
 	}
 	retnNat.Spec = nNat.Spec
 	return retnNat, nil
@@ -819,7 +819,7 @@ func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.Neighbo
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return nnat, errors.GetError(res.Status, ignoredErrors[0])
+		return nnat, errors.GetError(res.Status, ignoredErrors)
 	}
 	return nnat, nil
 }
@@ -907,7 +907,7 @@ func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRul
 		Spec:             api.FirewallRuleSpec{RuleID: fwRule.Spec.RuleID},
 		Status:           api.ProtoStatusToStatus(res.Status)}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
+		return retFwrule, errors.GetError(res.Status, ignoredErrors)
 	}
 	retFwrule.Spec = fwRule.Spec
 	return retFwrule, nil
@@ -927,7 +927,7 @@ func (c *client) GetFirewallRule(ctx context.Context, ruleID string, interfaceID
 			FirewallRuleMeta: api.FirewallRuleMeta{InterfaceID: interfaceID},
 			Spec:             api.FirewallRuleSpec{RuleID: ruleID},
 			Status:           api.ProtoStatusToStatus(res.Status),
-		}, errors.GetError(res.Status, ignoredErrors[0])
+		}, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	return api.ProtoFwRuleToFwRule(res.Rule, interfaceID)
@@ -948,7 +948,7 @@ func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, rul
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
+		return retFwrule, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retFwrule, nil
 }
@@ -963,7 +963,7 @@ func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...[]int32)
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInitialized, errors.GetError(res.Status, ignoredErrors[0])
+		return retInitialized, errors.GetError(res.Status, ignoredErrors)
 	}
 	retInitialized.Spec.UUID = res.Uuid
 	return retInitialized, nil
@@ -979,7 +979,7 @@ func (c *client) Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInit, errors.GetError(res.Status, ignoredErrors[0])
+		return retInit, errors.GetError(res.Status, ignoredErrors)
 	}
 	retInit.Spec.UUID = res.Uuid
 	return retInit, nil
@@ -999,7 +999,7 @@ func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredE
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors[0])
+		return retVni, errors.GetError(res.Status, ignoredErrors)
 	}
 	retVni.Spec.InUse = res.InUse
 	return retVni, nil
@@ -1019,7 +1019,7 @@ func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignore
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors[0])
+		return retVni, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retVni, nil
 }
@@ -1036,7 +1036,7 @@ func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredEr
 	}
 	version.Status = api.ProtoStatusToStatus(res.Status)
 	if res.GetStatus().GetCode() != 0 {
-		return version, errors.GetError(res.Status, ignoredErrors[0])
+		return version, errors.GetError(res.Status, ignoredErrors)
 	}
 	version.Spec.ServiceProtocol = res.ServiceProtocol
 	version.Spec.ServiceVersion = res.ServiceVersion
diff --git a/errors/errors.go b/errors/errors.go
index 9a1798a..0d7fb6a 100644
--- a/errors/errors.go
+++ b/errors/errors.go
@@ -94,12 +94,12 @@ func NewStatusError(errorCode int32, message string) *StatusError {
 }
 
 // Ignore requested status errors
-func GetError(status *dpdkproto.Status, ignoredErrors []int32) error {
+func GetError(status *dpdkproto.Status, ignoredErrors [][]int32) error {
 	if status.Code == 0 {
 		return nil
 	}
 	if len(ignoredErrors) > 0 {
-		for _, ignoredError := range ignoredErrors {
+		for _, ignoredError := range ignoredErrors[0] {
 			if status.Code == ignoredError {
 				return nil
 			}

From 8f2829d757a5b3af5bb8dfffc637c87f1a1b382b Mon Sep 17 00:00:00 2001
From: Viliam Lorinc <viliam.lorinc@t-systems.com>
Date: Mon, 18 Sep 2023 16:07:10 +0200
Subject: [PATCH 3/5] change the handling of ignored errors

---
 client/client.go | 236 +++++++++++++++++++++++------------------------
 errors/errors.go |  17 ++--
 2 files changed, 129 insertions(+), 124 deletions(-)

diff --git a/client/client.go b/client/client.go
index 2a86d76..995d5cb 100644
--- a/client/client.go
+++ b/client/client.go
@@ -26,55 +26,55 @@ import (
 )
 
 type Client interface {
-	GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-	CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-	DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error)
-
-	ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error)
-	CreateLoadBalancerPrefix(ctx context.Context, prefix *api.LoadBalancerPrefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error)
-	DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error)
-
-	ListLoadBalancerTargets(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTargetList, error)
-	CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error)
-	DeleteLoadBalancerTarget(ctx context.Context, id string, targetIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error)
-
-	GetInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-	ListInterfaces(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.InterfaceList, error)
-	CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-	DeleteInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error)
-
-	GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-	CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-	DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error)
-
-	ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error)
-	CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error)
-	DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error)
-
-	ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...errors.IgnoredErrors) (*api.RouteList, error)
-	CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error)
-	DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error)
-
-	GetNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error)
-	ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-
-	CreateNeighborNat(ctx context.Context, nat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error)
-	ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-	DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error)
-	ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error)
-
-	ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRuleList, error)
-	CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-	GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-	DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error)
-
-	CheckInitialized(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error)
-	Initialize(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error)
-	GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error)
-	ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error)
-	GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...errors.IgnoredErrors) (*api.Version, error)
+	GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+	CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+	DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error)
+
+	ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error)
+	CreateLoadBalancerPrefix(ctx context.Context, prefix *api.LoadBalancerPrefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error)
+	DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error)
+
+	ListLoadBalancerTargets(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.LoadBalancerTargetList, error)
+	CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error)
+	DeleteLoadBalancerTarget(ctx context.Context, id string, targetIP *netip.Addr, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error)
+
+	GetInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error)
+	ListInterfaces(ctx context.Context, ignoredErrors ...[]int32) (*api.InterfaceList, error)
+	CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...[]int32) (*api.Interface, error)
+	DeleteInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error)
+
+	GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+	CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+	DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error)
+
+	ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error)
+	CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error)
+	DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error)
+
+	ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...[]int32) (*api.RouteList, error)
+	CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...[]int32) (*api.Route, error)
+	DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Route, error)
+
+	GetNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error)
+	CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[]int32) (*api.Nat, error)
+	DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error)
+	ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error)
+
+	CreateNeighborNat(ctx context.Context, nat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error)
+	ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...[]int32) (*api.NatList, error)
+	DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error)
+	ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error)
+
+	ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.FirewallRuleList, error)
+	CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+	GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+	DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error)
+
+	CheckInitialized(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error)
+	Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error)
+	GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error)
+	ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error)
+	GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...[]int32) (*api.Version, error)
 }
 
 type client struct {
@@ -85,7 +85,7 @@ func NewClient(protoClient dpdkproto.DPDKonmetalClient) Client {
 	return &client{protoClient}
 }
 
-func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	res, err := c.DPDKonmetalClient.GetLoadBalancer(ctx, &dpdkproto.GetLoadBalancerRequest{
 		LoadbalancerId: []byte(id),
 	})
@@ -98,12 +98,12 @@ func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors .
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoLoadBalancerToLoadBalancer(res, id)
 }
 
-func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	var lbPorts = make([]*dpdkproto.LbPort, 0, len(lb.Spec.Lbports))
 	for _, p := range lb.Spec.Lbports {
 		lbPort := &dpdkproto.LbPort{Port: p.Port, Protocol: dpdkproto.Protocol(p.Protocol)}
@@ -124,7 +124,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -137,7 +137,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 	return retLoadBalancer, nil
 }
 
-func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancer, error) {
+func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.LoadBalancer, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancer(ctx, &dpdkproto.DeleteLoadBalancerRequest{
 		LoadbalancerId: []byte(id),
 	})
@@ -150,12 +150,12 @@ func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredError
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLoadBalancer, nil
 }
 
-func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error) {
+func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error) {
 	res, err := c.DPDKonmetalClient.ListLoadBalancerPrefixes(ctx, &dpdkproto.ListLoadBalancerPrefixesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -182,7 +182,7 @@ func (c *client) ListLoadBalancerPrefixes(ctx context.Context, interfaceID strin
 	}, nil
 }
 
-func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.LoadBalancerPrefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error) {
+func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.LoadBalancerPrefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error) {
 	res, err := c.DPDKonmetalClient.CreateLoadBalancerPrefix(ctx, &dpdkproto.CreateLoadBalancerPrefixRequest{
 		InterfaceId: []byte(lbprefix.InterfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -202,7 +202,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -212,7 +212,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 	return retLBPrefix, nil
 }
 
-func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerPrefix, error) {
+func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.LoadBalancerPrefix, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancerPrefix(ctx, &dpdkproto.DeleteLoadBalancerPrefixRequest{
 		InterfaceId: []byte(interfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -230,12 +230,12 @@ func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID strin
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLBPrefix, nil
 }
 
-func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID string, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTargetList, error) {
+func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID string, ignoredErrors ...[]int32) (*api.LoadBalancerTargetList, error) {
 	res, err := c.DPDKonmetalClient.ListLoadBalancerTargets(ctx, &dpdkproto.ListLoadBalancerTargetsRequest{
 		LoadbalancerId: []byte(loadBalancerID),
 	})
@@ -245,7 +245,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	if res.GetStatus().GetCode() != 0 {
 		return &api.LoadBalancerTargetList{
 			TypeMeta: api.TypeMeta{Kind: api.LoadBalancerTargetListKind},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	lbtargets := make([]api.LoadBalancerTarget, len(res.GetTargetIps()))
@@ -269,7 +269,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	}, nil
 }
 
-func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error) {
+func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.LoadBalancerTarget, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error) {
 	res, err := c.DPDKonmetalClient.CreateLoadBalancerTarget(ctx, &dpdkproto.CreateLoadBalancerTargetRequest{
 		LoadbalancerId: []byte(lbtarget.LoadBalancerTargetMeta.LoadbalancerID),
 		TargetIp:       api.NetIPAddrToProtoIpAddress(*lbtarget.Spec.TargetIP),
@@ -283,13 +283,13 @@ func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.Loa
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retLBTarget.Spec = lbtarget.Spec
 	return retLBTarget, nil
 }
 
-func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targetIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.LoadBalancerTarget, error) {
+func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targetIP *netip.Addr, ignoredErrors ...[]int32) (*api.LoadBalancerTarget, error) {
 	res, err := c.DPDKonmetalClient.DeleteLoadBalancerTarget(ctx, &dpdkproto.DeleteLoadBalancerTargetRequest{
 		LoadbalancerId: []byte(lbid),
 		TargetIp:       api.NetIPAddrToProtoIpAddress(*targetIP),
@@ -303,12 +303,12 @@ func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targ
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retLBTarget, nil
 }
 
-func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error) {
 	res, err := c.DPDKonmetalClient.GetInterface(ctx, &dpdkproto.GetInterfaceRequest{
 		InterfaceId: []byte(id),
 	})
@@ -319,12 +319,12 @@ func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...e
 		return &api.Interface{
 			TypeMeta:      api.TypeMeta{Kind: api.InterfaceKind},
 			InterfaceMeta: api.InterfaceMeta{ID: id},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoInterfaceToInterface(res.GetInterface())
 }
 
-func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.InterfaceList, error) {
+func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...[]int32) (*api.InterfaceList, error) {
 	res, err := c.DPDKonmetalClient.ListInterfaces(ctx, &dpdkproto.ListInterfacesRequest{})
 	if err != nil {
 		return nil, err
@@ -347,7 +347,7 @@ func (c *client) ListInterfaces(ctx context.Context, ignoredErrors ...errors.Ign
 	}, nil
 }
 
-func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, ignoredErrors ...[]int32) (*api.Interface, error) {
 	req := dpdkproto.CreateInterfaceRequest{
 		InterfaceType: dpdkproto.InterfaceType_VIRTUAL,
 		InterfaceId:   []byte(iface.ID),
@@ -372,7 +372,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors)
+		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -392,7 +392,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 	return retInterface, nil
 }
 
-func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors ...errors.IgnoredErrors) (*api.Interface, error) {
+func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors ...[]int32) (*api.Interface, error) {
 	res, err := c.DPDKonmetalClient.DeleteInterface(ctx, &dpdkproto.DeleteInterfaceRequest{
 		InterfaceId: []byte(id),
 	})
@@ -405,12 +405,12 @@ func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors .
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors)
+		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retInterface, nil
 }
 
-func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.GetVip(ctx, &dpdkproto.GetVipRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -421,12 +421,12 @@ func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredEr
 		return &api.VirtualIP{
 			TypeMeta:      api.TypeMeta{Kind: api.VirtualIPKind},
 			VirtualIPMeta: api.VirtualIPMeta{InterfaceID: interfaceID},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoVirtualIPToVirtualIP(interfaceID, res)
 }
 
-func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.CreateVip(ctx, &dpdkproto.CreateVipRequest{
 		InterfaceId: []byte(virtualIP.InterfaceID),
 		VipIp:       api.NetIPAddrToProtoIpAddress(*virtualIP.Spec.IP),
@@ -443,7 +443,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -453,7 +453,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 	return retVirtualIP, nil
 }
 
-func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.VirtualIP, error) {
+func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.VirtualIP, error) {
 	res, err := c.DPDKonmetalClient.DeleteVip(ctx, &dpdkproto.DeleteVipRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -466,12 +466,12 @@ func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignore
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retVirtualIP, nil
 }
 
-func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.PrefixList, error) {
+func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.PrefixList, error) {
 	res, err := c.DPDKonmetalClient.ListPrefixes(ctx, &dpdkproto.ListPrefixesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -497,7 +497,7 @@ func (c *client) ListPrefixes(ctx context.Context, interfaceID string, ignoredEr
 	}, nil
 }
 
-func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error) {
+func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error) {
 	res, err := c.DPDKonmetalClient.CreatePrefix(ctx, &dpdkproto.CreatePrefixRequest{
 		InterfaceId: []byte(prefix.InterfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -516,7 +516,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	}
 
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -526,7 +526,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	return retPrefix, nil
 }
 
-func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Prefix, error) {
+func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Prefix, error) {
 	res, err := c.DPDKonmetalClient.DeletePrefix(ctx, &dpdkproto.DeletePrefixRequest{
 		InterfaceId: []byte(interfaceID),
 		Prefix: &dpdkproto.Prefix{
@@ -544,12 +544,12 @@ func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *n
 		Status:     api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors)
+		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retPrefix, nil
 }
 
-func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error) {
+func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredErrors ...[]int32) (*api.Route, error) {
 	res, err := c.DPDKonmetalClient.CreateRoute(ctx, &dpdkproto.CreateRouteRequest{
 		Vni: route.VNI,
 		Route: &dpdkproto.Route{
@@ -574,13 +574,13 @@ func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredError
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors)
+		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retRoute.Spec = route.Spec
 	return retRoute, nil
 }
 
-func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...errors.IgnoredErrors) (*api.Route, error) {
+func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Prefix, ignoredErrors ...[]int32) (*api.Route, error) {
 	res, err := c.DPDKonmetalClient.DeleteRoute(ctx, &dpdkproto.DeleteRouteRequest{
 		Vni: vni,
 		Route: &dpdkproto.Route{
@@ -604,12 +604,12 @@ func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Pref
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors)
+		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retRoute, nil
 }
 
-func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...errors.IgnoredErrors) (*api.RouteList, error) {
+func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...[]int32) (*api.RouteList, error) {
 	res, err := c.DPDKonmetalClient.ListRoutes(ctx, &dpdkproto.ListRoutesRequest{
 		Vni: vni,
 	})
@@ -635,7 +635,7 @@ func (c *client) ListRoutes(ctx context.Context, vni uint32, ignoredErrors ...er
 	}, nil
 }
 
-func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.GetNat(ctx, &dpdkproto.GetNatRequest{InterfaceId: []byte(interfaceID)})
 	if err != nil {
 		return &api.Nat{}, err
@@ -644,12 +644,12 @@ func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors .
 		return &api.Nat{
 			TypeMeta: api.TypeMeta{Kind: api.NatKind},
 			NatMeta:  api.NatMeta{InterfaceID: interfaceID},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return api.ProtoNatToNat(res, interfaceID)
 }
 
-func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.CreateNat(ctx, &dpdkproto.CreateNatRequest{
 		InterfaceId: []byte(nat.NatMeta.InterfaceID),
 		NatIp:       api.NetIPAddrToProtoIpAddress(*nat.Spec.NatIP),
@@ -665,7 +665,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...e
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors)
+		return retNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -678,7 +678,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...e
 	return retNat, nil
 }
 
-func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.Nat, error) {
+func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.Nat, error) {
 	res, err := c.DPDKonmetalClient.DeleteNat(ctx, &dpdkproto.DeleteNatRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -691,16 +691,16 @@ func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredError
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors)
+		return retNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retNat, nil
 }
 
-func (c *client) ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListLocalNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error) {
 	return c.ListNats(ctx, natIP, "local", ignoredErrors...)
 }
 
-func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error) {
+func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error) {
 
 	res, err := c.DPDKonmetalClient.CreateNeighborNat(ctx, &dpdkproto.CreateNeighborNatRequest{
 		NatIp:         api.NetIPAddrToProtoIpAddress(*nNat.NatIP),
@@ -718,13 +718,13 @@ func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, i
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retnNat, errors.GetError(res.Status, ignoredErrors)
+		return retnNat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retnNat.Spec = nNat.Spec
 	return retnNat, nil
 }
 
-func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string, ignoredErrors ...[]int32) (*api.NatList, error) {
 	var nType int32
 	switch strings.ToLower(natType) {
 	case "local", "1":
@@ -803,7 +803,7 @@ func (c *client) ListNats(ctx context.Context, natIP *netip.Addr, natType string
 	}, nil
 }
 
-func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...errors.IgnoredErrors) (*api.NeighborNat, error) {
+func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.NeighborNat, ignoredErrors ...[]int32) (*api.NeighborNat, error) {
 	res, err := c.DPDKonmetalClient.DeleteNeighborNat(ctx, &dpdkproto.DeleteNeighborNatRequest{
 		NatIp:   api.NetIPAddrToProtoIpAddress(*neigbhorNat.NatIP),
 		Vni:     neigbhorNat.Spec.Vni,
@@ -819,16 +819,16 @@ func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.Neighbo
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return nnat, errors.GetError(res.Status, ignoredErrors)
+		return nnat, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return nnat, nil
 }
 
-func (c *client) ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...errors.IgnoredErrors) (*api.NatList, error) {
+func (c *client) ListNeighborNats(ctx context.Context, natIP *netip.Addr, ignoredErrors ...[]int32) (*api.NatList, error) {
 	return c.ListNats(ctx, natIP, "neigh", ignoredErrors...)
 }
 
-func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRuleList, error) {
+func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, ignoredErrors ...[]int32) (*api.FirewallRuleList, error) {
 	res, err := c.DPDKonmetalClient.ListFirewallRules(ctx, &dpdkproto.ListFirewallRulesRequest{
 		InterfaceId: []byte(interfaceID),
 	})
@@ -853,7 +853,7 @@ func (c *client) ListFirewallRules(ctx context.Context, interfaceID string, igno
 	}, nil
 }
 
-func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRule, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	var action, direction uint8
 
 	switch strings.ToLower(fwRule.Spec.FirewallAction) {
@@ -907,7 +907,7 @@ func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRul
 		Spec:             api.FirewallRuleSpec{RuleID: fwRule.Spec.RuleID},
 		Status:           api.ProtoStatusToStatus(res.Status)}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors)
+		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retFwrule.Spec = fwRule.Spec
 	return retFwrule, nil
@@ -927,13 +927,13 @@ func (c *client) GetFirewallRule(ctx context.Context, interfaceID string, ruleID
 			FirewallRuleMeta: api.FirewallRuleMeta{InterfaceID: interfaceID},
 			Spec:             api.FirewallRuleSpec{RuleID: ruleID},
 			Status:           api.ProtoStatusToStatus(res.Status),
-		}, errors.GetError(res.Status, ignoredErrors)
+		}, errors.GetError(res.Status, ignoredErrors[0])
 	}
 
 	return api.ProtoFwRuleToFwRule(res.Rule, interfaceID)
 }
 
-func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	res, err := c.DPDKonmetalClient.DeleteFirewallRule(ctx, &dpdkproto.DeleteFirewallRuleRequest{
 		InterfaceId: []byte(interfaceID),
 		RuleId:      []byte(ruleID),
@@ -948,12 +948,12 @@ func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, rul
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors)
+		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retFwrule, nil
 }
 
-func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error) {
+func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error) {
 	res, err := c.DPDKonmetalClient.CheckInitialized(ctx, &dpdkproto.CheckInitializedRequest{})
 	if err != nil {
 		return &api.Initialized{}, err
@@ -963,13 +963,13 @@ func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...errors.I
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInitialized, errors.GetError(res.Status, ignoredErrors)
+		return retInitialized, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retInitialized.Spec.UUID = res.Uuid
 	return retInitialized, nil
 }
 
-func (c *client) Initialize(ctx context.Context, ignoredErrors ...errors.IgnoredErrors) (*api.Initialized, error) {
+func (c *client) Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api.Initialized, error) {
 	res, err := c.DPDKonmetalClient.Initialize(ctx, &dpdkproto.InitializeRequest{})
 	if err != nil {
 		return &api.Initialized{}, err
@@ -979,13 +979,13 @@ func (c *client) Initialize(ctx context.Context, ignoredErrors ...errors.Ignored
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInit, errors.GetError(res.Status, ignoredErrors)
+		return retInit, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retInit.Spec.UUID = res.Uuid
 	return retInit, nil
 }
 
-func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error) {
+func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error) {
 	res, err := c.DPDKonmetalClient.CheckVniInUse(ctx, &dpdkproto.CheckVniInUseRequest{
 		Vni:  vni,
 		Type: dpdkproto.VniType(vniType),
@@ -999,13 +999,13 @@ func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredE
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors)
+		return retVni, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	retVni.Spec.InUse = res.InUse
 	return retVni, nil
 }
 
-func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...errors.IgnoredErrors) (*api.Vni, error) {
+func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignoredErrors ...[]int32) (*api.Vni, error) {
 	res, err := c.DPDKonmetalClient.ResetVni(ctx, &dpdkproto.ResetVniRequest{
 		Vni:  vni,
 		Type: dpdkproto.VniType(vniType),
@@ -1019,12 +1019,12 @@ func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignore
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors)
+		return retVni, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	return retVni, nil
 }
 
-func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...errors.IgnoredErrors) (*api.Version, error) {
+func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredErrors ...[]int32) (*api.Version, error) {
 	version.ClientProtocol = strings.TrimSpace(dpdkproto.GeneratedFrom)
 	res, err := c.DPDKonmetalClient.GetVersion(ctx, &dpdkproto.GetVersionRequest{
 		ClientProtocol: version.ClientProtocol,
@@ -1036,7 +1036,7 @@ func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredEr
 	}
 	version.Status = api.ProtoStatusToStatus(res.Status)
 	if res.GetStatus().GetCode() != 0 {
-		return version, errors.GetError(res.Status, ignoredErrors)
+		return version, errors.GetError(res.Status, ignoredErrors[0])
 	}
 	version.Spec.ServiceProtocol = res.ServiceProtocol
 	version.Spec.ServiceVersion = res.ServiceVersion
diff --git a/errors/errors.go b/errors/errors.go
index c0ad1e9..9a1798a 100644
--- a/errors/errors.go
+++ b/errors/errors.go
@@ -66,10 +66,6 @@ const (
 	StatusErrorString = "rpc error"
 )
 
-type IgnoredErrors struct {
-	Codes []int32
-}
-
 type StatusError struct {
 	errorCode int32
 	message   string
@@ -97,12 +93,13 @@ func NewStatusError(errorCode int32, message string) *StatusError {
 	}
 }
 
-func GetError(status *dpdkproto.Status, ignoredErrors []IgnoredErrors) error {
+// Ignore requested status errors
+func GetError(status *dpdkproto.Status, ignoredErrors []int32) error {
 	if status.Code == 0 {
 		return nil
 	}
 	if len(ignoredErrors) > 0 {
-		for _, ignoredError := range ignoredErrors[0].Codes {
+		for _, ignoredError := range ignoredErrors {
 			if status.Code == ignoredError {
 				return nil
 			}
@@ -131,3 +128,11 @@ func IgnoreStatusErrorCode(err error, errorCodes ...int32) error {
 	}
 	return err
 }
+
+// Create array of status error codes to be ignored
+func Ignore(errorCodes ...int32) []int32 {
+	arr := make([]int32, 0, len(errorCodes))
+	arr = append(arr, errorCodes...)
+
+	return arr
+}

From acaf916180438a36481147e2e1496870fef796f5 Mon Sep 17 00:00:00 2001
From: Viliam Lorinc <viliam.lorinc@t-systems.com>
Date: Tue, 19 Sep 2023 12:51:09 +0200
Subject: [PATCH 4/5] fix empty ignoredErrors handling

---
 client/client.go | 62 ++++++++++++++++++++++++------------------------
 errors/errors.go |  4 ++--
 2 files changed, 33 insertions(+), 33 deletions(-)

diff --git a/client/client.go b/client/client.go
index 995d5cb..82d57ec 100644
--- a/client/client.go
+++ b/client/client.go
@@ -98,7 +98,7 @@ func (c *client) GetLoadBalancer(ctx context.Context, id string, ignoredErrors .
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoLoadBalancerToLoadBalancer(res, id)
 }
@@ -124,7 +124,7 @@ func (c *client) CreateLoadBalancer(ctx context.Context, lb *api.LoadBalancer, i
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -150,7 +150,7 @@ func (c *client) DeleteLoadBalancer(ctx context.Context, id string, ignoredError
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors[0])
+		return retLoadBalancer, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLoadBalancer, nil
 }
@@ -202,7 +202,7 @@ func (c *client) CreateLoadBalancerPrefix(ctx context.Context, lbprefix *api.Loa
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -230,7 +230,7 @@ func (c *client) DeleteLoadBalancerPrefix(ctx context.Context, interfaceID strin
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLBPrefix, nil
 }
@@ -245,7 +245,7 @@ func (c *client) ListLoadBalancerTargets(ctx context.Context, loadBalancerID str
 	if res.GetStatus().GetCode() != 0 {
 		return &api.LoadBalancerTargetList{
 			TypeMeta: api.TypeMeta{Kind: api.LoadBalancerTargetListKind},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	lbtargets := make([]api.LoadBalancerTarget, len(res.GetTargetIps()))
@@ -283,7 +283,7 @@ func (c *client) CreateLoadBalancerTarget(ctx context.Context, lbtarget *api.Loa
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
 	}
 	retLBTarget.Spec = lbtarget.Spec
 	return retLBTarget, nil
@@ -303,7 +303,7 @@ func (c *client) DeleteLoadBalancerTarget(ctx context.Context, lbid string, targ
 		Status:                 api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retLBTarget, errors.GetError(res.Status, ignoredErrors[0])
+		return retLBTarget, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retLBTarget, nil
 }
@@ -319,7 +319,7 @@ func (c *client) GetInterface(ctx context.Context, id string, ignoredErrors ...[
 		return &api.Interface{
 			TypeMeta:      api.TypeMeta{Kind: api.InterfaceKind},
 			InterfaceMeta: api.InterfaceMeta{ID: id},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoInterfaceToInterface(res.GetInterface())
 }
@@ -372,7 +372,7 @@ func (c *client) CreateInterface(ctx context.Context, iface *api.Interface, igno
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
+		return retInterface, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -405,7 +405,7 @@ func (c *client) DeleteInterface(ctx context.Context, id string, ignoredErrors .
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInterface, errors.GetError(res.Status, ignoredErrors[0])
+		return retInterface, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retInterface, nil
 }
@@ -421,7 +421,7 @@ func (c *client) GetVirtualIP(ctx context.Context, interfaceID string, ignoredEr
 		return &api.VirtualIP{
 			TypeMeta:      api.TypeMeta{Kind: api.VirtualIPKind},
 			VirtualIPMeta: api.VirtualIPMeta{InterfaceID: interfaceID},
-			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:        api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoVirtualIPToVirtualIP(interfaceID, res)
 }
@@ -443,7 +443,7 @@ func (c *client) CreateVirtualIP(ctx context.Context, virtualIP *api.VirtualIP,
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -466,7 +466,7 @@ func (c *client) DeleteVirtualIP(ctx context.Context, interfaceID string, ignore
 		Status:        api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVirtualIP, errors.GetError(res.Status, ignoredErrors[0])
+		return retVirtualIP, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retVirtualIP, nil
 }
@@ -516,7 +516,7 @@ func (c *client) CreatePrefix(ctx context.Context, prefix *api.Prefix, ignoredEr
 	}
 
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
 	if err != nil {
@@ -544,7 +544,7 @@ func (c *client) DeletePrefix(ctx context.Context, interfaceID string, prefix *n
 		Status:     api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retPrefix, errors.GetError(res.Status, ignoredErrors[0])
+		return retPrefix, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retPrefix, nil
 }
@@ -574,7 +574,7 @@ func (c *client) CreateRoute(ctx context.Context, route *api.Route, ignoredError
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
+		return retRoute, errors.GetError(res.Status, ignoredErrors)
 	}
 	retRoute.Spec = route.Spec
 	return retRoute, nil
@@ -604,7 +604,7 @@ func (c *client) DeleteRoute(ctx context.Context, vni uint32, prefix *netip.Pref
 		Status: api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retRoute, errors.GetError(res.Status, ignoredErrors[0])
+		return retRoute, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retRoute, nil
 }
@@ -644,7 +644,7 @@ func (c *client) GetNat(ctx context.Context, interfaceID string, ignoredErrors .
 		return &api.Nat{
 			TypeMeta: api.TypeMeta{Kind: api.NatKind},
 			NatMeta:  api.NatMeta{InterfaceID: interfaceID},
-			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors[0])
+			Status:   api.ProtoStatusToStatus(res.Status)}, errors.GetError(res.Status, ignoredErrors)
 	}
 	return api.ProtoNatToNat(res, interfaceID)
 }
@@ -665,7 +665,7 @@ func (c *client) CreateNat(ctx context.Context, nat *api.Nat, ignoredErrors ...[
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retNat, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	underlayRoute, err := netip.ParseAddr(string(res.GetUnderlayRoute()))
@@ -691,7 +691,7 @@ func (c *client) DeleteNat(ctx context.Context, interfaceID string, ignoredError
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.Status.GetCode() != 0 {
-		return retNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retNat, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retNat, nil
 }
@@ -718,7 +718,7 @@ func (c *client) CreateNeighborNat(ctx context.Context, nNat *api.NeighborNat, i
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retnNat, errors.GetError(res.Status, ignoredErrors[0])
+		return retnNat, errors.GetError(res.Status, ignoredErrors)
 	}
 	retnNat.Spec = nNat.Spec
 	return retnNat, nil
@@ -819,7 +819,7 @@ func (c *client) DeleteNeighborNat(ctx context.Context, neigbhorNat *api.Neighbo
 		Status:          api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return nnat, errors.GetError(res.Status, ignoredErrors[0])
+		return nnat, errors.GetError(res.Status, ignoredErrors)
 	}
 	return nnat, nil
 }
@@ -907,7 +907,7 @@ func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRul
 		Spec:             api.FirewallRuleSpec{RuleID: fwRule.Spec.RuleID},
 		Status:           api.ProtoStatusToStatus(res.Status)}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
+		return retFwrule, errors.GetError(res.Status, ignoredErrors)
 	}
 	retFwrule.Spec = fwRule.Spec
 	return retFwrule, nil
@@ -927,7 +927,7 @@ func (c *client) GetFirewallRule(ctx context.Context, interfaceID string, ruleID
 			FirewallRuleMeta: api.FirewallRuleMeta{InterfaceID: interfaceID},
 			Spec:             api.FirewallRuleSpec{RuleID: ruleID},
 			Status:           api.ProtoStatusToStatus(res.Status),
-		}, errors.GetError(res.Status, ignoredErrors[0])
+		}, errors.GetError(res.Status, ignoredErrors)
 	}
 
 	return api.ProtoFwRuleToFwRule(res.Rule, interfaceID)
@@ -948,7 +948,7 @@ func (c *client) DeleteFirewallRule(ctx context.Context, interfaceID string, rul
 		Status:           api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retFwrule, errors.GetError(res.Status, ignoredErrors[0])
+		return retFwrule, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retFwrule, nil
 }
@@ -963,7 +963,7 @@ func (c *client) CheckInitialized(ctx context.Context, ignoredErrors ...[]int32)
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInitialized, errors.GetError(res.Status, ignoredErrors[0])
+		return retInitialized, errors.GetError(res.Status, ignoredErrors)
 	}
 	retInitialized.Spec.UUID = res.Uuid
 	return retInitialized, nil
@@ -979,7 +979,7 @@ func (c *client) Initialize(ctx context.Context, ignoredErrors ...[]int32) (*api
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retInit, errors.GetError(res.Status, ignoredErrors[0])
+		return retInit, errors.GetError(res.Status, ignoredErrors)
 	}
 	retInit.Spec.UUID = res.Uuid
 	return retInit, nil
@@ -999,7 +999,7 @@ func (c *client) GetVni(ctx context.Context, vni uint32, vniType uint8, ignoredE
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors[0])
+		return retVni, errors.GetError(res.Status, ignoredErrors)
 	}
 	retVni.Spec.InUse = res.InUse
 	return retVni, nil
@@ -1019,7 +1019,7 @@ func (c *client) ResetVni(ctx context.Context, vni uint32, vniType uint8, ignore
 		Status:   api.ProtoStatusToStatus(res.Status),
 	}
 	if res.GetStatus().GetCode() != 0 {
-		return retVni, errors.GetError(res.Status, ignoredErrors[0])
+		return retVni, errors.GetError(res.Status, ignoredErrors)
 	}
 	return retVni, nil
 }
@@ -1036,7 +1036,7 @@ func (c *client) GetVersion(ctx context.Context, version *api.Version, ignoredEr
 	}
 	version.Status = api.ProtoStatusToStatus(res.Status)
 	if res.GetStatus().GetCode() != 0 {
-		return version, errors.GetError(res.Status, ignoredErrors[0])
+		return version, errors.GetError(res.Status, ignoredErrors)
 	}
 	version.Spec.ServiceProtocol = res.ServiceProtocol
 	version.Spec.ServiceVersion = res.ServiceVersion
diff --git a/errors/errors.go b/errors/errors.go
index 9a1798a..0d7fb6a 100644
--- a/errors/errors.go
+++ b/errors/errors.go
@@ -94,12 +94,12 @@ func NewStatusError(errorCode int32, message string) *StatusError {
 }
 
 // Ignore requested status errors
-func GetError(status *dpdkproto.Status, ignoredErrors []int32) error {
+func GetError(status *dpdkproto.Status, ignoredErrors [][]int32) error {
 	if status.Code == 0 {
 		return nil
 	}
 	if len(ignoredErrors) > 0 {
-		for _, ignoredError := range ignoredErrors {
+		for _, ignoredError := range ignoredErrors[0] {
 			if status.Code == ignoredError {
 				return nil
 			}

From eaf3ffc618d563852b50cd2bd76c16749f538f86 Mon Sep 17 00:00:00 2001
From: Viliam Lorinc <viliam.lorinc@t-systems.com>
Date: Thu, 21 Sep 2023 13:09:14 +0200
Subject: [PATCH 5/5] fix after rebase

---
 client/client.go | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/client/client.go b/client/client.go
index 82d57ec..1a557c8 100644
--- a/client/client.go
+++ b/client/client.go
@@ -913,7 +913,7 @@ func (c *client) CreateFirewallRule(ctx context.Context, fwRule *api.FirewallRul
 	return retFwrule, nil
 }
 
-func (c *client) GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...errors.IgnoredErrors) (*api.FirewallRule, error) {
+func (c *client) GetFirewallRule(ctx context.Context, interfaceID string, ruleID string, ignoredErrors ...[]int32) (*api.FirewallRule, error) {
 	res, err := c.DPDKonmetalClient.GetFirewallRule(ctx, &dpdkproto.GetFirewallRuleRequest{
 		InterfaceId: []byte(interfaceID),
 		RuleId:      []byte(ruleID),