def execute(self): try: name = self._message.get("hostname") vm_id = self._message.get("instance_id") status = self._message.get("state") LOG.debug("vm create end name is %s status is %s", name, status) t_obj = yield task.get_task_flow(resource=name) if t_obj: if status == "active": yield task.update_task_flow_status(t_obj[0].get("id"), status=4) else: networks = yield get_vms_nics( self._message.get("instance_id")) for network in networks: port_id = network.get("port_id") yield network_module.request_delete_ports( self._message.get("tenant_id"), port_id) yield task.delete_task_flow(t_obj[0].get("id")) iso_list = yield list_server_attach_volume(vm_id, vd_type=3) if iso_list: for iso in iso_list: yield _update_iso_volume_available(iso.get("volume_id")) sys = yield list_server_attach_volume(vm_id, vd_type=1) if sys: image_meta = self._message.get("image_meta") for k, v in image_meta.items(): yield update_volume_image_metadata(sys[0].get("volume_id"), k, v) except Exception, e: LOG.error("instance create end process error %s" % e)
def execute(self): try: name = self._message.get("instance_id") status = self._message.get("state") LOG.debug("vm reboot end name is %s status is %s", name, status) t_obj = yield task.get_task_flow(resource=name) if t_obj: if status == "active": yield task.update_task_flow_status(t_obj[0].get("id"), status=4) else: yield task.delete_task_flow(t_obj[0].get("id")) except Exception, e: LOG.error("vm reboot end process error %s" % e)
def del_server(vm_id_or_name, delete_volume_ids=list()): """ :param vm_id_or_name: :param delete_volume_ids: list :return: """ if vm_id_or_name.startswith("vm-"): server_task = yield task.get_task_flow(resource=vm_id_or_name) if server_task: server_task = server_task[0] task_id = server_task.get("id") server_info = server_task["body"]["server"] networks = server_info["networks"] LOG.debug("vm %s delete task", vm_id_or_name) yield task.delete_task_flow(task_id) tenant_id = server_task.get('tenant') LOG.debug("vm %s free quotas", vm_id_or_name) used_quotas = yield get_tenant_quota(tenant_id=tenant_id) yield update_tenant_vm_quotas( tenant_id=tenant_id, used_cores=used_quotas["used_cores"], used_memory=used_quotas["used_memorys"]) else: try: vm = yield get_server(vm_id_or_name, detailed=False) for volume_id in delete_volume_ids: LOG.debug("delete vm %s with volume %s set deleting status", vm.get("name"), volume_id) yield set_volume_status(volume_id, status='deleting') if str(vm.get("vm_state")) != 'error': LOG.debug("delete vm %s set deleting status", vm.get("name")) yield set_or_update_vm_meta(vm_id_or_name, meta_key="status", meta_value="deleting") attach_volumes = yield list_server_attach_volume(vm_id_or_name, vd_type=0) if attach_volumes: for attach_volume in attach_volumes: # if int(attach_volume.get("type")) == TYPE_VDISK: LOG.debug("detach vm %s with volume %s ", vm.get("name"), attach_volume['volume_id']) yield set_volume_attach_vm_id( attach_volume.get("volume_id"), attach_vm_id=vm_id_or_name) yield detach_server_volume(vm_id_or_name, attach_volume['volume_id']) else: LOG.debug("force delete vm %s ", vm.get("name")) yield server_force_delete(vm_id_or_name) else: LOG.debug("force delete vm %s ", vm.get("name")) yield server_force_delete(vm_id_or_name) try: networks = yield get_vms_nics(vm.get("id")) for network in networks: port_id = network.get("port_id") yield network_module.request_delete_ports( vm.get("tenant_id"), port_id) except Exception as e: LOG.error("delete ports error: %s" % e) raise DeletePortsFailed except Exception as e: try: yield set_or_update_vm_meta(vm_id_or_name, meta_key="status", meta_value="") except Exception as e: raise e LOG.error("del vm error: %s" % e)
def create_reboot_start_schedule(): LOG.debug("*************************************************") LOG.debug("*********** Compute Control Start ************") LOG.debug("*************************************************") try: all_tasks = yield task.get_task_flow() host_schedule = {} for t_obj in all_tasks: host = t_obj.get("host") status = t_obj.get("status") type = t_obj.get("type") if host not in host_schedule: host_schedule[host] = { "nedd_create_tasks": [], "need_reboot_tasks": [], "need_start_tasks": [], "runnig_num": 0 } if status in (SCHED_STATUS_RUNNING, SCHED_STATUS_RUN_SUCCESS): host_schedule[host]["runnig_num"] += 1 if status == SCHED_STATUS_PREPARE_SUCCESS and type == SCHED_TYPE_ACTIONG_CREATE: host_schedule[host]["nedd_create_tasks"].append(t_obj) if status == SCHED_STATUS_PREPARE and type == SCHED_TYPE_ACTIONG_START: host_schedule[host]["need_start_tasks"].append(t_obj) if status == SCHED_STATUS_PREPARE and type == SCHED_TYPE_ACTIONG_REBOOT: host_schedule[host]["need_reboot_tasks"].append(t_obj) if status == SCHED_STATUS_RUN_SUCCESS: now = datetime.datetime.now() old = t_obj.get("updated_at") if (now - old).seconds > CONF.compute.boot_interval: yield task.delete_task_flow(t_obj.get("id")) for k, v in host_schedule.items(): need_running = CONF.compute.max_booting - v.get("runnig_num") if need_running > 0: for i in range(0, need_running): if v["nedd_create_tasks"]: t = v["nedd_create_tasks"].pop() LOG.debug("boot vm name is %s status is %s " % (t['resource'], t['status'])) row = yield task.update_task_flow_status( t.get("id"), status=SCHED_STATUS_RUNNING) if row: yield __boot_vm(t) continue if v["need_start_tasks"]: t = v["need_start_tasks"].pop() vm_id = t.get("resource") need_reboot = yield get_server_metas(vm_id) LOG.debug("start vm name is %s status is %s ", vm_id, t['status']) row = yield task.update_task_flow_status( t.get("id"), status=SCHED_STATUS_RUNNING) if row: iso_list = yield list_server_attach_volume( vm_id, vd_type=3) if iso_list: for iso in iso_list: volume_id = iso.get("volume_id") yield _detach_iso_volume(volume_id, vm_id) else: if need_reboot.get(NEED_REBOOT): yield server_action(vm_id, Control.REBOOT, info={"type": "HARD"}) yield del_server_meta(vm_id, [NEED_REBOOT]) else: yield server_action(vm_id, Control.START) continue if v["need_reboot_tasks"]: t = v["need_reboot_tasks"].pop() vm_id = t.get("resource") LOG.debug("reboot vm name is %s status is %s ", t.get("resource"), t['status']) row = yield task.update_task_flow_status( t.get("id"), status=SCHED_STATUS_RUNNING) if row: iso_list = yield list_server_attach_volume( vm_id, vd_type=3) if iso_list: for iso in iso_list: volume_id = iso.get("volume_id") yield _detach_iso_volume(volume_id, vm_id) else: yield server_action(t.get("resource"), Control.REBOOT, info={"type": "SOFT"}) continue LOG.debug("*************************************************") LOG.debug("*********** Compute Control End ************") LOG.debug("*************************************************") except Exception, e: LOG.error(trace()) LOG.error(" create start reboot schedule error %s" % e)