diff --git a/README.md b/README.md index cd65710..f465116 100644 --- a/README.md +++ b/README.md @@ -7,10 +7,10 @@ [![License: Apache-2.0](https://img.shields.io/badge/License-Apache--2.0-blue.svg)](LICENSE)

- Topology viewer showing an ImagePullBackOff diagnostic graph + Topology viewer showing a kind Helm storage topology graph

- Real topology viewer capture: a Pod diagnostic graph with workload, service, config, identity/RBAC, image, and event evidence. + Real topology viewer capture: a kind-style Helm workload graph with Service, config, identity/RBAC, PVC, PV, StorageClass, CSI driver, provisioner, Node, and Event evidence.

`kubernetes-ontology` is a read-only Kubernetes topology service for diff --git a/README.zh-CN.md b/README.zh-CN.md index 691f87b..2c9e031 100644 --- a/README.zh-CN.md +++ b/README.zh-CN.md @@ -3,10 +3,10 @@ [English](README.md) | [中文说明](README.zh-CN.md)

- Topology viewer 展示 ImagePullBackOff 诊断图 + Topology viewer 展示 kind Helm 存储拓扑诊断图

- 真实 viewer 页面捕获:从一个故障 Pod 展开 workload、Service、配置、身份/RBAC、镜像和 Event 证据。 + 真实 viewer 页面捕获:kind 风格 Helm workload 与 Service、配置、身份/RBAC、PVC、PV、StorageClass、CSI Driver、provisioner、Node 和 Event 证据同屏展开。

`kubernetes-ontology` 是一个只读的 Kubernetes 拓扑和诊断服务。它从 diff --git a/cmd/kubernetes-ontology-viewer/main.go b/cmd/kubernetes-ontology-viewer/main.go index d076a0d..fdf80da 100644 --- a/cmd/kubernetes-ontology-viewer/main.go +++ b/cmd/kubernetes-ontology-viewer/main.go @@ -92,6 +92,8 @@ func (h *handler) ServeHTTP(w http.ResponseWriter, r *http.Request) { switch r.URL.Path { case "/": h.serveIndex(w) + case "/vendor/cytoscape.min.js": + h.serveCytoscape(w) case "/topology": h.serveTopology(w, r) case "/diagnostic": @@ -114,6 +116,11 @@ func (h *handler) serveIndex(w http.ResponseWriter) { _, _ = io.WriteString(w, body) } +func (h *handler) serveCytoscape(w http.ResponseWriter) { + w.Header().Set("Content-Type", "application/javascript; charset=utf-8") + _, _ = io.WriteString(w, visualize.CytoscapeJS) +} + func (h *handler) serveTopology(w http.ResponseWriter, r *http.Request) { q := r.URL.Query() server := first(q, "server", h.defaultServer) diff --git a/cmd/kubernetes-ontology-viewer/main_test.go b/cmd/kubernetes-ontology-viewer/main_test.go index 3e1fdfb..041709a 100644 --- a/cmd/kubernetes-ontology-viewer/main_test.go +++ b/cmd/kubernetes-ontology-viewer/main_test.go @@ -2,13 +2,58 @@ package main import ( "encoding/json" + "io" "net/http" "net/http/httptest" "net/url" + "strings" "testing" "time" ) +func TestServeIndexIncludesProfessionalRenderer(t *testing.T) { + viewer := httptest.NewServer(newHandler("http://kubernetes-ontology:18080", time.Second)) + defer viewer.Close() + + resp, err := http.Get(viewer.URL + "/") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + text := string(body) + if !strings.Contains(text, "/vendor/cytoscape.min.js") || !strings.Contains(text, "Professional renderer") { + t.Fatalf("expected professional renderer assets in index") + } + if !strings.Contains(text, `value="http://kubernetes-ontology:18080"`) { + t.Fatalf("expected default ontology server to be injected") + } +} + +func TestServeCytoscapeAsset(t *testing.T) { + viewer := httptest.NewServer(newHandler("http://kubernetes-ontology:18080", time.Second)) + defer viewer.Close() + + resp, err := http.Get(viewer.URL + "/vendor/cytoscape.min.js") + if err != nil { + t.Fatal(err) + } + defer resp.Body.Close() + if contentType := resp.Header.Get("Content-Type"); !strings.Contains(contentType, "application/javascript") { + t.Fatalf("expected javascript content type, got %q", contentType) + } + body, err := io.ReadAll(resp.Body) + if err != nil { + t.Fatal(err) + } + if !strings.Contains(string(body[:min(len(body), 300)]), "Cytoscape") { + t.Fatalf("expected cytoscape asset body") + } +} + func TestServeDiagnosticForwardsRecipeAndBudgets(t *testing.T) { var got url.Values upstream := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { diff --git a/docs/assets/kind-helm-storage-demo.en.gif b/docs/assets/kind-helm-storage-demo.en.gif new file mode 100644 index 0000000..e6c90c0 Binary files /dev/null and b/docs/assets/kind-helm-storage-demo.en.gif differ diff --git a/docs/assets/kind-helm-storage-demo.gif b/docs/assets/kind-helm-storage-demo.gif new file mode 100644 index 0000000..b64c4b3 Binary files /dev/null and b/docs/assets/kind-helm-storage-demo.gif differ diff --git a/index.html b/index.html index d837de0..c96ec4f 100644 --- a/index.html +++ b/index.html @@ -7,7 +7,7 @@ - + @@ -785,8 +803,13 @@

Relation Filters

+