diff --git a/apis/metal3.io/v1alpha1/baremetalhost_validation.go b/apis/metal3.io/v1alpha1/baremetalhost_validation.go index f2b91efc21..5a64aa8418 100644 --- a/apis/metal3.io/v1alpha1/baremetalhost_validation.go +++ b/apis/metal3.io/v1alpha1/baremetalhost_validation.go @@ -6,6 +6,7 @@ import ( "regexp" "github.com/google/uuid" + "github.com/pkg/errors" logf "sigs.k8s.io/controller-runtime/pkg/log" "github.com/metal3-io/baremetal-operator/pkg/hardwareutils/bmc" @@ -38,6 +39,10 @@ func (host *BareMetalHost) validateHost() []error { errs = append(errs, err) } + if err := validateDNSName(host.Spec.BMC.Address); err != nil { + errs = append(errs, err) + } + return errs } @@ -143,3 +148,17 @@ func validateBMHName(bmhname string) error { return nil } + +func validateDNSName(hostaddress string) error { + + if hostaddress == "" { + return nil + } + + _, err := bmc.GetParsedURL(hostaddress) + if err != nil { + return errors.Wrap(err, "BMO validation") + } + + return nil +} diff --git a/apis/metal3.io/v1alpha1/baremetalhost_validation_test.go b/apis/metal3.io/v1alpha1/baremetalhost_validation_test.go index 29b6b978a4..8b26d1b7bd 100644 --- a/apis/metal3.io/v1alpha1/baremetalhost_validation_test.go +++ b/apis/metal3.io/v1alpha1/baremetalhost_validation_test.go @@ -349,6 +349,94 @@ func TestValidateCreate(t *testing.T) { oldBMH: nil, wantedErr: fmt.Sprintf("the 'numberOfPhysicalDisks'[%d] and number of 'physicalDisks'[2] is not same for volume 0", numberOfPhysicalDisks), }, + { + name: "validDNSName", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://host-0.example.com.org:6223"}}}, + oldBMH: nil, + wantedErr: "", + }, + { + name: "validDNSName2", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://baremetalhost"}}}, + oldBMH: nil, + wantedErr: "", + }, + { + name: "validDNSName3", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://[fe80::fc33:62ff:fe83:8a76]:6233"}}}, + oldBMH: nil, + wantedErr: "", + }, + { + name: "invalidDNSNameinvalidhyphenuse", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://-host.example.com.org"}}}, + oldBMH: nil, + wantedErr: "BMO validation: failed to parse BMC address information: BMC address hostname/IP : [-host.example.com.org] is invalid", + }, + { + name: "invalidDNSNameinvalidcharacter", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://host+1.example.com.org"}}}, + oldBMH: nil, + wantedErr: "BMO validation: failed to parse BMC address information: BMC address hostname/IP : [host+1.example.com.org] is invalid", + }, + { + name: "invalidDNSNameinvalidformat", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "[@]host.example.com"}}}, + oldBMH: nil, + wantedErr: "BMO validation: failed to parse BMC address information: parse \"ipmi://[@]host.example.com\": net/url: invalid userinfo", + }, + { + name: "invalidDNSNameinvalidbmc", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipm:host.example.com:6223"}}}, + oldBMH: nil, + wantedErr: "Unknown BMC type 'ipm' for address ipm:host.example.com:6223", + }, + { + name: "invalidDNSNameinvalidipv6", + newBMH: &BareMetalHost{ + TypeMeta: tm, + ObjectMeta: om, + Spec: BareMetalHostSpec{ + BMC: BMCDetails{ + Address: "ipmi://[fe80::fc33:62ff:fe33:8xff]:6223"}}}, + oldBMH: nil, + wantedErr: "BMO validation: failed to parse BMC address information: BMC address hostname/IP : [fe80::fc33:62ff:fe33:8xff] is invalid", + }, } for _, tt := range tests {