-
Notifications
You must be signed in to change notification settings - Fork 46
/
introspect.go
127 lines (107 loc) · 3.91 KB
/
introspect.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
// Copyright Amazon.com Inc. or its affiliates. All Rights Reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License"). You may
// not use this file except in compliance with the License. A copy of the
// License is located at
//
// http://aws.amazon.com/apache2.0/
//
// or in the "license" file accompanying this file. This file is distributed
// on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either
// express or implied. See the License for the specific language governing
// permissions and limitations under the License.
package resource
import (
"context"
"encoding/json"
"net/http"
rcHealthz "github.com/aws/amazon-vpc-resource-controller-k8s/pkg/healthz"
"github.com/go-logr/logr"
ctrl "sigs.k8s.io/controller-runtime"
"sigs.k8s.io/controller-runtime/pkg/healthz"
)
const (
GetNodeResourcesPath = "/node/"
GetAllResourcesPath = "/resources/all"
GetResourcesSummaryPath = "/resources/summary"
)
type IntrospectHandler struct {
Log logr.Logger
BindAddress string
ResourceManager ResourceManager
}
// StartENICleaner starts the ENI Cleaner routine that cleans up dangling ENIs created by the controller
func (i *IntrospectHandler) Start(_ context.Context) error {
i.Log.Info("starting introspection API")
mux := http.NewServeMux()
mux.HandleFunc(GetAllResourcesPath, i.ResourceHandler)
mux.HandleFunc(GetNodeResourcesPath, i.NodeResourceHandler)
mux.HandleFunc(GetResourcesSummaryPath, i.ResourceSummaryHandler)
// Should this be a fatal error?
err := http.ListenAndServe(i.BindAddress, mux)
if err != nil {
i.Log.Error(err, "failed to run introspect API")
}
return err
}
// ResourceHandler returns all the nodes associated with the resource
func (i *IntrospectHandler) ResourceHandler(w http.ResponseWriter, _ *http.Request) {
response := make(map[string]interface{})
for resourceName, provider := range i.ResourceManager.GetResourceProviders() {
data := provider.Introspect()
response[resourceName] = data
}
jsonData, err := json.MarshalIndent(response, "", "\t")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Header().Set("content-type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(jsonData)
}
// NodeResourceHandler returns all the resources associated with the Node
func (i *IntrospectHandler) NodeResourceHandler(w http.ResponseWriter, r *http.Request) {
nodeName := r.URL.Path[len(GetNodeResourcesPath):]
response := make(map[string]interface{})
for resourceName, provider := range i.ResourceManager.GetResourceProviders() {
data := provider.IntrospectNode(nodeName)
if data != nil {
response[resourceName] = data
}
}
jsonData, err := json.MarshalIndent(response, "", "\t")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Header().Set("content-type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(jsonData)
}
// ResourceSummaryHandler returns all the resources associated with the Node
func (i *IntrospectHandler) ResourceSummaryHandler(w http.ResponseWriter, r *http.Request) {
response := make(map[string]interface{})
for resourceName, provider := range i.ResourceManager.GetResourceProviders() {
data := provider.IntrospectSummary()
response[resourceName] = data
}
jsonData, err := json.MarshalIndent(response, "", "\t")
if err != nil {
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(err.Error()))
return
}
w.Header().Set("content-type", "application/json")
w.WriteHeader(http.StatusOK)
w.Write(jsonData)
}
func (i *IntrospectHandler) SetupWithManager(mgr ctrl.Manager, healthzHanlder *rcHealthz.HealthzHandler) error {
// add health check on subpath for introspect controller
healthzHanlder.AddControllersHealthCheckers(
map[string]healthz.Checker{"health-introspect-controller": rcHealthz.SimplePing("Introspect controller", i.Log)},
)
return mgr.Add(i)
}