From c21305aac7da8cb90baea4b64a5b8a2fa4415402 Mon Sep 17 00:00:00 2001 From: pkharat Date: Tue, 7 Jun 2016 15:28:27 +0530 Subject: [PATCH] Code for update api support for Firewall service --- .../handlers/config/firewall.py | 11 +++++++ .../config_drivers/heat_driver.py | 8 +++-- .../modules/service_orchestrator.py | 7 +++-- .../firewall/nfp_fwaas_plugin.py | 31 ++++++++++++++++++- 4 files changed, 50 insertions(+), 7 deletions(-) diff --git a/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py b/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py index 38e1b911da..918a8838c9 100644 --- a/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py +++ b/gbpservice/nfp/config_orchestrator/handlers/config/firewall.py @@ -146,6 +146,17 @@ def create_firewall(self, context, firewall, host): context, body, "CREATE") nfp_logging.clear_logging_context() + @log_helpers.log_method_call + def update_firewall(self, context, firewall, host): + # Fetch nf_id from description of the resource + nf_id = self._fetch_nf_from_resource_desc(firewall["description"]) + nfp_logging.store_logging_context(meta_id=nf_id) + nf = common.get_network_function_details(context, nf_id) + body = self._data_wrapper(context, firewall, host, nf, 'UPDATE') + transport.send_request_to_configurator(self._conf, + context, body, "UPDATE") + nfp_logging.clear_logging_context() + @log_helpers.log_method_call def delete_firewall(self, context, firewall, host): # Fetch nf_id from description of the resource diff --git a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py index 3510d87da7..97507fb0bc 100644 --- a/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py +++ b/gbpservice/nfp/orchestrator/config_drivers/heat_driver.py @@ -1182,8 +1182,9 @@ def delete_config(self, stack_id, tenant_id): def is_update_config_supported(self, service_type): return ( False - if (service_type == pconst.VPN or - service_type == pconst.FIREWALL) + if (service_type == pconst.VPN) + # or + # service_type == pconst.FIREWALL) else True ) @@ -1217,7 +1218,8 @@ def _update(self, auth_token, resource_owner_tenant_id, service_profile, return None if stack_id: - if service_type == pconst.VPN or service_type == pconst.FIREWALL: + if service_type == pconst.VPN: + # or service_type == pconst.FIREWALL: stack_name = ("stack_" + service_chain_instance['name'] + service_chain_node['name'] + service_chain_instance['id'][:8] + diff --git a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py index 2a58c7428c..15f5905b44 100644 --- a/gbpservice/nfp/orchestrator/modules/service_orchestrator.py +++ b/gbpservice/nfp/orchestrator/modules/service_orchestrator.py @@ -464,7 +464,7 @@ def _log_event_created(self, event_id, event_data): def _create_event(self, event_id, event_data=None, key=None, binding_key=None, serialize=False, is_poll_event=False, original_event=None, - is_internal_event=False): + is_internal_event=False, max_times=20): if not is_internal_event: if is_poll_event: ev = self._controller.new_event( @@ -473,7 +473,7 @@ def _create_event(self, event_id, event_data=None, binding_key=original_event.binding_key, key=original_event.desc.uid) LOG.debug("poll event started for %s" % (ev.id)) - self._controller.poll_event(ev, max_times=20) + self._controller.poll_event(ev, max_times=max_times) else: if original_event: ev = self._controller.new_event( @@ -978,7 +978,8 @@ def handle_continue_update_user_config(self, event): {'heat_stack_id': config_id}) self._create_event('UPDATE_USER_CONFIG_STILL_IN_PROGRESS', event_data=request_data, - is_poll_event=True, original_event=event) + is_poll_event=True, original_event=event, + max_times=30) def handle_device_create_failed(self, event): request_data = event.data diff --git a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py index e9008957a7..0b1996b96d 100644 --- a/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py +++ b/gbpservice/nfp/service_plugins/firewall/nfp_fwaas_plugin.py @@ -5,10 +5,29 @@ from neutron.plugins.common import constants as n_const from oslo_config import cfg +from functools import wraps from gbpservice.nfp.config_orchestrator.common import topics -import neutron_fwaas.extensions from neutron_fwaas.services.firewall import fwaas_plugin as ref_fw_plugin +import neutron_fwaas.extensions +import time + + +def poll_on_firewall_status(func): + @wraps(func) + def wrapper(self, *args, **kwargs): + retry = 12 + while retry > 0: + retry = retry - 1 + context = args[0] + firewall_id = args[1] + fwall = self.get_firewall(context, firewall_id) + if fwall['status'] == 'ACTIVE': + break + time.sleep(5) + return func(self, *args, **kwargs) + return wrapper + class NFPFirewallPlugin(ref_fw_plugin.FirewallPlugin): def __init__(self): @@ -58,3 +77,13 @@ def _get_routers_for_create_firewall(self, tenant_id, context, firewall): # self.validate_firewall_routers_not_in_use(context, # router_ids) return router_ids + + @poll_on_firewall_status + def _ensure_update_firewall(self, context, firewall_id): + fwall = self.get_firewall(context, firewall_id) + if fwall['status'] in [n_const.PENDING_CREATE, + n_const.PENDING_UPDATE, + n_const.PENDING_DELETE]: + raise self.fw_ext.FirewallInPendingState( + firewall_id=firewall_id, + pending_state=fwall['status'])