Class: Subnet

Inherits:
Object
  • Object
show all
Defined in:
lib/skytap/subnet.rb

Defined Under Namespace

Classes: InvalidSubnet

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(cidr_block) ⇒ Subnet

Returns a new instance of Subnet.



9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# File 'lib/skytap/subnet.rb', line 9

def initialize(cidr_block)
  unless cidr_block =~ /^(.*)\/(.*)/
    raise InvalidSubnet.new 'Not in CIDR block form (XX.XX.XX.XX/YY)'
  end

  network = $1
  begin
    @size = Integer($2)
  rescue
    raise InvalidSubnet.new 'Invalid size'
  end

  @address = IpAddress.new(network)
  @mask = size_to_mask(@size)
end

Instance Attribute Details

#addressObject (readonly)

Returns the value of attribute address.



7
8
9
# File 'lib/skytap/subnet.rb', line 7

def address
  @address
end

#maskObject (readonly)

Returns the value of attribute mask.



7
8
9
# File 'lib/skytap/subnet.rb', line 7

def mask
  @mask
end

#sizeObject (readonly)

Returns the value of attribute size.



7
8
9
# File 'lib/skytap/subnet.rb', line 7

def size
  @size
end

Instance Method Details

#<=>(other) ⇒ Object



81
82
83
# File 'lib/skytap/subnet.rb', line 81

def <=>(other)
  to_s <=> other.to_s
end

#==(other) ⇒ Object



30
31
32
33
34
# File 'lib/skytap/subnet.rb', line 30

def ==(other)
  other.is_a?(Subnet) && \
  (size == other.size) && \
  network_portion == other.network_portion
end

#contains?(ip) ⇒ Boolean

Returns:

  • (Boolean)


56
57
58
59
# File 'lib/skytap/subnet.rb', line 56

def contains?(ip)
  ip = IpAddress.new(ip) unless ip.is_a?(IpAddress)
  (ip & mask) == network_portion
end

#each_addressObject



52
53
54
# File 'lib/skytap/subnet.rb', line 52

def each_address
  (min.to_i..max.to_i).each{|i| yield IpAddress.new(i)}
end

#maxObject



48
49
50
# File 'lib/skytap/subnet.rb', line 48

def max
  @max ||= (mask.inverse | network_portion)
end

#min_machine_ipObject



65
66
67
# File 'lib/skytap/subnet.rb', line 65

def min_machine_ip
  min + 1
end

#network_portionObject Also known as: min



25
26
27
# File 'lib/skytap/subnet.rb', line 25

def network_portion
  @network_portion ||= (mask & address)
end

#normalizeObject



73
74
75
# File 'lib/skytap/subnet.rb', line 73

def normalize
  Subnet.new("#{network_portion}/#{size}")
end

#normalized?Boolean

Returns:

  • (Boolean)


69
70
71
# File 'lib/skytap/subnet.rb', line 69

def normalized?
  address == network_portion
end

#num_addressesObject



61
62
63
# File 'lib/skytap/subnet.rb', line 61

def num_addresses
  2 ** (32-size)
end

#overlaps?(other) ⇒ Boolean

Returns:

  • (Boolean)


36
37
38
# File 'lib/skytap/subnet.rb', line 36

def overlaps?(other)
  min <= other.max && max >= other.min
end

#strictly_subsumes?(other) ⇒ Boolean

Returns:

  • (Boolean)


44
45
46
# File 'lib/skytap/subnet.rb', line 44

def strictly_subsumes?(other)
  subsumes?(other) && self != other
end

#subsumes?(other) ⇒ Boolean

Returns:

  • (Boolean)


40
41
42
# File 'lib/skytap/subnet.rb', line 40

def subsumes?(other)
  min <= other.min && max >= other.max
end

#to_sObject



77
78
79
# File 'lib/skytap/subnet.rb', line 77

def to_s
  "#{address}/#{size}"
end