Skip to content

Commit

Permalink
added ResponseFilter function to prune CRD response
Browse files Browse the repository at this point in the history
  • Loading branch information
abhi-kn committed Apr 17, 2020
1 parent b1185de commit 491dde0
Show file tree
Hide file tree
Showing 3 changed files with 59 additions and 4 deletions.
2 changes: 2 additions & 0 deletions cmd/bridge/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import (
"github.com/openshift/console/pkg/proxy"
"github.com/openshift/console/pkg/server"
"github.com/openshift/console/pkg/serverconfig"
"github.com/openshift/console/pkg/serverutils"
)

var (
Expand Down Expand Up @@ -567,6 +568,7 @@ func main() {
TLSClientConfig: srv.K8sProxyConfig.TLSClientConfig,
},
},
ResponseFilter: serverutils.CrdResponseFilter,
}

listenURL := bridge.ValidateFlagIsURL("listen", *fListen)
Expand Down
17 changes: 13 additions & 4 deletions pkg/server/resource_lister.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,15 @@ import (
"github.com/openshift/console/pkg/serverutils"
)

// FilterFunction shall filter response before propagating
type FilterFunction func(http.ResponseWriter, io.Reader)

// ResourceLister determines the list of resources of a particular kind
type ResourceLister struct {
BearerToken string
RequestURL *url.URL
Client *http.Client
BearerToken string
RequestURL *url.URL
Client *http.Client
ResponseFilter FilterFunction
}

func (l *ResourceLister) handleResources(w http.ResponseWriter, r *http.Request) {
Expand Down Expand Up @@ -42,6 +46,11 @@ func (l *ResourceLister) handleResources(w http.ResponseWriter, r *http.Request)
}

w.WriteHeader(resp.StatusCode)
io.Copy(w, resp.Body)
if l.ResponseFilter != nil {
l.ResponseFilter(w, resp.Body)
}
if l.ResponseFilter == nil {
io.Copy(w, resp.Body)
}
resp.Body.Close()
}
44 changes: 44 additions & 0 deletions pkg/serverutils/crdutils.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package serverutils

import (
"encoding/json"
"io"
"net/http"
)

// CrdResponseFilter shall filter partial metadata from knative event sources CRDs before propagating
func CrdResponseFilter(w http.ResponseWriter, r io.Reader) {
var typedRes map[string]interface{}
err := json.NewDecoder(r).Decode(&typedRes)
if err != nil {
plog.Errorf("%s", err)
return
}

filteredData := map[string]interface{}{
"kind": typedRes["kind"],
"apiVersion": typedRes["apiVersion"],
"metadata": typedRes["metadata"],
}

items := make([]interface{}, 0)
for _, v := range typedRes["items"].([]interface{}) {
if typedV, ok := v.(map[string]interface{}); ok {
items = append(items, map[string]interface{}{
"metadata": map[string]interface{}{
"name": typedV["metadata"].(map[string]interface{})["name"],
},
"spec": map[string]interface{}{
"group": typedV["spec"].(map[string]interface{})["group"],
"version": typedV["spec"].(map[string]interface{})["version"],
"names": typedV["spec"].(map[string]interface{})["names"],
},
})
}
}
filteredData["items"] = items
err1 := json.NewEncoder(w).Encode(filteredData)
if err1 != nil {
plog.Errorf("%s", err1)
}
}

0 comments on commit 491dde0

Please sign in to comment.