X-Git-Url: https://osm.etsi.org/gitweb/?a=blobdiff_plain;f=RO-VIM-openstack%2Fosm_rovim_openstack%2Fvimconn_openstack.py;h=3aaedf60b9d99be35b17e32dfd681a929468cb03;hb=refs%2Fchanges%2F86%2F12586%2F5;hp=ef5c74096ff9a8ebd966cb371cce255b8cd65211;hpb=29a4c1a24050561a70f4f47b276a268d48c79067;p=osm%2FRO.git diff --git a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py index ef5c7409..3aaedf60 100644 --- a/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py +++ b/RO-VIM-openstack/osm_rovim_openstack/vimconn_openstack.py @@ -1283,13 +1283,7 @@ class vimconnector(vimconn.VimConnector): if numas: numa_nodes = len(numas) - if numa_nodes > 1: - return -1, "Can not add flavor with more than one numa" - extra_specs["hw:numa_nodes"] = str(numa_nodes) - extra_specs["hw:mem_page_size"] = "large" - extra_specs["hw:cpu_policy"] = "dedicated" - extra_specs["hw:numa_mempolicy"] = "strict" if self.vim_type == "VIO": extra_specs[ @@ -1298,13 +1292,25 @@ class vimconnector(vimconn.VimConnector): extra_specs["vmware:latency_sensitivity_level"] = "high" for numa in numas: + if "id" in numa: + node_id = numa["id"] + + if "memory" in numa: + memory_mb = numa["memory"] * 1024 + memory = "hw:numa_mem.{}".format(node_id) + extra_specs[memory] = int(memory_mb) + + if "vcpu" in numa: + vcpu = numa["vcpu"] + cpu = "hw:numa_cpus.{}".format(node_id) + vcpu = ",".join(map(str, vcpu)) + extra_specs[cpu] = vcpu + # overwrite ram and vcpus # check if key "memory" is present in numa else use ram value at flavor - if "memory" in numa: - ram = numa["memory"] * 1024 # See for reference: https://specs.openstack.org/openstack/nova-specs/specs/mitaka/ # implemented/virt-driver-cpu-thread-pinning.html - extra_specs["hw:cpu_sockets"] = 1 + extra_specs["hw:cpu_sockets"] = str(numa_nodes) if "paired-threads" in numa: vcpus = numa["paired-threads"] * 2 @@ -1369,6 +1375,22 @@ class vimconnector(vimconn.VimConnector): "Invalid mempage-size %s. Will be ignored", extended.get("mempage-size"), ) + if extended.get("cpu-pinning-policy"): + extra_specs["hw:cpu_policy"] = extended.get( + "cpu-pinning-policy" + ).lower() + + # Set the cpu thread pinning policy as specified in the descriptor + if extended.get("cpu-thread-pinning-policy"): + extra_specs["hw:cpu_thread_policy"] = extended.get( + "cpu-thread-pinning-policy" + ).lower() + + # Set the mem policy as specified in the descriptor + if extended.get("mem-policy"): + extra_specs["hw:numa_mempolicy"] = extended.get( + "mem-policy" + ).lower() # create flavor new_flavor = self.nova.flavors.create( @@ -1898,32 +1920,61 @@ class vimconnector(vimconn.VimConnector): if disk_list: block_device_mapping = {} for disk in disk_list: - if disk.get("vim_id"): - block_device_mapping["_vd" + chr(base_disk_index)] = disk[ - "vim_id" - ] - existing_vim_volumes.append({"id": disk["vim_id"]}) - else: - if "image_id" in disk: - base_disk_index = ord("a") + if "image_id" in disk: + # persistent root volume + base_disk_index = ord("a") + image_id = "" + # use existing persistent root volume + if disk.get("vim_volume_id"): + block_device_mapping["vd" + chr(base_disk_index)] = disk[ + "vim_volume_id" + ] + existing_vim_volumes.append({"id": disk["vim_volume_id"]}) + # use existing persistent root volume + elif disk.get("vim_id"): + block_device_mapping["vd" + chr(base_disk_index)] = disk[ + "vim_id" + ] + existing_vim_volumes.append({"id": disk["vim_id"]}) + else: + # create persistent root volume volume = self.cinder.volumes.create( size=disk["size"], - name=name + "_vd" + chr(base_disk_index), + name=name + "vd" + chr(base_disk_index), imageRef=disk["image_id"], # Make sure volume is in the same AZ as the VM to be attached to availability_zone=vm_av_zone, ) boot_volume_id = volume.id + created_items["volume:" + str(volume.id)] = True + block_device_mapping[ + "vd" + chr(base_disk_index) + ] = volume.id + else: + # non-root persistent volume + key_id = ( + "vim_volume_id" + if "vim_volume_id" in disk.keys() + else "vim_id" + ) + if disk.get(key_id): + # use existing persistent volume + block_device_mapping["vd" + chr(base_disk_index)] = disk[ + key_id + ] + existing_vim_volumes.append({"id": disk[key_id]}) else: + # create persistent volume volume = self.cinder.volumes.create( size=disk["size"], - name=name + "_vd" + chr(base_disk_index), + name=name + "vd" + chr(base_disk_index), # Make sure volume is in the same AZ as the VM to be attached to availability_zone=vm_av_zone, ) - - created_items["volume:" + str(volume.id)] = True - block_device_mapping["_vd" + chr(base_disk_index)] = volume.id + created_items["volume:" + str(volume.id)] = True + block_device_mapping[ + "vd" + chr(base_disk_index) + ] = volume.id base_disk_index += 1 @@ -1988,9 +2039,9 @@ class vimconnector(vimconn.VimConnector): ) ) server = self.nova.servers.create( - name, - image_id, - flavor_id, + name=name, + image=image_id, + flavor=flavor_id, nics=net_list_vim, security_groups=self.config.get("security_groups"), # TODO remove security_groups in future versions. Already at neutron port @@ -2295,7 +2346,7 @@ class vimconnector(vimconn.VimConnector): try: k_item, _, k_id = k.partition(":") if k_item == "port": - port_dict = self.neutron.list_ports(device_id=vm_id) + port_dict = self.neutron.list_ports() existing_ports = [ port["id"] for port in port_dict["ports"] if port_dict ]