+BOOT_FROM_VOLUME, BOOT_FROM_IMAGE = 1, 2
+
+RES_VOLUME = "volume"
+RES_NETWORK = "network"
+RES_SUBNET = "subnet"
+RES_PORT = "port"
+RES_FLAVOR = "flavor"
+RES_VM = "vm"
+NOT_PREDEFINED = 1
+
+
+def get_tenant_id(vim_cache, vim_id, tenant_name):
+ if vim_id not in vim_cache:
+ tenants = api.list_tenant(vim_id)
+ vim_cache[vim_id] = {}
+ for tenant in tenants["tenants"]:
+ id, name = tenant["id"], tenant["name"]
+ vim_cache[vim_id][name] = id
+ if tenant_name not in vim_cache[vim_id]:
+ raise VimException("Tenant(%s) not found in vim(%s)" % (tenant_name, vim_id), ERR_CODE)
+ return vim_cache[vim_id][tenant_name]
+
+
+def set_res_cache(res_cache, res_type, key, val):
+ if res_type not in res_cache:
+ res_cache[res_type] = {}
+ if key in res_cache[res_type]:
+ raise VimException("Duplicate key(%s) of %s" % (key, res_type), ERR_CODE)
+ res_cache[res_type][key] = val
+
+
+def get_res_id(res_cache, res_type, key):
+ if res_type not in res_cache:
+ raise VimException("%s not found in cache" % res_type, ERR_CODE)
+ if key not in res_cache[res_type]:
+ raise VimException("%s(%s) not found in cache" % (res_type, key), ERR_CODE)
+ return res_cache[res_type][key]
+
+
+def action_vm(action_type, server, vimId, tenantId):
+ param = {}
+ if action_type == ACTION_TYPE.START:
+ param = {
+ "os-start": None,
+ }
+ elif action_type == ACTION_TYPE.STOP:
+ param = {
+ "os-stop": None,
+ }
+ elif action_type == ACTION_TYPE.REBOOT:
+ param = {
+ "reboot": {}
+ }
+ if server["status"] == "ACTIVE":
+ param["reboot"]["type"] = "SOFT"
+ else:
+ param["reboot"]["type"] = "HARD"
+ res_id = server["id"]
+ api.action_vm(vimId, tenantId, res_id, param)
+
+
+# TODO Have to check if the resources should be started and stopped in some order.
+def operate_vim_res(data, changeStateTo, stopType, gracefulStopTimeout, do_notify_op):
+ for res in ignore_case_get(data, "vm"):
+ try:
+ if changeStateTo == "STARTED":
+ action_vm(ACTION_TYPE.START, res, res["vim_id"], res["tenant_id"])
+ do_notify_op("ACTIVE", res["id"])
+ elif changeStateTo == "STOPPED":
+ if stopType == "GRACEFUL":
+ if gracefulStopTimeout > 60:
+ gracefulStopTimeout = 60
+ time.sleep(gracefulStopTimeout)
+ action_vm(ACTION_TYPE.STOP, res, res["vim_id"], res["tenant_id"])
+ do_notify_op("INACTIVE", res["id"])
+ except VimException as e:
+ logger.error("Failed to Operate %s(%s)", RES_VM, res["res_id"])
+ logger.error("%s:%s", e.http_code, e.message)
+ 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):