@@ -60,6 +60,7 @@ import (
6060 "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/controller"
6161 commonController "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/controller_common"
6262 "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/etcd"
63+ "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/rbac"
6364 "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/secret"
6465 "github.com/ai-dynamo/dynamo/deploy/cloud/operator/internal/secrets"
6566 istioclientsetscheme "istio.io/client-go/pkg/clientset/versioned/scheme"
@@ -116,6 +117,7 @@ func init() {
116117 //+kubebuilder:scaffold:scheme
117118}
118119
120+ //nolint:gocyclo
119121func main () {
120122 var metricsAddr string
121123 var enableLeaderElection bool
@@ -137,6 +139,7 @@ func main() {
137139 var prometheusEndpoint string
138140 var mpiRunSecretName string
139141 var mpiRunSecretNamespace string
142+ var plannerClusterRoleName string
140143 flag .StringVar (& metricsAddr , "metrics-bind-address" , ":8080" , "The address the metric endpoint binds to." )
141144 flag .StringVar (& probeAddr , "health-probe-bind-address" , ":8081" , "The address the probe endpoint binds to." )
142145 flag .BoolVar (& enableLeaderElection , "leader-elect" , false ,
@@ -175,12 +178,19 @@ func main() {
175178 "Name of the secret containing the SSH key for MPI Run (required)" )
176179 flag .StringVar (& mpiRunSecretNamespace , "mpi-run-ssh-secret-namespace" , "" ,
177180 "Namespace where the MPI SSH secret is located (required)" )
181+ flag .StringVar (& plannerClusterRoleName , "planner-cluster-role-name" , "" ,
182+ "Name of the ClusterRole for planner (cluster-wide mode only)" )
178183 opts := zap.Options {
179184 Development : true ,
180185 }
181186 opts .BindFlags (flag .CommandLine )
182187 flag .Parse ()
183188
189+ if restrictedNamespace == "" && plannerClusterRoleName == "" {
190+ setupLog .Error (nil , "planner-cluster-role-name is required in cluster-wide mode" )
191+ os .Exit (1 )
192+ }
193+
184194 // Validate modelExpressURL if provided
185195 if modelExpressURL != "" {
186196 if _ , err := url .Parse (modelExpressURL ); err != nil {
@@ -225,6 +235,9 @@ func main() {
225235 MpiRun : commonController.MpiRunConfig {
226236 SecretName : mpiRunSecretName ,
227237 },
238+ RBAC : commonController.RBACConfig {
239+ PlannerClusterRoleName : plannerClusterRoleName ,
240+ },
228241 }
229242
230243 mainCtx := ctrl .SetupSignalHandler ()
@@ -421,13 +434,17 @@ func main() {
421434 os .Exit (1 )
422435 }
423436
437+ // Initialize RBAC manager for cross-namespace resource management
438+ rbacManager := rbac .NewManager (mgr .GetClient ())
439+
424440 if err = (& controller.DynamoGraphDeploymentReconciler {
425441 Client : mgr .GetClient (),
426442 Recorder : mgr .GetEventRecorderFor ("dynamographdeployment" ),
427443 Config : ctrlConfig ,
428444 DockerSecretRetriever : dockerSecretRetriever ,
429445 ScaleClient : scaleClient ,
430446 MPISecretReplicator : mpiSecretReplicator ,
447+ RBACManager : rbacManager ,
431448 }).SetupWithManager (mgr ); err != nil {
432449 setupLog .Error (err , "unable to create controller" , "controller" , "DynamoGraphDeployment" )
433450 os .Exit (1 )
0 commit comments