diff options
Diffstat (limited to 'cpp')
24 files changed, 288 insertions, 180 deletions
diff --git a/cpp/src/Ice/LocatorInfo.cpp b/cpp/src/Ice/LocatorInfo.cpp index 04abd723fbf..7cd8fcec978 100644 --- a/cpp/src/Ice/LocatorInfo.cpp +++ b/cpp/src/Ice/LocatorInfo.cpp @@ -245,12 +245,19 @@ IceInternal::LocatorInfo::getEndpoints(const ReferencePtr& ref, bool& cached) endpoints = object->__reference()->endpoints; } } - catch(const LocalException&) + catch(const LocalException& ex) { // - // Ignore. The proxy will most likely get empty + // Just trace the failure. The proxy will most likely get empty // endpoints and raise a NoEndpointException(). // + if(ref->instance->traceLevels()->location >= 1) + { + Trace out(ref->instance->logger(), ref->instance->traceLevels()->locationCat); + out << "couldn't contact the locator to retrieve adapter endpoints\n"; + out << "adapter = " << ref->adapterId << "\n"; + out << "reason = " << ex; + } } // diff --git a/cpp/src/IcePack/ActivatorI.cpp b/cpp/src/IcePack/ActivatorI.cpp index 8525e5eebeb..77bb18c6736 100644 --- a/cpp/src/IcePack/ActivatorI.cpp +++ b/cpp/src/IcePack/ActivatorI.cpp @@ -51,8 +51,9 @@ private: } -IcePack::ActivatorI::ActivatorI(const TraceLevelsPtr& traceLevels) : +IcePack::ActivatorI::ActivatorI(const TraceLevelsPtr& traceLevels, const PropertiesPtr& properties) : _traceLevels(traceLevels), + _properties(properties), _deactivating(false) { int fds[2]; @@ -126,7 +127,7 @@ IcePack::ActivatorI::activate(const ServerPtr& server) // // Compute arguments. // - int argc = server->description.theArgs.size() + 2; + int argc = server->description.theArgs.size() + 3; char** argv = static_cast<char**>(malloc(argc * sizeof(char*))); argv[0] = strdup(path.c_str()); unsigned int i = 0; @@ -135,6 +136,8 @@ IcePack::ActivatorI::activate(const ServerPtr& server) { argv[i + 1] = strdup(q->c_str()); } + string locatorArg = "--Ice.Default.Locator=" + _properties->getProperty("Ice.Default.Locator"); + argv[argc - 2] = strdup(locatorArg.c_str()); argv[argc - 1] = 0; if(_traceLevels->activator > 1) diff --git a/cpp/src/IcePack/ActivatorI.h b/cpp/src/IcePack/ActivatorI.h index fc694f17779..c2b1e871f62 100644 --- a/cpp/src/IcePack/ActivatorI.h +++ b/cpp/src/IcePack/ActivatorI.h @@ -25,7 +25,7 @@ class ActivatorI : public Activator, public IceUtil::Monitor< IceUtil::Mutex> { public: - ActivatorI(const TraceLevelsPtr&); + ActivatorI(const TraceLevelsPtr&, const Ice::PropertiesPtr&); virtual ~ActivatorI(); virtual bool activate(const ::IcePack::ServerPtr&); @@ -56,6 +56,7 @@ private: }; TraceLevelsPtr _traceLevels; + Ice::PropertiesPtr _properties; std::vector<Process> _processes; bool _deactivating; @@ -65,8 +66,6 @@ private: IceUtil::ThreadPtr _thread; }; -typedef IceUtil::Handle<ActivatorI> ActivatorIPtr; - } #endif diff --git a/cpp/src/IcePack/AdminI.cpp b/cpp/src/IcePack/AdminI.cpp index c39d458b7cd..f09b89c5f96 100644 --- a/cpp/src/IcePack/AdminI.cpp +++ b/cpp/src/IcePack/AdminI.cpp @@ -50,7 +50,7 @@ IcePack::AdminI::addServer(const string& node, const string& name, const string& const string& descriptor, const Targets& targets, const Current&) { ApplicationBuilder builder(_communicator, _nodeRegistry, targets); - builder.addServer(name, node, descriptor, path, ldpath); + builder.addServer(name, node, descriptor, path, ldpath, ""); builder.execute(); } @@ -63,7 +63,7 @@ IcePack::AdminI::removeServer(const string& name, const Current&) ServerDescription desc = server->getServerDescription(); ApplicationBuilder builder(_communicator, _nodeRegistry, desc.theTargets); - builder.addServer(name, desc.node, desc.descriptor, desc.path, ""); + builder.addServer(name, desc.node, desc.descriptor, desc.path, "", ""); builder.undo(); } catch(const Ice::ObjectNotExistException&) diff --git a/cpp/src/IcePack/ApplicationBuilder.cpp b/cpp/src/IcePack/ApplicationBuilder.cpp index 687a1e11150..2725670d1ea 100644 --- a/cpp/src/IcePack/ApplicationBuilder.cpp +++ b/cpp/src/IcePack/ApplicationBuilder.cpp @@ -164,11 +164,13 @@ IcePack::ApplicationHandler::startElement(const XMLCh* name, AttributeList& attr throw DeploySAXParseException("Server element is not allowed outside the scope of a node element", _locator); } + string name = getAttributeValue(attrs, "name"); string descriptor = _builder.toLocation(getAttributeValue(attrs, "descriptor")); string binpath = _builder.toLocation(getAttributeValueWithDefault(attrs, "binpath", "")); string libpath = getAttributeValueWithDefault(attrs, "libpath", ""); - _builder.addServer(name, _currentNode, descriptor, binpath, libpath); + string targets = getAttributeValueWithDefault(attrs, "targets", ""); + _builder.addServer(name, _currentNode, descriptor, binpath, libpath, targets); } } @@ -192,7 +194,7 @@ IcePack::ApplicationHandler::endElement(const XMLCh* name) IcePack::ApplicationBuilder::ApplicationBuilder(const Ice::CommunicatorPtr& communicator, const NodeRegistryPtr& nodeRegistry, const vector<string>& targets) : - ComponentBuilder(communicator, "", targets), + ComponentBuilder(communicator, map<string, string>(), targets), _nodeRegistry(nodeRegistry) { } @@ -210,7 +212,8 @@ IcePack::ApplicationBuilder::addServer(const string& name, const string& nodeName, const string& descriptor, const string& binpath, - const string& libpath) + const string& libpath, + const string& additionalTargets) { if(name.empty()) { @@ -224,6 +227,9 @@ IcePack::ApplicationBuilder::addServer(const string& name, { throw DeploySAXParseException("descriptor attribute value is empty", _locator); } + + vector<string> targets = toTargets(additionalTargets); + copy(_targets.begin(), _targets.end(), back_inserter(targets)); NodePrx node; try @@ -242,7 +248,7 @@ IcePack::ApplicationBuilder::addServer(const string& name, try { ServerDeployerPrx deployer = node->getServerDeployer(); - _tasks.push_back(new AddServer(deployer, nodeName, name, descriptor, binpath, libpath, _targets)); + _tasks.push_back(new AddServer(deployer, nodeName, name, descriptor, binpath, libpath, targets)); } catch(::Ice::LocalException&) { diff --git a/cpp/src/IcePack/ApplicationBuilder.h b/cpp/src/IcePack/ApplicationBuilder.h index fb000bf491a..ed70effe776 100644 --- a/cpp/src/IcePack/ApplicationBuilder.h +++ b/cpp/src/IcePack/ApplicationBuilder.h @@ -25,7 +25,8 @@ public: void parse(const std::string&); - void addServer(const std::string&, const std::string&, const std::string&, const std::string&, const std::string&); + void addServer(const std::string&, const std::string&, const std::string&, const std::string&, const std::string&, + const std::string&); void setBaseDir(const std::string&); private: diff --git a/cpp/src/IcePack/ComponentBuilder.cpp b/cpp/src/IcePack/ComponentBuilder.cpp index 6346cbc4bea..8598a0c74f8 100644 --- a/cpp/src/IcePack/ComponentBuilder.cpp +++ b/cpp/src/IcePack/ComponentBuilder.cpp @@ -355,16 +355,27 @@ IcePack::ComponentHandler::startElement(const XMLCh *const name, AttributeList & } else if(str == "adapter") { - if(!_currentAdapter.empty()) + if(!_currentAdapterId.empty()) { throw DeploySAXParseException("Adapter element enclosed in an adapter element is not allowed", _locator); } - _currentAdapter = getAttributeValue(attrs, "name"); + + // + // If the id is not specified, we ask the builder to generate + // an id for us based on the adapter name. + // + string name = getAttributeValue(attrs, "name"); + if(name.empty()) + { + throw DeploySAXParseException("empty adapter name", _locator); + } + _currentAdapterId = getAttributeValueWithDefault(attrs, "id", _builder.getDefaultAdapterId(name)); } else if(str == "offer") { - _builder.addOffer(getAttributeValue(attrs, "interface"), _currentAdapter, - getAttributeValue(attrs, "identity")); + _builder.addOffer(getAttributeValue(attrs, "interface"), + _currentAdapterId, + getAttributeValue(attrs, "identity")); } else if(str == "target") { @@ -392,7 +403,7 @@ IcePack::ComponentHandler::endElement(const XMLCh *const name) { if(str == "adapter") { - _currentAdapter = ""; + _currentAdapterId = ""; } } } @@ -482,24 +493,13 @@ IcePack::ComponentHandler::isCurrentTargetDeployable() const } IcePack::ComponentBuilder::ComponentBuilder(const Ice::CommunicatorPtr& communicator, - const string& componentPath, + const map<string, string>& variables, const vector<string>& targets) : _communicator(communicator), _properties(Ice::createProperties()), - _componentPath(componentPath), + _variables(variables), _targets(targets) { - Ice::PropertiesPtr properties = _communicator->getProperties(); - - // - // TODO: this probably doesn't belong to ComponentBuilder since - // it's also used by the registry... - // - string serversPath = properties->getProperty("IcePack.Node.Data"); - if(!serversPath.empty()) - { - _variables["datadir"] = serversPath + (serversPath[serversPath.length() - 1] == '/' ? "" : "/") + "servers"; - } } void @@ -544,7 +544,7 @@ IcePack::ComponentBuilder::parse(const string& xmlFile, ComponentHandler& handle os << xmlFile << ":" << e.getLineNumber() << ": " << toString(e.getMessage()); ParserDeploymentException ex; - ex.component = _componentPath; + ex.component = _variables["fqn"]; ex.reason = os.str(); throw ex; } @@ -556,7 +556,7 @@ IcePack::ComponentBuilder::parse(const string& xmlFile, ComponentHandler& handle os << xmlFile << ": SAXException: " << toString(e.getMessage()); ParserDeploymentException ex; - ex.component = _componentPath; + ex.component = _variables["fqn"]; ex.reason = os.str(); throw ex; } @@ -568,7 +568,7 @@ IcePack::ComponentBuilder::parse(const string& xmlFile, ComponentHandler& handle os << xmlFile << ": XMLException: " << toString(e.getMessage()); ParserDeploymentException ex; - ex.component = _componentPath; + ex.component = _variables["fqn"]; ex.reason = os.str(); throw ex; } @@ -580,7 +580,7 @@ IcePack::ComponentBuilder::parse(const string& xmlFile, ComponentHandler& handle os << xmlFile << ": unknown exception while parsing file"; ParserDeploymentException ex; - ex.component = _componentPath; + ex.component = _variables["fqn"]; ex.reason = os.str(); throw ex; } @@ -591,7 +591,7 @@ IcePack::ComponentBuilder::parse(const string& xmlFile, ComponentHandler& handle if(rc > 0) { ParserDeploymentException ex; - ex.component = _componentPath; + ex.component = _variables["fqn"]; ex.reason = xmlFile + ": parse error"; throw ex; } @@ -606,6 +606,10 @@ IcePack::ComponentBuilder::setDocumentLocator(const Locator* locator) bool IcePack::ComponentBuilder::isTargetDeployable(const string& target) const { + map<string, string>::const_iterator p = _variables.find("fqn"); + assert(p != _variables.end()); + const string fqn = p->second; + for(vector<string>::const_iterator p = _targets.begin(); p != _targets.end(); ++p) { if((*p) == target) @@ -619,17 +623,18 @@ IcePack::ComponentBuilder::isTargetDeployable(const string& target) const while(end != string::npos) { // - // Add the first component name to the component target - // path. + // Add the first component name from the component + // fully qualified name to the target and see if + // matches. // - end = _componentPath.find('.', end); + end = fqn.find('.', end); if(end == string::npos) { - componentTarget = _componentPath + "." + target; + componentTarget = fqn + "." + target; } else { - componentTarget = _componentPath.substr(0, end) + "." + target; + componentTarget = fqn.substr(0, end) + "." + target; ++end; } @@ -658,7 +663,7 @@ IcePack::ComponentBuilder::execute() { if(ex.component.empty()) { - ex.component = _componentPath; + ex.component = _variables["fqn"]; } undoFrom(p); throw; @@ -678,7 +683,7 @@ IcePack::ComponentBuilder::undo() catch(const DeploymentException& ex) { ostringstream os; - os << "exception while removing component " << (ex.component.empty() ? _componentPath : ex.component); + os << "exception while removing component " << (ex.component.empty() ? _variables["fqn"] : ex.component); os << ":\n" << ex << ": " << ex.reason; _communicator->getLogger()->warning(os.str()); @@ -708,9 +713,9 @@ IcePack::ComponentBuilder::addProperty(const string& name, const string& value) } void -IcePack::ComponentBuilder::addOffer(const string& offer, const string& adapter, const string& identity) +IcePack::ComponentBuilder::addOffer(const string& offer, const string& adapterId, const string& identity) { - assert(!adapter.empty()); + assert(!adapterId.empty()); if(!_yellowAdmin) { @@ -718,7 +723,7 @@ IcePack::ComponentBuilder::addOffer(const string& offer, const string& adapter, throw DeploySAXParseException(msg, _locator); } - Ice::ObjectPrx object = _communicator->stringToProxy(identity + "@" + adapter); + Ice::ObjectPrx object = _communicator->stringToProxy(identity + "@" + adapterId); assert(object); _tasks.push_back(new RegisterOffer(_yellowAdmin, offer, object)); @@ -738,6 +743,18 @@ IcePack::ComponentBuilder::overrideBaseDir(const string& basedir) } // +// Compute an adapter id for a given adapter name. +// +string +IcePack::ComponentBuilder::getDefaultAdapterId(const string& name) +{ + // + // Concatenate the component name to the adapter name. + // + return name + "-" + _variables["name"]; +} + +// // Returns a path including the base directory if path is a relative // path. // @@ -787,6 +804,34 @@ IcePack::ComponentBuilder::substitute(const string& v) const return value; } +vector<string> +IcePack::ComponentBuilder::toTargets(const string& targets) const +{ + vector<string> result; + + if(!targets.empty()) + { + const string delim = " \t\n\r"; + + string::size_type beg = 0; + string::size_type end = 0; + do + { + end = targets.find_first_of(delim, end); + if(end == string::npos) + { + end = targets.size(); + } + + result.push_back(targets.substr(beg, end - beg)); + beg = ++end; + } + while(end < targets.size()); + } + + return result; +} + void IcePack::ComponentBuilder::undoFrom(vector<TaskPtr>::iterator p) { @@ -801,7 +846,7 @@ IcePack::ComponentBuilder::undoFrom(vector<TaskPtr>::iterator p) catch(const DeploymentException& ex) { ostringstream os; - os << "exception while removing component " << _componentPath << ": " << ex.reason << ":" << endl; + os << "exception while removing component " << _variables["fqn"] << ": " << ex.reason << ":" << endl; os << ex; _communicator->getLogger()->warning(os.str()); diff --git a/cpp/src/IcePack/ComponentBuilder.h b/cpp/src/IcePack/ComponentBuilder.h index 90b15a537b4..28bda3b1048 100644 --- a/cpp/src/IcePack/ComponentBuilder.h +++ b/cpp/src/IcePack/ComponentBuilder.h @@ -113,7 +113,7 @@ protected: ComponentBuilder& _builder; std::stack<std::string> _elements; - std::string _currentAdapter; + std::string _currentAdapterId; std::string _currentTarget; bool _isCurrentTargetDeployable; @@ -137,7 +137,9 @@ class ComponentBuilder : public Task { public: - ComponentBuilder(const Ice::CommunicatorPtr&, const std::string&, const std::vector<std::string>&); + ComponentBuilder(const Ice::CommunicatorPtr&, + const std::map<std::string, std::string>&, + const std::vector<std::string>&); virtual void execute(); virtual void undo(); @@ -155,8 +157,10 @@ public: void addOffer(const std::string&, const std::string&, const std::string&); void overrideBaseDir(const std::string&); + virtual std::string getDefaultAdapterId(const std::string&); std::string toLocation(const std::string&) const; std::string substitute(const std::string&) const; + std::vector<std::string> toTargets(const std::string&) const; void undoFrom(std::vector<TaskPtr>::iterator); protected: @@ -168,7 +172,6 @@ protected: std::map<std::string, std::string> _variables; std::vector<TaskPtr> _tasks; std::string _configFile; - std::string _componentPath; std::vector<std::string> _targets; const Locator* _locator; diff --git a/cpp/src/IcePack/IcePackNode.cpp b/cpp/src/IcePack/IcePackNode.cpp index 4dad7b90bba..44064a1fd17 100644 --- a/cpp/src/IcePack/IcePackNode.cpp +++ b/cpp/src/IcePack/IcePackNode.cpp @@ -182,7 +182,7 @@ run(int argc, char* argv[], const Ice::CommunicatorPtr& communicator, const Free // // Create the activator. // - activator = new ActivatorI(traceLevels); + activator = new ActivatorI(traceLevels, properties); // // Creates the server factory. The server factory creates server @@ -354,6 +354,17 @@ main(int argc, char* argv[]) Ice::PropertiesPtr properties = communicator->getProperties(); // + // Disable server idle time. Otherwise, the adapter would be + // shutdown permaturaly and the deactivation would + // fail. Deactivation of the node relies on the object adapter + // to be active since it needs to terminate servers. + // + // TODO: implement Ice.ServerIdleTime in the activator + // termination listener instead? + // + properties->setProperty("Ice.ServerIdleTime", "0"); + + // // Remove IcePack and Freeze command line options from argv. // Ice::StringSeq args = Ice::argsToStringSeq(argc, argv); @@ -385,16 +396,8 @@ main(int argc, char* argv[]) // // Set the Ice.Default.Locator property to point to the - // collocated locator (this property is used in the server - // builder when generating server configuration files). - // - // TODO: Actually I don't think think this is really - // correct. We shouldn't put the Ice.Default.Locator in - // the generated server configuration file. If for some - // reasons the locator endpoint change we would need to - // re-generated everything. Instead, we should pass this - // property to the activator and pass it to the server - // through the command line. + // collocated locator (this property is passed by the + // activator to each activated server). // string locatorPrx = "IcePack/Locator:" + properties->getProperty("IcePack.Registry.Locator.Endpoints"); properties->setProperty("Ice.Default.Locator", locatorPrx); diff --git a/cpp/src/IcePack/ServerAdapterI.cpp b/cpp/src/IcePack/ServerAdapterI.cpp index e26e8432ecb..0ae0c8f2f03 100644 --- a/cpp/src/IcePack/ServerAdapterI.cpp +++ b/cpp/src/IcePack/ServerAdapterI.cpp @@ -97,11 +97,14 @@ IcePack::ServerAdapterI::setDirectProxy(const Ice::ObjectPrx& prx, const Ice::Cu // // If the adapter proxy is not null the given proxy can only be // null. We don't allow to overide an existing proxy by another - // non null proxy. + // non null proxy if the server is active. // if(prx && _proxy) { - throw AdapterActiveException(); + if(theServer->getState() == Active) + { + throw AdapterActiveException(); + } } _proxy = prx; diff --git a/cpp/src/IcePack/ServerBuilder.cpp b/cpp/src/IcePack/ServerBuilder.cpp index c79d32889d1..159c4b20014 100644 --- a/cpp/src/IcePack/ServerBuilder.cpp +++ b/cpp/src/IcePack/ServerBuilder.cpp @@ -257,7 +257,9 @@ IcePack::ServerHandler::startElement(const XMLCh *const name, AttributeList &att // _builder.addProperty("IceBox.ServiceManager.Identity", _builder.substitute("${name}/ServiceManager")); - _builder.registerAdapter("IceBox.ServiceManager", getAttributeValue(attrs, "endpoints"), ""); + _builder.registerAdapter("IceBox.ServiceManager", + getAttributeValue(attrs, "endpoints"), + _builder.getDefaultAdapterId("IceBox.ServiceManager")); } else if(kind == "java-icebox") { @@ -270,20 +272,23 @@ IcePack::ServerHandler::startElement(const XMLCh *const name, AttributeList &att // _builder.addProperty("IceBox.ServiceManager.Identity", _builder.substitute("${name}/ServiceManager")); - _builder.registerAdapter("IceBox.ServiceManager", getAttributeValue(attrs, "endpoints"), ""); + _builder.registerAdapter("IceBox.ServiceManager", + getAttributeValue(attrs, "endpoints"), + _builder.getDefaultAdapterId("IceBox.ServiceManager")); } } else if(str == "service") { string name = getAttributeValue(attrs, "name"); string descriptor = getAttributeValue(attrs, "descriptor"); - _builder.addService(name, descriptor); + string targets = getAttributeValueWithDefault(attrs, "targets", ""); + _builder.addService(name, descriptor, targets); } else if(str == "adapter") { - _builder.registerAdapter(getAttributeValue(attrs, "name"), - getAttributeValue(attrs, "endpoints"), - getAttributeValueWithDefault(attrs, "id", "")); + assert(!_currentAdapterId.empty()); + string name = getAttributeValue(attrs, "name"); + _builder.registerAdapter(name, getAttributeValue(attrs, "endpoints"), _currentAdapterId); } else if(str == "activation") { @@ -325,36 +330,31 @@ IcePack::ServerHandler::endElement(const XMLCh *const name) IcePack::ServerBuilder::ServerBuilder(const NodeInfoPtr& nodeInfo, const map<string, string>& variables, - const string& componentPath, const vector<string>& targets) : - ComponentBuilder(nodeInfo->getCommunicator(), componentPath, targets), + ComponentBuilder(nodeInfo->getCommunicator(), variables, targets), _nodeInfo(nodeInfo) { + assert(_variables.find("parent") != _variables.end()); + assert(_variables.find("name") != _variables.end()); + assert(_variables.find("fqn") != _variables.end()); + assert(_variables.find("datadir") != _variables.end()); + assert(_variables.find("binpath") != _variables.end()); + assert(_variables.find("libpath") != _variables.end()); + + // + // Required for the component builder. + // _yellowAdmin = _nodeInfo->getYellowAdmin(); - - map<string, string>::const_iterator p = variables.find("name"); - assert(p != variables.end()); - - _variables["name"] = p->second; - _variables["datadir"] += "/" + _variables["name"]; + // + // Begin to populate the server description. + // + _description.name = _variables["name"]; + _description.path = _variables["binpath"]; + _libraryPath = _variables["libpath"]; _description.node = nodeInfo->getNode()->getName(); - _description.name = p->second; _description.theTargets = targets; _description.activation = OnDemand; - - // - // TODO: variables should be passed to the component handler. We - // should also get rid of the _componentPath variable and instead - // use a "parent" variable. - // - p = variables.find("binpath"); - assert(p != variables.end()); - _description.path = p->second; - - p = variables.find("libpath"); - assert(p != variables.end()); - _libraryPath = p->second; } void @@ -382,12 +382,6 @@ IcePack::ServerBuilder::parse(const std::string& descriptor) _properties->setProperty("Yellow.Query", _nodeInfo->getCommunicator()->proxyToString(_nodeInfo->getYellowQuery())); - // - // TODO: we shouldn't generate this in the configuration. See - // comment in main() in IcePackNode.cpp - // - _properties->setProperty("Ice.Default.Locator", props->getProperty("Ice.Default.Locator")); - if(_kind == ServerKindJavaServer || _kind == ServerKindJavaIceBox) { if(!_libraryPath.empty()) @@ -553,31 +547,29 @@ IcePack::ServerBuilder::registerAdapter(const string& name, const string& endpoi { throw DeploySAXParseException("empty adapter endpoints", _locator); } + if(adapterId.empty()) + { + throw DeploySAXParseException("empty adapter id", _locator); + } // - // If the adapter id is not specified, generate one from the - // server and adapter name. - // - string id = adapterId.empty() ? name + "-" + _variables["name"] : adapterId; - - // // A server adapter object will be created with the server when // the server is created (see ServerBuilder::execute() // method). The RegisterServerAdapter task will get the server // adapter proxy through the builder method getServerAdapter(). // - _serverAdapterNames.push_back(id); - _tasks.push_back(new RegisterServerAdapterTask(adapterRegistry, id, *this)); + _serverAdapterNames.push_back(adapterId); + _tasks.push_back(new RegisterServerAdapterTask(adapterRegistry, adapterId, *this)); // // Generate adapter configuration properties. // addProperty(name + ".Endpoints", endpoints); - addProperty(name + ".AdapterId", id); + addProperty(name + ".AdapterId", adapterId); } void -IcePack::ServerBuilder::addService(const string& name, const string& descriptor) +IcePack::ServerBuilder::addService(const string& name, const string& descriptor, const string& additionalTargets) { if(_kind != ServerKindCppIceBox && _kind != ServerKindJavaIceBox) { @@ -597,11 +589,14 @@ IcePack::ServerBuilder::addService(const string& name, const string& descriptor) // Setup new variables for the service, overides the name value. // std::map<std::string, std::string> variables = _variables; + variables["parent"] = _variables["name"]; variables["name"] = name; + variables["fqn"] = _variables["fqn"] + "." + name; - string componentPath = _componentPath + "." + name; + vector<string> targets = toTargets(additionalTargets); + copy(_targets.begin(), _targets.end(), back_inserter(targets)); - ServiceBuilder* task = new ServiceBuilder(_nodeInfo, *this, variables, componentPath, _targets); + ServiceBuilder* task = new ServiceBuilder(_nodeInfo, *this, variables, targets); try { task->parse(toLocation(descriptor)); diff --git a/cpp/src/IcePack/ServerBuilder.h b/cpp/src/IcePack/ServerBuilder.h index e96ac3c5143..c9df3eba349 100644 --- a/cpp/src/IcePack/ServerBuilder.h +++ b/cpp/src/IcePack/ServerBuilder.h @@ -30,7 +30,8 @@ public: ServerKindJavaServer }; - ServerBuilder(const NodeInfoPtr&, const std::map<std::string, std::string>&, const std::string&, + ServerBuilder(const NodeInfoPtr&, + const std::map<std::string, std::string>&, const std::vector<std::string>&); void parse(const std::string&); @@ -42,7 +43,7 @@ public: void setWorkingDirectory(const std::string&); void registerServer(); void registerAdapter(const std::string&, const std::string&, const std::string&); - void addService(const std::string&, const std::string&); + void addService(const std::string&, const std::string&, const std::string&); void addOption(const std::string&); void addJavaOption(const std::string&); void setKind(ServerKind); diff --git a/cpp/src/IcePack/ServerDeployerI.cpp b/cpp/src/IcePack/ServerDeployerI.cpp index 7ed57ba3da5..b337a72be3f 100644 --- a/cpp/src/IcePack/ServerDeployerI.cpp +++ b/cpp/src/IcePack/ServerDeployerI.cpp @@ -30,18 +30,20 @@ void IcePack::ServerDeployerI::add(const string& name, const string& descriptor, const string& binPath, const string& libPath, const Targets& targets, const Ice::Current&) { + // + // Setup required variables. + // map<string, string> variables; + variables["parent"] = _nodeInfo->getNode()->getName(); variables["name"] = name; + variables["fqn"] = _nodeInfo->getNode()->getName() + "." + name; variables["binpath"] = binPath; variables["libpath"] = libPath; - - // - // Component path is used to identify the component. For example: - // node1.server1.service3 - // - string componentPath = _nodeInfo->getNode()->getName() + "." + name; - ServerBuilder builder(_nodeInfo, variables, componentPath, targets); + string dataDir = _nodeInfo->getCommunicator()->getProperties()->getProperty("IcePack.Node.Data"); + variables["datadir"] = dataDir + (dataDir[dataDir.length() - 1] == '/' ? "" : "/") + "servers/" + name; + + ServerBuilder builder(_nodeInfo, variables, targets); // // Parse the server deployment descriptors. @@ -107,11 +109,16 @@ IcePack::ServerDeployerI::remove(const string& name, const Ice::Current&) } map<string, string> variables; + variables["parent"] = _nodeInfo->getNode()->getName(); variables["name"] = name; - variables["binpath"] = desc.path; // Required for parsing to succeed. + variables["fqn"] = _nodeInfo->getNode()->getName() + "." + name; + variables["binpath"] = desc.path; variables["libpath"] = ""; - ServerBuilder builder(_nodeInfo, variables, componentPath, desc.theTargets); + string dataDir = _nodeInfo->getCommunicator()->getProperties()->getProperty("IcePack.Node.Data"); + variables["datadir"] = dataDir + (dataDir[dataDir.length() - 1] == '/' ? "" : "/") + "servers/" + name; + + ServerBuilder builder(_nodeInfo, variables, desc.theTargets); // // Parse the server deployment descriptors. diff --git a/cpp/src/IcePack/ServerI.cpp b/cpp/src/IcePack/ServerI.cpp index b98b7c9a453..f572e47ab0a 100644 --- a/cpp/src/IcePack/ServerI.cpp +++ b/cpp/src/IcePack/ServerI.cpp @@ -293,8 +293,8 @@ IcePack::ServerI::terminated(const Ice::Current&) } catch(const Ice::LocalException& ex) { - cerr << (*p)->__reference()->toString() << endl; - cerr << ex << endl; + //cerr << (*p)->__reference()->toString() << endl; + //cerr << ex << endl; throw; } } diff --git a/cpp/src/IcePack/ServiceBuilder.cpp b/cpp/src/IcePack/ServiceBuilder.cpp index 37adeaed70a..129a3a1e464 100644 --- a/cpp/src/IcePack/ServiceBuilder.cpp +++ b/cpp/src/IcePack/ServiceBuilder.cpp @@ -75,34 +75,29 @@ IcePack::ServiceHandler::startElement(const XMLCh *const name, AttributeList &at } else if(str == "adapter") { + assert(!_currentAdapterId.empty()); string name = getAttributeValue(attrs, "name"); - string id = getAttributeValueWithDefault(attrs, "id", ""); - - // - // If the adapter id is not specified or empty, generate one - // from the server, service and adapter name: <adapter - // name>-<server name>-<service name> - // - if(id.empty()) - { - id = name + "-" + _builder.getServerBuilder().substitute("${name}") + _builder.substitute("${name}"); - } - _builder.getServerBuilder().registerAdapter(name, getAttributeValue(attrs, "endpoints"), id); + _builder.getServerBuilder().registerAdapter(name, getAttributeValue(attrs, "endpoints"), _currentAdapterId); } } IcePack::ServiceBuilder::ServiceBuilder(const NodeInfoPtr& nodeInfo, ServerBuilder& serverBuilder, const map<string, string>& variables, - const string& componentPath, const vector<string>& targets) : - ComponentBuilder(nodeInfo->getCommunicator(), componentPath, targets), + ComponentBuilder(nodeInfo->getCommunicator(), variables, targets), _nodeInfo(nodeInfo), _serverBuilder(serverBuilder) { - _yellowAdmin = nodeInfo->getYellowAdmin(); + assert(_variables.find("parent") != _variables.end()); + assert(_variables.find("name") != _variables.end()); + assert(_variables.find("fqn") != _variables.end()); + assert(_variables.find("datadir") != _variables.end()); - _variables = variables; + // + // Required for the component builder. + // + _yellowAdmin = nodeInfo->getYellowAdmin(); } void @@ -168,3 +163,14 @@ IcePack::ServiceBuilder::setDBEnv(const string& dir) _serverBuilder.addProperty("IceBox.DBEnvName." + _variables["name"], path); } +// +// Compute an adapter id for a given adapter name. +// +string +IcePack::ServiceBuilder::getDefaultAdapterId(const string& name) +{ + // + // Concatenate the server and service name to the adapter name. + // + return name + "-" + _variables["parent"] + "." + _variables["name"]; +} diff --git a/cpp/src/IcePack/ServiceBuilder.h b/cpp/src/IcePack/ServiceBuilder.h index 166ec0baca0..69ecc7ecd84 100644 --- a/cpp/src/IcePack/ServiceBuilder.h +++ b/cpp/src/IcePack/ServiceBuilder.h @@ -29,8 +29,9 @@ public: ServiceKindFreeze }; - ServiceBuilder(const NodeInfoPtr&, ServerBuilder&, const std::map<std::string, std::string>&, - const std::string&, const std::vector<std::string>&); + ServiceBuilder(const NodeInfoPtr&, ServerBuilder&, + const std::map<std::string, std::string>&, + const std::vector<std::string>&); void parse(const std::string&); @@ -40,6 +41,8 @@ public: void setEntryPoint(const std::string&); void setDBEnv(const std::string&); + virtual std::string getDefaultAdapterId(const std::string&); + private: NodeInfoPtr _nodeInfo; diff --git a/cpp/test/IcePack/deployer/AllTests.cpp b/cpp/test/IcePack/deployer/AllTests.cpp index 3960afe5fd9..6982ca8764f 100644 --- a/cpp/test/IcePack/deployer/AllTests.cpp +++ b/cpp/test/IcePack/deployer/AllTests.cpp @@ -47,11 +47,11 @@ allCommonTests(const Ice::CommunicatorPtr& communicator) cout << "testing adapter registration... " << flush; Ice::StringSeq adapterNames = admin->getAllAdapterNames(); - test(find(adapterNames.begin(), adapterNames.end(), "Server1Adapter") != adapterNames.end()); - test(find(adapterNames.begin(), adapterNames.end(), "Server2Adapter") != adapterNames.end()); - test(find(adapterNames.begin(), adapterNames.end(), "IceBox1Service1Adapter") != adapterNames.end()); + test(find(adapterNames.begin(), adapterNames.end(), "Server-Server1") != adapterNames.end()); + test(find(adapterNames.begin(), adapterNames.end(), "Server-Server2") != adapterNames.end()); + test(find(adapterNames.begin(), adapterNames.end(), "Service1-IceBox1.Service1") != adapterNames.end()); test(find(adapterNames.begin(), adapterNames.end(), "IceBox1Service2Adapter") != adapterNames.end()); - test(find(adapterNames.begin(), adapterNames.end(), "IceBox2Service1Adapter") != adapterNames.end()); + test(find(adapterNames.begin(), adapterNames.end(), "Service1-IceBox2.Service1") != adapterNames.end()); test(find(adapterNames.begin(), adapterNames.end(), "IceBox2Service2Adapter") != adapterNames.end()); cout << "ok" << endl; @@ -63,10 +63,10 @@ allCommonTests(const Ice::CommunicatorPtr& communicator) Ice::ObjectProxySeq offers = yellow->lookupAll("::Test"); test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"Server1")) != offers.end()); test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"Server2")) != offers.end()); - test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox1Service1")) != offers.end()); - test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox1Service2")) != offers.end()); - test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox2Service1")) != offers.end()); - test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox2Service2")) != offers.end()); + test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox1-Service1")) != offers.end()); + test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox1-Service2")) != offers.end()); + test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox2-Service1")) != offers.end()); + test(find_if(offers.begin(), offers.end(), bind2nd(ProxyIdentityEqual(),"IceBox2-Service2")) != offers.end()); cout << "ok" << endl; } @@ -88,35 +88,39 @@ allTests(const Ice::CommunicatorPtr& communicator) TestPrx obj; - obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server1Adapter")); - obj = TestPrx::checkedCast(communicator->stringToProxy("Server2@Server2Adapter")); - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1Service1@IceBox1Service1Adapter")); - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1Service2@IceBox1Service2Adapter")); - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2Service1@IceBox2Service1Adapter")); - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2Service2@IceBox2Service2Adapter")); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server-Server1")); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server2@Server-Server2")); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1-Service1@Service1-IceBox1.Service1")); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1-Service2@IceBox1Service2Adapter")); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2-Service1@Service1-IceBox2.Service1")); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2-Service2@IceBox2Service2Adapter")); cout << "ok" << endl; cout << "testing server configuration... " << flush; - obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server1Adapter")); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server-Server1")); test(obj->getProperty("Type") == "Server"); test(obj->getProperty("Name") == "Server1"); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server2@Server-Server2")); + test(obj->getProperty("Target1") == "1"); + test(obj->getProperty("Target2") == "1"); + cout << "ok" << endl; cout << "testing service configuration... " << flush; - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1Service1@IceBox1Service1Adapter")); - test(obj->getProperty("IceBox1Service1.Type") == "standard"); - test(obj->getProperty("IceBox1Service1.ServiceName") == "IceBox1Service1"); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1-Service1@Service1-IceBox1.Service1")); + test(obj->getProperty("Service1.Type") == "standard"); + test(obj->getProperty("Service1.ServiceName") == "Service1"); - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2Service2@IceBox2Service2Adapter")); - test(obj->getProperty("IceBox2Service2.Type") == "freeze"); - test(obj->getProperty("IceBox2Service2.ServiceName") == "IceBox2Service2"); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox2-Service2@IceBox2Service2Adapter")); + test(obj->getProperty("Service2.Type") == "freeze"); + test(obj->getProperty("Service2.ServiceName") == "Service2"); - test(obj->getProperty("IceBox2Service2.DebugProperty") == ""); - test(obj->getProperty("IceBox1Service1.DebugProperty") == ""); + test(obj->getProperty("Service2.DebugProperty") == ""); + test(obj->getProperty("Service1.DebugProperty") == ""); cout << "ok" << endl; } @@ -138,7 +142,7 @@ allTestsWithTarget(const Ice::CommunicatorPtr& communicator) TestPrx obj; try { - obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server1Adapter")); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server1@Server-Server1")); test(false); } catch(const Ice::LocalException&) @@ -146,14 +150,14 @@ allTestsWithTarget(const Ice::CommunicatorPtr& communicator) } admin->startServer("Server1"); - obj = TestPrx::checkedCast(communicator->stringToProxy("Server2@Server2Adapter")); + obj = TestPrx::checkedCast(communicator->stringToProxy("Server2@Server-Server2")); cout << "ok" << endl; cout << "testing service configuration... " << flush; - obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1Service1@IceBox1Service1Adapter")); - test(obj->getProperty("IceBox1Service1.DebugProperty") == "debug"); + obj = TestPrx::checkedCast(communicator->stringToProxy("IceBox1-Service1@Service1-IceBox1.Service1")); + test(obj->getProperty("Service1.DebugProperty") == "debug"); cout << "ok" << endl; } diff --git a/cpp/test/IcePack/deployer/Server.cpp b/cpp/test/IcePack/deployer/Server.cpp index 8613974b79a..d6360d212fa 100644 --- a/cpp/test/IcePack/deployer/Server.cpp +++ b/cpp/test/IcePack/deployer/Server.cpp @@ -28,7 +28,7 @@ int Ice::PropertiesPtr properties = communicator()->getProperties(); string name = properties->getProperty("Ice.ProgramName"); - Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter(name); + Ice::ObjectAdapterPtr adapter = communicator()->createObjectAdapter("Server"); Ice::ObjectPtr object = new TestI(adapter, properties); adapter->add(object, Ice::stringToIdentity(name)); adapter->activate(); diff --git a/cpp/test/IcePack/deployer/Service.cpp b/cpp/test/IcePack/deployer/Service.cpp index fd0d7b0fce6..bfc3871444c 100644 --- a/cpp/test/IcePack/deployer/Service.cpp +++ b/cpp/test/IcePack/deployer/Service.cpp @@ -84,9 +84,11 @@ ServiceI::start(const string& name, const CommunicatorPtr& communicator, const StringSeq& args) { + Ice::PropertiesPtr properties = communicator->getProperties(); + Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter(name); - Ice::ObjectPtr object = new TestI(adapter, communicator->getProperties()); - adapter->add(object, Ice::stringToIdentity(name)); + Ice::ObjectPtr object = new TestI(adapter, properties); + adapter->add(object, Ice::stringToIdentity(properties->getProperty(name + ".Identity"))); adapter->activate(); } @@ -114,9 +116,11 @@ FreezeServiceI::start(const string& name, // Freeze::DBPtr db = dbEnv->openDB("testdb", true); + Ice::PropertiesPtr properties = communicator->getProperties(); + Ice::ObjectAdapterPtr adapter = communicator->createObjectAdapter(name); Ice::ObjectPtr object = new TestI(adapter, communicator->getProperties()); - adapter->add(object, Ice::stringToIdentity(name)); + adapter->add(object, Ice::stringToIdentity(properties->getProperty(name + ".Identity"))); adapter->activate(); } diff --git a/cpp/test/IcePack/deployer/application.xml b/cpp/test/IcePack/deployer/application.xml index aab926b79f6..89fe1061479 100644 --- a/cpp/test/IcePack/deployer/application.xml +++ b/cpp/test/IcePack/deployer/application.xml @@ -6,7 +6,7 @@ <server name="IceBox1" descriptor="icebox.xml"/> <server name="IceBox2" descriptor="icebox.xml"/> <server name="Server1" binpath="./server" descriptor="server.xml"/> - <server name="Server2" binpath="./server" descriptor="server.xml"/> + <server name="Server2" binpath="./server" descriptor="server.xml" targets="target1 target2"/> </node> diff --git a/cpp/test/IcePack/deployer/freezeservice.xml b/cpp/test/IcePack/deployer/freezeservice.xml index e39427c1caa..52ceaba69b4 100644 --- a/cpp/test/IcePack/deployer/freezeservice.xml +++ b/cpp/test/IcePack/deployer/freezeservice.xml @@ -1,12 +1,15 @@ <service kind="freeze" entry="TestService:createFreezeService"> <adapters> - <adapter name="${name}" endpoints="default" id="${name}Adapter"> - <offer interface="::Test" identity="${name}"/> + <adapter name="${name}" endpoints="default" id="${parent}${name}Adapter"> + <!-- The identity needs to be unique, here we concatenate the + server name (${parent}) with the service name. --> + <offer interface="::Test" identity="${parent}-${name}"/> </adapter> </adapters> <properties> + <property name="${name}.Identity" value="${parent}-${name}"/> <property name="${name}.Type" value="freeze"/> <property name="${name}.ServiceName" value="${name}"/> </properties> diff --git a/cpp/test/IcePack/deployer/icebox.xml b/cpp/test/IcePack/deployer/icebox.xml index a1115a3a3ab..853e8f6511c 100644 --- a/cpp/test/IcePack/deployer/icebox.xml +++ b/cpp/test/IcePack/deployer/icebox.xml @@ -1,7 +1,7 @@ <server kind="cpp-icebox" endpoints="default"> - <service name="${name}Service1" descriptor="service.xml"/> - <service name="${name}Service2" descriptor="freezeservice.xml"/> + <service name="Service1" descriptor="service.xml"/> + <service name="Service2" descriptor="freezeservice.xml"/> <properties> <property name="Ice.ConnectionWarnings" value="1"/> diff --git a/cpp/test/IcePack/deployer/server.xml b/cpp/test/IcePack/deployer/server.xml index 47528322380..84582a13363 100644 --- a/cpp/test/IcePack/deployer/server.xml +++ b/cpp/test/IcePack/deployer/server.xml @@ -6,7 +6,7 @@ </target> <adapters> - <adapter name="${name}" endpoints="default" id="${name}Adapter"> + <adapter name="Server" endpoints="default"> <offer interface="::Test" identity="${name}"/> </adapter> </adapters> @@ -17,6 +17,18 @@ <property name="Ice.ConnectionWarnings" value="1"/> </properties> + <target name="target1"> + <properties> + <property name="Target1" value="1"/> + </properties> + </target> + + <target name="target2"> + <properties> + <property name="Target2" value="1"/> + </properties> + </target> + <target name="ssl"> <properties> <property name="Ice.Plugin.IceSSL" value="IceSSL:create"/> diff --git a/cpp/test/IcePack/deployer/service.xml b/cpp/test/IcePack/deployer/service.xml index 11ec815ae3a..0dc944b7a75 100644 --- a/cpp/test/IcePack/deployer/service.xml +++ b/cpp/test/IcePack/deployer/service.xml @@ -1,12 +1,15 @@ <service kind="standard" entry="TestService:create"> <adapters> - <adapter name="${name}" endpoints="default" id="${name}Adapter"> - <offer interface="::Test" identity="${name}"/> + <adapter name="${name}" endpoints="default"> + <!-- The identity needs to be unique, here we concatenate the + server name (${parent}) with the service name. --> + <offer interface="::Test" identity="${parent}-${name}"/> </adapter> </adapters> <properties> + <property name="${name}.Identity" value="${parent}-${name}"/> <property name="${name}.Type" value="standard"/> <property name="${name}.ServiceName" value="${name}"/> </properties> |