Files
ubicloud/helpers/load_balancer.rb
2025-05-20 05:49:38 +09:00

63 lines
2.7 KiB
Ruby

# frozen_string_literal: true
class Clover
def load_balancer_list
dataset = dataset_authorize(@project.load_balancers_dataset, "LoadBalancer:view").eager(:private_subnet)
dataset = dataset.join(:private_subnet, id: Sequel[:load_balancer][:private_subnet_id]).where(location_id: @location.id).select_all(:load_balancer) if @location
if api?
paginated_result(dataset, Serializers::LoadBalancer)
else
@lbs = Serializers::LoadBalancer.serialize(dataset.all, {include_path: true})
view "networking/load_balancer/index"
end
end
def load_balancer_post(name)
authorize("LoadBalancer:create", @project.id)
algorithm, health_check_protocol, stack = typecast_params.nonempty_str!(%w[algorithm health_check_protocol stack])
src_port, dst_port = typecast_params.pos_int!(%w[src_port dst_port])
health_check_endpoint = typecast_params.nonempty_str("health_check_endpoint") || Prog::Vnet::LoadBalancerNexus::DEFAULT_HEALTH_CHECK_ENDPOINT
unless (ps = authorized_private_subnet)
fail Validation::ValidationFailed.new("private_subnet_id" => "Private subnet not found")
end
lb = nil
DB.transaction do
lb = Prog::Vnet::LoadBalancerNexus.assemble(
ps.id,
name:,
algorithm:,
stack: Validation.validate_load_balancer_stack(stack),
src_port: Validation.validate_port(:src_port, src_port),
dst_port: Validation.validate_port(:dst_port, dst_port),
health_check_endpoint:,
health_check_protocol:
).subject
audit_log(lb, "create")
end
if api?
Serializers::LoadBalancer.serialize(lb, {detailed: true})
else
flash["notice"] = "'#{name}' is created"
request.redirect "#{@project.path}#{lb.path}"
end
end
def generate_load_balancer_options
options = OptionTreeGenerator.new
options.add_option(name: "name")
options.add_option(name: "description")
options.add_option(name: "private_subnet_id", values: dataset_authorize(@project.private_subnets_dataset, "PrivateSubnet:view").map { {value: it.ubid, display_name: it.name} })
options.add_option(name: "algorithm", values: ["Round Robin", "Hash Based"].map { {value: it.downcase.tr(" ", "_"), display_name: it} })
options.add_option(name: "stack", values: [LoadBalancer::Stack::IPV4, LoadBalancer::Stack::IPV6, LoadBalancer::Stack::DUAL].map { {value: it.downcase, display_name: it.gsub("ip", "IP")} })
options.add_option(name: "src_port")
options.add_option(name: "dst_port")
options.add_option(name: "health_check_endpoint")
options.add_option(name: "health_check_protocol", values: ["http", "https", "tcp"].map { {value: it, display_name: it.upcase} })
options.serialize
end
end