class K8sInternalLb::Service

Attributes

endpoints[RW]
interval[RW]
last_update[RW]
name[R]
namespace[RW]
ports[RW]

Public Class Methods

create(type: :TCP, **params) click to toggle source
# File lib/k8s_internal_lb/service.rb, line 8
def self.create(type: :TCP, **params)
  raise ArgumentError, 'Must specify service type' if type.nil?

  klass = Services.const_get type
  raise ArgumentError, 'Unknown service type' if klass.nil?

  klass.new(**params)
end
new(name:, namespace: nil, ports:, interval: 10, **_params) click to toggle source
# File lib/k8s_internal_lb/service.rb, line 63
def initialize(name:, namespace: nil, ports:, interval: 10, **_params)
  raise ArgumentError, 'Ports must be a list of Port objects' unless ports.is_a?(Array) && ports.all? { |p| p.is_a? Port }
  raise ArgumentError, 'Interval must be a positive number' unless interval.is_a?(Numeric) && interval.positive?

  @name = name
  @namespace = namespace
  @ports = ports
  @interval = interval
  @last_update = Time.at(0)
  @endpoints = []
end

Public Instance Methods

logger() click to toggle source
# File lib/k8s_internal_lb/service.rb, line 17
def logger
  @logger ||= Logging::Logger[self]
end
to_subsets() click to toggle source
# File lib/k8s_internal_lb/service.rb, line 25
def to_subsets
  grouped = endpoints.group_by(&:port)

  # TODO: Find all port combinations that result in the same list of ready
  #       and not-ready addresses, and combine them into a single pair of
  #       multiple ports.
  #
  # {
  #   1 => { active: [A, B], inactive: [C] },
  #   2 => { active: [A, B], inactive: [C] }
  # }
  # =>
  # {
  #   [1,2] => { active: [A, B], inactive: [C] }
  # }

  grouped = grouped.map do |p, g|
    {
      addresses: g.select(&:ready?).map(&:address),
      notReadyAddresses: g.select(&:not_ready?).map(&:address),
      ports: [p]
    }
  end

  # grouped = grouped.group_by { |s| s[:addresses] + s[:notReadyAddresses] }
  #                  .map do |_, s|
  #   v = s.first
  #
  #   v[:ports] = s.reduce([]) { |sum, e| sum << e[:ports] }
  #
  #   v
  # end

  grouped
end
update() click to toggle source
# File lib/k8s_internal_lb/service.rb, line 21
def update
  raise NotImplementedError
end