Skip to content

Commit 2c3b33b

Browse files
authored
NETOBSERV-1905 Query UDNs without flows (#688)
* vendor * query UDNs from K8S API * display empty UDNs * add show empty checkbox * propagate k8s errors * fix scope id
1 parent 70e742c commit 2c3b33b

File tree

21 files changed

+856
-9
lines changed

21 files changed

+856
-9
lines changed

pkg/handler/k8s.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package handler
2+
3+
import (
4+
"context"
5+
"errors"
6+
"fmt"
7+
"net/http"
8+
9+
"github.com/netobserv/network-observability-console-plugin/pkg/kubernetes/auth"
10+
"github.com/netobserv/network-observability-console-plugin/pkg/kubernetes/resources"
11+
"github.com/netobserv/network-observability-console-plugin/pkg/utils"
12+
13+
kerr "k8s.io/apimachinery/pkg/api/errors"
14+
"k8s.io/apimachinery/pkg/runtime/schema"
15+
)
16+
17+
func (h *Handlers) GetUDNIdss(ctx context.Context) func(w http.ResponseWriter, r *http.Request) {
18+
return func(w http.ResponseWriter, r *http.Request) {
19+
token, err := auth.GetUserToken(r.Header)
20+
if err != nil {
21+
writeError(w, http.StatusInternalServerError, err.Error())
22+
}
23+
24+
cudns, err := resources.List(ctx, token, schema.GroupVersionResource{
25+
Group: "k8s.ovn.org",
26+
Version: "v1",
27+
Resource: "clusteruserdefinednetworks",
28+
})
29+
if err != nil {
30+
var k8sErr *kerr.StatusError
31+
if errors.As(err, &k8sErr) {
32+
writeError(w, int(k8sErr.ErrStatus.Code), err.Error())
33+
} else {
34+
writeError(w, http.StatusInternalServerError, err.Error())
35+
}
36+
}
37+
38+
udns, err := resources.List(ctx, token, schema.GroupVersionResource{
39+
Group: "k8s.ovn.org",
40+
Version: "v1",
41+
Resource: "userdefinednetworks",
42+
})
43+
if err != nil {
44+
var k8sErr *kerr.StatusError
45+
if errors.As(err, &k8sErr) {
46+
writeError(w, int(k8sErr.ErrStatus.Code), err.Error())
47+
} else {
48+
writeError(w, http.StatusInternalServerError, err.Error())
49+
}
50+
}
51+
52+
values := []string{}
53+
for _, cudn := range cudns {
54+
md := cudn.Object["metadata"].(map[string]interface{})
55+
values = append(values, fmt.Sprintf("%s", md["name"]))
56+
}
57+
for _, udn := range udns {
58+
md := udn.Object["metadata"].(map[string]interface{})
59+
values = append(values, fmt.Sprintf("%s.%s", md["namespace"], md["name"]))
60+
}
61+
writeJSON(w, http.StatusOK, utils.NonEmpty(utils.Dedup(values)))
62+
}
63+
}

pkg/kubernetes/auth/check_auth.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ func (b *DenyAllChecker) CheckAdmin(_ context.Context, _ http.Header) error {
7373
return errors.New("deny all auth mode selected")
7474
}
7575

76-
func getUserToken(header http.Header) (string, error) {
76+
func GetUserToken(header http.Header) (string, error) {
7777
authValue := header.Get(AuthHeader)
7878
if authValue != "" {
7979
parts := strings.Split(authValue, "Bearer ")
@@ -130,7 +130,7 @@ type BearerTokenChecker struct {
130130

131131
func (c *BearerTokenChecker) CheckAuth(ctx context.Context, header http.Header) error {
132132
hlog.Debug("Checking authenticated user")
133-
token, err := getUserToken(header)
133+
token, err := GetUserToken(header)
134134
if err != nil {
135135
return err
136136
}
@@ -145,7 +145,7 @@ func (c *BearerTokenChecker) CheckAuth(ctx context.Context, header http.Header)
145145

146146
func (c *BearerTokenChecker) CheckAdmin(ctx context.Context, header http.Header) error {
147147
hlog.Debug("Checking admin user")
148-
token, err := getUserToken(header)
148+
token, err := GetUserToken(header)
149149
if err != nil {
150150
return err
151151
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package resources
2+
3+
import (
4+
"context"
5+
6+
v1 "k8s.io/apimachinery/pkg/apis/meta/v1"
7+
"k8s.io/apimachinery/pkg/apis/meta/v1/unstructured"
8+
"k8s.io/apimachinery/pkg/runtime/schema"
9+
"k8s.io/client-go/dynamic"
10+
"k8s.io/client-go/rest"
11+
)
12+
13+
func List(ctx context.Context, token string, gvr schema.GroupVersionResource) ([]unstructured.Unstructured, error) {
14+
config, err := rest.InClusterConfig()
15+
if err != nil {
16+
return nil, err
17+
}
18+
config.BearerToken = token
19+
config.BearerTokenFile = ""
20+
21+
dynamicClient, err := dynamic.NewForConfig(config)
22+
if err != nil {
23+
return nil, err
24+
}
25+
26+
// Retrieve the custom resource
27+
list, err := dynamicClient.Resource(gvr).List(ctx, v1.ListOptions{})
28+
if err != nil {
29+
return nil, err
30+
}
31+
return list.Items, err
32+
}

pkg/server/routes.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,9 @@ func setupRoutes(ctx context.Context, cfg *config.Config, authChecker auth.Check
6060
api.HandleFunc("/resources/namespaces", h.GetNamespaces(ctx))
6161
api.HandleFunc("/resources/names", h.GetNames(ctx))
6262

63+
// K8S endpoints
64+
api.HandleFunc("/k8s/resources/udnIds", h.GetUDNIdss(ctx))
65+
6366
// Frontend files
6467
api.HandleFunc("/frontend-config", h.GetFrontendConfig())
6568
r.PathPrefix("/").Handler(http.FileServer(http.Dir("./web/dist/")))

vendor/k8s.io/client-go/dynamic/interface.go

Lines changed: 63 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/k8s.io/client-go/dynamic/scheme.go

Lines changed: 108 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)