Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Adding stack to errors #419

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 8 additions & 6 deletions pkg/networkservice/common/createpod/server.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Copyright (c) 2021-2022 Doc.ai and/or its affiliates.
//
// Copyright (c) 2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -123,7 +125,7 @@ func (s *createPodServer) Request(ctx context.Context, request *networkservice.N

name, err := s.createPod(ctx, nodeName, request.GetConnection())
if err != nil {
return nil, errors.WithStack(err)
return nil, err
}

return nil, errors.Errorf("cannot provide required networkservice: endpoint created as %v", name)
Expand All @@ -139,19 +141,19 @@ func (s *createPodServer) createPod(ctx context.Context, nodeName string, conn *
return uuid.New().String()
},
}).Parse(s.podTemplate)

if err != nil {
return "", errors.WithStack(err)
return "", errors.Wrapf(err, "failed to parse a pod template %s", s.podTemplate)
}

var buffer bytes.Buffer
if err = t.Execute(&buffer, conn); err != nil {
return "", errors.WithStack(err)
return "", errors.Wrapf(err, "failed to apply a parsed template %s", s.podTemplate)
}
var pod corev1.Pod

_, _, err = s.deserializer.Decode(buffer.Bytes(), nil, &pod)
if err != nil {
return "", errors.WithStack(err)
return "", errors.Wrap(err, "failed to deserialize a pod data")
}

if pod.Spec.NodeName == "" {
Expand All @@ -166,7 +168,7 @@ func (s *createPodServer) createPod(ctx context.Context, nodeName string, conn *

resp, err := s.client.CoreV1().Pods(s.myNamespace).Create(ctx, &pod, metav1.CreateOptions{})
if err != nil {
return "", errors.WithStack(err)
return "", errors.Wrapf(err, "failed to create a pod %s in a namespace %s", pod.Name, s.myNamespace)
}

return resp.GetObjectMeta().GetName(), nil
Expand Down
4 changes: 2 additions & 2 deletions pkg/networkservice/common/createpod/server_test.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) 2021-2022 Doc.ai and/or its affiliates.
//
// Copyright (c) 2021-2022 Doc.ai and/or its affiliates.
// Copyright (c) 2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
Expand Down Expand Up @@ -93,7 +93,7 @@ objectmeta:
Connection: &networkservice.Connection{},
})
require.Error(t, err)
require.Equal(t, "pods \"nse-1\" already exists", err.Error())
require.Equal(t, "failed to create a pod nse-1 in a namespace pod-ns-name: pods \"nse-1\" already exists", err.Error())

podList, err := clientSet.CoreV1().Pods(testNamespace).List(ctx, metav1.ListOptions{})
require.NoError(t, err)
Expand Down
20 changes: 11 additions & 9 deletions pkg/registry/etcd/ns_server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) 2020-2021 Doc.ai and/or its affiliates.
//
// Copyright (c) 2022 Cisco and/or its affiliates.
// Copyright (c) 2022-2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
Expand All @@ -20,13 +20,13 @@ package etcd

