@@ -16,6 +16,7 @@ limitations under the License.
1616package main
1717
1818import (
19+ "cmp"
1920 "crypto/tls"
2021 "flag"
2122 "fmt"
@@ -30,9 +31,7 @@ import (
3031 webhooks "github.com/metal3-io/baremetal-operator/internal/webhooks/metal3.io/v1alpha1"
3132 "github.com/metal3-io/baremetal-operator/pkg/imageprovider"
3233 "github.com/metal3-io/baremetal-operator/pkg/provisioner"
33- "github.com/metal3-io/baremetal-operator/pkg/provisioner/demo"
3434 "github.com/metal3-io/baremetal-operator/pkg/provisioner/fixture"
35- "github.com/metal3-io/baremetal-operator/pkg/provisioner/ironic"
3635 "github.com/metal3-io/baremetal-operator/pkg/secretutils"
3736 "github.com/metal3-io/baremetal-operator/pkg/version"
3837 ironicv1alpha1 "github.com/metal3-io/ironic-standalone-operator/api/v1alpha1"
7372
7473const leaderElectionID = "baremetal-operator"
7574
75+ // defaultIronicPluginPath is where the BMO image bakes the ironic provisioner plugin.
76+ const defaultIronicPluginPath = "/plugins/ironic-provisioner.so"
77+
7678func init () {
7779 _ = clientgoscheme .AddToScheme (scheme )
7880
@@ -132,7 +134,7 @@ func main() {
132134 var preprovImgEnable bool
133135 var devLogging bool
134136 var runInTestMode bool
135- var runInDemoMode bool
137+ var provisionerPlugin string
136138 var webhookPort int
137139 var restConfigQPS float64
138140 var restConfigBurst int
@@ -155,8 +157,8 @@ func main() {
155157 flag .BoolVar (& preprovImgEnable , "build-preprov-image" , false , "enable integration with the PreprovisioningImage API" )
156158 flag .BoolVar (& devLogging , "dev" , false , "enable developer logging" )
157159 flag .BoolVar (& runInTestMode , "test-mode" , false , "disable ironic communication" )
158- flag .BoolVar ( & runInDemoMode , "demo-mode " , false ,
159- "use the demo provisioner to set host states " )
160+ flag .StringVar ( & provisionerPlugin , "provisioner-plugin " , os . Getenv ( "PROVISIONER_PLUGIN" ) ,
161+ "Path to a Go plugin .so implementing the provisioner Factory. Defaults to " + defaultIronicPluginPath + ". " )
160162 flag .StringVar (& healthAddr , "health-addr" , ":9440" ,
161163 "The address the health endpoint binds to." )
162164 flag .IntVar (& webhookPort , "webhook-port" , 9443 , //nolint:mnd
@@ -317,22 +319,25 @@ func main() {
317319 if runInTestMode {
318320 ctrl .Log .Info ("using test provisioner" )
319321 provisionerFactory = & fixture.Fixture {}
320- } else if runInDemoMode {
321- ctrl .Log .Info ("using demo provisioner" )
322- provisionerFactory = & demo.Demo {}
323322 } else {
323+ pluginPath := cmp .Or (provisionerPlugin , defaultIronicPluginPath )
324324 provLog := zap .New (zap .UseFlagOptions (& logOpts )).WithName ("provisioner" )
325- // Check if we should use Ironic CR integration
326- if ironicName != "" && ironicNamespace != "" {
327- provisionerFactory , err = ironic .NewProvisionerFactoryWithClient (provLog , preprovImgEnable ,
328- mgr .GetClient (), mgr .GetAPIReader (), ironicName , ironicNamespace )
329- } else {
330- provisionerFactory , err = ironic .NewProvisionerFactory (provLog , preprovImgEnable )
325+ var hostFeatures []provisioner.HostFeature
326+ if preprovImgEnable {
327+ hostFeatures = append (hostFeatures , provisioner .FeaturePreprovImg )
331328 }
329+ var pluginName string
330+ provisionerFactory , pluginName , err = provisioner .LoadProvisionerPlugin (pluginPath , provisioner.PluginConfig {
331+ Logger : provLog ,
332+ Features : hostFeatures ,
333+ K8sClient : mgr .GetClient (),
334+ APIReader : mgr .GetAPIReader (),
335+ })
332336 if err != nil {
333- setupLog .Error (err , "cannot start ironic provisioner" )
337+ setupLog .Error (err , "cannot load provisioner plugin" , "path" , pluginPath )
334338 os .Exit (1 )
335339 }
340+ ctrl .Log .Info ("loaded provisioner plugin" , "name" , pluginName , "path" , pluginPath )
336341 }
337342
338343 maxConcurrency , err := getMaxConcurrentReconciles (controllerConcurrency )
0 commit comments