@@ -54,61 +54,21 @@ func (v *BMCSettingsCustomValidator) ValidateCreate(ctx context.Context, obj run
5454 }
5555 bmcsettingslog .Info ("Validation for BMCSettings upon creation" , "name" , bmcSettings .GetName ())
5656
57- if bmcSettings .Spec .BMCRef == nil && bmcSettings .Spec .ServerRefList == nil {
58- return nil , apierrors .NewInvalid (
59- schema.GroupKind {Group : bmcSettings .GroupVersionKind ().Group , Kind : bmcSettings .Kind },
60- bmcSettings .GetName (), field.ErrorList {field .Required (field .NewPath ("spec" ), "Spec.BMCRef or Spec.ServerRefList is required" )})
61- }
62-
6357 bmcSettingsList := & metalv1alpha1.BMCSettingsList {}
6458 if err := v .Client .List (ctx , bmcSettingsList ); err != nil {
6559 return nil , fmt .Errorf ("failed to list bmcSettingsList: %w" , err )
6660 }
6761
68- // this make one API call rather than multiple when trying to find duplicates
69- serversList := & metalv1alpha1.ServerList {}
70- if err := v .Client .List (ctx , serversList ); err != nil {
71- return nil , fmt .Errorf ("failed to list serversList: %w" , err )
72- }
73- serversMap := make (map [string ]* metalv1alpha1.Server , len (serversList .Items ))
74- for _ , server := range serversList .Items {
75- serversMap [server .Name ] = & server
76- }
77-
78- var bmcSettingsBMCName string
79- var path string
80- var bsBMCName string
81- var err error
82- // get the intended BMC
83- if bmcSettings .Spec .BMCRef != nil {
84- bmcSettingsBMCName = bmcSettings .Spec .BMCRef .Name
85- path = "Spec.BMCRef"
86- } else {
87- bmcSettingsBMCName , err = getBMCNameFromServerRef (serversMap , bmcSettings )
88- if err != nil {
89- return nil , err
90- }
91- path = "Spec.ServerRefList"
92- }
93-
94- bmcsettingslog .Info ("TEMP:bmcSettings" , "bmcSettings name" , bmcSettings .Name , "bmcSettings BMCRef" , bmcSettings .Spec .BMCRef , "bmcSettings ServerList" , bmcSettings .Spec .ServerRefList )
95-
9662 for _ , bs := range bmcSettingsList .Items {
97- bmcsettingslog .Info ("TEMP:bs " , "bs name" , bs .Name , "bs BMCRef" , bs .Spec .BMCRef , "bs ServerList" , bs .Spec .ServerRefList )
98- if bs .Spec .BMCRef != nil {
99- bsBMCName = bs .Spec .BMCRef .Name
100- } else {
101- bsBMCName , err = getBMCNameFromServerRef (serversMap , & bs )
102- if err != nil {
103- bmcsettingslog .Info ("Skipping as no referred BMC was found" , "BMCSettings" , bs .Name , "error" , err )
104- continue
105- }
106- }
107- if bsBMCName == bmcSettingsBMCName {
108- err = fmt .Errorf ("BMC (%v) referred in %v is duplicate of BMC (%v) referred in %v" , bmcSettingsBMCName , bmcSettings .Name , bsBMCName , bs .Name )
63+ if bs .Spec .BMCRef .Name == bmcSettings .Spec .BMCRef .Name {
64+ err := fmt .Errorf ("BMC (%v) referred in %v is duplicate of BMC (%v) referred in %v" ,
65+ bmcSettings .Spec .BMCRef .Name ,
66+ bmcSettings .Name ,
67+ bs .Spec .BMCRef .Name ,
68+ bs .Name )
10969 return nil , apierrors .NewInvalid (
11070 schema.GroupKind {Group : bmcSettings .GroupVersionKind ().Group , Kind : bmcSettings .Kind },
111- bmcSettings .GetName (), field.ErrorList {field .Duplicate (field .NewPath ("spec" , path ), err )})
71+ bmcSettings .GetName (), field.ErrorList {field .Duplicate (field .NewPath ("spec" , "BMCRef" ), err )})
11272 }
11373 }
11474 return nil , nil
@@ -122,65 +82,24 @@ func (v *BMCSettingsCustomValidator) ValidateUpdate(ctx context.Context, oldObj,
12282 }
12383 bmcsettingslog .Info ("Validation for BMCSettings upon update" , "name" , bmcSettings .GetName ())
12484
125- if bmcSettings .Spec .BMCRef == nil && bmcSettings .Spec .ServerRefList == nil {
126- return nil , apierrors .NewInvalid (
127- schema.GroupKind {Group : bmcSettings .GroupVersionKind ().Group , Kind : bmcSettings .Kind },
128- bmcSettings .GetName (), field.ErrorList {field .Required (field .NewPath ("spec" ), "Spec.BMCRef or Spec.ServerRefList is required" )})
129- }
130-
13185 bmcSettingsList := & metalv1alpha1.BMCSettingsList {}
13286 if err := v .Client .List (ctx , bmcSettingsList ); err != nil {
13387 return nil , fmt .Errorf ("failed to list bmcSettingsList: %w" , err )
13488 }
13589
136- // this make one API call rather than multiple when trying to find duplicates
137- serversList := & metalv1alpha1.ServerList {}
138- if err := v .Client .List (ctx , serversList ); err != nil {
139- return nil , fmt .Errorf ("failed to list serversList: %w" , err )
140- }
141- serversMap := make (map [string ]* metalv1alpha1.Server , len (serversList .Items ))
142- for _ , server := range serversList .Items {
143- serversMap [server .Name ] = & server
144- }
145-
146- var bmcSettingsBMCName string
147- var path string
148- var bsBMCName string
149- var err error
150-
151- // get the intended BMC
152- if bmcSettings .Spec .BMCRef != nil {
153- bmcSettingsBMCName = bmcSettings .Spec .BMCRef .Name
154- path = "Spec.BMCRef"
155- } else {
156- bmcSettingsBMCName , err = getBMCNameFromServerRef (serversMap , bmcSettings )
157- if err != nil {
158- return nil , err
159- }
160- path = "Spec.ServerRefList"
161- }
162-
163- bmcsettingslog .Info ("TEMP:bmcSettings" , "bmcSettings name" , bmcSettings .Name , "bmcSettings BMCRef" , bmcSettings .Spec .BMCRef , "bmcSettings ServerList" , bmcSettings .Spec .ServerRefList )
164-
16590 for _ , bs := range bmcSettingsList .Items {
16691 if bmcSettings .Name == bs .Name {
16792 continue
16893 }
169- bmcsettingslog .Info ("TEMP: bs" , "bs name" , bs .Name , "bs BMCRef" , bs .Spec .BMCRef , "bs ServerList" , bs .Spec .ServerRefList )
170- if bs .Spec .BMCRef != nil {
171- bsBMCName = bs .Spec .BMCRef .Name
172- } else {
173- bsBMCName , err = getBMCNameFromServerRef (serversMap , & bs )
174- if err != nil {
175- bmcsettingslog .Info ("Skipping as no referred BMC was found" , "BMCSettings" , bs .Name , "error" , err )
176- continue
177- }
178- }
179- if bsBMCName == bmcSettingsBMCName {
180- err = fmt .Errorf ("BMC (%v) referred in %v is duplicate of BMC (%v) referred in %v" , bmcSettingsBMCName , bmcSettings .Name , bsBMCName , bs .Name )
94+ if bs .Spec .BMCRef .Name == bmcSettings .Spec .BMCRef .Name && bmcSettings .Name != bs .Name {
95+ err := fmt .Errorf ("BMC (%v) referred in %v is duplicate of BMC (%v) referred in %v" ,
96+ bmcSettings .Spec .BMCRef .Name ,
97+ bmcSettings .Name ,
98+ bs .Spec .BMCRef .Name ,
99+ bs .Name )
181100 return nil , apierrors .NewInvalid (
182101 schema.GroupKind {Group : bmcSettings .GroupVersionKind ().Group , Kind : bmcSettings .Kind },
183- bmcSettings .GetName (), field.ErrorList {field .Duplicate (field .NewPath ("spec" , path ), err )})
102+ bmcSettings .GetName (), field.ErrorList {field .Duplicate (field .NewPath ("spec" , "BMCRef" ), err )})
184103 }
185104 }
186105 return nil , nil
@@ -196,13 +115,3 @@ func (v *BMCSettingsCustomValidator) ValidateDelete(ctx context.Context, obj run
196115
197116 return nil , nil
198117}
199-
200- func getBMCNameFromServerRef (serversMap map [string ]* metalv1alpha1.Server , bmcSettings * metalv1alpha1.BMCSettings ) (string , error ) {
201- for _ , serverRef := range bmcSettings .Spec .ServerRefList {
202- bmcsettingslog .Info ("TEMP: Validation " , "serverRef" , serverRef , "serversMap[serverRef.Name]" , serversMap )
203- if server , ok := serversMap [serverRef .Name ]; ok && server != nil && server .Spec .BMCRef != nil {
204- return server .Spec .BMCRef .Name , nil
205- }
206- }
207- return "" , fmt .Errorf ("no servers found with reference to BMC in given 'ServerRefList' %v" , bmcSettings .Spec .ServerRefList )
208- }
0 commit comments