forked from kubesphere/api
/
silence_types.go
111 lines (88 loc) · 2.79 KB
/
silence_types.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
/*
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 v2beta2
import (
"time"
"github.com/robfig/cron/v3"
metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
)
// SilenceSpec defines the desired state of Silence
type SilenceSpec struct {
// whether the silence is enabled
Enabled *bool `json:"enabled,omitempty"`
Matcher *metav1.LabelSelector `json:"matcher"`
// The start time during which the silence is active.
//
// +kubebuilder:validation:Format: date-time
StartsAt *metav1.Time `json:"startsAt,omitempty"`
// The schedule in Cron format.
// If set the silence will be active periodicity, and the startsAt will be invalid.
Schedule string `json:"schedule,omitempty"`
// The time range during which the silence is active.
// If not set, the silence will be active ever.
Duration *metav1.Duration `json:"duration,omitempty"`
}
// SilenceStatus defines the observed state of Silence
type SilenceStatus struct {
}
// +kubebuilder:object:root=true
// +kubebuilder:resource:scope=Cluster,categories=notification-manager
// +kubebuilder:subresource:status
// +kubebuilder:storageversion
// +genclient
// +genclient:nonNamespaced
// Silence is the Schema for the Silence API
type Silence struct {
metav1.TypeMeta `json:",inline"`
metav1.ObjectMeta `json:"metadata,omitempty"`
Spec SilenceSpec `json:"spec,omitempty"`
Status SilenceStatus `json:"status,omitempty"`
}
// +kubebuilder:object:root=true
// SilenceList contains a list of Silence
type SilenceList struct {
metav1.TypeMeta `json:",inline"`
metav1.ListMeta `json:"metadata,omitempty"`
Items []Silence `json:"items"`
}
func init() {
SchemeBuilder.Register(&Silence{}, &SilenceList{})
}
func (s *Silence) IsActive() bool {
if s.Spec.Enabled != nil && !*s.Spec.Enabled {
return false
}
if s.Spec.Schedule != "" {
if s.Spec.Duration == nil {
return true
}
schedule, _ := cron.ParseStandard(s.Spec.Schedule)
if schedule.Next(time.Now()) == schedule.Next(time.Now().Add(-(*s.Spec.Duration).Duration)) {
return false
} else {
return true
}
} else if s.Spec.StartsAt != nil {
if s.Spec.StartsAt.After(time.Now()) {
return false
}
if s.Spec.Duration == nil {
return true
}
if s.Spec.StartsAt.Add((*s.Spec.Duration).Duration).After(time.Now()) {
return true
}
return false
} else {
return true
}
}