def umount_task(driverCls, provider, identity, instance_id, volume_id, *args, **kwargs): try: celery_logger.debug("umount_task started at %s." % datetime.now()) driver = get_driver(driverCls, provider, identity) instance = driver.get_instance(instance_id) volume = driver.get_volume(volume_id) attach_data = volume.extra["attachments"][0] device = attach_data["device"] # Check mount to find the mount_location for device private_key = "/opt/dev/atmosphere/extras/ssh/id_rsa" kwargs.update({"ssh_key": private_key}) kwargs.update({"timeout": 120}) mount_location = None cm_script = check_mount() kwargs.update({"deploy": cm_script}) driver.deploy_to(instance, **kwargs) regex = re.compile("(?P<device>[\w/]+) on (?P<location>.*) type") for line in cm_script.stdout.split("\n"): res = regex.search(line) if not res: continue search_dict = res.groupdict() dev_found = search_dict["device"] if device == dev_found: mount_location = search_dict["location"] break # Volume not mounted, move along.. if not mount_location: return um_script = umount_volume(device) kwargs.update({"deploy": um_script}) driver.deploy_to(instance, **kwargs) if "device is busy" in um_script.stdout: # Show all processes that are making device busy.. lsof_script = lsof_location(mount_location) kwargs.update({"deploy": lsof_script}) driver.deploy_to(instance, **kwargs) regex = re.compile("(?P<name>[\w]+)\s*(?P<pid>[\d]+)") offending_processes = [] for line in lsof_script.stdout.split("\n"): res = regex.search(line) if not res: continue search_dict = res.groupdict() offending_processes.append((search_dict["name"], search_dict["pid"])) raise DeviceBusyException(mount_location, offending_processes) # Return here if no errors occurred.. celery_logger.debug("umount_task finished at %s." % datetime.now()) except DeviceBusyException: raise except Exception as exc: celery_logger.warn(exc) umount_task.retry(exc=exc)
def mount_task(driverCls, provider, identity, instance_id, volume_id, mount_location=None, *args, **kwargs): try: logger.debug("mount task started at %s." % datetime.now()) logger.debug("mount_location: %s" % (mount_location, )) driver = get_driver(driverCls, provider, identity) instance = driver.get_instance(instance_id) volume = driver.get_volume(volume_id) logger.debug(volume) try: device = volume.extra['attachmentSet'][0]['device'] except: device = None if not device: #Device was never attached -- Nothing to mount return private_key = "/opt/dev/atmosphere/extras/ssh/id_rsa" kwargs.update({'ssh_key': private_key}) kwargs.update({'timeout': 120}) #Step 2. Check the volume is not already mounted cm_script = check_mount() kwargs.update({'deploy': cm_script}) driver.deploy_to(instance, **kwargs) if device in cm_script.stdout: #Device has already been mounted. Move along.. return #Step 3. Find a suitable location to mount the volume logger.info("Original mount location - %s" % mount_location) if not mount_location: inc = 1 while True: if '/vol%s' % inc in cm_script.stdout: inc += 1 else: break mount_location = '/vol%s' % inc logger.info("Device location - %s" % device) logger.info("New mount location - %s" % mount_location) mv_script = mount_volume(device, mount_location) kwargs.update({'deploy': mv_script}) driver.deploy_to(instance, **kwargs) #TODO: Update metadata to include volume mount # so this data can persist on the UI? logger.debug("mount task finished at %s." % datetime.now()) return mount_location except Exception as exc: logger.warn(exc) mount_task.retry(exc=exc)
def mount_task(driverCls, provider, identity, instance_id, volume_id, device=None, mount_location=None, *args, **kwargs): try: celery_logger.debug("mount task started at %s." % datetime.now()) celery_logger.debug("mount_location: %s" % (mount_location, )) driver = get_driver(driverCls, provider, identity) instance = driver.get_instance(instance_id) volume = driver.get_volume(volume_id) username = identity.get_username() # DEV NOTE: Set as 'users' because this is a GUARANTEED group # and we know our 'user' will exist (if atmo_init_full was executed) # in case the VM does NOT rely on iPlant LDAP groupname = "users" celery_logger.debug(volume) try: attach_data = volume.extra['attachments'][0] if not device: device = attach_data['device'] except KeyError as IndexError: celery_logger.warn("Volume %s missing attachments in Extra" % (volume,)) device = None if not device: celery_logger.warn("Device never attached. Nothing to mount") return None private_key = "/opt/dev/atmosphere/extras/ssh/id_rsa" kwargs.update({'ssh_key': private_key}) kwargs.update({'timeout': 120}) # Step 2. Check the volume is not already mounted cm_script = check_mount() kwargs.update({'deploy': cm_script}) driver.deploy_to(instance, **kwargs) if device in cm_script.stdout: mount_location = _parse_mount_location(cm_script.stdout, device) if not mount_location: raise Exception("Device already mounted, " "but mount location could not be determined!" "Check _parse_mount_location()!") celery_logger.warn( "Device already mounted. Mount output:%s" % cm_script.stdout) # Device has already been mounted. Move along.. return mount_location # Step 3. Find a suitable location to mount the volume celery_logger.info("Original mount location - %s" % mount_location) if not mount_location: inc = 1 while True: if '/vol%s' % inc in cm_script.stdout: inc += 1 else: break mount_location = '/vol%s' % inc celery_logger.info("Device location - %s" % device) celery_logger.info("New mount location - %s" % mount_location) mv_script = mount_volume(device, mount_location, username, groupname) kwargs.update({'deploy': mv_script}) driver.deploy_to(instance, **kwargs) celery_logger.debug("mount task finished at %s." % datetime.now()) return mount_location except Exception as exc: celery_logger.warn(exc) mount_task.retry(exc=exc)
def umount_task(driverCls, provider, identity, instance_id, volume_id, *args, **kwargs): try: logger.debug("umount_task started at %s." % datetime.now()) driver = get_driver(driverCls, provider, identity) instance = driver.get_instance(instance_id) volume = driver.get_volume(volume_id) device = volume.extra['attachmentSet'][0]['device'] #Check mount to find the mount_location for device private_key = "/opt/dev/atmosphere/extras/ssh/id_rsa" kwargs.update({'ssh_key': private_key}) kwargs.update({'timeout': 120}) mount_location = None cm_script = check_mount() kwargs.update({'deploy': cm_script}) driver.deploy_to(instance, **kwargs) regex = re.compile("(?P<device>[\w/]+) on (?P<location>.*) type") for line in cm_script.stdout.split('\n'): res = regex.search(line) if not res: continue search_dict = res.groupdict() dev_found = search_dict['device'] if device == dev_found: mount_location = search_dict['location'] break #Volume not mounted, move along.. if not mount_location: return um_script = umount_volume(device) kwargs.update({'deploy': um_script}) driver.deploy_to(instance, **kwargs) if 'device is busy' in um_script.stdout: #Show all processes that are making device busy.. lsof_script = lsof_location(mount_location) kwargs.update({'deploy': lsof_script}) driver.deploy_to(instance, **kwargs) regex = re.compile("(?P<name>[\w]+)\s*(?P<pid>[\d]+)") offending_processes = [] for line in lsof_script.stdout.split('\n'): res = regex.search(line) if not res: continue search_dict = res.groupdict() offending_processes.append( (search_dict['name'], search_dict['pid'])) raise DeviceBusyException(mount_location, offending_processes) #Return here if no errors occurred.. logger.debug("umount_task finished at %s." % datetime.now()) except DeviceBusyException: raise except Exception as exc: logger.warn(exc) umount_task.retry(exc=exc)