22
19
from neutronclient.v2_0 import client
23
from oslo.config import cfg
24
from oslo import messaging
25
from oslo.utils import excutils
20
from oslo_config import cfg
21
from oslo_log import log as logging
26
23
import six.moves.urllib.parse as urlparse
26
from neutron.agent.linux import utils as agent_utils
29
27
from neutron.agent import rpc as agent_rpc
30
28
from neutron.common import constants as n_const
31
29
from neutron.common import rpc as n_rpc
34
32
from neutron import context
35
33
from neutron.i18n import _LE, _LW
36
34
from neutron.openstack.common.cache import cache
37
from neutron.openstack.common import log as logging
38
35
from neutron.openstack.common import loopingcall
39
from neutron import wsgi
41
37
LOG = logging.getLogger(__name__)
58
54
def __init__(self, topic):
59
target = messaging.Target(topic=topic,
60
namespace=n_const.RPC_NAMESPACE_METADATA,
55
target = oslo_messaging.Target(
57
namespace=n_const.RPC_NAMESPACE_METADATA,
62
59
self.client = n_rpc.get_client(target)
64
61
def get_ports(self, context, filters):
123
120
return self.plugin_rpc.get_ports(self.context, filters)
124
except (messaging.MessagingException, AttributeError):
121
except (oslo_messaging.MessagingException, AttributeError):
125
122
# TODO(obondarev): remove fallback once RPC is proven
126
123
# to work fine with metadata agent (K or L release at most)
127
124
LOG.warning(_LW('Server does not support metadata RPC, '
263
260
hashlib.sha256).hexdigest()
266
class UnixDomainHttpProtocol(eventlet.wsgi.HttpProtocol):
267
def __init__(self, request, client_address, server):
268
if client_address == '':
269
client_address = ('<local>', 0)
270
# base class is old-style, so super does not work properly
271
eventlet.wsgi.HttpProtocol.__init__(self, request, client_address,
275
class WorkerService(wsgi.WorkerService):
277
self._server = self._service.pool.spawn(self._service._run,
279
self._service._socket)
282
class UnixDomainWSGIServer(wsgi.Server):
283
def __init__(self, name):
285
self._launcher = None
287
super(UnixDomainWSGIServer, self).__init__(name)
289
def start(self, application, file_socket, workers, backlog):
290
self._socket = eventlet.listen(file_socket,
291
family=socket.AF_UNIX,
294
self._launch(application, workers=workers)
296
def _run(self, application, socket):
297
"""Start a WSGI service in a new green thread."""
298
logger = logging.getLogger('eventlet.wsgi.server')
299
eventlet.wsgi.server(socket,
301
custom_pool=self.pool,
302
protocol=UnixDomainHttpProtocol,
303
log=logging.WritableLogger(logger))
306
263
class UnixDomainMetadataProxy(object):
308
265
def __init__(self, conf):
311
dirname = os.path.dirname(cfg.CONF.metadata_proxy_socket)
312
if os.path.isdir(dirname):
314
os.unlink(cfg.CONF.metadata_proxy_socket)
316
with excutils.save_and_reraise_exception() as ctxt:
317
if not os.path.exists(cfg.CONF.metadata_proxy_socket):
320
os.makedirs(dirname, 0o755)
267
agent_utils.ensure_directory_exists_without_file(
268
cfg.CONF.metadata_proxy_socket)
322
269
self._init_state_reporting()
324
271
def _init_state_reporting(self):
359
306
self.agent_state.pop('start_flag', None)
362
server = UnixDomainWSGIServer('neutron-metadata-agent')
309
server = agent_utils.UnixDomainWSGIServer('neutron-metadata-agent')
363
310
server.start(MetadataProxyHandler(self.conf),
364
311
self.conf.metadata_proxy_socket,
365
312
workers=self.conf.metadata_workers,