# frozen_string_literal: true module Admin class StreamNodesController < Admin::BaseController def index Streams::NodeRegistry.ensure_home_from_env! @nodes = StreamNode.order(:role, :slug) @dns_provider = ENV.fetch("STREAM_DNS_PROVIDER", "lab") @cloud_provider = ENV.fetch("STREAM_CLOUD_PROVIDER", "local_lab") @lab_hosts = lab_dns_snippet @hetzner_configured = ENV["HCLOUD_TOKEN"].present? @autoscale_metrics = Streams::Autoscaler.metrics end def create kind = params[:kind].to_s node = if kind == "cloud" Streams::NodeProvisioner.new.provision_cloud! else Streams::NodeProvisioner.new.provision_lab! end redirect_to admin_stream_nodes_path, notice: t("admin.flash.stream_node_created", slug: node.slug) rescue Streams::NodeProvisioner::Error, Streams::CloudProviders::Error, Streams::DnsProviders::Error, KeyError => e redirect_to admin_stream_nodes_path, alert: e.message end def drain node = StreamNode.find(params[:id]) Streams::NodeProvisioner.new.drain!(node) redirect_to admin_stream_nodes_path, notice: t("admin.flash.stream_node_draining", slug: node.slug) rescue Streams::NodeProvisioner::Error => e redirect_to admin_stream_nodes_path, alert: e.message end def destroy node = StreamNode.find(params[:id]) Streams::NodeProvisioner.new.decommission!(node) redirect_to admin_stream_nodes_path, notice: t("admin.flash.stream_node_destroyed", slug: node.slug) rescue Streams::NodeProvisioner::BusyError, Streams::NodeProvisioner::Error, Streams::CloudProviders::Error, Streams::DnsProviders::Error => e redirect_to admin_stream_nodes_path, alert: e.message end private def lab_dns_snippet return "" unless @dns_provider == "lab" Streams::DnsProviders::Lab.new.hosts_file_snippet rescue Redis::BaseError "" end end end