diff --git a/analyzer/server.go b/analyzer/server.go index bb08ba99f8..8f9bdc9f98 100644 --- a/analyzer/server.go +++ b/analyzer/server.go @@ -296,7 +296,6 @@ func NewServerFromConfig() (*Server, error) { StatusReporter: s, TLSConfig: tlsConfig, Peers: peers, - EtcdKeysAPI: etcdClient.KeysAPI, TopologyMarshallers: api.TopologyMarshallers, } @@ -339,13 +338,13 @@ func NewServerFromConfig() (*Server, error) { flowSubscriberWSServer := ws.NewStructServer(config.NewWSServer(hub.HTTPServer(), "/ws/subscriber/flow", apiAuthBackend)) flowSubscriberEndpoint := server.NewFlowSubscriberEndpoint(flowSubscriberWSServer) - captureAPIHandler, err := api.RegisterCaptureAPI(hub.APIServer(), g, apiAuthBackend) + captureAPIHandler, err := api.RegisterCaptureAPI(hub.APIServer(), etcdClient.KeysAPI, g, apiAuthBackend) if err != nil { return nil, err } apiServer := hub.APIServer() - piAPIHandler, err := api.RegisterPacketInjectorAPI(g, apiServer, apiAuthBackend) + piAPIHandler, err := api.RegisterPacketInjectorAPI(g, apiServer, etcdClient.KeysAPI, apiAuthBackend) if err != nil { return nil, err } @@ -357,7 +356,7 @@ func NewServerFromConfig() (*Server, error) { return nil, err } - nodeRuleAPIHandler, err := api.RegisterNodeRuleAPI(apiServer, g, apiAuthBackend) + nodeRuleAPIHandler, err := api.RegisterNodeRuleAPI(apiServer, etcdClient.KeysAPI, g, apiAuthBackend) if err != nil { return nil, err } @@ -367,18 +366,18 @@ func NewServerFromConfig() (*Server, error) { return nil, err } - edgeRuleAPIHandler, err := api.RegisterEdgeRuleAPI(apiServer, g, apiAuthBackend) + edgeRuleAPIHandler, err := api.RegisterEdgeRuleAPI(apiServer, etcdClient.KeysAPI, g, apiAuthBackend) if err != nil { return nil, err } s.topologyManager = usertopology.NewTopologyManager(etcdClient, nodeRuleAPIHandler, edgeRuleAPIHandler, g) - if _, err = api.RegisterAlertAPI(apiServer, apiAuthBackend); err != nil { + if _, err = api.RegisterAlertAPI(apiServer, etcdClient.KeysAPI, apiAuthBackend); err != nil { return nil, err } - if _, err := api.RegisterWorkflowAPI(apiServer, apiAuthBackend); err != nil { + if _, err := api.RegisterWorkflowAPI(apiServer, etcdClient.KeysAPI, apiAuthBackend); err != nil { return nil, err } diff --git a/api/client/gremlin.go b/api/client/gremlin.go index fc2390d755..bf9c3f7345 100644 --- a/api/client/gremlin.go +++ b/api/client/gremlin.go @@ -20,12 +20,12 @@ package client import ( "bytes" "encoding/json" + "errors" "fmt" "io/ioutil" "net/http" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow" "github.com/skydive-project/skydive/graffiti/graph" shttp "github.com/skydive-project/skydive/graffiti/http" @@ -35,6 +35,9 @@ import ( "github.com/skydive-project/skydive/topology/probes/socketinfo" ) +// ErrNoResult is returned when a query returned no result +var ErrNoResult = errors.New("no result") + // GremlinQueryHelper describes a gremlin query request query helper mechanism type GremlinQueryHelper struct { authOptions *shttp.AuthenticationOpts @@ -137,7 +140,7 @@ func (g *GremlinQueryHelper) GetNode(query interface{}) (node *graph.Node, _ err return nodes[0], nil } - return nil, common.ErrNotFound + return nil, ErrNoResult } // GetFlows from the Gremlin query @@ -206,7 +209,7 @@ func (g *GremlinQueryHelper) GetFlowMetrics(query interface{}) (map[string][]*fl } if len(result) == 0 { - return nil, common.ErrNotFound + return nil, ErrNoResult } return result[0], nil diff --git a/api/server/alert.go b/api/server/alert.go index 5cf221fa04..2f3745a93b 100644 --- a/api/server/alert.go +++ b/api/server/alert.go @@ -23,6 +23,7 @@ package server import ( "time" + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" @@ -52,11 +53,11 @@ func (a *AlertResourceHandler) Name() string { } // RegisterAlertAPI registers an Alert's API to a designated API Server -func RegisterAlertAPI(apiServer *api.Server, authBackend shttp.AuthenticationBackend) (*AlertAPIHandler, error) { +func RegisterAlertAPI(apiServer *api.Server, kapi etcd.KeysAPI, authBackend shttp.AuthenticationBackend) (*AlertAPIHandler, error) { alertAPIHandler := &AlertAPIHandler{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &AlertResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, } if err := apiServer.RegisterAPIHandler(alertAPIHandler, authBackend); err != nil { diff --git a/api/server/capture.go b/api/server/capture.go index d12251457b..bd5fe5923c 100644 --- a/api/server/capture.go +++ b/api/server/capture.go @@ -23,6 +23,7 @@ package server import ( "fmt" + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/flow" "github.com/skydive-project/skydive/flow/probes" @@ -146,11 +147,11 @@ func (c *CaptureAPIHandler) Create(r rest.Resource, opts *rest.CreateOptions) er } // RegisterCaptureAPI registers an new resource, capture -func RegisterCaptureAPI(apiServer *api.Server, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*CaptureAPIHandler, error) { +func RegisterCaptureAPI(apiServer *api.Server, kapi etcd.KeysAPI, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*CaptureAPIHandler, error) { captureAPIHandler := &CaptureAPIHandler{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &CaptureResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, Graph: g, } diff --git a/api/server/edge.go b/api/server/edge.go index 7db97d9fa8..533619cee4 100644 --- a/api/server/edge.go +++ b/api/server/edge.go @@ -24,7 +24,6 @@ import ( "time" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" "github.com/skydive-project/skydive/graffiti/graph" @@ -110,7 +109,7 @@ func (h *EdgeAPIHandler) Delete(id string) error { edge := h.g.GetEdge(graph.Identifier(id)) if edge == nil { - return common.ErrNotFound + return rest.ErrNotFound } return h.g.DelEdge(edge) diff --git a/api/server/edgerule.go b/api/server/edgerule.go index 077c9a7607..963cc1dd99 100644 --- a/api/server/edgerule.go +++ b/api/server/edgerule.go @@ -21,6 +21,7 @@ package server import ( + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" @@ -50,11 +51,11 @@ func (erh *EdgeRuleResourceHandler) New() rest.Resource { } // RegisterEdgeRuleAPI registers an EdgeRule's API to a designated API Server -func RegisterEdgeRuleAPI(apiServer *api.Server, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*EdgeRuleAPI, error) { +func RegisterEdgeRuleAPI(apiServer *api.Server, kapi etcd.KeysAPI, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*EdgeRuleAPI, error) { era := &EdgeRuleAPI{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &EdgeRuleResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, Graph: g, } diff --git a/api/server/node.go b/api/server/node.go index 24e32a8d3e..ddc51a0cd3 100644 --- a/api/server/node.go +++ b/api/server/node.go @@ -24,7 +24,6 @@ import ( "time" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" "github.com/skydive-project/skydive/graffiti/graph" @@ -110,7 +109,7 @@ func (h *NodeAPIHandler) Delete(id string) error { node := h.g.GetNode(graph.Identifier(id)) if node == nil { - return common.ErrNotFound + return rest.ErrNotFound } return h.g.DelNode(node) diff --git a/api/server/noderule.go b/api/server/noderule.go index e078e908ec..db59f747f4 100644 --- a/api/server/noderule.go +++ b/api/server/noderule.go @@ -21,6 +21,7 @@ package server import ( + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" @@ -50,11 +51,11 @@ func (nrh *NodeRuleResourceHandler) New() rest.Resource { } // RegisterNodeRuleAPI register a new node rule api handler -func RegisterNodeRuleAPI(apiServer *api.Server, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*NodeRuleAPI, error) { +func RegisterNodeRuleAPI(apiServer *api.Server, kapi etcd.KeysAPI, g *graph.Graph, authBackend shttp.AuthenticationBackend) (*NodeRuleAPI, error) { nra := &NodeRuleAPI{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &NodeRuleResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, Graph: g, } diff --git a/api/server/packet_injector_common.go b/api/server/packet_injector_common.go index 7046883391..62db333dbc 100644 --- a/api/server/packet_injector_common.go +++ b/api/server/packet_injector_common.go @@ -21,6 +21,7 @@ package server import ( + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" @@ -76,11 +77,11 @@ func (pi *PacketInjectorAPI) getNode(gremlinQuery string) *graph.Node { } // RegisterPacketInjectorAPI registers a new packet injector resource in the API -func RegisterPacketInjectorAPI(g *graph.Graph, apiServer *api.Server, authBackend shttp.AuthenticationBackend) (*PacketInjectorAPI, error) { +func RegisterPacketInjectorAPI(g *graph.Graph, apiServer *api.Server, kapi etcd.KeysAPI, authBackend shttp.AuthenticationBackend) (*PacketInjectorAPI, error) { pia := &PacketInjectorAPI{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &packetInjectorResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, Graph: g, } diff --git a/api/server/workflow.go b/api/server/workflow.go index 4532f19692..8eb71dcdd8 100644 --- a/api/server/workflow.go +++ b/api/server/workflow.go @@ -25,6 +25,7 @@ import ( yaml "gopkg.in/yaml.v2" + etcd "github.com/coreos/etcd/client" "github.com/skydive-project/skydive/api/types" "github.com/skydive-project/skydive/graffiti/api/rest" api "github.com/skydive-project/skydive/graffiti/api/server" @@ -110,11 +111,11 @@ func (w *WorkflowAPIHandler) Index() map[string]rest.Resource { } // RegisterWorkflowAPI registers a new workflow api handler -func RegisterWorkflowAPI(apiServer *api.Server, authBackend shttp.AuthenticationBackend) (*WorkflowAPIHandler, error) { +func RegisterWorkflowAPI(apiServer *api.Server, kapi etcd.KeysAPI, authBackend shttp.AuthenticationBackend) (*WorkflowAPIHandler, error) { workflowAPIHandler := &WorkflowAPIHandler{ BasicAPIHandler: rest.BasicAPIHandler{ ResourceHandler: &WorkflowResourceHandler{}, - EtcdKeyAPI: apiServer.EtcdKeyAPI, + EtcdKeyAPI: kapi, }, } if err := apiServer.RegisterAPIHandler(workflowAPIHandler, authBackend); err != nil { diff --git a/common/types.go b/common/types.go index 9909a64f20..2207c1e2af 100644 --- a/common/types.go +++ b/common/types.go @@ -17,23 +17,6 @@ package common -import ( - "errors" -) - -var ( - // ErrCantCompareInterface error can't compare interface - ErrCantCompareInterface = errors.New("Can't compare interface") - // ErrFieldWrongType error field has wrong type - ErrFieldWrongType = errors.New("Field has wrong type") - // ErrNotFound error no result was found - ErrNotFound = errors.New("No result found") - // ErrTimeout network timeout - ErrTimeout = errors.New("Timeout") - // ErrNotImplemented unimplemented feature - ErrNotImplemented = errors.New("Not implemented") -) - // SortOrder describes ascending or descending order type SortOrder string diff --git a/flow/no_bpf.go b/flow/no_bpf.go index 35ed972488..a469a9ee07 100644 --- a/flow/no_bpf.go +++ b/flow/no_bpf.go @@ -20,12 +20,14 @@ package flow import ( + "errors" + "github.com/google/gopacket/layers" "golang.org/x/net/bpf" - - "github.com/skydive-project/skydive/common" ) +var errNeedPcap = errors.New("BPF filtering needs libpcap support") + // BPF describes a filter type BPF struct { vm *bpf.VM @@ -33,7 +35,7 @@ type BPF struct { // BPFFilterToRaw creates a raw binary filter from a BPF expression func BPFFilterToRaw(linkType layers.LinkType, captureLength uint32, filter string) ([]bpf.RawInstruction, error) { - return nil, common.ErrNotImplemented + return nil, errNeedPcap } // Matches returns true data match the filter @@ -43,5 +45,5 @@ func (b *BPF) Matches(data []byte) bool { // NewBPF creates a new BPF filter func NewBPF(linkType layers.LinkType, captureLength uint32, filter string) (*BPF, error) { - return nil, common.ErrNotImplemented + return nil, errNeedPcap } diff --git a/flow/probes/gopacket/no_gopacket.go b/flow/probes/gopacket/no_gopacket.go index 0e891babdf..b9d6828d8e 100644 --- a/flow/probes/gopacket/no_gopacket.go +++ b/flow/probes/gopacket/no_gopacket.go @@ -20,12 +20,11 @@ package gopacket import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow/probes" "github.com/skydive-project/skydive/probe" ) // NewProbe returns a new GoPacket probe func NewProbe(ctx probes.Context, bundle *probe.Bundle) (probes.FlowProbeHandler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/flow/probes/ovsmirror/no_ovsmirror.go b/flow/probes/ovsmirror/no_ovsmirror.go index c61244cbeb..b46e1f7f88 100644 --- a/flow/probes/ovsmirror/no_ovsmirror.go +++ b/flow/probes/ovsmirror/no_ovsmirror.go @@ -20,12 +20,11 @@ package ovsmirror import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow/probes" "github.com/skydive-project/skydive/probe" ) // NewProbe returns an empty flow probe handler and an error func NewProbe(ctx probes.Context, bundle *probe.Bundle) (probes.FlowProbeHandler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/flow/probes/targets/no_erspan.go b/flow/probes/targets/no_erspan.go index 1e4333ade4..23aa98816c 100644 --- a/flow/probes/targets/no_erspan.go +++ b/flow/probes/targets/no_erspan.go @@ -22,7 +22,6 @@ package targets import ( "github.com/google/gopacket" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow" "github.com/skydive-project/skydive/graffiti/graph" ) @@ -45,5 +44,5 @@ func (ers *ERSpanTarget) Stop() { // NewERSpanTarget returns a new ERSpan target func NewERSpanTarget(g *graph.Graph, n *graph.Node, capture *types.Capture) (*ERSpanTarget, error) { - return nil, common.ErrNotImplemented + return nil, errrors.ErrNotImplemented } diff --git a/graffiti/api/rest/kv.go b/graffiti/api/rest/kv.go index 8d9ee3566e..eaa9eaac66 100644 --- a/graffiti/api/rest/kv.go +++ b/graffiti/api/rest/kv.go @@ -127,6 +127,9 @@ func (h *BasicAPIHandler) Delete(id string) error { etcdPath := fmt.Sprintf("/%s/%s", h.ResourceHandler.Name(), id) _, err := h.EtcdKeyAPI.Delete(context.Background(), etcdPath, nil) + if err, ok := err.(etcd.Error); ok && err.Code == etcd.ErrorCodeKeyNotFound { + return ErrNotFound + } return err } diff --git a/graffiti/api/rest/rest.go b/graffiti/api/rest/rest.go index b2ef3e8448..466e3d504b 100644 --- a/graffiti/api/rest/rest.go +++ b/graffiti/api/rest/rest.go @@ -23,7 +23,10 @@ import ( ) // ErrDuplicatedResource is returned when a resource is duplicated -var ErrDuplicatedResource = errors.New("Duplicated resource") +var ErrDuplicatedResource = errors.New("duplicated resource") + +// ErrNotFound is returned when a resource could not be found +var ErrNotFound = errors.New("resource not found") // Resource used as interface resources for each API type Resource interface { diff --git a/graffiti/api/server/server.go b/graffiti/api/server/server.go index 2f1fb14d6a..d4a70a09bd 100644 --- a/graffiti/api/server/server.go +++ b/graffiti/api/server/server.go @@ -46,7 +46,6 @@ import ( "time" auth "github.com/abbot/go-http-auth" - etcd "github.com/coreos/etcd/client" yaml "gopkg.in/yaml.v2" "github.com/skydive-project/skydive/graffiti/api/rest" @@ -64,7 +63,6 @@ type Validator interface { // Server defines an API server type Server struct { HTTPServer *shttp.Server - EtcdKeyAPI etcd.KeysAPI handlers map[string]rest.Handler validator Validator } @@ -85,6 +83,10 @@ func (a *Server) RegisterAPIHandler(handler rest.Handler, authBackend shttp.Auth name := handler.Name() title := strings.Title(name) + aclError := func(username, resource, permission string) string { + return fmt.Sprintf("'%s' has no '%s' permission on '%s'", username, permission, resource) + } + routes := []shttp.Route{ { Name: title + "Index", @@ -115,19 +117,19 @@ func (a *Server) RegisterAPIHandler(handler rest.Handler, authBackend shttp.Auth Path: shttp.PathPrefix(fmt.Sprintf("/api/%s/", name)), HandlerFunc: func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { if !rbac.Enforce(r.Username, name, "read") { - w.WriteHeader(http.StatusMethodNotAllowed) + http.Error(w, aclError(r.Username, name, "read"), http.StatusMethodNotAllowed) return } id := r.URL.Path[len(fmt.Sprintf("/api/%s/", name)):] if id == "" { - w.WriteHeader(http.StatusBadRequest) + http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) return } resource, ok := handler.Get(id) if !ok { - w.WriteHeader(http.StatusNotFound) + http.Error(w, fmt.Sprintf("%s '%s' not found", title, id), http.StatusNotFound) return } w.Header().Set("Content-Type", "application/json; charset=UTF-8") @@ -144,7 +146,7 @@ func (a *Server) RegisterAPIHandler(handler rest.Handler, authBackend shttp.Auth Path: "/api/" + name, HandlerFunc: func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { if !rbac.Enforce(r.Username, name, "write") { - w.WriteHeader(http.StatusMethodNotAllowed) + http.Error(w, aclError(r.Username, name, "write"), http.StatusMethodNotAllowed) return } @@ -155,7 +157,7 @@ func (a *Server) RegisterAPIHandler(handler rest.Handler, authBackend shttp.Auth if content, e := ioutil.ReadAll(r.Body); e == nil { err = yaml.Unmarshal(content, resource) } else { - http.Error(w, err.Error(), http.StatusBadRequest) + http.Error(w, e.Error(), http.StatusBadRequest) return } } else { @@ -212,19 +214,19 @@ func (a *Server) RegisterAPIHandler(handler rest.Handler, authBackend shttp.Auth Path: shttp.PathPrefix(fmt.Sprintf("/api/%s/", name)), HandlerFunc: func(w http.ResponseWriter, r *auth.AuthenticatedRequest) { if !rbac.Enforce(r.Username, name, "write") { - w.WriteHeader(http.StatusMethodNotAllowed) + http.Error(w, aclError(r.Username, name, "write"), http.StatusMethodNotAllowed) return } id := r.URL.Path[len(fmt.Sprintf("/api/%s/", name)):] if id == "" { - w.WriteHeader(http.StatusBadRequest) + http.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest) return } if err := handler.Delete(id); err != nil { - if err, ok := err.(etcd.Error); ok && err.Code == etcd.ErrorCodeKeyNotFound { - http.Error(w, err.Error(), http.StatusNotFound) + if err == rest.ErrNotFound { + http.Error(w, fmt.Sprintf("%s '%s' not found", title, id), http.StatusNotFound) } else { http.Error(w, err.Error(), http.StatusBadRequest) } @@ -386,14 +388,13 @@ func (a *Server) addLoginRoute(authBackend shttp.AuthenticationBackend) { } // NewAPI creates a new API server based on http -func NewAPI(server *shttp.Server, kapi etcd.KeysAPI, version string, service service.Service, authBackend shttp.AuthenticationBackend, validator Validator) (*Server, error) { +func NewAPI(server *shttp.Server, version string, service service.Service, authBackend shttp.AuthenticationBackend, validator Validator) (*Server, error) { if version == "" { version = "unknown" } apiServer := &Server{ HTTPServer: server, - EtcdKeyAPI: kapi, handlers: make(map[string]rest.Handler), validator: validator, } diff --git a/graffiti/graph/graph.go b/graffiti/graph/graph.go index 940ddb7352..42ea5c6de9 100644 --- a/graffiti/graph/graph.go +++ b/graffiti/graph/graph.go @@ -448,7 +448,7 @@ func (e *graphElement) GetFieldStringList(key string) ([]string, error) { if s, ok := s.(string); ok { strings = append(strings, s) } else { - return nil, common.ErrFieldWrongType + return nil, errors.New("one array entry could not be converted to string") } } return strings, nil diff --git a/graffiti/hub/hub.go b/graffiti/hub/hub.go index 7a417bbb13..8c9ee5a7e6 100644 --- a/graffiti/hub/hub.go +++ b/graffiti/hub/hub.go @@ -20,8 +20,6 @@ package hub import ( "crypto/tls" - etcd "github.com/coreos/etcd/client" - api "github.com/skydive-project/skydive/graffiti/api/server" gc "github.com/skydive-project/skydive/graffiti/common" etcdserver "github.com/skydive-project/skydive/graffiti/etcd/server" @@ -48,7 +46,6 @@ type Opts struct { ClusterAuthBackend shttp.AuthenticationBackend Peers []service.Address TLSConfig *tls.Config - EtcdKeysAPI etcd.KeysAPI Logger logging.Logger } @@ -203,7 +200,7 @@ func NewHub(id string, serviceType service.Type, listen string, g *graph.Graph, gc.NewSubscriberEndpoint(subscriberWSServer, g, tr, opts.Logger) service := service.Service{ID: id, Type: serviceType} - apiServer, err := api.NewAPI(httpServer, opts.EtcdKeysAPI, opts.Version, service, opts.APIAuthBackend, opts.APIValidator) + apiServer, err := api.NewAPI(httpServer, opts.Version, service, opts.APIAuthBackend, opts.APIValidator) if err != nil { return nil, err } diff --git a/graffiti/logging/no_syslog.go b/graffiti/logging/no_syslog.go index 64e82b5ca2..fca1ab51e6 100644 --- a/graffiti/logging/no_syslog.go +++ b/graffiti/logging/no_syslog.go @@ -19,10 +19,8 @@ package logging -import ( - "github.com/skydive-project/skydive/common" -) +import "errors" func NewSyslogBackend(protocol, address, tag string) (Backend, error) { - return nil, common.ErrNotImplemented + return nil, errors.New("Syslog backend is only supported on Linux and Unix") } diff --git a/graffiti/pod/pod.go b/graffiti/pod/pod.go index 49da583c27..48277c9bcd 100644 --- a/graffiti/pod/pod.go +++ b/graffiti/pod/pod.go @@ -166,7 +166,7 @@ func NewPod(id string, serviceType service.Type, listen string, podEndpoint stri httpServer := shttp.NewServer(id, serviceType, sa.Addr, sa.Port, opts.TLSConfig, opts.Logger) svc := service.Service{ID: id, Type: serviceType} - apiServer, err := api.NewAPI(httpServer, nil, opts.Version, svc, opts.APIAuthBackend, opts.APIValidator) + apiServer, err := api.NewAPI(httpServer, opts.Version, svc, opts.APIAuthBackend, opts.APIValidator) if err != nil { return nil, err } diff --git a/netns/no_netns.go b/netns/no_netns.go index 263ce8cfc3..8007c29cc0 100644 --- a/netns/no_netns.go +++ b/netns/no_netns.go @@ -19,7 +19,7 @@ package netns -import "github.com/skydive-project/skydive/common" +import "errors" // Context describes a NameSpace Context switch API type Context struct { @@ -37,7 +37,7 @@ func (n *Context) Close() { // NewContext creates a new NameSpace context base on path func NewContext(path string) (*Context, error) { if path != "" { - return nil, common.ErrNotImplemented + return nil, errors.New("Network namespaces are only supported on Linux") } return &Context{}, nil diff --git a/probe/bundle.go b/probe/bundle.go index f306409df3..4d51af6692 100644 --- a/probe/bundle.go +++ b/probe/bundle.go @@ -27,6 +27,9 @@ import ( "github.com/skydive-project/skydive/graffiti/service" ) +// ErrNotImplemented unimplemented feature +var ErrNotImplemented = errors.New("not implemented") + // ErrNotCompiled is thrown when a probe was not compiled within the binary var ErrNotCompiled = fmt.Errorf("probe not compiled") diff --git a/rawsocket/no_rawsocket.go b/rawsocket/no_rawsocket.go index 27dbe71805..e0d2eddb9d 100644 --- a/rawsocket/no_rawsocket.go +++ b/rawsocket/no_rawsocket.go @@ -19,7 +19,9 @@ package rawsocket -import "github.com/skydive-project/skydive/common" +import "errors" + +var errNotSupported = errors.New("Raw sockets are only supported on Linux") // Protocols to receive const ( @@ -38,20 +40,20 @@ func (s *RawSocket) GetFd() int { // Write outputs some bytes to the file func (s *RawSocket) Write(data []byte) (int, error) { - return 0, common.ErrNotImplemented + return 0, errNotSupported } // Close the file descriptor func (s *RawSocket) Close() error { - return common.ErrNotImplemented + return errNotSupported } // NewRawSocket creates a raw socket for the network interface ifName func NewRawSocket(ifName string, protocol int) (*RawSocket, error) { - return nil, common.ErrNotImplemented + return nil, errNotSupported } // NewRawSocketInNs create/open a socket in the namespace nsPath for the network interface ifName func NewRawSocketInNs(nsPath string, ifName string, protocol int) (*RawSocket, error) { - return nil, common.ErrNotImplemented + return nil, errNotSupported } diff --git a/tests/flow_test.go b/tests/flow_test.go index 0c8c3cb620..78fec86b49 100644 --- a/tests/flow_test.go +++ b/tests/flow_test.go @@ -36,7 +36,6 @@ import ( "github.com/google/gopacket/pcapgo" "github.com/skydive-project/skydive/api/client" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow" "github.com/skydive-project/skydive/graffiti/logging" g "github.com/skydive-project/skydive/gremlin" @@ -610,13 +609,14 @@ func TestFlowMetrics(t *testing.T) { return fmt.Errorf("Layers bytes error, got: %v", icmp) } + errNotFound := errors.New("not found") getFirstFlowMetric := func(query interface{}) (*flow.FlowMetric, error) { flows, err := c.gh.GetFlows(query) if err != nil { return nil, err } if len(flows) == 0 { - return nil, common.ErrNotFound + return nil, errNotFound } return flows[0].Metric, nil } @@ -628,7 +628,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Gt(pingLen))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } @@ -638,7 +638,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Gte(pingLen+1))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } @@ -648,7 +648,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Lt(pingLen))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } @@ -658,7 +658,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Lte(pingLen-1))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } @@ -668,7 +668,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Inside(pingLen, pingLen+1))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } @@ -678,7 +678,7 @@ func TestFlowMetrics(t *testing.T) { } metric, err = getFirstFlowMetric(gremlin.Has("Metric.ABBytes", g.Between(pingLen, pingLen))) - if err != common.ErrNotFound { + if err != errNotFound { return fmt.Errorf("Wrong number of flow, should have none, got : %v", metric) } diff --git a/tests/topology_test.go b/tests/topology_test.go index 641d9d70e7..6f3acb8fd7 100644 --- a/tests/topology_test.go +++ b/tests/topology_test.go @@ -25,8 +25,8 @@ import ( "testing" "time" + "github.com/skydive-project/skydive/api/client" "github.com/skydive-project/skydive/api/types" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/graffiti/graph" g "github.com/skydive-project/skydive/gremlin" "github.com/skydive-project/skydive/topology" @@ -631,7 +631,7 @@ func TestNodeRuleCreate(t *testing.T) { func(c *CheckContext) error { c.client.Delete("noderule", nodeRule.GetID()) - if node, err := c.gh.GetNode(c.gremlin.V().Has("Name", "TestNode")); err != common.ErrNotFound { + if node, err := c.gh.GetNode(c.gremlin.V().Has("Name", "TestNode")); err != client.ErrNoResult { return fmt.Errorf("Node %+v found with name TestNode", node) } @@ -682,7 +682,7 @@ func TestNodeRuleUpdate(t *testing.T) { func(c *CheckContext) error { c.client.Delete("noderule", nodeRule.GetID()) - if node, err := c.gh.GetNode(c.gremlin.V().Has("testKey", "testValue")); err != common.ErrNotFound { + if node, err := c.gh.GetNode(c.gremlin.V().Has("testKey", "testValue")); err != client.ErrNoResult { return fmt.Errorf("Node %+v was found with metadata testKey", node) } @@ -745,7 +745,7 @@ func TestEdgeRuleCreate(t *testing.T) { c.client.Delete("edgerule", edgeRule.GetID()) } - if _, err := c.gh.GetNode(query); err != common.ErrNotFound { + if _, err := c.gh.GetNode(query); err != client.ErrNoResult { return errors.New("Found a layer2 link") } diff --git a/topology/nexthop.go b/topology/nexthop.go index e9a5e01859..f5918e6b0c 100644 --- a/topology/nexthop.go +++ b/topology/nexthop.go @@ -21,12 +21,15 @@ package topology import ( + "errors" "net" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/graffiti/graph" ) +// ErrNoNextHop is returned when no next hop could be determined +var ErrNoNextHop = errors.New("no next hop") + // NextHop describes a next hop // easyjson:json // gendecoder @@ -101,5 +104,5 @@ func GetNextHop(node *graph.Node, ip net.IP) (*NextHop, error) { } } - return nil, common.ErrNotFound + return nil, ErrNoNextHop } diff --git a/topology/probes/blockdev/no_blockdev.go b/topology/probes/blockdev/no_blockdev.go index f38acfc4b2..e1d407808c 100644 --- a/topology/probes/blockdev/no_blockdev.go +++ b/topology/probes/blockdev/no_blockdev.go @@ -20,12 +20,11 @@ package blockdev import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // Init initializes a new topology block device probe func (p *ProbeHandler) Init(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/topology/probes/docker/no_docker.go b/topology/probes/docker/no_docker.go index dc3d0920cf..18cddc62dd 100644 --- a/topology/probes/docker/no_docker.go +++ b/topology/probes/docker/no_docker.go @@ -20,14 +20,13 @@ package docker import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new topology Docker probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/libvirt/no_libvirt.go b/topology/probes/libvirt/no_libvirt.go index 1d9c73d724..1769fefd51 100644 --- a/topology/probes/libvirt/no_libvirt.go +++ b/topology/probes/libvirt/no_libvirt.go @@ -20,14 +20,13 @@ package libvirt import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new topology Libvirt probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/lldp/no_lldp.go b/topology/probes/lldp/no_lldp.go index 7261bac79b..485e3a2786 100644 --- a/topology/probes/lldp/no_lldp.go +++ b/topology/probes/lldp/no_lldp.go @@ -20,14 +20,13 @@ package lldp import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new LLDP probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/lxd/no_lxd.go b/topology/probes/lxd/no_lxd.go index 704e49e444..a14c8329f9 100644 --- a/topology/probes/lxd/no_lxd.go +++ b/topology/probes/lxd/no_lxd.go @@ -21,14 +21,13 @@ package lxd import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new topology LXD probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/netlink/no_netlink.go b/topology/probes/netlink/no_netlink.go index cf6fea2dcc..aa3c5ba390 100644 --- a/topology/probes/netlink/no_netlink.go +++ b/topology/probes/netlink/no_netlink.go @@ -20,14 +20,13 @@ package netlink import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new topology netlink probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/netns/no_netns.go b/topology/probes/netns/no_netns.go index cf1b0e3440..9e3aa064d5 100644 --- a/topology/probes/netns/no_netns.go +++ b/topology/probes/netns/no_netns.go @@ -20,12 +20,11 @@ package netns import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new network namespace probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/topology/probes/nsm/no_nsm.go b/topology/probes/nsm/no_nsm.go index 531ef85b8d..7edfb3f42d 100644 --- a/topology/probes/nsm/no_nsm.go +++ b/topology/probes/nsm/no_nsm.go @@ -20,11 +20,11 @@ package nsm import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/flow/probes" "github.com/skydive-project/skydive/graffiti/graph" + "github.com/skydive-project/skydive/probe" ) func NewNsmProbe(g *graph.Graph) (probes.FlowProbeHandler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/topology/probes/opencontrail/no_opencontrail.go b/topology/probes/opencontrail/no_opencontrail.go index f41cc2c821..ccda6a4d69 100644 --- a/topology/probes/opencontrail/no_opencontrail.go +++ b/topology/probes/opencontrail/no_opencontrail.go @@ -20,14 +20,13 @@ package opencontrail import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new OpenContrail topology probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/ovsdb/of12.go b/topology/probes/ovsdb/of12.go index 62c5066975..c09e967a34 100644 --- a/topology/probes/ovsdb/of12.go +++ b/topology/probes/ovsdb/of12.go @@ -18,13 +18,13 @@ package ovsdb import ( + "errors" "time" goloxi "github.com/skydive-project/goloxi" "github.com/skydive-project/goloxi/of12" "github.com/skydive-project/goloxi/of13" "github.com/skydive-project/goloxi/of15" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/openflow" ) @@ -63,11 +63,11 @@ func (h *of12Handler) OnMessage(msg goloxi.Message) { } func (h *of12Handler) NewGroupForwardRequest() (goloxi.Message, error) { - return nil, common.ErrNotImplemented + return nil, errors.New("Not supported on OpenFlow 1.2") } func (h *of12Handler) NewRoleRequest() (goloxi.Message, error) { - return nil, common.ErrNotImplemented + return nil, errors.New("Not supported on OpenFlow 1.2") } func (h *of12Handler) NewFlowStatsRequest(match Match) (goloxi.Message, error) { diff --git a/topology/probes/ovsdb/of13.go b/topology/probes/ovsdb/of13.go index e559d5fc83..72e0654ece 100644 --- a/topology/probes/ovsdb/of13.go +++ b/topology/probes/ovsdb/of13.go @@ -18,12 +18,12 @@ package ovsdb import ( + "errors" "time" goloxi "github.com/skydive-project/goloxi" "github.com/skydive-project/goloxi/of13" "github.com/skydive-project/goloxi/of15" - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/openflow" ) @@ -66,11 +66,11 @@ func (h *of13Handler) OnMessage(msg goloxi.Message) { } func (h *of13Handler) NewGroupForwardRequest() (goloxi.Message, error) { - return nil, common.ErrNotImplemented + return nil, errors.New("Not supported on OpenFlow 1.3") } func (h *of13Handler) NewRoleRequest() (goloxi.Message, error) { - return nil, common.ErrNotImplemented + return nil, errors.New("Not supported on OpenFlow 1.3") } func (h *of13Handler) NewFlowStatsRequest(match Match) (goloxi.Message, error) { diff --git a/topology/probes/runc/no_runc.go b/topology/probes/runc/no_runc.go index b17583d280..90abc75b40 100644 --- a/topology/probes/runc/no_runc.go +++ b/topology/probes/runc/no_runc.go @@ -20,14 +20,13 @@ package runc import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new runc topology probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } // Register registers graph metadata decoders diff --git a/topology/probes/socketinfo/no_socket_info.go b/topology/probes/socketinfo/no_socket_info.go index e71a57cd10..1fbb785d73 100644 --- a/topology/probes/socketinfo/no_socket_info.go +++ b/topology/probes/socketinfo/no_socket_info.go @@ -20,12 +20,11 @@ package socketinfo import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new socketinfo topology probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented } diff --git a/topology/probes/vpp/no_vpp.go b/topology/probes/vpp/no_vpp.go index 1b505e8673..ae18f9ede6 100644 --- a/topology/probes/vpp/no_vpp.go +++ b/topology/probes/vpp/no_vpp.go @@ -20,12 +20,11 @@ package vpp import ( - "github.com/skydive-project/skydive/common" "github.com/skydive-project/skydive/probe" tp "github.com/skydive-project/skydive/topology/probes" ) // NewProbe returns a new VPP probe func NewProbe(ctx tp.Context, bundle *probe.Bundle) (probe.Handler, error) { - return nil, common.ErrNotImplemented + return nil, probe.ErrNotImplemented }