-
Notifications
You must be signed in to change notification settings - Fork 575
/
reloadimpl.go
132 lines (111 loc) · 3.88 KB
/
reloadimpl.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
128
129
130
131
132
package reloadservice
/*
Copyright 2017-2019 Crunchy Data Solutions, Inc.
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License 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.
*/
import (
log "github.com/sirupsen/logrus"
crv1 "github.com/crunchydata/postgres-operator/apis/cr/v1"
"github.com/crunchydata/postgres-operator/apiserver"
msgs "github.com/crunchydata/postgres-operator/apiservermsgs"
"github.com/crunchydata/postgres-operator/kubeapi"
"github.com/crunchydata/postgres-operator/util"
"k8s.io/api/core/v1"
"k8s.io/client-go/kubernetes"
"k8s.io/client-go/rest"
"strings"
)
// Reload ...
// pgo reload mycluster
// pgo reload all
// pgo reload --selector=name=mycluster
func Reload(request *msgs.ReloadRequest, ns string) msgs.ReloadResponse {
resp := msgs.ReloadResponse{}
resp.Status.Code = msgs.Ok
resp.Status.Msg = ""
resp.Results = make([]string, 0)
log.Debugf("Reload %v", request)
if request.Selector != "" {
//use the selector instead of an argument list to filter on
clusterList := crv1.PgclusterList{}
err := kubeapi.GetpgclustersBySelector(apiserver.RESTClient, &clusterList, request.Selector, ns)
if err != nil {
resp.Status.Code = msgs.Error
resp.Status.Msg = err.Error()
return resp
}
if len(clusterList.Items) == 0 {
log.Debug("no clusters found")
resp.Results = append(resp.Results, "no clusters found with that selector")
return resp
} else {
newargs := make([]string, 0)
for _, cluster := range clusterList.Items {
newargs = append(newargs, cluster.Spec.Name)
}
request.Args = newargs
}
}
for _, arg := range request.Args {
log.Debugf("reload called for %s", arg)
cluster := crv1.Pgcluster{}
found, err := kubeapi.Getpgcluster(apiserver.RESTClient, &cluster, arg, ns)
if !found {
resp.Status.Code = msgs.Error
resp.Status.Msg = arg + " was not found, verify cluster name"
return resp
} else if err != nil {
resp.Status.Code = msgs.Error
resp.Status.Msg = err.Error()
return resp
}
var podList *v1.PodList
selector := util.LABEL_SERVICE_NAME + "=" + cluster.Spec.Name
podList, err = kubeapi.GetPods(apiserver.Clientset, selector, ns)
if err != nil {
resp.Status.Code = msgs.Error
resp.Status.Msg = err.Error()
return resp
}
if len(podList.Items) == 0 {
resp.Status.Code = msgs.Error
resp.Status.Msg = "no pods found using " + selector
return resp
}
err = reload(&podList.Items[0], apiserver.Clientset, apiserver.RESTClient, ns, apiserver.RESTConfig, ns)
if err != nil {
if !strings.Contains(err.Error(), "normal") {
resp.Status.Code = msgs.Error
resp.Status.Msg = err.Error()
return resp
}
}
resp.Results = append(resp.Results, "reload performed on "+arg)
}
return resp
}
// run reload.sh on the postgres pod, remember we are assuming
// first container in the pod is always the postgres container.
func reload(
pod *v1.Pod,
clientset *kubernetes.Clientset,
client *rest.RESTClient, namespace string, restconfig *rest.Config, ns string) error {
//get the target pod that matches the replica-name=target
command := make([]string, 1)
command[0] = "/opt/cpm/bin/reload.sh"
log.Debugf("running Exec with namespace=[%s] podname=[%s] container name=[%s]", namespace, pod.Name, pod.Spec.Containers[0].Name)
stdout, stderr, err := kubeapi.ExecToPodThroughAPI(restconfig, apiserver.Clientset, command, pod.Spec.Containers[0].Name, pod.Name, ns, nil)
if err != nil {
log.Error(err)
}
log.Debugf("stdout=[%s] stderr=[%s]", stdout, stderr)
return err
}