module Now
# Generic hash class with custom accessors and helper methods
- class NowHash < ::Hash
- def self.my_accessor(*keys)
- keys.each do |key|
- define_method(key) do
- return nil if !key?(key)
- fetch(key)
- end
- define_method("#{key}=") do |new_value|
- if new_value.nil?
- delete(key)
- else
- store(key, new_value)
- end
- end
- end
- end
+ class NowObject
def initialize(parameters = {})
- parameters.select! { |_k, v| !v.nil? }
- replace(parameters)
+ parameters.select { |_k, v| !v.nil? }.each_pair { |k, v| instance_variable_set("@#{k}", v) }
end
# Conversion of the data structure to hash. Arrays and hashes are browsed, the leafs are converted by calling to_hash method or directly copied.
def _to_hash(value)
if value.is_a?(Array)
value.map { |v| _to_hash(v) }
- # beware we're the Hash!!!
- elsif value.is_a?(Hash) && !value.is_a?(Now::NowHash)
+ elsif value.is_a?(Hash)
{}.tap do |hash|
value.each { |k, v| hash[k] = _to_hash(v) }
end
value
end
end
+
end
end
module Now
# Network object
- class Network < NowHash
+ class Network < NowObject
# OpenNebula ID
- my_accessor :id
+ attr_accessor :id
# Network title
- my_accessor :title
+ attr_accessor :title
# Network summary
- my_accessor :description
+ attr_accessor :description
# Owner
- my_accessor :user
+ attr_accessor :user
# VLAN ID
- my_accessor :vlan
+ attr_accessor :vlan
# IP address range (reader)
- def range
- return nil if !key?(:range)
- fetch(:range)
- end
+ attr_reader :range
# IP address range (writer)
def range=(new_value)
if !valid_range?(new_value)
raise NowError.new(500), 'Invalid range type'
end
- store(:range, new_value)
+ @range = new_value
end
# Network state (active, inactive, error)
- my_accessor :state
+ attr_accessor :state
# Availability zone (cluster)
- my_accessor :zone
+ attr_accessor :zone
def initialize(parameters = {})
if !parameters.key?(:id)
# Returns the object in the form of hash
# @return [Hash] Returns the object in the form of hash
def to_hash
- hash = {}
- each_pair do |attr, value|
- hash[attr] = _to_hash(value)
+ h = {}
+ [:id, :title, :description, :user, :vlan, :range, :state, :zone].each do |k|
+ v = instance_variable_get "@#{k}"
+ if !v.nil?
+ h[k] = _to_hash(v)
+ end
end
- return hash
+ return h
end
private
module Now
# Address range
- class Range < NowHash
+ class Range < NowObject
# Address range in CIDR notation (reader)
- def address
- fetch(:address)
- end
+ attr_reader :address
# Address range in CIDR notation (writer)
def address=(new_value)
if !valid_address?(new_value)
raise NowError.new(500), 'Internal error: Invalid IP network address'
end
- store(:address, new_value)
+ @address = new_value
end
# Address allocation type (static, dynamic)
- my_accessor :allocation
+ attr_accessor :allocation
def initialize(parameters = {})
if !parameters.key?(:address)
# @return [Hash] Returns the object in the form of hash
def to_hash
h = {}
- if key?(:address)
+ if !address.nil?
h[:address] = "#{address}/#{address.prefix}"
end
- if key?(:allocation)
+ if !allocation.nil?
h[:allocation] = allocation
end
end
end
- context '#no addess range' do
+ context '#no address range' do
let(:network) { Now::Network.new(id: 0) }
let(:range) { Now::Range.new(address: IPAddress.parse('fd00::/8')) }
let(:range2) { Now::Range.new(address: IPAddress.parse('fd00::/8')) }
it 'is valid' do
expect(network.valid?).to be true
end
- it 'still valid with addess range' do
+ it 'still valid with address range' do
network.range = range
expect(network.valid?).to be true
end