cookbooks/aws-parallelcluster-environment/resources/efs/partial/_mount_umount.rb (101 lines of code) (raw):

# frozen_string_literal: true # # Copyright:: 2023 Amazon.com, Inc. or its affiliates. All Rights Reserved. # # Licensed under the Apache License, Version 2.0 (the "License"). # You may not use this file except in compliance with the License. # A copy of the License is located at # # http://aws.amazon.com/apache2.0/ # # or in the "LICENSE.txt" file accompanying this file. # This file is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, express or implied. # See the License for the specific language governing permissions and limitations under the License. # This is the local system directory at which we want to mount the EFS mount point property :shared_dir_array, Array, required: %i(mount unmount) property :efs_fs_id_array, Array, required: %i(mount unmount) property :efs_encryption_in_transit_array, Array, required: false property :efs_iam_authorization_array, Array, required: false property :efs_access_point_id_array, Array, required: false # This is the mount point on the EFS itself, as opposed to the local system directory, defaults to "/" property :efs_mount_point_array, Array, required: false property :efs_unmount_forced_array, Array, required: false property :mode, String, default: "1777" action :mount do return if on_docker? efs_shared_dir_array = new_resource.shared_dir_array.dup efs_fs_id_array = new_resource.efs_fs_id_array.dup efs_encryption_in_transit_array = new_resource.efs_encryption_in_transit_array.dup efs_iam_authorization_array = new_resource.efs_iam_authorization_array.dup efs_access_point_id_array = new_resource.efs_access_point_id_array.dup efs_mount_point_array = new_resource.efs_mount_point_array.dup efs_fs_id_array.each_with_index do |efs_fs_id, index| efs_shared_dir = efs_shared_dir_array[index] efs_encryption_in_transit = efs_encryption_in_transit_array[index] unless efs_encryption_in_transit_array.nil? efs_iam_authorization = efs_iam_authorization_array[index] unless efs_iam_authorization_array.nil? efs_access_point_id = efs_access_point_id_array[index] unless efs_access_point_id_array.nil? # Path needs to be fully qualified, for example "shared/temp" becomes "/shared/temp" efs_shared_dir = "/#{efs_shared_dir}" unless efs_shared_dir.start_with?('/') # See reference of mount options: https://docs.aws.amazon.com/efs/latest/ug/automount-with-efs-mount-helper.html mount_options = "_netdev,noresvport" if efs_encryption_in_transit == "true" mount_options += ",tls" # iam authorization requires tls if efs_iam_authorization == "true" mount_options += ",iam" end # accesspoint requires tls if efs_access_point_id != 'none' mount_options += ",accesspoint=#{efs_access_point_id}" end end mount_point = efs_mount_point_array.nil? ? "/" : efs_mount_point_array[index] # Create the EFS shared directory directory efs_shared_dir do owner 'root' group 'root' mode new_resource.mode recursive true action :create end unless ::File.directory?(efs_shared_dir) # Mount EFS over NFS mount efs_shared_dir do device "#{efs_fs_id}:#{mount_point}" fstype 'efs' options mount_options dump 0 pass 0 action :mount retries 10 retry_delay 60 # increase to 60s because it takes about 5 minutes for a managed EFS to be ready to mount after creation complete not_if "mount | grep ' #{efs_shared_dir} '" end # Enable the mount dir mount efs_shared_dir do device "#{efs_fs_id}:#{mount_point}" fstype 'efs' options mount_options dump 0 pass 0 action :enable retries 10 retry_delay 6 only_if "mount | grep ' #{efs_shared_dir} '" end # Make sure EFS shared directory permissions are correct directory "change permissions for #{efs_shared_dir}" do path efs_shared_dir owner 'root' group 'root' mode new_resource.mode only_if { node['cluster']['node_type'] == "HeadNode" } end end end action :unmount do return if on_docker? efs_shared_dir_array = new_resource.shared_dir_array.dup efs_shared_dir_array.each do |efs_shared_dir| # Path needs to be fully qualified, for example "shared/temp" becomes "/shared/temp" efs_shared_dir = "/#{efs_shared_dir}" unless efs_shared_dir.start_with?('/') # Unmount EFS file_utils "check active processes on #{efs_shared_dir}" do file efs_shared_dir action :check_active_processes end execute 'unmount efs' do command "umount -fl #{efs_shared_dir}" retries 10 retry_delay 6 timeout 60 only_if "mount | grep ' #{efs_shared_dir} '" end # remove volume from fstab delete_lines "remove volume #{efs_shared_dir} from /etc/fstab" do path "/etc/fstab" pattern " #{efs_shared_dir} " end # Delete the EFS shared directory directory efs_shared_dir do owner 'root' group 'root' mode new_resource.mode recursive false action :delete only_if { Dir.exist?(efs_shared_dir.to_s) && Dir.empty?(efs_shared_dir.to_s) } end end end