Fix Bug 1911 Root disk cannot be a Persistent Volume 43/12043/1
authoraticig <gulsum.atici@canonical.com>
Thu, 12 May 2022 18:35:47 +0000 (21:35 +0300)
committeraticig <gulsum.atici@canonical.com>
Thu, 12 May 2022 19:12:21 +0000 (22:12 +0300)
By this fix, VNFs could have persistent root disk if the disk type is defined as persistent-storage.
Besides, the problem of creating unnecessary empty persistent volume is solved.

Change-Id: Ibb48fab8084962a0983c2a5260ae97b53eee8f4d
Signed-off-by: aticig <gulsum.atici@canonical.com>
NG-RO/osm_ng_ro/ns.py
RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py
releasenotes/notes/fix_bug_1911-e84f3fe699d114cf.yaml [new file with mode: 0644]

index 2ca12eb..3a7929c 100644 (file)
@@ -921,14 +921,37 @@ class Ns(object):
                 if ssh_keys:
                     cloud_config["key-pairs"] = ssh_keys
 
-                disk_list = None
+                persistent_root_disk = {}
+                disk_list = []
+                vnfd_id = vnfr["vnfd-id"]
+                vnfd = self.db.get_one("vnfds", {"_id": vnfd_id})
+                for vdu in vnfd.get("vdu", ()):
+                    if vdu["name"] == target_vdu["vdu-name"]:
+                        for vsd in vnfd.get("virtual-storage-desc", ()):
+                            if (
+                                vsd.get("id")
+                                == vdu.get("virtual-storage-desc", [[]])[0]
+                            ):
+                                root_disk = vsd
+                                if root_disk.get(
+                                    "type-of-storage"
+                                ) == "persistent-storage:persistent-storage" and root_disk.get(
+                                    "size-of-storage"
+                                ):
+                                    persistent_root_disk[vsd["id"]] = {
+                                        "image_id": vdu.get("sw-image-desc"),
+                                        "size": root_disk["size-of-storage"],
+                                    }
+                                    disk_list.append(persistent_root_disk[vsd["id"]])
+
                 if target_vdu.get("virtual-storages"):
-                    disk_list = [
-                        {"size": disk["size-of-storage"]}
-                        for disk in target_vdu["virtual-storages"]
-                        if disk.get("type-of-storage")
-                        == "persistent-storage:persistent-storage"
-                    ]
+                    for disk in target_vdu["virtual-storages"]:
+                        if (
+                            disk.get("type-of-storage")
+                            == "persistent-storage:persistent-storage"
+                            and disk["id"] not in persistent_root_disk.keys()
+                        ):
+                            disk_list.append({"size": disk["size-of-storage"]})
 
                 affinity_group_list = []
 
index a15a53c..92e1f56 100644 (file)
@@ -1867,6 +1867,7 @@ class vimconnector(vimconn.VimConnector):
 
             # Create additional volumes in case these are present in disk_list
             base_disk_index = ord("b")
+            boot_volume_id = None
             if disk_list:
                 block_device_mapping = {}
                 for disk in disk_list:
@@ -1876,11 +1877,13 @@ class vimconnector(vimconn.VimConnector):
                         ]
                     else:
                         if "image_id" in disk:
+                            base_disk_index = ord("a")
                             volume = self.cinder.volumes.create(
                                 size=disk["size"],
                                 name=name + "_vd" + chr(base_disk_index),
                                 imageRef=disk["image_id"],
                             )
+                            boot_volume_id = volume.id
                         else:
                             volume = self.cinder.volumes.create(
                                 size=disk["size"],
@@ -1912,7 +1915,8 @@ class vimconnector(vimconn.VimConnector):
                         "Timeout creating volumes for instance " + name,
                         http_code=vimconn.HTTP_Request_Timeout,
                     )
-
+                if boot_volume_id:
+                    self.cinder.volumes.set_bootable(boot_volume_id, True)
             # get availability Zone
             vm_av_zone = self._get_vm_availability_zone(
                 availability_zone_index, availability_zone_list
diff --git a/releasenotes/notes/fix_bug_1911-e84f3fe699d114cf.yaml b/releasenotes/notes/fix_bug_1911-e84f3fe699d114cf.yaml
new file mode 100644 (file)
index 0000000..fdcbf34
--- /dev/null
@@ -0,0 +1,22 @@
+#######################################################################################
+# Copyright ETSI Contributors and Others.
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+#    http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+# implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#######################################################################################
+---
+fixes:
+  - |
+    This fixes the bug 1911 Root disk cannot be a Persistent Volume. VNFs could have
+    persistent root disk if the disk type is defined as persistent-storage. Besides,
+    the problem of creating one more persistent volume is solved.
\ No newline at end of file