/
operands_handler.go
94 lines (86 loc) · 2.88 KB
/
operands_handler.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
package server
import (
"context"
"encoding/json"
"fmt"
"net/http"
"github.com/openshift/console/pkg/auth"
"github.com/openshift/console/pkg/serverutils"
"github.com/operator-framework/kubectl-operator/pkg/action"
"k8s.io/client-go/rest"
"k8s.io/klog/v2"
"sigs.k8s.io/controller-runtime/pkg/client"
)
type OperandsListHandler struct {
APIServerURL string
Client *http.Client
}
func (o *OperandsListHandler) GetConfig(user *auth.User) (*rest.Config, error) {
config := &rest.Config{
Host: o.APIServerURL,
Transport: o.Client.Transport,
BearerToken: user.Token,
}
return config, nil
}
func (o *OperandsListHandler) OperandsListHandler(user *auth.User, w http.ResponseWriter, r *http.Request) {
if r.Method != "GET" {
w.Header().Set("Allow", "GET")
serverutils.SendResponse(w, http.StatusMethodNotAllowed, serverutils.ApiError{Err: "Method unsupported, the only supported methods is GET"})
return
}
query := r.URL.Query()
operatorName := query.Get("name")
operatorNamespace := query.Get("namespace")
if len(operatorName) < 1 || len(operatorNamespace) < 1 {
errMsg := fmt.Sprintf("Failed to get operator name or namespace from the request URL: %q", r.URL.String())
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusBadRequest, serverutils.ApiError{Err: errMsg})
return
}
scheme, err := action.NewScheme()
if err != nil {
errMsg := fmt.Sprintf("Failed to get new scheme for operator client: %v", err)
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusInternalServerError, serverutils.ApiError{Err: errMsg})
return
}
config, err := o.GetConfig(user)
if err != nil {
errMsg := fmt.Sprintf("Failed to get new config for operator client: %v", err)
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusInternalServerError, serverutils.ApiError{Err: errMsg})
return
}
client, err := client.New(config, client.Options{
Scheme: scheme,
})
if err != nil {
errMsg := fmt.Sprintf("Failed to get new client for listing operands: %v", err)
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusInternalServerError, serverutils.ApiError{Err: errMsg})
return
}
cfg := &action.Configuration{
Client: client,
Scheme: scheme,
Namespace: operatorNamespace,
}
operatorListOperands := action.NewOperatorListOperands(cfg)
operandsList, err := operatorListOperands.Run(context.TODO(), operatorName)
if err != nil {
errMsg := fmt.Sprintf("Failed to list operands: %v", err)
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusBadGateway, serverutils.ApiError{Err: errMsg})
return
}
w.Header().Set("Content-Type", "application/json")
resp, err := json.Marshal(operandsList)
if err != nil {
errMsg := fmt.Sprintf("Failed to marshal the list operands response: %v", err)
klog.Error(errMsg)
serverutils.SendResponse(w, http.StatusInternalServerError, serverutils.ApiError{Err: errMsg})
return
}
w.Write(resp)
}