BaseTopic.format_on_new(content, project_id=project_id, make_public=make_public)
content["_admin"]["onboardingState"] = "CREATED"
content["_admin"]["operationalState"] = "DISABLED"
- content["_admin"]["usageSate"] = "NOT_IN_USE"
+ content["_admin"]["usageState"] = "NOT_IN_USE"
def delete(self, session, _id, force=False, dry_run=False):
"""
clean_indata = clean_indata['vnfd:vnfd'][0]
return clean_indata
+ def check_conflict_on_edit(self, session, final_content, edit_content, _id, force=False):
+ super().check_conflict_on_edit(session, final_content, edit_content, _id, force=force)
+
+ # set type of vnfd
+ contains_pdu = False
+ contains_vdu = False
+ for vdu in get_iterable(final_content.get("vdu")):
+ if vdu.get("pdu-type"):
+ contains_pdu = True
+ else:
+ contains_vdu = True
+ if contains_pdu:
+ final_content["_admin"]["type"] = "hnfd" if contains_vdu else "pnfd"
+ elif contains_vdu:
+ final_content["_admin"]["type"] = "vnfd"
+ # if neither vud nor pdu do not fill type
+
def check_conflict_on_del(self, session, _id, force=False):
"""
Check that there is not any NSD that uses this VNFD. Only NSDs belonging to this project are considered. Note
def _validate_input_new(self, indata, force=False):
indata = self.pyangbind_validation("vnfds", indata, force)
# Cross references validation in the descriptor
- if not indata.get("mgmt-interface"):
- raise EngineException("'mgmt-interface' is a mandatory field and it is not defined",
- http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
- if indata["mgmt-interface"].get("cp"):
- for cp in get_iterable(indata.get("connection-point")):
- if cp["name"] == indata["mgmt-interface"]["cp"]:
- break
- else:
- raise EngineException("mgmt-interface:cp='{}' must match an existing connection-point"
- .format(indata["mgmt-interface"]["cp"]),
+ if indata.get("vdu"):
+ if not indata.get("mgmt-interface"):
+ raise EngineException("'mgmt-interface' is a mandatory field and it is not defined",
http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
+ if indata["mgmt-interface"].get("cp"):
+ for cp in get_iterable(indata.get("connection-point")):
+ if cp["name"] == indata["mgmt-interface"]["cp"]:
+ break
+ else:
+ raise EngineException("mgmt-interface:cp='{}' must match an existing connection-point"
+ .format(indata["mgmt-interface"]["cp"]),
+ http_code=HTTPStatus.UNPROCESSABLE_ENTITY)
for vdu in get_iterable(indata.get("vdu")):
for interface in get_iterable(vdu.get("interface")):
raise EngineException("There is some NSR that depends on this NSD", http_code=HTTPStatus.CONFLICT)
+class NstTopic(DescriptorTopic):
+ topic = "nsts"
+ topic_msg = "nst"
+
+ def __init__(self, db, fs, msg):
+ DescriptorTopic.__init__(self, db, fs, msg)
+
+ @staticmethod
+ def _remove_envelop(indata=None):
+ if not indata:
+ return {}
+ clean_indata = indata
+
+ if clean_indata.get('nst:nst'):
+ clean_indata = clean_indata['nst:nst']
+ elif clean_indata.get('nst'):
+ clean_indata = clean_indata['nst']
+ if clean_indata.get('nst'):
+ if not isinstance(clean_indata['nst'], list) or len(clean_indata['nst']) != 1:
+ raise EngineException("'nst' must be a list only one element")
+ clean_indata = clean_indata['nst'][0]
+ return clean_indata
+
+ def _validate_input_edit(self, indata, force=False):
+ # TODO validate with pyangbind, serialize
+ return indata
+
+ def _check_descriptor_dependencies(self, session, descriptor):
+ """
+ Check that the dependent descriptors exist on a new descriptor or edition
+ :param session: client session information
+ :param descriptor: descriptor to be inserted or edit
+ :return: None or raises exception
+ """
+ if not descriptor.get("netslice-subnet"):
+ return
+ for nsd in descriptor["netslice-subnet"]:
+ nsd_id = nsd["nsd-ref"]
+ filter_q = self._get_project_filter(session, write=False, show_all=True)
+ filter_q["id"] = nsd_id
+ if not self.db.get_list("nsds", filter_q):
+ raise EngineException("Descriptor error at 'netslice-subnet':'nsd-ref'='{}' references a non "
+ "existing nsd".format(nsd_id), http_code=HTTPStatus.CONFLICT)
+
+ def check_conflict_on_edit(self, session, final_content, edit_content, _id, force=False):
+ super().check_conflict_on_edit(session, final_content, edit_content, _id, force=force)
+
+ self._check_descriptor_dependencies(session, final_content)
+
+ def check_conflict_on_del(self, session, _id, force=False):
+ """
+ Check that there is not any NSIR that uses this NST. Only NSIRs belonging to this project are considered. Note
+ that NST can be public and be used by other projects.
+ :param session:
+ :param _id: nst internal id
+ :param force: Avoid this checking
+ :return: None or raises EngineException with the conflict
+ """
+ # TODO: Check this method
+ if force:
+ return
+ # Get Network Slice Template from Database
+ _filter = self._get_project_filter(session, write=False, show_all=False)
+ _filter["_id"] = _id
+ nst = self.db.get_one("nst", _filter)
+
+ # Search NSIs using NST via nst-ref
+ _filter = self._get_project_filter(session, write=False, show_all=False)
+ _filter["nst-ref"] = nst["id"]
+ if self.db.get_list("nsis", _filter):
+ raise EngineException("There is some NSIS that depends on this NST", http_code=HTTPStatus.CONFLICT)
+
+
class PduTopic(BaseTopic):
topic = "pdus"
topic_msg = "pdu"
@staticmethod
def format_on_new(content, project_id=None, make_public=False):
- BaseTopic.format_on_new(content, project_id=None, make_public=make_public)
+ BaseTopic.format_on_new(content, project_id=project_id, make_public=make_public)
content["_admin"]["onboardingState"] = "CREATED"
- content["_admin"]["operationalState"] = "DISABLED"
- content["_admin"]["usageSate"] = "NOT_IN_USE"
+ content["_admin"]["operationalState"] = "ENABLED"
+ content["_admin"]["usageState"] = "NOT_IN_USE"
def check_conflict_on_del(self, session, _id, force=False):
if force: