1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202
|
#!/usr/bin/env python3
#
# Copyright (c) ZeroC, Inc. All rights reserved.
#
import Ice
from TestHelper import TestHelper
TestHelper.loadSlice("Test.ice")
import Test
class ServerLocatorRegistry(Test.TestLocatorRegistry):
def __init__(self):
self._adapters = {}
self._objects = {}
def setAdapterDirectProxy(self, adapter, obj, current=None):
if obj:
self._adapters[adapter] = obj
else:
self._adapters.pop(adapter)
return None
def setReplicatedAdapterDirectProxy(self, adapter, replica, obj, current=None):
if obj:
self._adapters[adapter] = obj
self._adapters[replica] = obj
else:
self._adapters.pop(adapter)
self._adapters.pop(replica)
return None
def setServerProcessProxy(self, id, proxy, current=None):
return None
def addObject(self, obj, current=None):
self._objects[obj.ice_getIdentity()] = obj
def getAdapter(self, adapter):
if adapter not in self._adapters:
raise Ice.AdapterNotFoundException()
return self._adapters[adapter]
def getObject(self, id):
if id not in self._objects:
raise Ice.ObjectNotFoundException()
return self._objects[id]
class ServerLocator(Test.TestLocator):
def __init__(self, registry, registryPrx):
self._registry = registry
self._registryPrx = registryPrx
self._requestCount = 0
def findObjectById(self, id, current=None):
self._requestCount += 1
return Ice.Future.completed(self._registry.getObject(id))
def findAdapterById(self, id, current=None):
self._requestCount += 1
return Ice.Future.completed(self._registry.getAdapter(id))
def getRegistry(self, current=None):
return self._registryPrx
def getRequestCount(self, current=None):
return self._requestCount
class ServerManagerI(Test.ServerManager):
def __init__(self, registry, initData, helper):
self._registry = registry
self._communicators = []
self._initData = initData
self._nextPort = 1
self._helper = helper;
self._initData.properties.setProperty("TestAdapter.AdapterId", "TestAdapter")
self._initData.properties.setProperty("TestAdapter.ReplicaGroupId", "ReplicatedAdapter")
self._initData.properties.setProperty("TestAdapter2.AdapterId", "TestAdapter2")
def startServer(self, current=None):
#
# Simulate a server: create a new communicator and object
# adapter. The object adapter is started on a system allocated
# port. The configuration used here contains the Ice.Locator
# configuration variable. The new object adapter will register
# its endpoints with the locator and create references containing
# the adapter id instead of the endpoints.
#
serverCommunicator = Ice.initialize(self._initData)
self._communicators.append(serverCommunicator)
nRetry = 10
while --nRetry > 0:
adapter = None
adapter2 = None
try:
serverCommunicator.getProperties().setProperty("TestAdapter.Endpoints",
self._helper.getTestEndpoint(num=self._nextPort))
self._nextPort += 1
serverCommunicator.getProperties().setProperty("TestAdapter2.Endpoints",
self._helper.getTestEndpoint(num=self._nextPort))
self._nextPort += 1
adapter = serverCommunicator.createObjectAdapter("TestAdapter")
adapter2 = serverCommunicator.createObjectAdapter("TestAdapter2")
locator = serverCommunicator.stringToProxy("locator:{0}".format(self._helper.getTestEndpoint()))
adapter.setLocator(Ice.LocatorPrx.uncheckedCast(locator))
adapter2.setLocator(Ice.LocatorPrx.uncheckedCast(locator))
object = TestI(adapter, adapter2, self._registry)
self._registry.addObject(adapter.add(object, Ice.stringToIdentity("test")))
self._registry.addObject(adapter.add(object, Ice.stringToIdentity("test2")))
adapter.add(object, Ice.stringToIdentity("test3"))
adapter.activate()
adapter2.activate()
break
except Ice.SocketException as ex:
if nRetry == 0:
raise ex
# Retry, if OA creation fails with EADDRINUSE (this can occur when running with JS web
# browser clients if the driver uses ports in the same range as this test, ICE-8148)
if adapter:
adapter.destroy()
if adapter2:
adapter2.destroy()
def shutdown(self, current=None):
for i in self._communicators:
i.destroy()
current.adapter.getCommunicator().shutdown()
class HelloI(Test.Hello):
def sayHello(self, current=None):
pass
class TestI(Test.TestIntf):
def __init__(self, adapter, adapter2, registry):
self._adapter1 = adapter
self._adapter2 = adapter2
self._registry = registry
self._registry.addObject(self._adapter1.add(HelloI(), Ice.stringToIdentity("hello")))
def shutdown(self, current=None):
self._adapter1.getCommunicator().shutdown()
def getHello(self, current=None):
return Test.HelloPrx.uncheckedCast(self._adapter1.createIndirectProxy(Ice.stringToIdentity("hello")))
def getReplicatedHello(self, current=None):
return Test.HelloPrx.uncheckedCast(self._adapter1.createProxy(Ice.stringToIdentity("hello")))
def migrateHello(self, current=None):
id = Ice.stringToIdentity("hello")
try:
self._registry.addObject(self._adapter2.add(self._adapter1.remove(id), id))
except Ice.NotRegisteredException:
self._registry.addObject(self._adapter1.add(self._adapter2.remove(id), id))
class Server(TestHelper):
def run(self, args):
initData = Ice.InitializationData()
initData.properties = self.createTestProperties(args)
with self.initialize(initData=initData) as communicator:
#
# Register the server manager. The server manager creates a new
# 'server' (a server isn't a different process, it's just a new
# communicator and object adapter).
#
communicator.getProperties().setProperty("Ice.ThreadPool.Server.Size", "2")
communicator.getProperties().setProperty("ServerManager.Endpoints", self.getTestEndpoint())
adapter = communicator.createObjectAdapter("ServerManager")
#
# We also register a sample server locator which implements the
# locator interface, this locator is used by the clients and the
# 'servers' created with the server manager interface.
#
registry = ServerLocatorRegistry()
registry.addObject(adapter.createProxy(Ice.stringToIdentity("ServerManager")))
adapter.add(ServerManagerI(registry, initData, self), Ice.stringToIdentity("ServerManager"))
registryPrx = Ice.LocatorRegistryPrx.uncheckedCast(adapter.add(registry, Ice.stringToIdentity("registry")))
locator = ServerLocator(registry, registryPrx)
adapter.add(locator, Ice.stringToIdentity("locator"))
adapter.activate()
communicator.waitForShutdown()
|