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
|
# Copyright 2023 Infomaniak Networks SA
#
# Author: Axel Jacquet <axel.jacquet@infomaniak.com>
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from oslo_config import cfg
from oslo_log import log as logging
from designate.notification_handler import base
from designate.context import DesignateContext
LOG = logging.getLogger(__name__)
class NeutronFloatingHandlerNG(base.NotificationHandler):
"""Handler for Neutron's notifications"""
__plugin_name__ = 'neutron_floatingip_ng'
def get_exchange_topics(self):
exchange = cfg.CONF[self.name].control_exchange
topics = [topic for topic in cfg.CONF[self.name].notification_topics]
return (exchange, topics)
def get_event_types(self):
return [
'floatingip.update.end',
'floatingip.delete.start'
]
def delete_ptr(self, payload):
"""
Handle a generic delete of a fixed ip within a zone
:param zone_id: The ID of the designate zone.
:param resource_id: The managed resource ID
:param resource_type: The managed resource type
:param criterion: Criterion to search and destroy records
"""
context = DesignateContext().elevated()
context.all_tenants = True
context.edit_managed_records = True
criterion = {
'managed': True,
'managed_resource_id': payload['floatingip_id'],
'managed_resource_type': 'ptr:floatingip'
}
records = self.central_api.find_records(context, criterion)
for record in records:
self._update_or_delete_recordset(
context, record['zone_id'], record['recordset_id'], record['id']
)
def process_notification(self, context, event_type, payload):
LOG.debug('%s received notification - %s',
self.get_canonical_name(), event_type)
if event_type.startswith('floatingip.delete'):
self.delete_ptr(payload)
|