diff --git a/pkg/bmc/access.go b/pkg/bmc/access.go index 8b211bd9dd..8408a3166c 100644 --- a/pkg/bmc/access.go +++ b/pkg/bmc/access.go @@ -46,6 +46,11 @@ type AccessDetails interface { // Boot interface to set BootInterface() string + + ManagementInterface() string + PowerInterface() string + RAIDInterface() string + VendorInterface() string } func getParsedURL(address string) (parsedURL *url.URL, err error) { diff --git a/pkg/bmc/access_test.go b/pkg/bmc/access_test.go index 7c5a69cbdd..69d5a81c99 100644 --- a/pkg/bmc/access_test.go +++ b/pkg/bmc/access_test.go @@ -351,6 +351,14 @@ func TestStaticDriverInfo(t *testing.T) { driver: "redfish", boot: "redfish-virtual-media", }, + + { + Scenario: "idrac virtual media", + input: "idrac-virtualmedia://192.168.122.1", + needsMac: true, + driver: "idrac", + boot: "idrac-redfish-virtual-media", + }, } { t.Run(tc.Scenario, func(t *testing.T) { acc, err := NewAccessDetails(tc.input) @@ -584,6 +592,17 @@ func TestDriverInfo(t *testing.T) { "redfish_username": "", }, }, + + { + Scenario: "idrac virtual media", + input: "idrac-virtualmedia://192.168.122.1/foo/bar", + expects: map[string]string{ + "redfish_address": "https://192.168.122.1", + "redfish_system_id": "/foo/bar", + "redfish_password": "", + "redfish_username": "", + }, + }, } { t.Run(tc.Scenario, func(t *testing.T) { acc, err := NewAccessDetails(tc.input) diff --git a/pkg/bmc/idrac.go b/pkg/bmc/idrac.go index ab9c15be14..a55f23dc58 100644 --- a/pkg/bmc/idrac.go +++ b/pkg/bmc/idrac.go @@ -70,3 +70,19 @@ func (a *iDracAccessDetails) DriverInfo(bmcCreds Credentials) map[string]interfa func (a *iDracAccessDetails) BootInterface() string { return "ipxe" } + +func (a *iDracAccessDetails) ManagementInterface() string { + return "" +} + +func (a *iDracAccessDetails) PowerInterface() string { + return "" +} + +func (a *iDracAccessDetails) RAIDInterface() string { + return "" +} + +func (a *iDracAccessDetails) VendorInterface() string { + return "" +} diff --git a/pkg/bmc/ipmi.go b/pkg/bmc/ipmi.go index 0c356948a9..8f40b8fc3f 100644 --- a/pkg/bmc/ipmi.go +++ b/pkg/bmc/ipmi.go @@ -66,3 +66,19 @@ func (a *ipmiAccessDetails) DriverInfo(bmcCreds Credentials) map[string]interfac func (a *ipmiAccessDetails) BootInterface() string { return "ipxe" } + +func (a *ipmiAccessDetails) ManagementInterface() string { + return "" +} + +func (a *ipmiAccessDetails) PowerInterface() string { + return "" +} + +func (a *ipmiAccessDetails) RAIDInterface() string { + return "" +} + +func (a *ipmiAccessDetails) VendorInterface() string { + return "" +} diff --git a/pkg/bmc/irmc.go b/pkg/bmc/irmc.go index 5067fa814d..5e975620e8 100644 --- a/pkg/bmc/irmc.go +++ b/pkg/bmc/irmc.go @@ -58,3 +58,19 @@ func (a *iRMCAccessDetails) DriverInfo(bmcCreds Credentials) map[string]interfac func (a *iRMCAccessDetails) BootInterface() string { return "pxe" } + +func (a *iRMCAccessDetails) ManagementInterface() string { + return "" +} + +func (a *iRMCAccessDetails) PowerInterface() string { + return "" +} + +func (a *iRMCAccessDetails) RAIDInterface() string { + return "" +} + +func (a *iRMCAccessDetails) VendorInterface() string { + return "" +} diff --git a/pkg/bmc/redfish.go b/pkg/bmc/redfish.go index 6a0f95b12e..472912cf17 100644 --- a/pkg/bmc/redfish.go +++ b/pkg/bmc/redfish.go @@ -11,30 +11,45 @@ func init() { registerFactory("redfish+https", newRedfishAccessDetails) registerFactory("redfish-virtualmedia", newRedfishVirtualMediaAccessDetails) registerFactory("ilo5-virtualmedia", newRedfishVirtualMediaAccessDetails) + registerFactory("idrac-virtualmedia", newRedfishiDracVirtualMediaAccessDetails) } -func newRedfishAccessDetails(parsedURL *url.URL) (AccessDetails, error) { +func redfishDetails(parsedURL *url.URL) *redfishAccessDetails { return &redfishAccessDetails{ bmcType: parsedURL.Scheme, host: parsedURL.Host, path: parsedURL.Path, - }, nil + } +} + +func newRedfishAccessDetails(parsedURL *url.URL) (AccessDetails, error) { + return redfishDetails(parsedURL), nil } func newRedfishVirtualMediaAccessDetails(parsedURL *url.URL) (AccessDetails, error) { - return &redfishAccessDetails{ - bmcType: parsedURL.Scheme, - host: parsedURL.Host, - path: parsedURL.Path, - isVirtualMedia: true, + return &redfishVirtualMediaAccessDetails{ + *redfishDetails(parsedURL), + }, nil +} + +func newRedfishiDracVirtualMediaAccessDetails(parsedURL *url.URL) (AccessDetails, error) { + return &redfishiDracVirtualMediaAccessDetails{ + *redfishDetails(parsedURL), }, nil } type redfishAccessDetails struct { - bmcType string - host string - path string - isVirtualMedia bool + bmcType string + host string + path string +} + +type redfishVirtualMediaAccessDetails struct { + redfishAccessDetails +} + +type redfishiDracVirtualMediaAccessDetails struct { + redfishAccessDetails } const redfishDefaultScheme = "https" @@ -83,9 +98,53 @@ func (a *redfishAccessDetails) DriverInfo(bmcCreds Credentials) map[string]inter // That can be either pxe or redfish-virtual-media func (a *redfishAccessDetails) BootInterface() string { - if a.isVirtualMedia { - return "redfish-virtual-media" - } - return "ipxe" } + +func (a *redfishAccessDetails) ManagementInterface() string { + return "" +} + +func (a *redfishAccessDetails) PowerInterface() string { + return "" +} + +func (a *redfishAccessDetails) RAIDInterface() string { + return "" +} + +func (a *redfishAccessDetails) VendorInterface() string { + return "" +} + +// Virtual Media Overrides + +func (a *redfishVirtualMediaAccessDetails) BootInterface() string { + return "redfish-virtual-media" +} + +// iDrac Virtual Media Overrides + +func (a *redfishiDracVirtualMediaAccessDetails) Driver() string { + return "idrac" +} + +func (a *redfishiDracVirtualMediaAccessDetails) BootInterface() string { + return "idrac-redfish-virtual-media" +} + +func (a *redfishiDracVirtualMediaAccessDetails) ManagementInterface() string { + return "idrac-redfish" +} + +func (a *redfishiDracVirtualMediaAccessDetails) PowerInterface() string { + return "idrac-redfish" +} + +func (a *redfishiDracVirtualMediaAccessDetails) RAIDInterface() string { + return "no-raid" +} + +func (a *redfishiDracVirtualMediaAccessDetails) VendorInterface() string { + return "no-vendor" +} diff --git a/pkg/provisioner/ironic/ironic.go b/pkg/provisioner/ironic/ironic.go index f88dd30901..d81cb0092e 100644 --- a/pkg/provisioner/ironic/ironic.go +++ b/pkg/provisioner/ironic/ironic.go @@ -237,10 +237,15 @@ func (p *ironicProvisioner) ValidateManagementAccess(credentialsChanged bool) (r ironicNode, err = nodes.Create( p.client, nodes.CreateOpts{ - Driver: p.bmcAccess.Driver(), - BootInterface: p.bmcAccess.BootInterface(), - Name: p.host.Name, - DriverInfo: driverInfo, + Driver: p.bmcAccess.Driver(), + BootInterface: p.bmcAccess.BootInterface(), + Name: p.host.Name, + DriverInfo: driverInfo, + InspectInterface: "inspector", + ManagementInterface: p.bmcAccess.ManagementInterface(), + PowerInterface: p.bmcAccess.PowerInterface(), + RAIDInterface: p.bmcAccess.RAIDInterface(), + VendorInterface: p.bmcAccess.VendorInterface(), }).Extract() // FIXME(dhellmann): Handle 409 and 503? errors here. if err != nil {