Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
RECIRCLE
/
interface-openstack
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
2
Merge Requests
4
Pipelines
Wiki
Snippets
Members
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
07df1fec
authored
5 years ago
by
Arnau Comas Codina
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Port Forwarding
parent
5ed6f6b9
Pipeline
#1089
failed with stage
in 48 seconds
Changes
3
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
107 additions
and
19 deletions
+107
-19
implementation/network/port_forwarding.py
+70
-15
interface/network/port_forwarding.py
+1
-1
interface/network/resources.py
+36
-3
No files found.
implementation/network/port_forwarding.py
View file @
07df1fec
from
openstack.exceptions
import
ResourceNotFound
from
interface.network.port_forwarding
import
PortForwardingInterface
from
interface.network.resources
import
FloatingIP
,
PortForwarding
from
interface.network.resources
import
Port
,
FloatingIP
,
PortForwarding
from
implementation.utils.connection
import
OpenStackConnection
class
OSPortForwardingManager
(
PortForwardingInterface
,
OpenStackConnection
):
# TODO: init ha d'obtenir el rang de floating ips i els ports forwardings
# actuals per gestionar els rangs de ports lliures/ocupats
# TODO: gestionar els rangs de ports lliures/ocupats i floating ips? aquí o al django o on?
# el delete el podem fer a partir de la ip i no de la instance_id
def
__init__
(
self
,
*
args
,
**
kwargs
):
super
()
.
__init__
(
*
args
,
**
kwargs
)
...
...
@@ -19,11 +20,13 @@ class OSPortForwardingManager(PortForwardingInterface, OpenStackConnection):
for
floating_ip
in
self
.
floating_ips
:
items
=
self
.
openstack
.
network
.
floating_ip_port_forwardings
(
floating_ip
.
id
)
floating_ip
.
port_forwardings
=
[
PortForwarding
(
item
)
for
item
in
items
]
floating_ip
.
port_forwardings
=
[
PortForwarding
(
item
,
floating_ip
.
address
)
for
item
in
items
]
#self.port_forwardings = [
# PortForwarding(item) for item in self.openstack.network.port_forwardings(self.floating_ips[0].id)]
def
create_port_forwarding
(
self
,
instance_id
,
internal_port_number
,
protocol
):
"""DUBTE hem de gestionar condicions com ara que no estigui creat ja
un port forwarding igual, que la floating_ip no estigui activa, que no
...
...
@@ -33,10 +36,9 @@ class OSPortForwardingManager(PortForwardingInterface, OpenStackConnection):
project_id
=
self
.
openstack
.
auth
[
'project_id'
]
# fetch internal Neutron port id of the instance by instance_id
internal_port_object
=
[
item
for
item
in
self
.
openstack
.
network
.
ports
(
device_id
=
instance_id
)]
.
pop
()
# pop() is used because returns a list
internal_port_object
=
self
.
__get_internal_port_object_from_instance_id
(
instance_id
)
internal_port_id
=
internal_port_object
.
id
internal_ip_address
=
internal_port_object
.
fixed_ips
[
0
][
'ip_address'
]
internal_ip_address
=
internal_port_object
.
ip_address
# recorrer cada floating ip i cridar una funció que ens torni un port lliure o None, sinó crear nova ip
floating_ip_id
=
self
.
floating_ips
[
0
]
.
id
...
...
@@ -53,7 +55,8 @@ class OSPortForwardingManager(PortForwardingInterface, OpenStackConnection):
description
=
''
)
port_forwardings
=
[
PortForwarding
(
item
)
for
item
in
self
.
openstack
.
network
.
port_forwardings
(
self
.
floating_ips
[
0
]
.
id
)]
PortForwarding
(
item
)
for
item
in
self
.
openstack
.
network
.
port_forwardings
(
self
.
floating_ips
[
0
]
.
id
)]
# DUBTE: l'instància de la connection sempre s'ha d'inicialitzar amb l'objecte auth.
# no es podria compartir? Perquè aquí necessito accedir a funcions del port manager
...
...
@@ -80,15 +83,67 @@ class OSPortForwardingManager(PortForwardingInterface, OpenStackConnection):
# f"/{floating_ip_id}/port_forwardings", data = payload)
#r.json()
def
remove_port_forwarding
(
self
,
instance_id
,
internal_port_number
):
"""
Removes port forwarding rule
def
delete_port_forwarding
(
self
,
instance_id
,
internal_port_number
):
"""
Removes port forwarding rule
"""
pass
# fetch internal Neutron port of the instance by instance_id
internal_port_object
=
self
.
__get_internal_port_object_from_instance_id
(
instance_id
)
internal_port_id
=
internal_port_object
.
id
internal_ip_address
=
internal_port_object
.
ip_address
# find floating ip where port forwarding rule is defined
floating_ip_id
=
None
for
floating_ip
in
self
.
openstack
.
list_floating_ips
():
for
port_forwarding
in
floating_ip
.
port_forwardings
:
if
(
port_forwarding
.
internal_ip_address
==
internal_ip_address
)
and
(
port_forwarding
.
internal_port
==
internal_port_number
):
# found
floating_ip_id
=
floating_ip
.
id
break
break
# loop again to fetch port forwarding id
# because is not contained in objects from the above results
port_forwarding_id
=
None
for
port_forwarding
in
self
.
openstack
.
network
.
floating_ip_port_forwardings
(
floating_ip_id
)
if
(
port_forwarding
.
internal_ip_address
==
internal_ip_address
)
and
(
port_forwarding
.
internal_port
==
internal_port_number
):
port_forwarding_id
=
port_forwarding
.
id
self
.
openstack
.
network
.
delete_port_forwarding
(
port_forwarding_id
,
floating_ip_id
)
def
list_instance_port_forwardings
(
self
,
instance_id
):
""" Lists all port forwarding rules defined from a vm instance
"""
Lists all port forwarding rules defined from a vm instance
# NOTE: shall we return all rules or filtered by floating ip for example?
# fetch internal Neutron port id of the instance by instance_id
internal_port_object
=
self
.
__get_internal_port_object_from_instance_id
(
instance_id
)
internal_port_id
=
internal_port_object
.
id
internal_ip_address
=
internal_port_object
.
ip_address
# fetch port forwardings
instance_port_forwardings
=
[]
for
floating_ip
in
self
.
floating_ips
:
for
item
in
self
.
openstack
.
network
.
port_forwardings
(
floating_ip
.
id
):
if
item
.
internal_ip_address
==
internal_ip_address
:
instance_port_forwardings
.
append
(
PortForwarding
(
item
,
floating_ip
.
address
))
return
instance_port_forwardings
def
__get_internal_port_object_from_instance_id
(
self
,
instance_id
):
""" Fetches Neutron internal port object from instance_id
"""
pass
# query ports filtered by keyboard arguments (kwargs), returns a list
results
=
[
Port
(
item
)
for
item
in
self
.
openstack
.
network
.
ports
(
device_id
=
instance_id
)]
# pick the result, we assume the list lenght is 1
internal_port_object
=
results
.
pop
()
return
internal_port_object
This diff is collapsed.
Click to expand it.
interface/network/port_forwarding.py
View file @
07df1fec
...
...
@@ -10,7 +10,7 @@ class PortForwardingInterface:
def
create_port_forwarding
(
self
,
instance_id
,
internal_port_number
,
protocol
):
raise
NotImplementedError
def
remov
e_port_forwarding
(
self
,
instance_id
,
internal_port_number
):
def
delet
e_port_forwarding
(
self
,
instance_id
,
internal_port_number
):
raise
NotImplementedError
def
list_instance_port_forwardings
(
self
,
instance_id
):
...
...
This diff is collapsed.
Click to expand it.
interface/network/resources.py
View file @
07df1fec
import
json
class
Port
:
""" From the OpenStack Port source data:
- Releveant attributes are stored
- Some methods regarding class representation
"""
def
__init__
(
self
,
data
):
self
.
id
=
data
[
'id'
]
# str
self
.
ip_address
=
None
# see below
self
.
ipv6_address
=
None
# see below
self
.
status
=
data
[
'status'
]
# str e.g. 'ACTIVE'
self
.
device_id
=
data
[
'device_id'
]
# str
self
.
created_at
=
data
[
'created_at'
]
# str
self
.
updated_at
=
data
[
'updated_at'
]
# str
if
len
(
data
[
'fixed_ips'
]):
for
ip
in
data
[
'fixed_ips'
]:
if
':'
in
ip
[
'ip_address'
]:
# ipv6
self
.
ipv6_address
=
data
[
'fixed_ips'
][
1
][
'ip_address'
]
# str
else
:
self
.
ip_address
=
data
[
'fixed_ips'
][
0
][
'ip_address'
]
# str
def
__repr__
(
self
):
return
f
"Port({self.ip_address})"
def
__str__
(
self
):
return
f
"Port({self.ip_address})"
def
JSON
(
self
):
return
json
.
dumps
(
self
.
__dict__
)
class
FloatingIP
:
""" From the OpenStack Floating IP source data:
- Releveant attributes are stored
...
...
@@ -34,22 +66,23 @@ class PortForwarding:
- Some methods regarding class representation
"""
def
__init__
(
self
,
data
):
def
__init__
(
self
,
data
,
floating_ip_address
=
''
):
self
.
id
=
data
[
'id'
]
# str
self
.
protocol
=
data
[
'protocol'
]
# str
self
.
internal_ip_address
=
data
[
'internal_ip_address'
]
# str
self
.
external_ip_address
=
floating_ip_address
# str
self
.
internal_port
=
data
[
'internal_port'
]
# number
self
.
external_port
=
data
[
'external_port'
]
# number
def
__repr__
(
self
):
return
(
f
"PortForwarding({self.internal_ip_address}:{self.internal_port}"
f
" -> {self.external_port})"
)
f
" -> {self.external_
ip_address}:{self.external_
port})"
)
def
__str__
(
self
):
return
(
f
"PortForwarding({self.internal_ip_address}:{self.internal_port}"
f
" -> {self.external_port})"
)
f
" -> {self.external_
ip_address}:{self.external_
port})"
)
def
JSON
(
self
):
return
json
.
dumps
(
self
.
__dict__
)
This diff is collapsed.
Click to expand it.
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment