Speed up openstack server listing

The old openstack driver used the "bare=True" argument to list_servers
and then relied on wait_for_server to expand the network information
on the server when it was active.  The new driver omits the bare
argument meaning that neutron is consulted for all server lists.

This can be very slow on large systems, so let's switch back to
bare=True, but instead of calling wait_for_server (which we are
unable to do in the state machine framework since state machine
runs are expected to be quick), we add the interface data ourselves
when refreshing information about active servers.

Change-Id: Ia7dce406e14b06166d5fa1d5d9bea0e661122dde
This commit is contained in:
James E. Blair 2023-01-25 14:54:53 -08:00
parent ad7bf9aaeb
commit a6c0159e40
2 changed files with 13 additions and 4 deletions

View File

@ -444,3 +444,6 @@ class FakeAdapter(OpenStackAdapter):
self.createServer_fails_with_external_id -= 1
raise OpenStackCloudCreateException('server', 'fakeid')
return super()._createServer(*args, **kwargs)
def _expandServer(self, server):
return server

View File

@ -627,21 +627,27 @@ class OpenStackAdapter(statemachine.Adapter):
@cachetools.func.ttl_cache(maxsize=1, ttl=CACHE_TTL)
def _listServers(self):
return self._client.list_servers()
return self._client.list_servers(bare=True)
@cachetools.func.ttl_cache(maxsize=1, ttl=CACHE_TTL)
def _listFloatingIps(self):
return self._client.list_floating_ips()
def _refreshServer(self, obj):
for server in self._listServers():
if server.id == obj.id:
return server
ret = self._getServer(obj.id)
if ret:
return ret
return obj
def _expandServer(self, server):
return openstack.cloud.meta.add_server_interfaces(
self._client, server)
def _getServer(self, external_id):
for server in self._listServers():
if server.id == external_id:
if server.status in ['ACTIVE', 'ERROR']:
return self._expandServer(server)
return server
return None