@@ -115,32 +115,43 @@ func validatePolicies(policies []v1alpha1.LifecyclePolicy, fldPath *field.Path)
115115 exitCodes := map [int32 ]struct {}{}
116116
117117 for _ , policy := range policies {
118- if policy .Event != "" && policy .ExitCode != nil {
118+ if ( policy .Event != "" || len ( policy . Events ) != 0 ) && policy .ExitCode != nil {
119119 err = multierror .Append (err , fmt .Errorf ("must not specify event and exitCode simultaneously" ))
120120 break
121121 }
122122
123- if policy .Event == "" && policy .ExitCode == nil {
123+ if policy .Event == "" && len ( policy . Events ) == 0 && policy .ExitCode == nil {
124124 err = multierror .Append (err , fmt .Errorf ("either event and exitCode should be specified" ))
125125 break
126126 }
127127
128- if policy .Event != "" {
129- if allow , ok := policyEventMap [policy .Event ]; ! ok || ! allow {
130- err = multierror .Append (err , field .Invalid (fldPath , policy .Event , fmt .Sprintf ("invalid policy event" )))
131- break
128+ if len (policy .Event ) != 0 || len (policy .Events ) != 0 {
129+ bFlag := false
130+ policyEventsList := getEventlist (policy )
131+ for _ , event := range policyEventsList {
132+ if allow , ok := policyEventMap [event ]; ! ok || ! allow {
133+ err = multierror .Append (err , field .Invalid (fldPath , event , fmt .Sprintf ("invalid policy event" )))
134+ bFlag = true
135+ break
136+ }
137+
138+ if allow , ok := policyActionMap [policy .Action ]; ! ok || ! allow {
139+ err = multierror .Append (err , field .Invalid (fldPath , policy .Action , fmt .Sprintf ("invalid policy action" )))
140+ bFlag = true
141+ break
142+ }
143+ if _ , found := policyEvents [event ]; found {
144+ err = multierror .Append (err , fmt .Errorf ("duplicate event %v across different policy" , event ))
145+ bFlag = true
146+ break
147+ } else {
148+ policyEvents [event ] = struct {}{}
149+ }
132150 }
133-
134- if allow , ok := policyActionMap [policy .Action ]; ! ok || ! allow {
135- err = multierror .Append (err , field .Invalid (fldPath , policy .Action , fmt .Sprintf ("invalid policy action" )))
151+ if bFlag == true {
136152 break
137153 }
138- if _ , found := policyEvents [policy .Event ]; found {
139- err = multierror .Append (err , fmt .Errorf ("duplicate event %v" , policy .Event ))
140- break
141- } else {
142- policyEvents [policy .Event ] = struct {}{}
143- }
154+
144155 } else {
145156 if * policy .ExitCode == 0 {
146157 err = multierror .Append (err , fmt .Errorf ("0 is not a valid error code" ))
@@ -162,6 +173,27 @@ func validatePolicies(policies []v1alpha1.LifecyclePolicy, fldPath *field.Path)
162173 return err
163174}
164175
176+ func getEventlist (policy v1alpha1.LifecyclePolicy ) []v1alpha1.Event {
177+ policyEventsList := policy .Events
178+ if len (policy .Event ) > 0 {
179+ policyEventsList = append (policyEventsList , policy .Event )
180+ }
181+ uniquePolicyEventlist := removeDuplicates (policyEventsList )
182+ return uniquePolicyEventlist
183+ }
184+
185+ func removeDuplicates (EventList []v1alpha1.Event ) []v1alpha1.Event {
186+ keys := make (map [v1alpha1.Event ]bool )
187+ list := []v1alpha1.Event {}
188+ for _ , val := range EventList {
189+ if _ , value := keys [val ]; ! value {
190+ keys [val ] = true
191+ list = append (list , val )
192+ }
193+ }
194+ return list
195+ }
196+
165197func getValidEvents () []v1alpha1.Event {
166198 var events []v1alpha1.Event
167199 for e , allow := range policyEventMap {
0 commit comments