Added a way to query cidr for existing subnets
Also fixed a select-from-source function to properly handle empty path Change-Id: I87c694cfa7725e32956062b63529c3bda5804ba7
This commit is contained in:
parent
f3e779ea33
commit
4c7ff16951
@ -31,6 +31,7 @@ class NeutronExecutor(CommandBase):
|
|||||||
self.address = muranoconductor.config.CONF.env_ip_template
|
self.address = muranoconductor.config.CONF.env_ip_template
|
||||||
|
|
||||||
self.cidr_waiting_per_router = {}
|
self.cidr_waiting_per_router = {}
|
||||||
|
self.cidr_waiting_per_network = {}
|
||||||
self.router_requests = []
|
self.router_requests = []
|
||||||
self.network_requests = []
|
self.network_requests = []
|
||||||
self.tenant_id = tenant_id
|
self.tenant_id = tenant_id
|
||||||
@ -57,7 +58,8 @@ class NeutronExecutor(CommandBase):
|
|||||||
insecure=neutron_settings.insecure)
|
insecure=neutron_settings.insecure)
|
||||||
|
|
||||||
self.command_map = {
|
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_router": self._schedule_get_router,
|
||||||
"get_network": self._schedule_get_network
|
"get_network": self._schedule_get_network
|
||||||
}
|
}
|
||||||
@ -68,15 +70,17 @@ class NeutronExecutor(CommandBase):
|
|||||||
|
|
||||||
def has_pending_commands(self):
|
def has_pending_commands(self):
|
||||||
return len(self.cidr_waiting_per_router) + len(
|
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):
|
def execute_pending(self):
|
||||||
r1 = self._execute_pending_cidr_requests()
|
r1 = self._execute_pending_new_cidr_requests()
|
||||||
r2 = self._execute_pending_net_requests()
|
r2 = self._execute_pending_net_requests()
|
||||||
r3 = self._execute_pending_router_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):
|
if not len(self.cidr_waiting_per_router):
|
||||||
return False
|
return False
|
||||||
for router, callbacks in self.cidr_waiting_per_router.items():
|
for router, callbacks in self.cidr_waiting_per_router.items():
|
||||||
@ -86,11 +90,21 @@ class NeutronExecutor(CommandBase):
|
|||||||
self.cidr_waiting_per_router = {}
|
self.cidr_waiting_per_router = {}
|
||||||
return True
|
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):
|
def _execute_pending_router_requests(self):
|
||||||
if not len(self.router_requests):
|
if not len(self.router_requests):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
routers = self.neutron.list_routers(tenant_id=self.tenant_id).\
|
routers = self.neutron.list_routers(tenant_id=self.tenant_id). \
|
||||||
get("routers")
|
get("routers")
|
||||||
if not len(routers):
|
if not len(routers):
|
||||||
routerId = None
|
routerId = None
|
||||||
@ -153,6 +167,13 @@ class NeutronExecutor(CommandBase):
|
|||||||
taken_cidrs.append(res)
|
taken_cidrs.append(res)
|
||||||
return results
|
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):
|
def _get_taken_cidrs_by_router(self, routerId):
|
||||||
ports = self.neutron.list_ports(device_id=routerId)["ports"]
|
ports = self.neutron.list_ports(device_id=routerId)["ports"]
|
||||||
subnet_ids = []
|
subnet_ids = []
|
||||||
@ -182,7 +203,7 @@ class NeutronExecutor(CommandBase):
|
|||||||
return str(subnet)
|
return str(subnet)
|
||||||
return None
|
return None
|
||||||
|
|
||||||
def _schedule_get_subnet(self, callback, **kwargs):
|
def _schedule_get_new_subnet(self, callback, **kwargs):
|
||||||
routerId = kwargs.get("routerId")
|
routerId = kwargs.get("routerId")
|
||||||
if not routerId:
|
if not routerId:
|
||||||
routerId = "*"
|
routerId = "*"
|
||||||
@ -191,6 +212,14 @@ class NeutronExecutor(CommandBase):
|
|||||||
else:
|
else:
|
||||||
self.cidr_waiting_per_router[routerId] = [callback]
|
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):
|
def _schedule_get_router(self, callback, **kwargs):
|
||||||
self.router_requests.append(callback)
|
self.router_requests.append(callback)
|
||||||
|
|
||||||
|
@ -20,7 +20,8 @@ from openstack.common import log as logging
|
|||||||
log = logging.getLogger(__name__)
|
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']
|
command_dispatcher = context['/commandDispatcher']
|
||||||
|
|
||||||
def callback(result_value):
|
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:
|
if success_handler is not None:
|
||||||
engine.evaluate_content(success_handler, context)
|
engine.evaluate_content(success_handler, context)
|
||||||
|
|
||||||
|
if existingNetwork:
|
||||||
|
command = "get_existing_subnet"
|
||||||
|
else:
|
||||||
|
command = "get_new_subnet"
|
||||||
|
|
||||||
command_dispatcher.execute(
|
command_dispatcher.execute(
|
||||||
name="net",
|
name="net",
|
||||||
command="get_subnet",
|
command=command,
|
||||||
|
existingNetwork=existingNetwork,
|
||||||
routerId=routerId,
|
routerId=routerId,
|
||||||
callback=callback)
|
callback=callback)
|
||||||
|
|
||||||
@ -77,7 +84,7 @@ def get_network_topology(engine, context, body, result=None):
|
|||||||
|
|
||||||
|
|
||||||
xml_code_engine.XmlCodeEngine.register_function(
|
xml_code_engine.XmlCodeEngine.register_function(
|
||||||
get_available_subnet, "get-cidr")
|
get_subnet, "get-cidr")
|
||||||
|
|
||||||
xml_code_engine.XmlCodeEngine.register_function(
|
xml_code_engine.XmlCodeEngine.register_function(
|
||||||
get_default_router, "get-default-router-id")
|
get_default_router, "get-default-router-id")
|
||||||
|
@ -127,8 +127,11 @@ class Workflow(object):
|
|||||||
elif path.startswith('#'):
|
elif path.startswith('#'):
|
||||||
result = context[path[1:]]
|
result = context[path[1:]]
|
||||||
elif source is not None:
|
elif source is not None:
|
||||||
result = Workflow._get_path(
|
if path == '':
|
||||||
context[source], path.split('.'))
|
p = []
|
||||||
|
else:
|
||||||
|
p = path.split('.')
|
||||||
|
result = Workflow._get_path(context[source], p)
|
||||||
else:
|
else:
|
||||||
result = Workflow._get_path(
|
result = Workflow._get_path(
|
||||||
context['/dataSource'],
|
context['/dataSource'],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user