module NSXDriver::NSXRule::NSXVRule

Module NSXVRule

Public Instance Methods

nsxv_rule_spec(rule, vm_data, nic_data) click to toggle source
# File lib/nsxv_rule.rb, line 23
def nsxv_rule_spec(rule, vm_data, nic_data)
    rule_name = "#{rule[:id]}-#{rule[:name]}-#{vm_data[:id]}"
    rule_name << "-#{vm_data[:deploy_id]}-#{nic_data[:id]}"

    # rubocop:disable Layout/LineLength
    builder = Nokogiri::XML::Builder.new(:encoding => 'UTF-8') do |xml|
        # rubocop:enable Layout/LineLength
        xml.rule('disabled' => 'false', 'logged' => 'false') do
            xml.name rule_name
            xml.action 'allow'
            xml.appliedToList do
                xml.appliedTo do
                    xml.name nic_data[:name]
                    xml.value nic_data[:lp]
                    xml.type 'Vnic'
                    xml.isValid 'true'
                end
            end
            xml.sectionId @one_section_id

            # SOURCES / DESTINATIONS: Any | IP Address | Vnet

            unless rule[:network_id].empty? && rule[:subnets].empty?

                if rule[:direction] == 'IN'
                    xml.sources('excluded' => 'false') do
                        if !rule[:network_id].empty?
                            xml.source do
                                xml.name rule[:network_name]
                                xml.value rule[:network_nsxid]
                                xml.type 'VirtualWire'
                                xml.isValid 'true'
                            end
                        elsif !rule[:subnets].empty?
                            rule[:subnets].each do |subnet|
                                xml.source do
                                    # rubocop:disable Layout/LineLength
                                    ip_version = IPAddr.new(subnet).ipv4? ? 'Ipv4Address' : 'Ipv6Address'
                                    # rubocop:enable Layout/LineLength
                                    xml.value subnet
                                    xml.type ip_version
                                    xml.isValid 'true'
                                end
                            end
                        end
                    end
                else
                    xml.destinations('excluded' => 'false') do
                        # Target network: Vnet
                        if !rule[:network_id].empty?
                            xml.destination do
                                xml.name nic_data[:network_name]
                                xml.value rule[:network_nsxid]
                                xml.type 'VirtualWire'
                                xml.isValid 'true'
                            end
                        # Target network: Manual network(IP Address)
                        elsif !rule[:subnets].empty?
                            rule[:subnets].each do |subnet|
                                xml.destination do
                                    # rubocop:disable Layout/LineLength
                                    ip_version = IPAddr.new(subnet).ipv4? ? 'Ipv4Address' : 'Ipv6Address'
                                    # rubocop:enable Layout/LineLength
                                    xml.value subnet
                                    xml.type ip_version
                                    xml.isValid 'true'
                                end
                            end
                        end
                    end
                end
            end

            ##### SERVICES #####
            unless rule[:protocol].empty?
                xml.services do
                    case rule[:protocol]
                    when 'TCP'
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '6'
                            xml.protocolName 'TCP'
                            # rubocop:disable Layout/LineLength
                            xml.sourcePort parse_ports(rule[:ports]) \
                                if rule[:direction] == 'IN'
                            xml.destinationPort parse_ports(rule[:ports]) \
                                if rule[:direction] == 'OUT'
                            # rubocop:enable Layout/LineLength
                        end
                    when 'UDP'
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '17'
                            xml.protocolName 'UDP'
                            # rubocop:disable Layout/LineLength
                            xml.sourcePort parse_ports(rule[:ports]) \
                                if rule[:direction] == 'IN'
                            xml.destinationPort parse_ports(rule[:ports]) \
                                if rule[:direction] == 'OUT'
                            # rubocop:enable Layout/LineLength
                        end
                    when 'ICMP'
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '1'
                            xml.protocolName 'ICMP'
                        end
                    when 'ICMPv6'
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '58'
                            xml.protocolName 'IPV6ICMP'
                        end
                    when 'IPSEC'
                        ports = NSXConstants::NSX_RULE_IPSEC_PORTS
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '50'
                            xml.protocolName 'ESP'
                        end
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '51'
                            xml.protocolName 'AH'
                        end
                        xml.service do
                            xml.isValid 'true'
                            xml.protocol '17'
                            xml.protocolName 'UDP'
                            xml.sourcePort parse_ports(ports) \
                                if rule[:direction] == 'IN'
                            xml.destinationPort parse_ports(ports) \
                                if rule[:direction] == 'OUT'
                        end
                    end
                end
            end

            xml.direction rule[:direction].downcase
            xml.packetType 'any'
        end
    end
    builder.to_xml
end