Permit duplicate VNIs in templates with flag

Supports niche usecases whereby a network template should contain the
same VNI(s) more than once.
This commit is contained in:
2024-02-09 12:12:04 -05:00
parent d63cc2e661
commit 3bc500bc55
3 changed files with 61 additions and 21 deletions

View File

@ -7139,7 +7139,11 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
"name": "vni",
"required": True,
"helptext": "A valid VNI must be specified.",
}
},
{
"name": "permit_duplicate",
"required": False,
},
]
)
@Authenticator
@ -7155,6 +7159,11 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
type: integer
required: false
description: PVC network VNI
- in: query
name: permit_duplicate
type: boolean
required: false
description: Bypass checks to permit duplicate VNIs for niche usecases
responses:
200:
description: OK
@ -7168,7 +7177,7 @@ class API_Provisioner_Template_Network_Net_Root(Resource):
id: Message
"""
return api_provisioner.create_template_network_element(
template, reqargs.get("vni", None)
template, reqargs.get("vni", None), reqargs.get("permit_duplicate", False)
)
@ -7206,13 +7215,27 @@ class API_Provisioner_Template_Network_Net_Element(Resource):
return _vni, 200
abort(404)
@RequestParser(
[
{
"name": "permit_duplicate",
"required": False,
}
]
)
@Authenticator
def post(self, template, vni):
def post(self, template, vni, reqargs):
"""
Create a new network {vni} in network template {template}
---
tags:
- provisioner / template
parameters:
- in: query
name: permit_duplicate
type: boolean
required: false
description: Bypass checks to permit duplicate VNIs for niche usecases
responses:
200:
description: OK
@ -7225,7 +7248,9 @@ class API_Provisioner_Template_Network_Net_Element(Resource):
type: object
id: Message
"""
return api_provisioner.create_template_network_element(template, vni)
return api_provisioner.create_template_network_element(
template, vni, reqargs.get("permit_duplicate", False)
)
@Authenticator
def delete(self, template, vni):

View File

@ -284,27 +284,28 @@ def create_template_network(name, mac_template=None):
return retmsg, retcode
def create_template_network_element(name, vni):
def create_template_network_element(name, vni, permit_duplicate=False):
if list_template_network(name, is_fuzzy=False)[-1] != 200:
retmsg = {"message": 'The network template "{}" does not exist.'.format(name)}
retcode = 400
return retmsg, retcode
networks, code = list_template_network_vnis(name)
if code != 200:
networks = []
found_vni = False
for network in networks:
if network["vni"] == vni:
found_vni = True
if found_vni:
retmsg = {
"message": 'The VNI "{}" in network template "{}" already exists.'.format(
vni, name
)
}
retcode = 400
return retmsg, retcode
if not permit_duplicate:
networks, code = list_template_network_vnis(name)
if code != 200:
networks = []
found_vni = False
for network in networks:
if network["vni"] == vni:
found_vni = True
if found_vni:
retmsg = {
"message": 'The VNI "{}" in network template "{}" already exists.'.format(
vni, name
)
}
retcode = 400
return retmsg, retcode
conn, cur = open_database(config)
try: