in src/mount_efs/__init__.py [0:0]
def get_mount_target_in_az(efs_client, ec2_client, fs_id, az_name=None):
if not efs_client or not ec2_client:
raise FallbackException("Boto client cannot be null")
mount_targets = get_mount_targets_info(efs_client, fs_id)
if not mount_targets:
message = (
"Cannot find mount target for the file system %s, please create a mount target in %s."
% (fs_id, az_name if az_name else "any availability zone.")
)
raise FallbackException(message)
available_mount_targets = [
mount_target
for mount_target in mount_targets
if mount_target.get("LifeCycleState") == "available"
]
if not available_mount_targets:
message = (
"No mount target created for the file system %s is in available state yet, please retry in 5 minutes."
% fs_id
)
raise FallbackException(message)
if az_name:
az_id = get_az_id_by_az_name(ec2_client, az_name)
else:
# If the az_name is None, which means the IMDS instance identity retrieve failed,
# in that case randomly pick one available mount target
logging.info(
"No az info passed via options, randomly pick one available mount target."
)
return random.choice(available_mount_targets)
az_names_of_available_mount_targets = [
mount_target.get("AvailabilityZoneName")
for mount_target in available_mount_targets
]
available_mount_targets_message = (
"Available mount target(s) are in az %s" % az_names_of_available_mount_targets
)
if not az_id:
message = (
"No matching az id for the az %s. Please check the az option passed. %s"
% (az_name, available_mount_targets_message)
)
raise FallbackException(message)
for mount_target in mount_targets:
if mount_target["AvailabilityZoneId"] == az_id:
mount_target_state = mount_target.get("LifeCycleState")
if mount_target_state != "available":
message = "Unknown mount target state"
if mount_target_state in ["creating", "updating", "error"]:
message = (
"Mount target in the az %s is %s, please retry in 5 minutes, or use the "
"mount target in the other az by passing the availability zone name option. %s"
% (az_name, mount_target_state, available_mount_targets_message)
)
elif mount_target_state in ["deleted", "deleting"]:
message = (
"Mount target in the availability zone %s is %s, "
'please create a new one in %s, or use the " "mount target '
"in the other az by passing the availability zone name option. %s"
) % (
az_name,
mount_target_state,
az_name,
available_mount_targets_message,
)
raise FallbackException(message)
return mount_target
message = (
"No matching mount target in the az %s. Please create one mount target in %s, or try the mount target in another "
"AZ by passing the availability zone name option. %s"
% (az_name, az_name, available_mount_targets_message)
)
raise FallbackException(message)