Feature 10887: Add cross-model relations support

Changes:
- Update the `osm_lcm.ns.NsLcm._add_vca_relations` function, and
decouple it into simpler and smaller functions.
- Get relation data for the descriptor taking into account the changes
introduced here: https://osm.etsi.org/gerrit/11212/
- Add `osm_lcm.data_utils.vca` module to take care of VCA related parts
in the IM
- Add a couple of functions into the `osm_lcm.data_utils` package:
  - nsd: get_vnf_profile(), get_ns_configuration(),
get_ns_configuration_relation_list()
  - nsr: get_nsd(), get_deployed_vca_list(), get_deployed_vca()
  - vnfd: get_relation_list()
- Rename `osm_lcm.data_utils.vnfd.get_kdu_profile` to `osm_lcm.data_utils.vnfd.get_kdu_resource_profile`

Change-Id: I6da29e656d092e17c85b44f5b3960a6ca3aa3ad8
Signed-off-by: David Garcia <david.garcia@canonical.com>
diff --git a/osm_lcm/data_utils/nsd.py b/osm_lcm/data_utils/nsd.py
index 2917c04..9b6fb81 100644
--- a/osm_lcm/data_utils/nsd.py
+++ b/osm_lcm/data_utils/nsd.py
@@ -23,11 +23,20 @@
 ##
 import ast
 
+from osm_lcm.data_utils.list_utils import find_in_list
+
 
 def get_vnf_profiles(nsd):
     return nsd.get("df")[0].get("vnf-profile", ())
 
 
+def get_vnf_profile(nsd, vnf_profile_id):
+    return find_in_list(
+        get_vnf_profiles(nsd),
+        lambda vnf_profile: vnf_profile["id"] == vnf_profile_id,
+    )
+
+
 def get_virtual_link_profiles(nsd):
     return nsd.get("df")[0].get("virtual-link-profile", ())
 
@@ -36,3 +45,11 @@
     dict_str = str(nsd)
     dict_str.replace(old_vnf_id, new_vnf_id)
     return ast.literal_eval(dict_str)
+
+
+def get_ns_configuration(nsd):
+    return nsd.get("ns-configuration", {})
+
+
+def get_ns_configuration_relation_list(nsd):
+    return get_ns_configuration(nsd).get("relation", [])