Provisioning & Migration with p2: Case study - The Good, the Bad and the Ugly Christian Bourgeois @bourgeois_c Some Context on Previous Product Version • Based on Eclipse 3.4 • Too much time to deliver a simple update • Migration would leave system in inconsistent state 2 How can we update a software component and migrate it’s configuration data while having a stable system in case of failure? 3 Demonstration 4 Provisioning UI import org.eclipse.equinox.internal.p2.ui.ProvUI; import org.eclipse.equinox.internal.p2.ui.ProvUIProvisioningListener; import org.eclipse.equinox.internal.p2.ui.dialogs.AddRepositoryDialog; import org.eclipse.equinox.internal.provisional.p2.repository.RepositoryEvent; 5 Business Model Artifacts Layout • server.feature • • • • 6 info.feature server.bundle common.bundle config.feature • client.feature • • • • info.feature client.bundle common.bundle client.bundle.nls Business Model info.feature – p2.inf properties.1.name = bsm.adaptor properties.1.value = true properties.2.name = adaptor.name properties.2.value = ZExampleAdaptor properties.3.name = client.feature.name properties.3.value = zzz.compuware.example.adaptor.client.feature properties.4.name = server.feature.name properties.4.value = zzz.compuware.example.adaptor.server.feature properties.5.name = adaptor.id properties.5.value = ZExampleAdaptor properties.6.name = adaptor.version properties.6.value = 1.0.0 properties.7.name = company.id properties.7.value = CPWR properties.8.name = domains.ids properties.8.value = APM 7 Migrations… How to integrate them with p2? public abstract class org.eclipse.equinox.p2.engine.spi.ProvisioningAction { … public abstract IStatus execute(Map<String, Object> parameters); public abstract IStatus undo(Map<String, Object> parameters); … } 8 Remote Provisioning Server Client Create Plan Uninstall Create Plan Execute Plan Save timestamp Install Create Plan Execute Plan timestamp Execute Plan 9 Migrate p2 Touchpoint Actions instructions.configure=markStarted(started:true); instructions.configure=copy(source:a, target:b,overwrite:true); instructions.configure=setProgramProperty(propName:key, propValue:value); instructions.configure=addJvmArg(jvmArg:-XX:+UnlockDiagnosticVMOptions); They are executed in the “builder”! 10 Custom p2 Touchpoint Actions instructions.configure=…adaptors.p2.engine.touchpoint.migrate(); instructions.unconfigure=…adaptors.p2.engine.touchpoint.saveConfigurations(); • Executes business logic • Must have knowledge of their runtime 11 public IStatus execute(Map<String, Object> parameters) { boolean isServer = RuntimeInfo.isServer(); if (!isServer) { return Status.OK_STATUS; } … IInstallableUnit infoInstallableUnit = this.getInfoInstallableUnit(iu, repositoryManager, progressMonitor); String adaptorID = this.getAdaptorID(infoInstallableUnit); Version adaptorVersion = this.getAdaptorVersion(infoInstallableUnit); MigrationManager manager = this.getMigrationManager(); MigrationStatus migrationStatus = manager.migrate(adaptorID, adaptorVersion); IStatus status = EclipseStatusFactory.createStatus(migrationStatus); return status; } public IStatus undo(Map<String, Object> parameters) { … MigrationManager manager = this.getMigrationManager(); manager.revert(adaptorID, adaptorVersion); } 12 Ok… But now I get a “No action found” message? 13 p2 Meta-Requirements • Provisions the meta-requirements in the builder com.compuware.vantage.vsm.adaptors.p2.engine.touchpoint.feature provides.0.namespace=com.compuware.vantage.vsm.adaptors.p2 provides.0.name=touchpoints provides.0.version=1.1 com.compuware.vantage.vsm.adaptors.p2.prerequisite.feature metaRequirements.0.namespace=com.compuware.vantage.vsm.adaptors.p2 metaRequirements.0.name=touchpoints metaRequirements.0.range=1.1 14 p2 Meta-Requirements Beware! • Tycho Bugzilla 351487 • tycho-p2-director-plugin ignores metarequirements • *.target in IDE 15 Conclusion • p2 is easy to use (when you know the basics) • p2 API is becoming more high level • Must be aware of the “tricks” and pitfalls 16 Christian Bourgeois @bourgeois_c Feedback is always appreciated