/
drpolicy_util.go
115 lines (86 loc) · 2.94 KB
/
drpolicy_util.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
// SPDX-FileCopyrightText: The RamenDR authors
// SPDX-License-Identifier: Apache-2.0
package util
import (
"context"
"errors"
"fmt"
"strconv"
"time"
"k8s.io/apimachinery/pkg/api/meta"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
"k8s.io/apimachinery/pkg/util/sets"
"sigs.k8s.io/controller-runtime/pkg/client"
rmn "github.com/ramendr/ramen/api/v1alpha1"
)
func DRPolicyClusterNames(drpolicy *rmn.DRPolicy) []string {
return drpolicy.Spec.DRClusters
}
func DRPolicyClusterNamesAsASet(drpolicy *rmn.DRPolicy) sets.String {
return sets.NewString(DRPolicyClusterNames(drpolicy)...)
}
func DrpolicyRegionNames(drpolicy *rmn.DRPolicy, drClusters []rmn.DRCluster) []string {
regionNames := make([]string, len(DRPolicyClusterNames(drpolicy)))
for i, v := range DRPolicyClusterNames(drpolicy) {
regionName := ""
for _, drCluster := range drClusters {
if drCluster.Name == v {
regionName = string(drCluster.Spec.Region)
}
}
regionNames[i] = regionName
}
return regionNames
}
func DrpolicyRegionNamesAsASet(drpolicy *rmn.DRPolicy, drClusters []rmn.DRCluster) sets.String {
return sets.NewString(DrpolicyRegionNames(drpolicy, drClusters)...)
}
func DrpolicyValidated(drpolicy *rmn.DRPolicy) error {
// TODO: What if the DRPolicy is deleted!
// A deleted DRPolicy should not be applied to a new DRPC
if condition := meta.FindStatusCondition(drpolicy.Status.Conditions, rmn.DRPolicyValidated); condition != nil {
if condition.Status != metav1.ConditionTrue {
return errors.New(condition.Message)
}
return nil
}
return errors.New(`validated condition absent`)
}
func GetAllDRPolicies(ctx context.Context, client client.Reader) (rmn.DRPolicyList, error) {
drpolicies := rmn.DRPolicyList{}
if err := client.List(ctx, &drpolicies); err != nil {
return drpolicies, fmt.Errorf("unable to fetch drpolicies: %w", err)
}
return drpolicies, nil
}
func DRPolicyS3Profiles(drpolicy *rmn.DRPolicy, drclusters []rmn.DRCluster) sets.String {
mustHaveS3Profiles := sets.String{}
for _, managedCluster := range DRPolicyClusterNames(drpolicy) {
s3ProfileName := ""
for i := range drclusters {
if drclusters[i].Name == managedCluster {
s3ProfileName = drclusters[i].Spec.S3ProfileName
}
}
mustHaveS3Profiles = mustHaveS3Profiles.Insert(s3ProfileName)
}
return mustHaveS3Profiles
}
//nolint:gomnd
func GetSecondsFromSchedulingInterval(drpolicy *rmn.DRPolicy) (float64, error) {
schedulingInterval := drpolicy.Spec.SchedulingInterval
if schedulingInterval == "" {
return 0, nil
}
intervalFormat := schedulingInterval[len(schedulingInterval)-1:] // extracts m|h|d string
interval := schedulingInterval[:len(schedulingInterval)-1] // extracts numerical value of schedulingInterval
dayInSeconds := 24 * 60 * 60
switch intervalFormat {
case "d":
s, err := strconv.ParseFloat(interval, 64)
return s * float64(dayInSeconds), err
default:
s, err := time.ParseDuration(schedulingInterval)
return s.Seconds(), err
}
}