From 4c7ff16951c517a4127dac729ce08092e152b5b7 Mon Sep 17 00:00:00 2001 From: ativelkov Date: Fri, 6 Dec 2013 15:38:38 +0400 Subject: [PATCH] Added a way to query cidr for existing subnets Also fixed a select-from-source function to properly handle empty path Change-Id: I87c694cfa7725e32956062b63529c3bda5804ba7 --- muranoconductor/commands/network.py | 43 ++++++++++++++++++++++++----- muranoconductor/network.py | 13 +++++++-- muranoconductor/workflow.py | 7 +++-- 3 files changed, 51 insertions(+), 12 deletions(-) diff --git a/muranoconductor/commands/network.py b/muranoconductor/commands/network.py index d4ff0d8..9d1c62f 100644 --- a/muranoconductor/commands/network.py +++ b/muranoconductor/commands/network.py @@ -31,6 +31,7 @@ class NeutronExecutor(CommandBase): self.address = muranoconductor.config.CONF.env_ip_template self.cidr_waiting_per_router = {} + self.cidr_waiting_per_network = {} self.router_requests = [] self.network_requests = [] self.tenant_id = tenant_id @@ -57,7 +58,8 @@ class NeutronExecutor(CommandBase): insecure=neutron_settings.insecure) self.command_map = { - "get_subnet": self._schedule_get_subnet, + "get_new_subnet": self._schedule_get_new_subnet, + "get_existing_subnet": self._schedule_get_existing_subnet, "get_router": self._schedule_get_router, "get_network": self._schedule_get_network } @@ -68,15 +70,17 @@ class NeutronExecutor(CommandBase): def has_pending_commands(self): return len(self.cidr_waiting_per_router) + len( - self.router_requests) + len(self.network_requests) > 0 + self.cidr_waiting_per_network) + len(self.router_requests) + len( + self.network_requests) > 0 def execute_pending(self): - r1 = self._execute_pending_cidr_requests() + r1 = self._execute_pending_new_cidr_requests() r2 = self._execute_pending_net_requests() r3 = self._execute_pending_router_requests() - return r1 or r2 or r3 + r4 = self._execute_pending_existing_cidr_requests() + return r1 or r2 or r3 or r4 - def _execute_pending_cidr_requests(self): + def _execute_pending_new_cidr_requests(self): if not len(self.cidr_waiting_per_router): return False for router, callbacks in self.cidr_waiting_per_router.items(): @@ -86,11 +90,21 @@ class NeutronExecutor(CommandBase): self.cidr_waiting_per_router = {} return True + def _execute_pending_existing_cidr_requests(self): + if not len(self.cidr_waiting_per_network): + return False + for network, callbacks in self.cidr_waiting_per_network.items(): + result = self._get_existing_subnet(network) + for callback in callbacks: + callback(result) + self.cidr_waiting_per_network = {} + return True + def _execute_pending_router_requests(self): if not len(self.router_requests): return False - routers = self.neutron.list_routers(tenant_id=self.tenant_id).\ + routers = self.neutron.list_routers(tenant_id=self.tenant_id). \ get("routers") if not len(routers): routerId = None @@ -153,6 +167,13 @@ class NeutronExecutor(CommandBase): taken_cidrs.append(res) return results + def _get_existing_subnet(self, network_id): + subnets = self.neutron.list_subnets(network_id=network_id)['subnets'] + if not subnets: + return None + else: + return subnets[0]['cidr'] + def _get_taken_cidrs_by_router(self, routerId): ports = self.neutron.list_ports(device_id=routerId)["ports"] subnet_ids = [] @@ -182,7 +203,7 @@ class NeutronExecutor(CommandBase): return str(subnet) return None - def _schedule_get_subnet(self, callback, **kwargs): + def _schedule_get_new_subnet(self, callback, **kwargs): routerId = kwargs.get("routerId") if not routerId: routerId = "*" @@ -191,6 +212,14 @@ class NeutronExecutor(CommandBase): else: self.cidr_waiting_per_router[routerId] = [callback] + def _schedule_get_existing_subnet(self, callback, **kwargs): + existing_network = kwargs.get("existingNetwork") + + if existing_network in self.cidr_waiting_per_network: + self.cidr_waiting_per_network[existing_network].append(callback) + else: + self.cidr_waiting_per_network[existing_network] = [callback] + def _schedule_get_router(self, callback, **kwargs): self.router_requests.append(callback) diff --git a/muranoconductor/network.py b/muranoconductor/network.py index e61f06e..6f7bf0f 100644 --- a/muranoconductor/network.py +++ b/muranoconductor/network.py @@ -20,7 +20,8 @@ from openstack.common import log as logging log = logging.getLogger(__name__) -def get_available_subnet(engine, context, body, routerId=None, result=None): +def get_subnet(engine, context, body, routerId=None, existingNetwork=None, + result=None): command_dispatcher = context['/commandDispatcher'] def callback(result_value): @@ -31,9 +32,15 @@ def get_available_subnet(engine, context, body, routerId=None, result=None): if success_handler is not None: engine.evaluate_content(success_handler, context) + if existingNetwork: + command = "get_existing_subnet" + else: + command = "get_new_subnet" + command_dispatcher.execute( name="net", - command="get_subnet", + command=command, + existingNetwork=existingNetwork, routerId=routerId, callback=callback) @@ -77,7 +84,7 @@ def get_network_topology(engine, context, body, result=None): xml_code_engine.XmlCodeEngine.register_function( - get_available_subnet, "get-cidr") + get_subnet, "get-cidr") xml_code_engine.XmlCodeEngine.register_function( get_default_router, "get-default-router-id") diff --git a/muranoconductor/workflow.py b/muranoconductor/workflow.py index 5b441b4..0b6b493 100644 --- a/muranoconductor/workflow.py +++ b/muranoconductor/workflow.py @@ -127,8 +127,11 @@ class Workflow(object): elif path.startswith('#'): result = context[path[1:]] elif source is not None: - result = Workflow._get_path( - context[source], path.split('.')) + if path == '': + p = [] + else: + p = path.split('.') + result = Workflow._get_path(context[source], p) else: result = Workflow._get_path( context['/dataSource'],