@Override
  public ComputeEngineContainer start(Props props) {
    this.level1 = new ComponentContainer();
    this.level1
        .add(props.rawProperties())
        .add(LEVEL_1_COMPONENTS)
        .add(toArray(CorePropertyDefinitions.all()))
        .add(toArray(CePropertyDefinitions.all()));
    configureFromModules(this.level1);
    this.level1.startComponents();

    ComponentContainer level2 = this.level1.createChild();
    level2.add(LEVEL_2_COMPONENTS);
    configureFromModules(level2);
    level2.startComponents();

    ComponentContainer level3 = level2.createChild();
    level3.add(LEVEL_3_COMPONENTS);
    configureFromModules(level3);
    level3.startComponents();

    this.level4 = level3.createChild();
    this.level4.add(LEVEL_4_COMPONENTS);
    configureFromModules(this.level4);
    ServerExtensionInstaller extensionInstaller =
        this.level4.getComponentByType(ServerExtensionInstaller.class);
    extensionInstaller.installExtensions(this.level4);
    this.level4.startComponents();

    startupTasks();

    return this;
  }
 private void startupTasks() {
   ComponentContainer startupLevel = this.level4.createChild();
   startupLevel.add(STARTUP_COMPONENTS);
   startupLevel.startComponents();
   // done in PlatformLevelStartup
   ServerLifecycleNotifier serverLifecycleNotifier =
       startupLevel.getComponentByType(ServerLifecycleNotifier.class);
   if (serverLifecycleNotifier != null) {
     serverLifecycleNotifier.notifyStart();
   }
   startupLevel.stopComponents();
 }