From 6e60354dd5b263ef35519d690fae5e8cd89b0058 Mon Sep 17 00:00:00 2001 From: Yan Pujante Date: Wed, 10 Jul 2013 15:40:36 -1000 Subject: [PATCH] #58: refactored packaging to use MetaModel concept - added install script --- .../packaging/setup/AgentCliPackager.groovy | 7 ++ .../setup/AgentServerPackager.groovy | 39 ++++--- .../glu/packaging/setup/BasePackager.groovy | 6 +- .../packaging/setup/ConsoleCliPackager.groovy | 7 ++ .../setup/ConsoleServerPackager.groovy | 7 ++ .../glu/packaging/setup/GluPackager.groovy | 100 +++++++++--------- .../glu/packaging/setup/SetupMain.groovy | 83 +++++++++++++-- .../setup/ZooKeeperClusterPackager.groovy | 15 +-- .../test/setup/TestAgentServerPackager.groovy | 13 +-- .../setup/TestZooKeeperClusterPackager.groovy | 43 +++++--- .../metamodel/impl/AgentMetaModelImpl.groovy | 2 + .../impl/AgentUpgradeMetaModelImpl.groovy | 11 ++ .../metamodel/impl/GluMetaModelImpl.groovy | 7 +- .../core/metamodel/AgentMetaModel.java | 5 + .../core/metamodel/AgentUpgradeMetaModel.java | 14 +++ .../core/metamodel/CliMetaModel.java | 2 +- .../metamodel/ConsolePluginMetaModel.java | 2 +- .../core/metamodel/FabricMetaModel.java | 2 +- .../core/metamodel/GluMetaModel.java | 2 +- .../core/metamodel/HostMetaModel.java | 2 +- .../core/metamodel/InstallMetaModel.java | 2 +- .../core/metamodel/KeyStoreMetaModel.java | 2 +- .../core/metamodel/KeysMetaModel.java | 2 +- .../provisioner/core/metamodel/MetaModel.java | 10 ++ .../core/metamodel/StateMachineMetaModel.java | 2 +- .../metamodel/ZooKeeperClusterMetaModel.java | 2 +- 26 files changed, 275 insertions(+), 114 deletions(-) create mode 100644 provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentUpgradeMetaModelImpl.groovy create mode 100644 provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentUpgradeMetaModel.java create mode 100644 provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/MetaModel.java diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentCliPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentCliPackager.groovy index 4391dcd7..fa6dc4fb 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentCliPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentCliPackager.groovy @@ -18,6 +18,7 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.util.io.resource.Resource import org.pongasoft.glu.provisioner.core.metamodel.AgentCliMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel /** * @author yan@pongasoft.com */ @@ -25,6 +26,12 @@ public class AgentCliPackager extends BasePackager { AgentCliMetaModel metaModel + @Override + Map createPackages() + { + [(metaModel): createPackage()] + } + PackagedArtifact createPackage() { String packageName = ensureVersion(metaModel.version) diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentServerPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentServerPackager.groovy index 4c075913..b9471aa1 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentServerPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/AgentServerPackager.groovy @@ -19,6 +19,7 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.util.io.resource.Resource import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel import org.pongasoft.glu.provisioner.core.metamodel.GluMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel /** * @author yan@pongasoft.com */ @@ -60,7 +61,7 @@ public class AgentServerPackager extends BasePackager AgentMetaModel metaModel - private def _packagedArtifacts = null + private Map _packagedArtifacts = null private Map _tokens = null Map getConfigTokens() @@ -68,7 +69,7 @@ public class AgentServerPackager extends BasePackager metaModel.configTokens } - def computePackagedArtifacts() + Map computePackagedArtifacts() { if(!_packagedArtifacts) { @@ -129,22 +130,26 @@ public class AgentServerPackager extends BasePackager Resource packagePath = outputFolder.createRelative(parts.join('-')) Resource upgradePackagePath = outputFolder.createRelative(upgradeParts.join('-')) - _packagedArtifacts = [ - agentServer: new PackagedArtifact(location: packagePath, - host: metaModel.host.resolveHostAddress(), - port: agentPort, - tokens: _tokens), - agentServerUpgrade: new PackagedArtifact(location: upgradePackagePath, - host: metaModel.host.resolveHostAddress(), - port: agentPort, - tokens: _tokens), - ] + _packagedArtifacts = [:] + + _packagedArtifacts[metaModel] = + new PackagedArtifact(location: packagePath, + host: metaModel.host.resolveHostAddress(), + port: agentPort, + tokens: _tokens) + + _packagedArtifacts[metaModel.agentUpgrade] = + new PackagedArtifact(location: upgradePackagePath, + host: metaModel.host.resolveHostAddress(), + port: agentPort, + tokens: _tokens) } return _packagedArtifacts } - def createPackage() + @Override + Map createPackages() { def packagedArtifacts = computePackagedArtifacts() @@ -158,15 +163,15 @@ public class AgentServerPackager extends BasePackager if(!dryMode) { - copyInputPackage(packagedArtifacts.agentServer.location) - Resource serverRoot = configure(packagedArtifacts.agentServer.location, tokens) + copyInputPackage(packagedArtifacts[metaModel].location) + Resource serverRoot = configure(packagedArtifacts[metaModel].location, tokens) if(metaModel.gluMetaModel.stateMachine) generateStateMachineJarFile(metaModel.gluMetaModel.stateMachine, serverRoot.createRelative('lib')) - shell.delete(packagedArtifacts.agentServerUpgrade.location) - shell.cp(serverRoot, packagedArtifacts.agentServerUpgrade.location) + shell.delete(packagedArtifacts[metaModel.agentUpgrade].location) + shell.cp(serverRoot, packagedArtifacts[metaModel.agentUpgrade].location) } return packagedArtifacts diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/BasePackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/BasePackager.groovy index 652e882e..9705f5ab 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/BasePackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/BasePackager.groovy @@ -2,16 +2,16 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.glu.groovy.utils.io.GluGroovyIOUtils import org.linkedin.glu.groovy.utils.shell.Shell -import org.linkedin.groovy.util.ant.AntUtils import org.linkedin.groovy.util.io.GroovyIOUtils import org.linkedin.util.io.resource.Resource +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel import org.pongasoft.glu.provisioner.core.metamodel.StateMachineMetaModel import org.slf4j.Logger import org.slf4j.LoggerFactory /** * @author yan@pongasoft.com */ -public class BasePackager +public abstract class BasePackager { public static final String MODULE = BasePackager.class.getName(); public static final Logger log = LoggerFactory.getLogger(MODULE); @@ -44,6 +44,8 @@ public class BasePackager fullPackageName - "-${version}" } + abstract Map createPackages() + Shell getShell() { packagerContext.shell diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleCliPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleCliPackager.groovy index 7a6f6af8..cea27b97 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleCliPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleCliPackager.groovy @@ -18,6 +18,7 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.util.io.resource.Resource import org.pongasoft.glu.provisioner.core.metamodel.ConsoleCliMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel /** * @author yan@pongasoft.com */ @@ -25,6 +26,12 @@ public class ConsoleCliPackager extends BasePackager { ConsoleCliMetaModel metaModel + @Override + Map createPackages() + { + [(metaModel): createPackage()] + } + PackagedArtifact createPackage() { String packageName = ensureVersion(metaModel.version) diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleServerPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleServerPackager.groovy index 0e1dec91..7d0436f0 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleServerPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ConsoleServerPackager.groovy @@ -18,6 +18,7 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.util.io.resource.Resource import org.pongasoft.glu.provisioner.core.metamodel.ConsoleMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel /** * @author yan@pongasoft.com */ @@ -47,6 +48,12 @@ public class ConsoleServerPackager extends BasePackager metaModel.configTokens } + @Override + Map createPackages() + { + [(metaModel): createPackage()] + } + PackagedArtifact createPackage() { String packageName = ensureVersion(metaModel.version) diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/GluPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/GluPackager.groovy index 0ad9db33..1d1cef4a 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/GluPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/GluPackager.groovy @@ -23,10 +23,14 @@ import org.linkedin.util.codec.HexaCodec import org.linkedin.util.codec.OneWayCodec import org.linkedin.util.codec.OneWayMessageDigestCodec import org.linkedin.util.io.resource.Resource +import org.pongasoft.glu.provisioner.core.metamodel.AgentCliMetaModel import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ConsoleCliMetaModel import org.pongasoft.glu.provisioner.core.metamodel.ConsoleMetaModel import org.pongasoft.glu.provisioner.core.metamodel.GluMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperClusterMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperMetaModel import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -51,11 +55,11 @@ public class GluPackager Resource outputFolder Resource keysRoot - def packagedArtifacts = [:] + Map packagedArtifacts = [:] boolean dryMode = false - def packageAll() + Map packageAll() { packageAgents() packageConsoles() @@ -73,11 +77,13 @@ public class GluPackager gluMetaModel.agents.each { AgentMetaModel model -> AgentServerPackager packager = buildPackager(model) - def pas = packager.computePackagedArtifacts() + Map pas = packager.computePackagedArtifacts() - def checksum = computeChecksum(pas.agentServer) + PackagedArtifact agent = pas[model] - def packageName = pas.agentServer.location.filename + def checksum = computeChecksum(agent) + + def packageName = agent.location.filename def previousChecksum = checksums[packageName] if(previousChecksum) @@ -90,43 +96,51 @@ public class GluPackager // no need to generate the package! if(!dryMode) { - log.info "Skipped agent package ${pas.agentServer.location} => ${pas.agentServer.host}:${pas.agentServer.port}" + log.info "Skipped agent package ${agent.location} => ${agent.host}:${agent.port}" } } } else { - packager.createPackage() - if(!dryMode) - log.info "Generated agent package ${pas.agentServer.location} => ${pas.agentServer.host}:${pas.agentServer.port}" + packagedArtifacts.putAll(packager.createPackages()) + displayPackagedArtifact(model, "agent package") checksums[packageName] = checksum } - - packagedArtifacts[model] = pas } } void packageConsoles() { gluMetaModel.consoles.values().each { ConsoleMetaModel model -> - PackagedArtifact pa = packageConsole(model) - packagedArtifacts[model] = pa - if(!dryMode) - log.info "Generated console package ${pa.location} => ${pa.host}:${pa.port}" + Map pas = packageConsole(model) + packagedArtifacts.putAll(pas) + displayPackagedArtifact(model, "console package") } } void packageZooKeeperClusters() { gluMetaModel.zooKeeperClusters.values().each { ZooKeeperClusterMetaModel model -> - def pas = packageZooKeeperCluster(model) - packagedArtifacts[model] = pas - if(!dryMode) + Map pas = packageZooKeeperCluster(model) + packagedArtifacts.putAll(pas) + model.zooKeepers.each { ZooKeeperMetaModel zkm -> + displayPackagedArtifact(zkm, "ZooKeeper instance [${zkm.serverIdx}]") + } + displayPackagedArtifact(model, "ZooKeeper cluster [${model.name}]") + } + } + + protected void displayPackagedArtifact(MetaModel metaModel, String displayName) + { + if(!dryMode) + { + PackagedArtifact pa = packagedArtifacts[metaModel] + if(pa) { - pas.zooKeepers.each { zki -> - log.info "Generated ZooKeeper instance ${zki.location} => ${zki.host}:${zki.port}" - } - log.info "Generated ZooKeeper cluster ${pas.zooKeeperCluster.location} => ${model.zooKeeperConnectionString}" + String str = "Generated ${displayName} ${pa.location}" + if(pa.host) + str = "${str} => ${pa.host}:${pa.port}" + log.info str } } } @@ -145,7 +159,7 @@ public class GluPackager return packager } - protected PackagedArtifact packageConsole(ConsoleMetaModel consoleMetaModel) + protected Map packageConsole(ConsoleMetaModel consoleMetaModel) { def out = shell.mkdirs(outputFolder.createRelative('consoles')) def packager = @@ -156,10 +170,10 @@ public class GluPackager configsRoots: configsRoots, metaModel: consoleMetaModel, dryMode: dryMode) - packager.createPackage() + packager.createPackages() } - protected def packageZooKeeperCluster(ZooKeeperClusterMetaModel zooKeeperClusterMetaModel) + protected Map packageZooKeeperCluster(ZooKeeperClusterMetaModel zooKeeperClusterMetaModel) { def out = shell.mkdirs(outputFolder.createRelative('zookeeper-clusters')) def packager = @@ -170,11 +184,13 @@ public class GluPackager configsRoots: configsRoots, metaModel: zooKeeperClusterMetaModel, dryMode: dryMode) - packager.createPackage() + packager.createPackages() } - protected PackagedArtifact packageAgentCli() + protected void packageAgentCli() { + AgentCliMetaModel agentCliMetaModel = gluMetaModel.agentCli + def out = shell.mkdirs(outputFolder.createRelative('agent-cli')) def packager = new AgentCliPackager(packagerContext: createPackagerContext(), @@ -182,24 +198,19 @@ public class GluPackager inputPackage: getInputPackage('org.linkedin.glu.agent-cli', gluMetaModel.gluVersion), configsRoots: configsRoots, - metaModel: gluMetaModel, + metaModel: agentCliMetaModel, dryMode: dryMode) - PackagedArtifact pa = packager.createPackage() - - if(!packagedArtifacts[gluMetaModel]) - packagedArtifacts[gluMetaModel] = [:] - - packagedArtifacts[gluMetaModel].agentCli = pa + packagedArtifacts.putAll(packager.createPackages()) if(!dryMode) - println "Generated agent-cli package ${pa.location}" - - return pa + println "Generated agent-cli package ${packagedArtifacts[agentCliMetaModel].location}" } - protected PackagedArtifact packageConsoleCli() + protected void packageConsoleCli() { + ConsoleCliMetaModel consoleCliMetaModel = gluMetaModel.consoleCli + def out = shell.mkdirs(outputFolder.createRelative('console-cli')) def packager = new ConsoleCliPackager(packagerContext: createPackagerContext(), @@ -207,20 +218,13 @@ public class GluPackager inputPackage: getInputPackage('org.linkedin.glu.console-cli', gluMetaModel.gluVersion), configsRoots: configsRoots, - metaModel: gluMetaModel, + metaModel: consoleCliMetaModel, dryMode: dryMode) - PackagedArtifact pa = packager.createPackage() - - if(!packagedArtifacts[gluMetaModel]) - packagedArtifacts[gluMetaModel] = [:] - - packagedArtifacts[gluMetaModel].consoleCli = pa + packagedArtifacts.putAll(packager.createPackages()) if(!dryMode) - println "Generated console-cli package ${pa.location}" - - return pa + println "Generated console-cli package ${packagedArtifacts[consoleCliMetaModel].location}" } protected PackagerContext createPackagerContext() diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/SetupMain.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/SetupMain.groovy index b5633201..d50c26ae 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/SetupMain.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/SetupMain.groovy @@ -24,10 +24,18 @@ import org.linkedin.groovy.util.log.JulToSLF4jBridge import org.linkedin.util.clock.Timespan import org.linkedin.util.io.resource.FileResource import org.linkedin.util.io.resource.Resource +import org.linkedin.util.reflect.ReflectUtils import org.linkedin.zookeeper.cli.commands.UploadCommand import org.linkedin.zookeeper.client.ZKClient +import org.pongasoft.glu.provisioner.core.metamodel.AgentCliMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.CliMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ConsoleCliMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ConsoleMetaModel import org.pongasoft.glu.provisioner.core.metamodel.GluMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperClusterMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperMetaModel import org.pongasoft.glu.provisioner.core.metamodel.impl.builder.GluMetaModelBuilder import org.slf4j.Logger import org.slf4j.LoggerFactory @@ -268,17 +276,80 @@ setup.sh -Z + // configure ZooKeeper clusters (step 3) } else { - def packagedArtifacts = packager.packageAll() + Map packagedArtifacts = packager.packageAll() + + log.info "All distributions generated successfully." + + def installScript = [] + + [ + ZooKeeperMetaModel, + AgentMetaModel, + ConsoleMetaModel, + AgentCliMetaModel, + ConsoleCliMetaModel, + ].each { Class metaModelClass -> + installScript << ("#" * 20) + " [${metaModelClass.simpleName - 'MetaModel'}s] " + ("#" * 20) + buildInstallCommands(packagedArtifacts, metaModelClass, installScript) + installScript << "#" * 20 + } + + log.info """Install script .... +#!/bin/bash - log.info "All distributions generated successfully" +SCP_OPTIONS="-R" +SCP_USER="${System.getProperty('user.name')}" - log.info "In this version, you need to install them yourself on the appropriate hosts:" - log.info "#" * 20 +${installScript.join('\n')} - packagedArtifacts.findAll { k, v -> k instanceof ZooKeeperClusterMetaModel}.values() +""" + } + } + + /** + * Build install commands + */ + protected void buildInstallCommands(Map packagedArtifacts, + Class metaModelClass, + def installScript) + { + filter(packagedArtifacts, metaModelClass).each { T metaModel, PackagedArtifact pa -> + installScript << buildInstallCommand(metaModel, pa) + } + } - log.info "#" * 20 + /** + * Build a single install command + */ + protected String buildInstallCommand(CliMetaModel cli, PackagedArtifact artifact) + { + if(artifact.host) + { + if(cli.install?.path) + { + "scp \$SCP_OPTIONS \"${artifact.location.file.canonicalPath}\" \"\$SCP_USER@${artifact.host}:${cli.install.path}\"" + } + else + { + "# manually install ${artifact.location.file.canonicalPath} on host ${artifact.host}" + } + } + else + { + "# manually install ${artifact.location.file.canonicalPath}" } + + } + + /** + * Filter the map by class + */ + protected Map filter(Map artifacts, + Class metaModelClass) + { + artifacts.findAll {k, v -> + ReflectUtils.isSubClassOrInterfaceOf(k.getClass(), metaModelClass) + } as Map } /** diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ZooKeeperClusterPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ZooKeeperClusterPackager.groovy index e33cdd3d..1d094d5a 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ZooKeeperClusterPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/main/groovy/org/pongasoft/glu/packaging/setup/ZooKeeperClusterPackager.groovy @@ -3,6 +3,7 @@ package org.pongasoft.glu.packaging.setup import org.linkedin.util.io.resource.Resource import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel import org.pongasoft.glu.provisioner.core.metamodel.FabricMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperClusterMetaModel import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperMetaModel @@ -12,7 +13,7 @@ public class ZooKeeperClusterPackager extends BasePackager { ZooKeeperClusterMetaModel metaModel - def createPackage() + Map createPackages() { def parts = ['zookeeper-cluster'] @@ -22,18 +23,18 @@ public class ZooKeeperClusterPackager extends BasePackager Resource packagePath = configure(outputFolder.createRelative(parts.join('-'))) - def zooKeepers = createPackages(packagePath) + Map zooKeepers = createPackages(packagePath) return [ - zooKeeperCluster: new PackagedArtifact(location: packagePath), - zooKeepers: zooKeepers + (metaModel): new PackagedArtifact(location: packagePath), + *:zooKeepers ] } - Collection createPackages(Resource clusterPackagePath) + Map createPackages(Resource clusterPackagePath) { - metaModel.zooKeepers.collect { ZooKeeperMetaModel zk -> - createPackage(clusterPackagePath, zk) + metaModel.zooKeepers.collectEntries { ZooKeeperMetaModel zk -> + [(zk): createPackage(clusterPackagePath, zk)] } } diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestAgentServerPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestAgentServerPackager.groovy index 6b88dbf6..7909276a 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestAgentServerPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestAgentServerPackager.groovy @@ -21,6 +21,7 @@ import org.linkedin.glu.groovy.utils.shell.ShellImpl import org.pongasoft.glu.packaging.setup.AgentServerPackager import org.pongasoft.glu.packaging.setup.PackagedArtifact import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel /** * @author yan@pongasoft.com */ @@ -47,9 +48,9 @@ public class TestAgentServerPackager extends BasePackagerTest configsRoots: copyConfigs(shell.toResource('/configs')), metaModel: testModel.agents[0]) - def pkg = packager.createPackage() + Map pkgs = packager.createPackages() - PackagedArtifact artifact = pkg.agentServer + PackagedArtifact artifact = pkgs[packager.metaModel] assertEquals(shell.toResource("/out/org.linkedin.glu.agent-server-agent-1-tutorialZooKeeperCluster-${GLU_VERSION}"), artifact.location) assertEquals('localhost', artifact.host) @@ -95,7 +96,7 @@ GLU_AGENT_NAME="agent-1" checkPackageContent(expectedResources, artifact.location) // now check for upgrade - artifact = pkg.agentServerUpgrade + artifact = pkgs[packager.metaModel.agentUpgrade] assertEquals(shell.toResource("/out/org.linkedin.glu.agent-server-agent-1-tutorialZooKeeperCluster-upgrade-${GLU_VERSION}"), artifact.location) assertEquals('localhost', artifact.host) @@ -151,9 +152,9 @@ zooKeeperClusters << [ configsRoots: copyConfigs(shell.toResource('/configs')), metaModel: toGluMetaModel(metaModel).agents[0]) - def pkg = packager.createPackage() + Map pkgs = packager.createPackages() - PackagedArtifact artifact = pkg.agentServer + PackagedArtifact artifact = pkgs[packager.metaModel] assertEquals(shell.toResource("/out/org.linkedin.glu.agent-server-12345-zkc-${GLU_VERSION}"), artifact.location) assertEquals('ha', artifact.host) @@ -196,7 +197,7 @@ GLU_AGENT_PORT="12345" checkPackageContent(expectedResources, artifact.location) // now check for upgrade - artifact = pkg.agentServerUpgrade + artifact = pkgs[packager.metaModel.agentUpgrade] assertEquals(shell.toResource("/out/org.linkedin.glu.agent-server-12345-zkc-upgrade-${GLU_VERSION}"), artifact.location) assertEquals('ha', artifact.host) diff --git a/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestZooKeeperClusterPackager.groovy b/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestZooKeeperClusterPackager.groovy index 3b18e2e9..ff9d9c19 100644 --- a/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestZooKeeperClusterPackager.groovy +++ b/packaging/org.pongasoft.glu.packaging-setup-impl/src/test/groovy/test/setup/TestZooKeeperClusterPackager.groovy @@ -2,7 +2,10 @@ package test.setup import org.linkedin.glu.groovy.utils.shell.Shell import org.linkedin.glu.groovy.utils.shell.ShellImpl +import org.pongasoft.glu.packaging.setup.PackagedArtifact import org.pongasoft.glu.packaging.setup.ZooKeeperClusterPackager +import org.pongasoft.glu.provisioner.core.metamodel.MetaModel +import org.pongasoft.glu.provisioner.core.metamodel.ZooKeeperMetaModel /** * @author yan@pongasoft.com */ @@ -22,7 +25,9 @@ public class TestZooKeeperClusterPackager extends BasePackagerTest configsRoots: copyConfigs(shell.toResource('/configs')), metaModel: testModel.zooKeeperClusters['tutorialZooKeeperCluster']) - def pkg = packager.createPackage() + Map pkgs = packager.createPackages() + + PackagedArtifact artifact = pkgs[packager.metaModel] def zkPackageName = "org.linkedin.zookeeper-server-${ZOOKEEPER_VERSION}" @@ -67,13 +72,13 @@ clientPort=2181 ] assertEquals(shell.toResource("/out/zookeeper-cluster-tutorialZooKeeperCluster"), - pkg.zooKeeperCluster.location) + artifact.location) - checkPackageContent(expectedResources, pkg.zooKeeperCluster.location) + checkPackageContent(expectedResources, artifact.location) - assertEquals(1, pkg.zooKeepers.size()) + assertEquals(1, pkgs.keySet().findAll { it instanceof ZooKeeperMetaModel }.size()) - def zk = (pkg.zooKeepers as List)[0] + PackagedArtifact zk = pkgs[packager.metaModel.zooKeepers[0]] assertEquals(shell.toResource("/out/zookeeper-cluster-tutorialZooKeeperCluster/${zkPackageName}"), zk.location) @@ -120,10 +125,12 @@ zooKeeperClusters << [ configsRoots: copyConfigs(shell.toResource('/configs')), metaModel: toGluMetaModel(metaModel).zooKeeperClusters['zkc']) - def pkg = packager.createPackage() + Map pkgs = packager.createPackages() + + PackagedArtifact artifact = pkgs[packager.metaModel] assertEquals(shell.toResource("/out/zookeeper-cluster-zkc"), - pkg.zooKeeperCluster.location) + artifact.location) def zk1PackageName = "org.linkedin.zookeeper-server-h1-${ZOOKEEPER_VERSION}" def zk2PackageName = "org.linkedin.zookeeper-server-h2-${ZOOKEEPER_VERSION}" @@ -196,18 +203,20 @@ server.2=h2:2888:3888 """, ] - checkPackageContent(expectedResources, pkg.zooKeeperCluster.location) + checkPackageContent(expectedResources, artifact.location) - assertEquals(2, pkg.zooKeepers.size()) + assertEquals(2, pkgs.keySet().findAll { it instanceof ZooKeeperMetaModel }.size()) - def zk1 = (pkg.zooKeepers as List)[0] + PackagedArtifact zk = pkgs[packager.metaModel.zooKeepers[0]] + + PackagedArtifact zk1 = pkgs[packager.metaModel.zooKeepers[0]] assertEquals(shell.toResource("/out/zookeeper-cluster-zkc/${zk1PackageName}"), zk1.location) assertEquals('h1', zk1.host) assertEquals(2181, zk1.port) - def zk2 = (pkg.zooKeepers as List)[1] + PackagedArtifact zk2 = pkgs[packager.metaModel.zooKeepers[1]] assertEquals(shell.toResource("/out/zookeeper-cluster-zkc/${zk2PackageName}"), zk2.location) @@ -261,10 +270,12 @@ zooKeeperClusters << [ configsRoots: copyConfigs(shell.toResource('/configs')), metaModel: toGluMetaModel(metaModel).zooKeeperClusters['zkc']) - def pkg = packager.createPackage() + Map pkgs = packager.createPackages() + + PackagedArtifact artifact = pkgs[packager.metaModel] assertEquals(shell.toResource("/out/zookeeper-cluster-zkc"), - pkg.zooKeeperCluster.location) + artifact.location) def zkPackageName = "org.linkedin.zookeeper-server-1234-${ZOOKEEPER_VERSION}" @@ -331,11 +342,11 @@ clientPort=1234 ] - checkPackageContent(expectedResources, pkg.zooKeeperCluster.location, false) + checkPackageContent(expectedResources, artifact.location, false) - assertEquals(1, pkg.zooKeepers.size()) + assertEquals(1, pkgs.keySet().findAll { it instanceof ZooKeeperMetaModel }.size()) - def zk1 = (pkg.zooKeepers as List)[0] + PackagedArtifact zk1 = pkgs[packager.metaModel.zooKeepers[0]] assertEquals(shell.toResource("/out/zookeeper-cluster-zkc/${zkPackageName}"), zk1.location) diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentMetaModelImpl.groovy b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentMetaModelImpl.groovy index 50dd96f3..42e4f955 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentMetaModelImpl.groovy +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentMetaModelImpl.groovy @@ -17,6 +17,7 @@ package org.pongasoft.glu.provisioner.core.metamodel.impl import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.AgentUpgradeMetaModel import org.pongasoft.glu.provisioner.core.metamodel.FabricMetaModel /** @@ -25,6 +26,7 @@ public class AgentMetaModelImpl extends ServerMetaModelImpl implements AgentMeta { String name FabricMetaModel fabric + AgentUpgradeMetaModel agentUpgrade = new AgentUpgradeMetaModelImpl(agent: this) @Override int getDefaultPort() diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentUpgradeMetaModelImpl.groovy b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentUpgradeMetaModelImpl.groovy new file mode 100644 index 00000000..a5d2349b --- /dev/null +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/AgentUpgradeMetaModelImpl.groovy @@ -0,0 +1,11 @@ +package org.pongasoft.glu.provisioner.core.metamodel.impl + +import org.pongasoft.glu.provisioner.core.metamodel.AgentMetaModel +import org.pongasoft.glu.provisioner.core.metamodel.AgentUpgradeMetaModel + +/** + * @author yan@pongasoft.com */ +public class AgentUpgradeMetaModelImpl implements AgentUpgradeMetaModel +{ + AgentMetaModel agent +} \ No newline at end of file diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/GluMetaModelImpl.groovy b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/GluMetaModelImpl.groovy index c8a2b828..7dc81d90 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/GluMetaModelImpl.groovy +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/groovy/org/pongasoft/glu/provisioner/core/metamodel/impl/GluMetaModelImpl.groovy @@ -40,6 +40,9 @@ public class GluMetaModelImpl implements GluMetaModel ConsoleCliMetaModel consoleCli AgentCliMetaModel agentCli + private ConsoleCliMetaModel _defaultConsoleCli = new ConsoleCliMetaModelImpl(gluMetaModel: this) + private AgentCliMetaModel _defaultAgentCli = new AgentCliMetaModelImpl(gluMetaModel: this) + @Override FabricMetaModel findFabric(String fabricName) { @@ -103,13 +106,13 @@ public class GluMetaModelImpl implements GluMetaModel @Override ConsoleCliMetaModel getConsoleCli() { - consoleCli ?: new ConsoleCliMetaModelImpl(gluMetaModel: this) + consoleCli ?: _defaultConsoleCli } @Override AgentCliMetaModel getAgentCli() { - agentCli ?: new AgentCliMetaModelImpl(gluMetaModel: this) + agentCli ?: _defaultAgentCli } @Override diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentMetaModel.java index 955b1806..62e538f6 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentMetaModel.java @@ -56,4 +56,9 @@ public interface AgentMetaModel extends ServerMetaModel, Externable * @return the unique fabric this agent belongs to */ FabricMetaModel getFabric(); + + /** + * @return the agent upgrade + */ + AgentUpgradeMetaModel getAgentUpgrade(); } \ No newline at end of file diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentUpgradeMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentUpgradeMetaModel.java new file mode 100644 index 00000000..a4bc7fbb --- /dev/null +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/AgentUpgradeMetaModel.java @@ -0,0 +1,14 @@ +package org.pongasoft.glu.provisioner.core.metamodel; + +/** + * Represents the agent upgrade only (all configuration happens for the full agent) + * + * @author yan@pongasoft.com + */ +public interface AgentUpgradeMetaModel extends MetaModel +{ + /** + * @return the agent associated to it + */ + AgentMetaModel getAgent(); +} \ No newline at end of file diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/CliMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/CliMetaModel.java index b9bc7c98..8446c7ed 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/CliMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/CliMetaModel.java @@ -7,7 +7,7 @@ * * @author yan@pongasoft.com */ -public interface CliMetaModel extends Externable, Configurable +public interface CliMetaModel extends Externable, Configurable, MetaModel { /** * @return the version of this cli... if undefined, defaults to diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ConsolePluginMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ConsolePluginMetaModel.java index aafc8d14..bcf6b464 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ConsolePluginMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ConsolePluginMetaModel.java @@ -10,7 +10,7 @@ * * @author yan@pongasoft.com */ -public interface ConsolePluginMetaModel extends Externable +public interface ConsolePluginMetaModel extends Externable, MetaModel { /** * @return the fully qualified class name of the plugin */ diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/FabricMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/FabricMetaModel.java index bf75fca7..679f55da 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/FabricMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/FabricMetaModel.java @@ -25,7 +25,7 @@ * * @author yan@pongasoft.com */ -public interface FabricMetaModel extends Externable +public interface FabricMetaModel extends Externable, MetaModel { /** * @return the name of the fabric diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/GluMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/GluMetaModel.java index 64fa2c75..b3bd7555 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/GluMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/GluMetaModel.java @@ -26,7 +26,7 @@ * * @author yan@pongasoft.com */ -public interface GluMetaModel extends Externable +public interface GluMetaModel extends Externable, MetaModel { public static final String DEFAULT_ZOOKEEPER_ROOT = "/org/glu"; diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/HostMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/HostMetaModel.java index f36c771d..492027a1 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/HostMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/HostMetaModel.java @@ -21,7 +21,7 @@ /** * @author yan@pongasoft.com */ -public interface HostMetaModel extends Externable +public interface HostMetaModel extends Externable, MetaModel { /** * @return the address (ip, hostname, etc...) on which this host is reachable diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/InstallMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/InstallMetaModel.java index c624786b..4331cd62 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/InstallMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/InstallMetaModel.java @@ -8,7 +8,7 @@ * * @author yan@pongasoft.com */ -public interface InstallMetaModel extends Externable +public interface InstallMetaModel extends Externable, MetaModel { /** * Note that a trailing / indicates, it will be considered a directory in which to install diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeyStoreMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeyStoreMetaModel.java index 47f0ff72..0792f731 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeyStoreMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeyStoreMetaModel.java @@ -25,7 +25,7 @@ * * @author yan@pongasoft.com */ -public interface KeyStoreMetaModel extends Externable +public interface KeyStoreMetaModel extends Externable, MetaModel { /** * @return location of the key store (can be relative, use --keys-root to 'resolve' the location) diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeysMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeysMetaModel.java index 82d09813..4624a3e4 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeysMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/KeysMetaModel.java @@ -22,7 +22,7 @@ * Represents the set of keys associated to a fabric * @author yan@pongasoft.com */ -public interface KeysMetaModel extends Externable +public interface KeysMetaModel extends Externable, MetaModel { /** * @return agent key store (private to agent) diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/MetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/MetaModel.java new file mode 100644 index 00000000..8759b15c --- /dev/null +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/MetaModel.java @@ -0,0 +1,10 @@ +package org.pongasoft.glu.provisioner.core.metamodel; + +/** + * Marker interface for all meta models + * + * @author yan@pongasoft.com + */ +public interface MetaModel +{ +} \ No newline at end of file diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/StateMachineMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/StateMachineMetaModel.java index ea67c000..14f0425d 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/StateMachineMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/StateMachineMetaModel.java @@ -23,7 +23,7 @@ * Represents the state machine to use with glu. * @author yan@pongasoft.com */ -public interface StateMachineMetaModel extends Externable +public interface StateMachineMetaModel extends Externable, MetaModel { /** * @return the transitions diff --git a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ZooKeeperClusterMetaModel.java b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ZooKeeperClusterMetaModel.java index 4a824557..98c8eb92 100644 --- a/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ZooKeeperClusterMetaModel.java +++ b/provisioner/org.linkedin.glu.provisioner-core/src/main/java/org/pongasoft/glu/provisioner/core/metamodel/ZooKeeperClusterMetaModel.java @@ -25,7 +25,7 @@ * Represents a cluster of ZooKeeper instances. * @author yan@pongasoft.com */ -public interface ZooKeeperClusterMetaModel extends Externable, Configurable +public interface ZooKeeperClusterMetaModel extends Externable, Configurable, MetaModel { /** * @return the name of the cluster