Skip to content
GitLab
Explore
Sign in
Primary navigation
Search or go to…
Project
GÉANT Service Orchestrator
Manage
Activity
Members
Labels
Plan
Issues
Issue boards
Milestones
Wiki
Jira
Code
Merge requests
Repository
Branches
Commits
Tags
Repository graph
Compare revisions
Snippets
Build
Pipelines
Jobs
Pipeline schedules
Artifacts
Deploy
Releases
Package registry
Container registry
Model registry
Operate
Environments
Terraform modules
Monitor
Incidents
Analyze
Value stream analytics
Contributor analytics
CI/CD analytics
Repository analytics
Model experiments
Help
Help
Support
GitLab documentation
Compare GitLab plans
Community forum
Contribute to GitLab
Provide feedback
Keyboard shortcuts
?
Snippets
Groups
Projects
Show more breadcrumbs
GÉANT Orchestration and Automation Team
GAP
GÉANT Service Orchestrator
Commits
68639f09
Commit
68639f09
authored
1 year ago
by
JORGE SASIAIN
Browse files
Options
Downloads
Patches
Plain Diff
NAT-212
/213: more code improvements, and validate_network method
parent
efd77610
Branches
Branches containing commit
Tags
Tags containing commit
1 merge request
!52
Feature/nat 212 213
Pipeline
#83732
failed
1 year ago
Stage: tox
Stage: documentation
Changes
1
Pipelines
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
gso/services/ipam.py
+71
-36
71 additions, 36 deletions
gso/services/ipam.py
with
71 additions
and
36 deletions
gso/services/ipam.py
+
71
−
36
View file @
68639f09
...
...
@@ -87,7 +87,7 @@ def assert_host_in_service(
oss_ipv4_containers
=
None
,
oss_ipv6_containers
=
None
,
oss_ipv4_networks
=
None
,
oss_ipv6_networks
=
None
,
oss_ipv6_networks
=
None
):
# IPv4
if
oss_ipv4_containers
:
...
...
@@ -110,6 +110,33 @@ def assert_host_in_service(
),
"
Host
'
s IPv6 address doesn
'
t belong to service type.
"
def
assert_network_in_service
(
ipv4_network
:
Optional
[
V4ServiceNetwork
]
=
None
,
ipv6_network
:
Optional
[
V6ServiceNetwork
]
=
None
,
oss_ipv4_containers
=
None
,
oss_ipv6_containers
=
None
,
oss_ipv4_networks
=
None
,
oss_ipv6_networks
=
None
):
# IPv4
if
ipv4_network
:
if
oss_ipv4_containers
:
assert
any
(
ipv4_network
.
subnet_of
(
oss_ipv4_container
)
for
oss_ipv4_container
in
oss_ipv4_containers
),
"
Network doesn
'
t belong to service type.
"
else
:
assert
ipv4_network
in
oss_ipv4_networks
,
"
Network doesn
'
t belong to service type.
"
# IPv6
if
ipv6_network
:
if
oss_ipv6_containers
:
assert
any
(
ipv6_network
.
subnet_of
(
oss_ipv6_container
)
for
oss_ipv6_container
in
oss_ipv6_containers
),
"
Network doesn
'
t belong to service type.
"
else
:
assert
ipv6_network
in
oss_ipv6_networks
,
"
Network doesn
'
t belong to service type.
"
def
find_networks
(
network_container
:
Optional
[
str
]
=
""
,
network
:
Optional
[
str
]
=
""
,
ip_version
:
int
=
4
):
"""
If network_container is not None, find all networks within the specified container.
Otherwise, if network is not None, find the specified network.
...
...
@@ -126,7 +153,7 @@ def find_networks(network_container: Optional[str] = "", network: Optional[str]
if
network_container
:
params
=
{
"
network_container
"
:
network_container
}
elif
network
:
params
=
{
"
network
"
:
network
}
params
=
{
"
network
"
:
network
,
"
_return_fields
"
:
"
comment
"
}
r
=
requests
.
get
(
f
"
{
wapi
(
infoblox_params
)
}
/
{
endpoint
}
"
,
params
=
params
,
...
...
@@ -281,7 +308,7 @@ def allocate_host_inner(
cname_aliases
=
[]
if
extattrs
is
None
:
extattrs
=
{}
assert
addrs
or
networks
,
"
You must specify either the host addresses or the networks CIDR
.
"
assert
addrs
or
networks
,
"
Neither networks nor host addresses could be derived to allocate host
.
"
oss
=
settings
.
load_oss_params
()
assert
oss
.
IPAM
.
INFOBLOX
infoblox_params
=
oss
.
IPAM
.
INFOBLOX
...
...
@@ -454,19 +481,11 @@ def allocate_host(
ipv6_network
=
str
(
oss_ipv6_networks
[
ipv6_network_index
])
elif
service_networks
:
# IPv4
ipv4_network
=
service_networks
.
v4
if
oss_ipv4_containers
:
assert
any
(
ipv4_network
.
subnet_of
(
oss_ipv4_container
)
for
oss_ipv4_container
in
oss_ipv4_containers
)
else
:
assert
ipv4_network
in
oss_ipv4_networks
# IPv6
ipv6_network
=
service_networks
.
v6
if
oss_ipv6_containers
:
assert
any
(
ipv6_network
.
subnet_of
(
oss_ipv6_container
)
for
oss_ipv6_container
in
oss_ipv6_containers
)
else
:
assert
ipv6_network
in
oss_ipv6_networks
assert_network_in_service
(
ipv4_network
,
ipv6_network
,
oss_ipv4_containers
,
oss_ipv6_containers
,
oss_ipv4_networks
,
oss_ipv6_networks
)
host
=
allocate_host_inner
(
hostname
=
hostname
+
domain_name
,
...
...
@@ -476,7 +495,7 @@ def allocate_host(
extattrs
=
extattrs
,
)
assert
"
NETWORK_FULL
"
not
in
host
,
"
Network is full.
"
assert
"
NETWORK_NOT_FOUND
"
not
in
host
,
"
Network does not exist. Create it first.
"
assert
"
NETWORK_NOT_FOUND
"
not
in
host
,
"
Network does not exist
in IPAM
. Create it first.
"
elif
host_addresses
:
ipv4_addr
=
host_addresses
.
v4
...
...
@@ -508,35 +527,30 @@ def delete_network(
assert
ipam_params
.
INFOBLOX
infoblox_params
=
ipam_params
.
INFOBLOX
assert
network
,
"
No network specified to delete.
"
assert
hasattr
(
ipam_params
,
service_type
)
and
service_type
!=
"
INFOBLOX
"
,
"
Invalid service type.
"
ip_version
=
ip_network_version
(
str
(
network
))
# Ensure that the network to be deleted is under the service type.
# Otherwise user is not allowed to delete it
oss_ipv4_containers
=
getattr
(
ipam_params
,
service_type
).
V4
.
containers
oss_ipv6_containers
=
getattr
(
ipam_params
,
service_type
).
V6
.
containers
oss_ipv4_networks
=
getattr
(
ipam_params
,
service_type
).
V4
.
networks
oss_ipv6_networks
=
getattr
(
ipam_params
,
service_type
).
V6
.
networks
ipv4_network
=
None
ipv6_network
=
None
if
ip_version
==
4
:
oss_ipv4_containers
=
getattr
(
ipam_params
,
service_type
).
V4
.
containers
oss_ipv4_networks
=
getattr
(
ipam_params
,
service_type
).
V4
.
networks
if
oss_ipv4_containers
:
assert
any
(
network
.
subnet_of
(
oss_ipv4_container
)
for
oss_ipv4_container
in
oss_ipv4_containers
),
"
Can
'
t delete: network doesn
'
t belong to service type.
"
else
:
assert
network
in
oss_ipv4_networks
,
"
Can
'
t delete: network doesn
'
t belong to service type.
"
ipv4_network
=
network
else
:
oss_ipv6_containers
=
getattr
(
ipam_params
,
service_type
).
V6
.
containers
oss_ipv6_networks
=
getattr
(
ipam_params
,
service_type
).
V6
.
networks
if
oss_ipv6_containers
:
assert
any
(
network
.
subnet_of
(
oss_ipv6_container
)
for
oss_ipv6_container
in
oss_ipv6_containers
),
"
Can
'
t delete: network doesn
'
t belong to service type.
"
else
:
assert
network
in
oss_ipv6_networks
,
"
Can
'
t delete: network doesn
'
t belong to service type.
"
ipv6_network
=
network
assert_network_in_service
(
ipv4_network
,
ipv6_network
,
oss_ipv4_containers
,
oss_ipv6_containers
,
oss_ipv4_networks
,
oss_ipv6_networks
)
network_info
=
find_networks
(
network
=
str
(
network
),
ip_version
=
ip_version
)
assert
len
(
network_info
)
==
1
,
"
Network does not exist.
"
assert
"
_ref
"
in
network_info
[
0
]
assert
len
(
network_info
)
==
1
,
"
Network
to delete
does not exist
in IPAM
.
"
assert
"
_ref
"
in
network_info
[
0
]
,
"
Network to delete does not exist in IPAM.
"
r
=
requests
.
delete
(
f
'
{
wapi
(
infoblox_params
)
}
/
{
network_info
[
0
][
"
_ref
"
]
}
'
,
...
...
@@ -573,6 +587,7 @@ def delete_host(
assert
ipam_params
.
INFOBLOX
infoblox_params
=
ipam_params
.
INFOBLOX
assert
host_addresses
,
"
No host specified to delete.
"
assert
hasattr
(
ipam_params
,
service_type
)
and
service_type
!=
"
INFOBLOX
"
,
"
Invalid service type.
"
oss_ipv4_containers
=
getattr
(
ipam_params
,
service_type
).
V4
.
containers
oss_ipv6_containers
=
getattr
(
ipam_params
,
service_type
).
V6
.
containers
...
...
@@ -606,8 +621,8 @@ def delete_host(
timeout
=
REQUESTS_TIMEOUT
)
host_data
=
r
.
json
()
assert
len
(
host_data
)
==
1
,
"
Host does not exist.
"
assert
"
_ref
"
in
host_data
[
0
]
assert
len
(
host_data
)
==
1
,
"
Host
to delete
does not exist
in IPAM
.
"
assert
"
_ref
"
in
host_data
[
0
]
,
"
Host to delete does not exist in IPAM.
"
host_ref
=
host_data
[
0
][
"
_ref
"
]
# Find cname records reference
...
...
@@ -647,3 +662,23 @@ def delete_host(
assert
r
.
status_code
>=
200
and
r
.
status_code
<
300
,
f
"
HTTP error
{
r
.
status_code
}
:
{
r
.
reason
}
\n\n
{
r
.
text
}
"
return
host_addresses
def
validate_network
(
gso_subscription_id
:
str
=
""
,
network
:
Union
[
V4ServiceNetwork
,
V6ServiceNetwork
]
=
None
,
service_type
:
str
=
""
)
->
Union
[
V4ServiceNetwork
,
V6ServiceNetwork
]:
"""
Validate IPv4 or IPv6 network.
Check if the specified network exist, and, if it does,
check if its comment field contains gso_subscription_id.
"""
assert
network
,
"
No network specified to validate.
"
ip_version
=
ip_network_version
(
str
(
network
))
network_info
=
find_networks
(
network
=
str
(
network
),
ip_version
=
ip_version
)
assert
len
(
network_info
)
==
1
and
"
_ref
"
in
network_info
[
0
],
"
Network to validate not found in IPAM.
"
assert
"
comment
"
in
network_info
[
0
],
"
Network to validate does not have comment in IPAM.
"
assert
gso_subscription_id
in
network_info
[
0
][
"
comment
"
],
"
GSO subscription ID does not match the one in the comment field of the IPAM network.
"
return
network
This diff is collapsed.
Click to expand it.
Preview
0%
Loading
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Save comment
Cancel
Please
register
or
sign in
to comment