def describe_mount_targets(self, max_items, file_system_id, mount_target_id, access_point_id, marker): """Describe the mount targets given a mount target ID or a file system ID. Note that as of this writing access points, and thus access point IDs are not supported. https://docs.aws.amazon.com/efs/latest/ug/API_DescribeMountTargets.html """ # Restrict the possible corpus of results based on inputs. if not (bool(file_system_id) ^ bool(mount_target_id) ^ bool(access_point_id)): raise BadRequest( "Must specify exactly one mutually exclusive parameter.") elif file_system_id: # Handle the case that a file_system_id is given. if file_system_id not in self.file_systems_by_id: raise FileSystemNotFound(file_system_id) corpus = [ mt.info_json() for mt in self.file_systems_by_id[file_system_id].iter_mount_targets() ] elif mount_target_id: if mount_target_id not in self.mount_targets_by_id: raise MountTargetNotFound(mount_target_id) # Handle mount target specification case. corpus = [self.mount_targets_by_id[mount_target_id].info_json()] else: # We don't handle access_point_id's yet. assert False, "Moto does not yet support EFS access points." # Handle the case that a marker is given. Note that the handling is quite # different from that in describe_file_systems. if marker is not None: if marker not in self.next_markers: raise BadRequest("Invalid Marker") corpus_mtids = {m["MountTargetId"] for m in corpus} marked_mtids = { m["MountTargetId"] for m in self.next_markers[marker] } mt_ids = corpus_mtids & marked_mtids corpus = [ self.mount_targets_by_id[mt_id].info_json() for mt_id in mt_ids ] # Handle the max_items parameter. mount_targets = corpus[:max_items] next_marker = self._mark_description(corpus, max_items) return next_marker, mount_targets
def describe_mount_targets(self, max_items, file_system_id, mount_target_id, access_point_id, marker): """Describe the mount targets given an access point ID, mount target ID or a file system ID. https://docs.aws.amazon.com/efs/latest/ug/API_DescribeMountTargets.html """ # Restrict the possible corpus of results based on inputs. if not (bool(file_system_id) ^ bool(mount_target_id) ^ bool(access_point_id)): raise BadRequest( "Must specify exactly one mutually exclusive parameter.") if access_point_id: file_system_id = self.access_points[access_point_id].file_system_id if file_system_id: # Handle the case that a file_system_id is given. if file_system_id not in self.file_systems_by_id: raise FileSystemNotFound(file_system_id) corpus = [ mt for mt in self.file_systems_by_id[file_system_id].iter_mount_targets() ] elif mount_target_id: if mount_target_id not in self.mount_targets_by_id: raise MountTargetNotFound(mount_target_id) # Handle mount target specification case. corpus = [self.mount_targets_by_id[mount_target_id]] # Handle the case that a marker is given. Note that the handling is quite # different from that in describe_file_systems. if marker is not None: if marker not in self.next_markers: raise BadRequest("Invalid Marker") corpus_mtids = {m.mount_target_id for m in corpus} marked_mtids = { m.mount_target_id for m in self.next_markers[marker] } mt_ids = corpus_mtids & marked_mtids corpus = [self.mount_targets_by_id[mt_id] for mt_id in mt_ids] # Handle the max_items parameter. mount_targets = corpus[:max_items] next_marker = self._mark_description(corpus, max_items) return next_marker, mount_targets
def delete_file_system(self, file_system_id): """Delete the file system specified by the given file_system_id. Note that mount targets must be deleted first. https://docs.aws.amazon.com/efs/latest/ug/API_DeleteFileSystem.html """ if file_system_id not in self.file_systems_by_id: raise FileSystemNotFound(file_system_id) file_system = self.file_systems_by_id[file_system_id] if file_system.number_of_mount_targets > 0: raise FileSystemInUse( "Must delete all mount targets before deleting file system.") del self.file_systems_by_id[file_system_id] self.creation_tokens.remove(file_system.creation_token) return
def create_mount_target(self, file_system_id, subnet_id, ip_address=None, security_groups=None): """Create a new EFS Mount Target for a given File System to a given subnet. Note that you can only create one mount target for each availability zone (which is implied by the subnet ID). https://docs.aws.amazon.com/efs/latest/ug/API_CreateMountTarget.html """ # Get the relevant existing resources try: subnet = self.ec2_backend.get_subnet(subnet_id) except InvalidSubnetIdError: raise SubnetNotFound(subnet_id) if file_system_id not in self.file_systems_by_id: raise FileSystemNotFound(file_system_id) file_system = self.file_systems_by_id[file_system_id] # Validate the security groups. if security_groups: sg_lookup = { sg.id for sg in self.ec2_backend.describe_security_groups() } for sg_id in security_groups: if sg_id not in sg_lookup: raise SecurityGroupNotFound(sg_id) # Create the new mount target mount_target = MountTarget(file_system, subnet, ip_address, security_groups) # Establish the network interface. network_interface = self.ec2_backend.create_network_interface( subnet, [mount_target.ip_address], group_ids=security_groups) mount_target.set_network_interface(network_interface) # Record the new mount target self.mount_targets_by_id[mount_target.mount_target_id] = mount_target return mount_target
def describe_file_systems(self, marker=None, max_items=10, creation_token=None, file_system_id=None): """Describe all the EFS File Systems, or specific File Systems. https://docs.aws.amazon.com/efs/latest/ug/API_DescribeFileSystems.html """ # Restrict the possible corpus of resules based on inputs. if creation_token and file_system_id: raise BadRequest( "Request cannot contain both a file system ID and a creation token." ) elif creation_token: # Handle the creation token case. corpus = [] for fs in self.file_systems_by_id.values(): if fs.creation_token == creation_token: corpus.append(fs) elif file_system_id: # Handle the case that a file_system_id is given. if file_system_id not in self.file_systems_by_id: raise FileSystemNotFound(file_system_id) corpus = [self.file_systems_by_id[file_system_id]] elif marker is not None: # Handle the case that a marker is given. if marker not in self.next_markers: raise BadRequest("Invalid Marker") corpus = self.next_markers[marker] else: # Handle the vanilla case. corpus = [fs for fs in self.file_systems_by_id.values()] # Handle the max_items parameter. file_systems = corpus[:max_items] next_marker = self._mark_description(corpus, max_items) return next_marker, file_systems