'This is run in the event of a failed live migration operation.
:param device_info_dict: the data dict
:param source_storage_group_list: list of storage groups associated
with the device
:param extra_specs: extra specifications'

def failed_live_migration(self, device_info_dict, source_storage_group_list, extra_specs):

    array = device_info_dict['array']
    source_nf_sg = device_info_dict['source_nf_sg']
    source_sg = device_info_dict['source_sg']
    source_parent_sg = device_info_dict['source_parent_sg']
    device_id = device_info_dict['device_id']
    for sg in source_storage_group_list:
        if (sg not in [source_sg, source_nf_sg]):
            self.remove_volume_from_sg(array, device_id, device_info_dict['volume_name'], sg, extra_specs)
    if (source_nf_sg in source_storage_group_list):
        self.move_volume_between_storage_groups(array, device_id, source_nf_sg, source_sg, extra_specs)
        is_descendant = self.rest.is_child_sg_in_parent_sg(array, source_nf_sg, source_parent_sg)
        if is_descendant:
            self.rest.remove_child_sg_from_parent_sg(array, source_nf_sg, source_parent_sg, extra_specs)
        self.rest.delete_storage_group(array, source_nf_sg)
