Skip to content

Commit ab9b56c

Browse files
LucasRoesleralexellis
authored andcommitted
Refactor secrets handler logic into sub-handlers
**What** - Create independent handler methods for each support http method Signed-off-by: Lucas Roesler <[email protected]>
1 parent e17ae35 commit ab9b56c

File tree

1 file changed

+99
-79
lines changed

1 file changed

+99
-79
lines changed

handlers/secrets.go

Lines changed: 99 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ import (
88
"log"
99
"net/http"
1010

11+
typedV1 "k8s.io/client-go/kubernetes/typed/core/v1"
12+
1113
"github.com/openfaas/faas/gateway/requests"
1214
apiv1 "k8s.io/api/core/v1"
1315
v1beta1 "k8s.io/api/extensions/v1beta1"
@@ -30,97 +32,115 @@ func MakeSecretHandler(namespace string, kube kubernetes.Interface) http.Handler
3032
defer r.Body.Close()
3133
}
3234

35+
client := kube.CoreV1().Secrets(namespace)
36+
3337
switch r.Method {
3438
case http.MethodGet:
35-
selector := fmt.Sprintf("%s=%s", secretLabel, secretLabelValue)
36-
res, err := kube.CoreV1().Secrets(namespace).List(metav1.ListOptions{LabelSelector: selector})
37-
if err != nil {
38-
w.WriteHeader(http.StatusInternalServerError)
39-
log.Printf("Secrets query error: %v\n", err)
40-
return
41-
}
42-
43-
secrets := []requests.Secret{}
44-
for _, item := range res.Items {
45-
secret := requests.Secret{
46-
Name: item.Name,
47-
}
48-
secrets = append(secrets, secret)
49-
}
50-
secretsBytes, err := json.Marshal(secrets)
51-
if err != nil {
52-
w.WriteHeader(http.StatusInternalServerError)
53-
log.Printf("Secrets json marshal error: %v\n", err)
54-
return
55-
}
56-
w.Header().Set("Content-Type", "application/json")
57-
w.WriteHeader(http.StatusOK)
58-
w.Write(secretsBytes)
39+
getSecretsHandler(client, w, r)
5940
case http.MethodPost:
60-
secret, err := parseSecret(namespace, r.Body)
61-
if err != nil {
62-
w.WriteHeader(http.StatusBadRequest)
63-
log.Printf("Secret unmarshal error: %v\n", err)
64-
return
65-
}
66-
_, err = kube.CoreV1().Secrets(namespace).Create(secret)
67-
if err != nil {
68-
w.WriteHeader(http.StatusInternalServerError)
69-
log.Printf("Secret create error: %v\n", err)
70-
return
71-
}
72-
log.Printf("Secret %s create\n", secret.GetName())
73-
w.WriteHeader(http.StatusAccepted)
41+
createSecretHandler(client, namespace, w, r)
7442
case http.MethodPut:
75-
newSecret, err := parseSecret(namespace, r.Body)
76-
if err != nil {
77-
w.WriteHeader(http.StatusBadRequest)
78-
log.Printf("Secret unmarshal error: %v\n", err)
79-
return
80-
}
81-
secret, err := kube.CoreV1().Secrets(namespace).Get(newSecret.GetName(), metav1.GetOptions{})
82-
if errors.IsNotFound(err) {
83-
w.WriteHeader(http.StatusNotFound)
84-
log.Printf("Secret update error: %s not found\n", newSecret.GetName())
85-
return
86-
}
87-
if err != nil {
88-
w.WriteHeader(http.StatusInternalServerError)
89-
log.Printf("Secret query error: %v\n", err)
90-
return
91-
}
92-
secret.StringData = newSecret.StringData
93-
_, err = kube.CoreV1().Secrets(namespace).Update(secret)
94-
if err != nil {
95-
w.WriteHeader(http.StatusInternalServerError)
96-
log.Printf("Secret update error: %v\n", err)
97-
return
98-
}
99-
log.Printf("Secret %s updated", secret.GetName())
100-
w.WriteHeader(http.StatusAccepted)
43+
replaceSecretHandler(client, namespace, w, r)
10144
case http.MethodDelete:
102-
secret, err := parseSecret(namespace, r.Body)
103-
if err != nil {
104-
w.WriteHeader(http.StatusBadRequest)
105-
log.Printf("Secret unmarshal error: %v\n", err)
106-
return
107-
}
108-
opts := &metav1.DeleteOptions{}
109-
err = kube.CoreV1().Secrets(namespace).Delete(secret.GetName(), opts)
110-
if err != nil {
111-
w.WriteHeader(http.StatusInternalServerError)
112-
log.Printf("Secret %s delete error: %v\n", secret.GetName(), err)
113-
return
114-
}
115-
log.Printf("Secret %s deleted\n", secret.GetName())
116-
w.WriteHeader(http.StatusAccepted)
45+
deleteSecretHandler(client, namespace, w, r)
11746
default:
11847
w.WriteHeader(http.StatusBadRequest)
11948
return
12049
}
12150
}
12251
}
12352

