X-Git-Url: https://gerrit.onap.org/r/gitweb?a=blobdiff_plain;f=lcm%2Flcm%2Fpub%2Fvimapi%2Fadaptor.py;h=3b959c450b63e2388afb58efc2bb0f7d3f3e917f;hb=0424858cefb1c6b8b06796304b04eff4af487937;hp=f47c3370f4476a6c781133d966de70c2e533ccdb;hpb=86af279acebf863b46693e8ba0f2f43013b2b66e;p=vfc%2Fgvnfm%2Fvnflcm.git diff --git a/lcm/lcm/pub/vimapi/adaptor.py b/lcm/lcm/pub/vimapi/adaptor.py index f47c3370..3b959c45 100644 --- a/lcm/lcm/pub/vimapi/adaptor.py +++ b/lcm/lcm/pub/vimapi/adaptor.py @@ -15,12 +15,15 @@ import logging import time import json +import os +import base64 from lcm.pub.utils.values import ignore_case_get, set_opt_val from lcm.pub.msapi.aai import get_flavor_info from . import api from .exceptions import VimException -from lcm.nf.const import ACTION_TYPE +from lcm.pub.exceptions import NFLCMException +from lcm.nf.const import ACTION_TYPE, HEAL_ACTION_TYPE logger = logging.getLogger(__name__) @@ -101,17 +104,30 @@ def operate_vim_res(data, changeStateTo, stopType, gracefulStopTimeout, do_notif gracefulStopTimeout = 60 time.sleep(gracefulStopTimeout) action_vm(ACTION_TYPE.STOP, res, res["vim_id"], res["tenant_id"]) - # TODO check if the we should poll getvm to get the status or the action_vm api - # successful return should suffice to mark vm as Active/Inactive do_notify_op("INACTIVE", res["id"]) except VimException as e: - # TODO Have to update database appropriately on failure - logger.error("Failed to Heal %s(%s)", RES_VM, res["res_id"]) + logger.error("Failed to Operate %s(%s)", RES_VM, res["res_id"]) logger.error("%s:%s", e.http_code, e.message) - - -def create_vim_res(data, do_notify): - vim_cache, res_cache = {}, {} + raise NFLCMException("Failed to Operate %s(%s)", RES_VM, res["res_id"]) + + +def heal_vim_res(vdus, vnfd_info, do_notify, data, vim_cache, res_cache): + try: + vimid = data["vimid"] + tenant = data["tenant"] + actionType = data["action"] + if actionType == HEAL_ACTION_TYPE.START: + create_vm(vim_cache, res_cache, vnfd_info, vdus[0], do_notify, RES_VM) + elif actionType == HEAL_ACTION_TYPE.RESTART: + vm_info = api.get_vm(vimid, tenant, vdus[0].resourceid) + action_vm(ACTION_TYPE.REBOOT, vm_info, vimid, tenant) + except VimException as e: + logger.error("Failed to Heal %s(%s)", RES_VM, vdus[0]["vdu_id"]) + logger.error("%s:%s", e.http_code, e.message) + raise NFLCMException("Failed to Heal %s(%s)", RES_VM, vdus[0]["vdu_id"]) + + +def create_vim_res(data, do_notify, vim_cache={}, res_cache={}): for vol in ignore_case_get(data, "volume_storages"): create_volume(vim_cache, res_cache, vol, do_notify, RES_VOLUME) for network in ignore_case_get(data, "vls"): @@ -146,11 +162,11 @@ def delete_vim_res(data, do_notify): def create_volume(vim_cache, res_cache, vol, do_notify, res_type): location_info = vol["properties"]["location_info"] param = { - "name": vol["properties"]["volume_name"], - "volumeSize": int(ignore_case_get(vol["properties"], "size", "0").replace('GB', '').strip()) + "name": vol["properties"]["volume_name"] if vol["properties"].get("volume_name", None) else vol["volume_storage_id"], + "volumeSize": int(ignore_case_get(vol["properties"], "size_of_storage", "0").replace('GB', '').replace('"', '').strip()) } set_opt_val(param, "imageName", ignore_case_get(vol, "image_file")) - set_opt_val(param, "volumeType", ignore_case_get(vol["properties"], "custom_volume_type")) + set_opt_val(param, "volumeType", ignore_case_get(vol["properties"], "type_of_storage")) set_opt_val(param, "availabilityZone", ignore_case_get(location_info, "availability_zone")) vim_id, tenant_name = location_info["vimid"], location_info["tenant"] tenant_id = get_tenant_id(vim_cache, vim_id, tenant_name) @@ -176,7 +192,7 @@ def create_network(vim_cache, res_cache, network, do_notify, res_type): param = { "name": vl_profile["networkName"], "shared": False, - "networkType": vl_profile["networkType"], + "networkType": ignore_case_get(vl_profile, "networkType"), "physicalNetwork": ignore_case_get(vl_profile, "physicalNetwork") } set_opt_val(param, "vlanTransparent", ignore_case_get(vl_profile, "vlanTransparent")) @@ -236,7 +252,7 @@ def create_port(vim_cache, res_cache, data, port, do_notify, res_type): subnet_id = get_res_id(res_cache, RES_SUBNET, port["vl_id"]) param = { "networkId": network_id, - "name": port["properties"].get("name", "undefined") + "name": port["properties"].get("name", "") } set_opt_val(param, "subnetId", subnet_id) set_opt_val(param, "macAddress", ignore_case_get(port["properties"], "mac_address")) @@ -245,9 +261,9 @@ def create_port(vim_cache, res_cache, data, port, do_notify, res_type): l3_address_data = one_protocol_data["address_data"]["l3_address_data"] # l3 is not 13 fixed_ip_address = ignore_case_get(l3_address_data, "fixed_ip_address") ip_address.extend(fixed_ip_address) - for one_virtual_network_interface in port["properties"]["virtual_network_interface_requirements"]: + for one_virtual_network_interface in port["properties"].get("virtual_network_interface_requirements", []): interfaceTypeString = one_virtual_network_interface["network_interface_requirements"]["interfaceType"] - interfaceType = json.loads(interfaceTypeString)["configuration-value"] + interfaceType = json.loads(interfaceTypeString)["configurationValue"] vnic_type = ignore_case_get(port["properties"], "vnic_type") if vnic_type == "": if interfaceType == "SR-IOV": @@ -292,7 +308,7 @@ def create_flavor(vim_cache, res_cache, data, flavor, do_notify, res_type): location_info = flavor["properties"]["location_info"] vim_id, tenant_name = location_info["vimid"], location_info["tenant"] virtual_compute = flavor["virtual_compute"] - virtual_storage = flavor["virtual_storage"] + virtual_storages = flavor["virtual_storages"] virtual_cpu = ignore_case_get(virtual_compute, "virtual_cpu") virtual_memory = ignore_case_get(virtual_compute, "virtual_memory") param = { @@ -304,10 +320,11 @@ def create_flavor(vim_cache, res_cache, data, flavor, do_notify, res_type): # Using flavor name returned by OOF to search falvor vdu_id = ignore_case_get(flavor, "vdu_id") + aai_flavor = None for one_vdu in location_info["vduInfo"]: if one_vdu["vduName"] == vdu_id: + aai_flavor = search_flavor_aai(vim_id, one_vdu["flavorName"]) break - aai_flavor = search_flavor_aai(vim_id, one_vdu["flavorName"]) # Add aai flavor if aai_flavor: @@ -315,15 +332,18 @@ def create_flavor(vim_cache, res_cache, data, flavor, do_notify, res_type): do_notify(res_type, ret) set_res_cache(res_cache, res_type, flavor["vdu_id"], ret["flavor-id"]) else: - disk_type = ignore_case_get(virtual_storage, "type_of_storage") - disk_size = int(ignore_case_get(virtual_storage, "size_of_storage").replace('GB', '').strip()) - if disk_type == "root": - param["disk"] = disk_size - elif disk_type == "ephemeral": - param["ephemeral"] = disk_size - elif disk_type == "swap": - param["swap"] = disk_size - + for virtual_storage in virtual_storages: + vs_id = virtual_storage["virtual_storage_id"] + for vs in data["volume_storages"]: + if vs["volume_storage_id"] == vs_id: + disk_type = ignore_case_get(vs["properties"], "type_of_storage") + disk_size = int(ignore_case_get(vs["properties"], "size_of_storage").replace('GB', '').replace('"', '').strip()) + if disk_type == "root": + param["disk"] = disk_size + elif disk_type == "ephemeral": + param["ephemeral"] = disk_size + elif disk_type == "swap": + param["swap"] = disk_size tenant_id = get_tenant_id(vim_cache, vim_id, tenant_name) logger.debug("param:%s" % param) ret = api.create_flavor(vim_id, tenant_id, param) @@ -351,7 +371,7 @@ def create_vm(vim_cache, res_cache, data, vm, do_notify, res_type): for artifact in vm["artifacts"]: if artifact["artifact_name"] == "sw_image": # TODO: after DM define - img_name = artifact["file"] + img_name = os.path.basename(artifact["file"]) break if not img_name: raise VimException("Undefined image(%s)" % vm["artifacts"], ERR_CODE) @@ -362,9 +382,9 @@ def create_vm(vim_cache, res_cache, data, vm, do_notify, res_type): break if "imageId" not in param["boot"]: raise VimException("Undefined artifacts image(%s)" % vm["artifacts"], ERR_CODE) - elif vm["volume_storages"]: + elif vm["virtual_storages"]: param["boot"]["type"] = BOOT_FROM_VOLUME - vol_id = vm["volume_storages"][0]["volume_storage_id"] + vol_id = vm["virtual_storages"][0]["virtual_storage_id"] param["boot"]["volumeId"] = get_res_id(res_cache, RES_VOLUME, vol_id) else: raise VimException("No image and volume defined", ERR_CODE) @@ -381,8 +401,9 @@ def create_vm(vim_cache, res_cache, data, vm, do_notify, res_type): "volumeId": get_res_id(res_cache, RES_VOLUME, vol_id) }) + user_data = base64.encodestring(ignore_case_get(vm["properties"], "user_data")) set_opt_val(param, "availabilityZone", ignore_case_get(location_info, "availability_zone")) - set_opt_val(param, "userdata", ignore_case_get(vm["properties"], "user_data")) + set_opt_val(param, "userdata", user_data) set_opt_val(param, "metadata", ignore_case_get(vm["properties"], "meta_data")) set_opt_val(param, "securityGroups", "") # TODO List of names of security group set_opt_val(param, "serverGroup", "") # TODO the ServerGroup for anti-affinity and affinity