forked from cloudnative-pg/cloudnative-pg
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathhibernate.go
103 lines (90 loc) · 2.88 KB
/
hibernate.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
/*
Copyright The CloudNativePG Contributors
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.
*/
package utils
import (
"context"
"fmt"
ctrlclient "sigs.k8s.io/controller-runtime/pkg/client"
"github.com/cloudnative-pg/cloudnative-pg/pkg/reconciler/hibernation"
"github.com/cloudnative-pg/cloudnative-pg/pkg/utils"
)
// HibernationMethod will be one of the supported ways to trigger an instance fencing
type HibernationMethod string
const (
// HibernateDeclaratively it is a keyword to use while fencing on/off the instances using annotation method
HibernateDeclaratively HibernationMethod = "annotation"
// HibernateImperatively it is a keyword to use while fencing on/off the instances using plugin method
HibernateImperatively HibernationMethod = "plugin"
)
// HibernateOn hibernate on a cluster
func HibernateOn(
env *TestingEnvironment,
namespace,
clusterName string,
method HibernationMethod,
) error {
switch method {
case HibernateImperatively:
_, _, err := Run(fmt.Sprintf("kubectl cnpg hibernate on %v -n %v",
clusterName, namespace))
if err != nil {
return err
}
return nil
case HibernateDeclaratively:
cluster, err := env.GetCluster(namespace, clusterName)
if err != nil {
return err
}
if cluster.Annotations == nil {
cluster.Annotations = make(map[string]string)
}
originCluster := cluster.DeepCopy()
cluster.Annotations[utils.HibernationAnnotationName] = hibernation.HibernationOn
err = env.Client.Patch(context.Background(), cluster, ctrlclient.MergeFrom(originCluster))
return err
default:
return fmt.Errorf("unknown method: %v", method)
}
}
// HibernateOff hibernate off a cluster
func HibernateOff(
env *TestingEnvironment,
namespace,
clusterName string,
method HibernationMethod,
) error {
switch method {
case HibernateImperatively:
_, _, err := Run(fmt.Sprintf("kubectl cnpg hibernate off %v -n %v",
clusterName, namespace))
if err != nil {
return err
}
return nil
case HibernateDeclaratively:
cluster, err := env.GetCluster(namespace, clusterName)
if err != nil {
return err
}
if cluster.Annotations == nil {
cluster.Annotations = make(map[string]string)
}
originCluster := cluster.DeepCopy()
cluster.Annotations[utils.HibernationAnnotationName] = hibernation.HibernationOff
err = env.Client.Patch(context.Background(), cluster, ctrlclient.MergeFrom(originCluster))
return err
default:
return fmt.Errorf("unknown method: %v", method)
}
}