Filter implementation for cloud & Nat

Fix #1111
This commit is contained in:
Julien Duponchelle committed 2017-07-17 17:27:07 +02:00
1 parent 03af9bd621
commit 536c708c16
10 files changed
+124 -9

No files matched your search

+18
View File
@@ -64,6 +64,10 @@ class Cloud(BaseNode):
port_number += 1
self._ports_mapping = ports
@property
def nios(self):
return self._nios
def _interfaces(self):
return gns3server.utils.interfaces.interfaces()
@@ -202,6 +206,7 @@ class Cloud(BaseNode):
rhost=nio.rhost,
rport=nio.rport))
yield from self._ubridge_apply_filters(bridge_name, nio.filters)
if port_info["type"] in ("ethernet", "tap"):
if sys.platform.startswith("win"):
@@ -311,6 +316,19 @@ class Cloud(BaseNode):
self.status = "stopped"
self._nios[port_number] = nio
@asyncio.coroutine
def update_nio(self, port_number, nio):
"""
Update an nio on this node
:param nio: NIO instance to add
:param port_number: port to allocate for the NIO
"""
bridge_name = "{}-{}".format(self._id, port_number)
if self._ubridge_hypervisor and self._ubridge_hypervisor.is_running():
yield from self._ubridge_apply_filters(bridge_name, nio.filters)
@asyncio.coroutine
def _delete_ubridge_connection(self, port_number):
"""
+1
View File
@@ -38,6 +38,7 @@ class NIOUDP(NIO):
self._lport = lport
self._rhost = rhost
self._rport = rport
assert isinstance(filters, dict)
self._filters = filters
@property
+6 -1
View File
@@ -365,7 +365,12 @@ class Link:
:returns: None if no node support filtering else the node
"""
for node in self._nodes:
if node["node"].node_type in ('vpcs', 'dynamips', 'qemu', 'docker'):
if node["node"].node_type in ('vpcs',
'dynamips',
'qemu',
'cloud',
'nat',
'docker'):
return node["node"]
return None
@@ -199,6 +199,33 @@ class CloudHandler:
response.set_status(201)
response.json(nio)
@Route.put(
r"/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
parameters={
"project_id": "Project UUID",
"node_id": "Node UUID",
"adapter_number": "Network adapter where the nio is located",
"port_number": "Port from where the nio should be updated"
},
status_codes={
201: "NIO updated",
400: "Invalid request",
404: "Instance doesn't exist"
},
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a Cloud instance")
def update_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = node.nios[int(request.match_info["adapter_number"])]
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from node.update_nio(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@Route.delete(
r"/projects/{project_id}/cloud/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
parameters={
@@ -198,6 +198,33 @@ class NatHandler:
response.set_status(201)
response.json(nio)
@Route.put(
r"/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
parameters={
"project_id": "Project UUID",
"node_id": "Node UUID",
"adapter_number": "Network adapter where the nio is located",
"port_number": "Port from where the nio should be updated"
},
status_codes={
201: "NIO updated",
400: "Invalid request",
404: "Instance doesn't exist"
},
input=NIO_SCHEMA,
output=NIO_SCHEMA,
description="Update a NIO from a NAT instance")
def update_nio(request, response):
builtin_manager = Builtin.instance()
node = builtin_manager.get_node(request.match_info["node_id"], project_id=request.match_info["project_id"])
nio = node.nios[int(request.match_info["adapter_number"])]
if "filters" in request.json and nio:
nio.filters = request.json["filters"]
yield from node.update_nio(int(request.match_info["port_number"]), nio)
response.set_status(201)
response.json(request.json)
@Route.delete(
r"/projects/{project_id}/nat/nodes/{node_id}/adapters/{adapter_number:\d+}/ports/{port_number:\d+}/nio",
parameters={