import (
"context"
"errors"
"io"
"sync"
"time"

"github.com/golang/protobuf/ptypes/empty"
"github.com/networkservicemesh/sdk/pkg/tools/log"
"github.com/pkg/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/watch"
Expand Down Expand Up @@ -61,11 +61,12 @@ func (n *etcdNSRegistryServer) Register(ctx context.Context, request *registry.N
},
metav1.CreateOptions{},
)
err = errors.Wrapf(err, "failed to create a pod %s in a namespace %s", resp.Name, n.ns)
if apierrors.IsAlreadyExists(err) {
var ns *v1.NetworkService
list, erro := n.client.NetworkservicemeshV1().NetworkServices("").List(ctx, metav1.ListOptions{})
if erro != nil {
return nil, erro
return nil, errors.Wrap(erro, "failed to get a list of NetworkServices")
}
for i := 0; i < len(list.Items); i++ {
item := (*registry.NetworkService)(&list.Items[i].Spec)
Expand All @@ -80,6 +81,7 @@ func (n *etcdNSRegistryServer) Register(ctx context.Context, request *registry.N

if ns != nil {
apiResp, err = n.client.NetworkservicemeshV1().NetworkServices(n.ns).Update(ctx, ns, metav1.UpdateOptions{})
err = errors.Wrapf(err, "failed to update a pod %s in a namespace %s", ns.Name, n.ns)
}
}
if err != nil {
Expand All @@ -102,7 +104,7 @@ func (n *etcdNSRegistryServer) watch(query *registry.NetworkServiceQuery, s regi
TimeoutSeconds: &timeoutSeconds,
})
if err != nil {
return err
return errors.Wrap(err, "failed to get a watch.Interface for a requested networkServices")
}

watchErr = n.handleWatcher(watcher, query, s)
Expand Down Expand Up @@ -131,7 +133,7 @@ func (n *etcdNSRegistryServer) handleWatcher(
for watcherOpened := true; watcherOpened; {
select {
case <-s.Context().Done():
return s.Context().Err()
return errors.Wrap(s.Context().Err(), "find context is done")
case event, watcherOpened = <-watcher.ResultChan():
if !watcherOpened {
logger.Warn("watcher is closed, retrying")
Expand All @@ -145,7 +147,7 @@ func (n *etcdNSRegistryServer) handleWatcher(
if matchutils.MatchNetworkServices(query.NetworkService, item) {
err := s.Send(&registry.NetworkServiceResponse{NetworkService: item})
if err != nil {
return err
return errors.Wrapf(err, "NetworkServiceRegistry find server failed to send a response %s", item.String())
}
}
}
Expand All @@ -156,7 +158,7 @@ func (n *etcdNSRegistryServer) handleWatcher(
func (n *etcdNSRegistryServer) Find(query *registry.NetworkServiceQuery, s registry.NetworkServiceRegistry_FindServer) error {
list, err := n.client.NetworkservicemeshV1().NetworkServices("").List(s.Context(), metav1.ListOptions{})
if err != nil {
return err
return errors.Wrap(err, "failed to get a list of NetworkServices")
}
for i := 0; i < len(list.Items); i++ {
item := (*registry.NetworkService)(&list.Items[i].Spec)
Expand All @@ -166,7 +168,7 @@ func (n *etcdNSRegistryServer) Find(query *registry.NetworkServiceQuery, s regis
if matchutils.MatchNetworkServices(query.NetworkService, item) {
err := s.Send(&registry.NetworkServiceResponse{NetworkService: item})
if err != nil {
return err
return errors.Wrapf(err, "NetworkServiceRegistry find server failed to send a response %s", item.String())
}
}
}
Expand Down Expand Up @@ -194,7 +196,7 @@ func (n *etcdNSRegistryServer) Unregister(ctx context.Context, request *registry
},
})
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "failed to delete a NetworkServices %s in a namespace %s", request.Name, n.ns)
}
}
return resp, nil
Expand Down
24 changes: 13 additions & 11 deletions pkg/registry/etcd/nse_server.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
// Copyright (c) 2020-2021 Doc.ai and/or its affiliates.
//
// Copyright (c) 2022 Cisco and/or its affiliates.
// Copyright (c) 2022-2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
Expand All @@ -20,13 +20,13 @@ package etcd

import (
"context"
"errors"
"io"
"sync"
"time"

"github.com/golang/protobuf/ptypes/empty"
"github.com/networkservicemesh/sdk/pkg/tools/log"
"github.com/pkg/errors"
apierrors "k8s.io/apimachinery/pkg/api/errors"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/watch"
Expand Down Expand Up @@ -65,11 +65,12 @@ func (n *etcdNSERegistryServer) Register(ctx context.Context, request *registry.
},
metav1.CreateOptions{},
)
err = errors.Wrapf(err, "failed to create a pod %s in a namespace %s", resp.Name, n.ns)
if apierrors.IsAlreadyExists(err) {
var nse *v1.NetworkServiceEndpoint
list, erro := n.client.NetworkservicemeshV1().NetworkServiceEndpoints("").List(ctx, metav1.ListOptions{})
if erro != nil {
return nil, erro
return nil, errors.Wrap(erro, "failed to get a list of NetworkServiceEndpoints")
}
for i := 0; i < len(list.Items); i++ {
item := (*registry.NetworkServiceEndpoint)(&list.Items[i].Spec)
Expand All @@ -84,6 +85,7 @@ func (n *etcdNSERegistryServer) Register(ctx context.Context, request *registry.

if nse != nil {
apiResp, err = n.client.NetworkservicemeshV1().NetworkServiceEndpoints(n.ns).Update(ctx, nse, metav1.UpdateOptions{})
err = errors.Wrapf(err, "failed to update a pod %s in a namespace %s", nse.Name, n.ns)
}
}
if err != nil {
Expand All @@ -98,7 +100,7 @@ func (n *etcdNSERegistryServer) Register(ctx context.Context, request *registry.
func (n *etcdNSERegistryServer) Find(query *registry.NetworkServiceEndpointQuery, s registry.NetworkServiceEndpointRegistry_FindServer) error {
list, err := n.client.NetworkservicemeshV1().NetworkServiceEndpoints("").List(s.Context(), metav1.ListOptions{})
if err != nil {
return err
return errors.Wrap(err, "failed to get a list of NetworkServiceEndpoints")
}
for i := 0; i < len(list.Items); i++ {
item := (*registry.NetworkServiceEndpoint)(&list.Items[i].Spec)
Expand All @@ -108,7 +110,7 @@ func (n *etcdNSERegistryServer) Find(query *registry.NetworkServiceEndpointQuery
if matchutils.MatchNetworkServiceEndpoints(query.NetworkServiceEndpoint, item) {
err := s.Send(&registry.NetworkServiceEndpointResponse{NetworkServiceEndpoint: item})
if err != nil {
return err
return errors.Wrapf(err, "NetworkServiceEndpointRegistry find server failed to send a response %s", item.String())
}
}
}
Expand All @@ -123,7 +125,7 @@ func (n *etcdNSERegistryServer) Find(query *registry.NetworkServiceEndpointQuery
func (n *etcdNSERegistryServer) Unregister(ctx context.Context, request *registry.NetworkServiceEndpoint) (*empty.Empty, error) {
resp, err := next.NetworkServiceEndpointRegistryServer(ctx).Unregister(ctx, request)
if err != nil {
return nil, err
return nil, errors.WithStack(err)
}

if v, ok := n.versions.Load(request.Name); ok {
Expand All @@ -137,7 +139,7 @@ func (n *etcdNSERegistryServer) Unregister(ctx context.Context, request *registr
},
})
if err != nil {
return nil, err
return nil, errors.Wrapf(err, "failed to delete a NetworkServiceEndpoints %s in a namespace %s", request.Name, n.ns)
}
}
return resp, nil
Expand All @@ -152,7 +154,7 @@ func (n *etcdNSERegistryServer) watch(query *registry.NetworkServiceEndpointQuer
TimeoutSeconds: &timeoutSeconds,
})
if err != nil {
return err
return errors.Wrap(err, "failed to get a watch.Interface for a requested networkServiceEndpoints")
}

watchErr = n.handleWatcher(watcher, query, s)
Expand Down Expand Up @@ -181,9 +183,9 @@ func (n *etcdNSERegistryServer) handleWatcher(
for watcherOpened := true; watcherOpened; {
select {
case <-n.chainContext.Done():
return n.chainContext.Err()
return errors.Wrap(n.chainContext.Err(), "application context is done")
case <-s.Context().Done():
return s.Context().Err()
return errors.Wrap(s.Context().Err(), "find context is done")
case event, watcherOpened = <-watcher.ResultChan():
if !watcherOpened {
logger.Warn("watcher is closed, retrying")
Expand All @@ -203,7 +205,7 @@ func (n *etcdNSERegistryServer) handleWatcher(
if matchutils.MatchNetworkServiceEndpoints(query.NetworkServiceEndpoint, item) {
err := s.Send(nseResp)
if err != nil {
return err
return errors.Wrapf(err, "NetworkServiceEndpointRegistry find server failed to send a response %s", nseResp.String())
}
}
}
Expand Down
10 changes: 6 additions & 4 deletions pkg/tools/deviceplugin/client.go
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
// Copyright (c) 2020-2022 Doc.ai and/or its affiliates.
//
// Copyright (c) 2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -65,7 +67,7 @@ func (c *Client) StartDeviceServer(ctx context.Context, deviceServer pluginapi.D
socketPath := socketpath.SocketPath(path.Join(c.devicePluginPath, socket))
logger.Infof("socket = %v", socket)
if err := socketpath.SocketCleanup(socketPath); err != nil {
return "", err
return "", errors.Wrapf(err, "failed to cleanup the socket %s", socketPath)
}

grpcServer := grpc.NewServer()
Expand All @@ -91,7 +93,7 @@ func (c *Client) StartDeviceServer(ctx context.Context, deviceServer pluginapi.D
conn, err := grpc.DialContext(dialCtx, socketURL.String(), grpc.WithBlock(), grpc.WithTransportCredentials(insecure.NewCredentials()))
if err != nil {
logger.Errorf("failed to dial kubelet api: %s", err.Error())
return "", err
return "", errors.Wrapf(err, "failed to create a client connection to the %s", socketURL.String())
}
_ = conn.Close()

Expand Down Expand Up @@ -164,13 +166,13 @@ func (c *Client) MonitorKubeletRestart(ctx context.Context) (chan struct{}, erro
func watchOn(paths ...string) (*fsnotify.Watcher, error) {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return nil, err
return nil, errors.Wrap(err, "failed to get a file system notifications watcher")
}

for _, path := range paths {
if err := watcher.Add(path); err != nil {
_ = watcher.Close()
return nil, err
return nil, errors.Wrapf(err, "failed to watch a %s", path)
}
}

Expand Down
12 changes: 8 additions & 4 deletions pkg/tools/deviceplugin/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
//
// Copyright (c) 2021-2022 Nordix Foundation.
//
// Copyright (c) 2023 Cisco and/or its affiliates.
//
// SPDX-License-Identifier: Apache-2.0
//
// Licensed under the Apache License, Version 2.0 (the "License");
Expand Down Expand Up @@ -31,6 +33,7 @@ import (
podresourcesapi "k8s.io/kubelet/pkg/apis/podresources/v1alpha1"

"github.com/networkservicemesh/sdk/pkg/tools/log"
"github.com/pkg/errors"

"github.com/networkservicemesh/sdk-k8s/pkg/tools/podresources"
)
Expand Down Expand Up @@ -78,7 +81,7 @@ func StartServers(
resp, err := resourceListerClient.List(ctx, new(podresourcesapi.ListPodResourcesRequest))
if err != nil {
logger.Errorf("resourceListerClient unavailable: %+v", err)
return err
return errors.Wrap(err, "failed to get a podresourcesapi.ListPodResourcesRequest")
}
_ = tokenPool.Restore(respToDeviceIDs(resp))

Expand Down Expand Up @@ -184,20 +187,20 @@ func (s *devicePluginServer) ListAndWatch(_ *pluginapi.Empty, server pluginapi.D
resp, err := s.resourceListerClient.List(s.ctx, new(podresourcesapi.ListPodResourcesRequest))
if err != nil {
logger.Errorf("resourceListerClient unavailable: %+v", err)
return err
return errors.Wrap(err, "failed to get a podresourcesapi.ListPodResourcesRequest")
}

s.updateDevices(s.respToDeviceIDs(resp))

if err := server.Send(s.listAndWatchResponse()); err != nil {
logger.Errorf("server unavailable: %+v", err)
return err
return errors.Wrapf(err, "DevicePlugin_ListAndWatchServer failed to send %s", s.listAndWatchResponse().String())
}

select {
case <-s.ctx.Done():
logger.Info("server stopped")
return s.ctx.Err()
return errors.Wrap(s.ctx.Err(), "application context is done")
case <-time.After(s.resourcePollTimeout):
case <-s.updateCh:
}
Expand Down Expand Up @@ -289,6 +292,7 @@ func (s *devicePluginServer) useDevices(ids []string) (err error) {
for i := range ids {
err = s.tokenPool.Allocate(ids[i])
if err != nil {
err = errors.Wrapf(err, "failed to mark a %s token as \"allocated\"", ids[i])
break
}
s.allocatedTokens[ids[i]] = true
Expand Down
Loading