53+
func getSecretsHandler(kube typedV1.SecretInterface, w http.ResponseWriter, r *http.Request) {
54+
selector := fmt.Sprintf("%s=%s", secretLabel, secretLabelValue)
55+
res, err := kube.List(metav1.ListOptions{LabelSelector: selector})
56+
if err != nil {
57+
w.WriteHeader(http.StatusInternalServerError)
58+
log.Printf("Secrets query error: %v\n", err)
59+
return
60+
}
61+
62+
secrets := []requests.Secret{}
63+
for _, item := range res.Items {
64+
secret := requests.Secret{
65+
Name: item.Name,
66+
}
67+
secrets = append(secrets, secret)
68+
}
69+
secretsBytes, err := json.Marshal(secrets)
70+
if err != nil {
71+
w.WriteHeader(http.StatusInternalServerError)
72+
log.Printf("Secrets json marshal error: %v\n", err)
73+
return
74+
}
75+
w.Header().Set("Content-Type", "application/json")
76+
w.WriteHeader(http.StatusOK)
77+
w.Write(secretsBytes)
78+
}
79+
80+
func createSecretHandler(kube typedV1.SecretInterface, namespace string, w http.ResponseWriter, r *http.Request) {
81+
secret, err := parseSecret(namespace, r.Body)
82+
if err != nil {
83+
w.WriteHeader(http.StatusBadRequest)
84+
log.Printf("Secret unmarshal error: %v\n", err)
85+
return
86+
}
87+
_, err = kube.Create(secret)
88+
if err != nil {
89+
w.WriteHeader(http.StatusInternalServerError)
90+
log.Printf("Secret create error: %v\n", err)
91+
return
92+
}
93+
log.Printf("Secret %s create\n", secret.GetName())
94+
w.WriteHeader(http.StatusAccepted)
95+
}
96+
97+
func replaceSecretHandler(kube typedV1.SecretInterface, namespace string, w http.ResponseWriter, r *http.Request) {
98+
newSecret, err := parseSecret(namespace, r.Body)
99+
if err != nil {
100+
w.WriteHeader(http.StatusBadRequest)
101+
log.Printf("Secret unmarshal error: %v\n", err)
102+
return
103+
}
104+
secret, err := kube.Get(newSecret.GetName(), metav1.GetOptions{})
105+
if errors.IsNotFound(err) {
106+
w.WriteHeader(http.StatusNotFound)
107+
log.Printf("Secret update error: %s not found\n", newSecret.GetName())
108+
return
109+
}
110+
if err != nil {
111+
w.WriteHeader(http.StatusInternalServerError)
112+
log.Printf("Secret query error: %v\n", err)
113+
return
114+
}
115+
secret.StringData = newSecret.StringData
116+
_, err = kube.Update(secret)
117+
if err != nil {
118+
w.WriteHeader(http.StatusInternalServerError)
119+
log.Printf("Secret update error: %v\n", err)
120+
return
121+
}
122+
log.Printf("Secret %s updated", secret.GetName())
123+
w.WriteHeader(http.StatusAccepted)
124+
}
125+
126+
func deleteSecretHandler(kube typedV1.SecretInterface, namespace string, w http.ResponseWriter, r *http.Request) {
127+
secret, err := parseSecret(namespace, r.Body)
128+
if err != nil {
129+
w.WriteHeader(http.StatusBadRequest)
130+
log.Printf("Secret unmarshal error: %v\n", err)
131+
return
132+
}
133+
opts := &metav1.DeleteOptions{}
134+
err = kube.Delete(secret.GetName(), opts)
135+
if err != nil {
136+
w.WriteHeader(http.StatusInternalServerError)
137+
log.Printf("Secret %s delete error: %v\n", secret.GetName(), err)
138+
return
139+
}
140+
log.Printf("Secret %s deleted\n", secret.GetName())
141+
w.WriteHeader(http.StatusAccepted)
142+
}
143+
124144
func parseSecret(namespace string, r io.Reader) (*apiv1.Secret, error) {
125145
body, _ := ioutil.ReadAll(r)
126146
req := requests.Secret{}

0 commit comments

Comments
 (0)