4343import javax .crypto .Mac ;
4444import javax .crypto .spec .SecretKeySpec ;
4545import javax .inject .Inject ;
46+ import javax .management .InstanceAlreadyExistsException ;
47+ import javax .management .MBeanRegistrationException ;
48+ import javax .management .MalformedObjectNameException ;
49+ import javax .management .NotCompliantMBeanException ;
4650
4751import org .apache .commons .codec .binary .Base64 ;
4852import org .apache .log4j .Logger ;
53+ import org .springframework .context .annotation .Primary ;
4954import org .springframework .stereotype .Component ;
5055
5156import com .cloud .acl .SecurityChecker .AccessType ;
218223import com .cloud .utils .Pair ;
219224import com .cloud .utils .PasswordGenerator ;
220225import com .cloud .utils .Ternary ;
226+ import com .cloud .utils .component .Adapter ;
221227import com .cloud .utils .component .Adapters ;
222228import com .cloud .utils .component .ComponentContext ;
223229import com .cloud .utils .component .ComponentLocator ;
230+ import com .cloud .utils .component .Manager ;
224231import com .cloud .utils .component .SystemIntegrityChecker ;
225232import com .cloud .utils .concurrency .NamedThreadFactory ;
226233import com .cloud .utils .crypt .DBEncryptionUtil ;
234241import com .cloud .utils .db .SearchCriteria ;
235242import com .cloud .utils .db .Transaction ;
236243import com .cloud .utils .exception .CloudRuntimeException ;
244+ import com .cloud .utils .mgmt .JmxUtil ;
245+ import com .cloud .utils .mgmt .ManagementBean ;
237246import com .cloud .utils .net .MacAddress ;
238247import com .cloud .utils .net .NetUtils ;
239248import com .cloud .utils .ssh .SSHKeysHelper ;
@@ -368,13 +377,8 @@ public void startup() {
368377 private void initCloudStackComponents () {
369378 runCheckers ();
370379 startDaos (); // daos should not be using managers and adapters.
371-
372- /*
373- configureManagers();
374- configureAdapters();
375380 startManagers ();
376381 startAdapters ();
377- */
378382 }
379383
380384 private void runCheckers () {
@@ -385,7 +389,7 @@ private void runCheckers() {
385389 try {
386390 checker .check ();
387391 } catch (Exception e ) {
388- s_logger .error ("Problems with running checker:" + checker . getClass ( ).getName (), e );
392+ s_logger .error ("Problems with running checker:" + ComponentContext . getTargetClass ( checker ).getName (), e );
389393 System .exit (1 );
390394 }
391395 }
@@ -398,15 +402,92 @@ private void startDaos() {
398402
399403 for (GenericDaoBase dao : daos .values ()) {
400404 try {
405+ s_logger .info ("Starting dao " + ComponentContext .getTargetClass (dao ).getName ());
401406
407+ // TODO
402408 // dao.configure(dao.getClass().getSimpleName(), params);
403409 } catch (Exception e ) {
404- s_logger .error ("Problems with running checker:" + dao . getClass ( ).getName (), e );
410+ s_logger .error ("Problems with running checker:" + ComponentContext . getTargetClass ( dao ).getName (), e );
405411 System .exit (1 );
406412 }
407413 }
408414 }
409-
415+
416+ private void startManagers () {
417+ @ SuppressWarnings ("rawtypes" )
418+ Map <String , Manager > managers = ComponentContext .getApplicationContext ().getBeansOfType (
419+ Manager .class );
420+
421+ Map <String , Object > params = new HashMap <String , Object >();
422+ for (Manager manager : managers .values ()) {
423+ s_logger .info ("Start manager: " + ComponentContext .getTargetClass (manager ).getName () + "..." );
424+ try {
425+ if (!ComponentContext .isPrimary (manager , Manager .class )) {
426+ s_logger .error ("Skip manager:" + ComponentContext .getTargetClass (manager ).getName () + " as there are multiple matches" );
427+ continue ;
428+ }
429+
430+ if (!manager .configure (manager .getClass ().getSimpleName (), params )) {
431+ throw new CloudRuntimeException ("Failed to start manager: " + ComponentContext .getTargetClass (manager ).getName ());
432+ }
433+
434+ if (!manager .start ()) {
435+ throw new CloudRuntimeException ("Failed to start manager: " + ComponentContext .getTargetClass (manager ).getName ());
436+ }
437+
438+ if (manager instanceof ManagementBean ) {
439+ registerMBean ((ManagementBean )manager );
440+ }
441+ } catch (Exception e ) {
442+ s_logger .error ("Problems to start manager:" + ComponentContext .getTargetClass (manager ).getName (), e );
443+ System .exit (1 );
444+ }
445+ }
446+ }
447+
448+ private void startAdapters () {
449+ @ SuppressWarnings ("rawtypes" )
450+ Map <String , Adapter > adapters = ComponentContext .getApplicationContext ().getBeansOfType (
451+ Adapter .class );
452+
453+ Map <String , Object > params = new HashMap <String , Object >();
454+ for (Adapter adapter : adapters .values ()) {
455+ try {
456+ if (!ComponentContext .isPrimary (adapter , Adapter .class ))
457+ continue ;
458+
459+ if (!adapter .configure (adapter .getClass ().getSimpleName (), params )) {
460+ throw new CloudRuntimeException ("Failed to start adapter: " + ComponentContext .getTargetClass (adapter ).getName ());
461+ }
462+ if (!adapter .start ()) {
463+ throw new CloudRuntimeException ("Failed to start adapter: " + ComponentContext .getTargetClass (adapter ).getName ());
464+ }
465+
466+ if (adapter instanceof ManagementBean ) {
467+ registerMBean ((ManagementBean )adapter );
468+ }
469+ } catch (Exception e ) {
470+ s_logger .error ("Problems to start manager:" + ComponentContext .getTargetClass (adapter ).getName (), e );
471+ System .exit (1 );
472+ }
473+ }
474+ }
475+
476+ protected void registerMBean (ManagementBean mbean ) {
477+ try {
478+ JmxUtil .registerMBean (mbean );
479+ } catch (MalformedObjectNameException e ) {
480+ s_logger .warn ("Unable to register MBean: " + mbean .getName (), e );
481+ } catch (InstanceAlreadyExistsException e ) {
482+ s_logger .warn ("Unable to register MBean: " + mbean .getName (), e );
483+ } catch (MBeanRegistrationException e ) {
484+ s_logger .warn ("Unable to register MBean: " + mbean .getName (), e );
485+ } catch (NotCompliantMBeanException e ) {
486+ s_logger .warn ("Unable to register MBean: " + mbean .getName (), e );
487+ }
488+ s_logger .info ("Registered MBean: " + mbean .getName ());
489+ }
490+
410491 protected Map <String , String > getConfigs () {
411492 return _configs ;
412493 }
0 commit comments