cookbooks/aws-parallelcluster-environment/recipes/config/network_interfaces.rb (77 lines of code) (raw):

# frozen_string_literal: true # # Copyright:: 2013-2021 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. # amazon-ec2-net-utils is pre-installed in AL2023 and handles multi-nics instances properly return if on_docker? def network_card_index(mac, token) # This IMDS call is not available on single NIC instance, therefore fallback to 0 uri = URI("http://169.254.169.254/latest/meta-data/network/interfaces/macs/#{mac}/network-card") get_metadata_with_token(token, uri) || 0 end def device_number(mac, token) uri = URI("http://169.254.169.254/latest/meta-data/network/interfaces/macs/#{mac}/device-number") get_metadata_with_token(token, uri) end def device_name(mac) cmd = Mixlib::ShellOut.new("ip -o link | grep #{mac} | awk '{print substr($2, 1, length($2) -1)}'") cmd.run_command cmd.stdout.delete("\n") end def device_ip(mac, token) uri = URI("http://169.254.169.254/latest/meta-data/network/interfaces/macs/#{mac}/local-ipv4s") get_metadata_with_token(token, uri) end def gateway_address cmd = Mixlib::ShellOut.new("ip r | grep default | head -n 1 | awk '{print $3}'") cmd.run_command cmd.stdout.delete("\n") end def subnet_cidr_block(mac, token) uri = URI("http://169.254.169.254/latest/meta-data/network/interfaces/macs/#{mac}/subnet-ipv4-cidr-block") get_metadata_with_token(token, uri) end def cidr_prefix_length(mac, token) subnet_cidr_block(mac, token).split("/")[1] end def cidr_to_netmask(cidr) require 'ipaddr' IPAddr.new('255.255.255.255').mask(cidr).to_s end # generate the token for retrieving IMDSv2 metadata token = get_metadata_token macs = network_interface_macs(token) log "macs: #{macs}" if macs.length > 1 cookbook_file 'configure_nw_interface.sh' do source 'network_interfaces/configure_nw_interface.sh' path '/tmp/configure_nw_interface.sh' user 'root' group 'root' mode '0644' end # Configure nw interfaces macs.each do |mac| device_name = device_name(mac) device_number = device_number(mac, token) network_card_index = network_card_index(mac, token) gw_ip_address = gateway_address device_ip_address = device_ip(mac, token) cidr_prefix_length = cidr_prefix_length(mac, token) netmask = cidr_to_netmask(cidr_prefix_length) cidr_block = subnet_cidr_block(mac, token) log "network_card_index: #{network_card_index}, device_name: #{device_name}, device_ip_address: #{device_ip_address}" execute 'configure_nw_interface' do user 'root' group 'root' cwd "/tmp" environment( # TODO: The variables are a superset of what's required by individual scripts. Consider simplification. 'DEVICE_NAME' => device_name, 'DEVICE_NUMBER' => "#{device_number}", 'NETWORK_CARD_INDEX' => "#{network_card_index}", 'GW_IP_ADDRESS' => gw_ip_address, 'DEVICE_IP_ADDRESS' => device_ip_address, 'CIDR_PREFIX_LENGTH' => cidr_prefix_length, 'NETMASK' => netmask, 'CIDR_BLOCK' => cidr_block, 'MAC' => mac ) command 'sh /tmp/configure_nw_interface.sh' end end # Apply configuration network_service 'Reload network configuration' do action :reload end end