Module: Pangea::Resources::NetworkHelpers

Defined in:
lib/pangea/resources/network_helpers.rb

Overview

Network helpers for templates

Instance Method Summary collapse

Instance Method Details

#availability_zones(region, count = 3) ⇒ Object

Generate availability zones for a region



59
60
61
62
# File 'lib/pangea/resources/network_helpers.rb', line 59

def availability_zones(region, count = 3)
  zones = ('a'..'f').to_a
  zones.take(count).map { |zone| "#{region}#{zone}" }
end

#cidr_block(ip, mask) ⇒ Object

Create CIDR block from IP and mask



35
36
37
# File 'lib/pangea/resources/network_helpers.rb', line 35

def cidr_block(ip, mask)
  "#{ip}/#{mask}"
end

#discover_public_ip(timeout: 5) ⇒ Object

Discover public IP address - available in template context



24
25
26
27
28
29
30
31
32
# File 'lib/pangea/resources/network_helpers.rb', line 24

def discover_public_ip(timeout: 5)
  # Cache the IP discovery result to avoid multiple calls
  @_discovered_ip ||= begin
    discovery = Utilities::IpDiscovery.new(timeout: timeout)
    ip = discovery.discover
    puts "[Pangea] Discovered public IP: #{ip}"
    ip
  end
end

#subnet_cidr(base_cidr, subnet_bits, index) ⇒ Object

Calculate subnet CIDR from base and offset



40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# File 'lib/pangea/resources/network_helpers.rb', line 40

def subnet_cidr(base_cidr, subnet_bits, index)
  base_ip, base_mask = base_cidr.split('/')
  octets = base_ip.split('.').map(&:to_i)
  
  # Calculate new IP based on subnet bits and index
  subnet_size = 2 ** subnet_bits
  offset = index * subnet_size
  
  # Apply offset to appropriate octet
  octet_index = (32 - base_mask.to_i - subnet_bits) / 8
  octets[octet_index] += offset
  
  new_ip = octets.join('.')
  new_mask = base_mask.to_i + subnet_bits
  
  "#{new_ip}/#{new_mask}"
end

#valid_ip?(ip) ⇒ Boolean

Validate IP address format

Returns:

  • (Boolean)


65
66
67
68
69
# File 'lib/pangea/resources/network_helpers.rb', line 65

def valid_ip?(ip)
  return false unless ip =~ /\A(?:\d{1,3}\.){3}\d{1,3}\z/
  
  ip.split('.').all? { |octet| octet.to_i <= 255 }
end