Bug Description
sequin config export produces auth_type: none for Elasticsearch sinks that have no authentication configured. However, sequin config apply (and CONFIG_FILE_PATH boot-time loading) fails because Sequin.Transforms.parse_auth_type/1 does not handle the "none" value.
Steps to Reproduce
- Create an Elasticsearch sink with no authentication (
auth_type: none)
- Export config:
sequin config export > config.yaml
- Apply to a fresh instance:
sequin config apply config.yaml
Error
(FunctionClauseError) no function clause matching in Sequin.Transforms.parse_auth_type/1
Sequin.Transforms.parse_auth_type("none")
lib/sequin/transforms/transforms.ex:1319: Sequin.Transforms.parse_sink/2
If auth_type is removed from the YAML entirely, it defaults to :api_key via parse_auth_type(nil), which then requires auth_value — so there's no way to import an Elasticsearch sink without authentication.
Root Cause
In lib/sequin/transforms/transforms.ex (lines 1622-1625):
defp parse_auth_type("api_key"), do: :api_key
defp parse_auth_type("basic"), do: :basic
defp parse_auth_type("bearer"), do: :bearer
defp parse_auth_type(nil), do: :api_key
Missing: defp parse_auth_type("none"), do: :none
The rest of the codebase correctly supports :none:
- Schema (
lib/sequin/consumers/elasticsearch_sink.ex:15): field :auth_type, Ecto.Enum, values: [:none, :api_key, :basic, :bearer]
- Changeset (line 35-36):
if auth_type == :none do put_change(changeset, :auth_value, nil)
- Client (
lib/sequin/sinks/elasticsearch/client.ex:131): :none -> [] (no auth headers)
- Export (
lib/sequin/transforms/transforms.ex:425): exports auth_type: sink.auth_type which produces "none"
Proposed Fix
Add the missing clause:
defp parse_auth_type("none"), do: :none
defp parse_auth_type("api_key"), do: :api_key
defp parse_auth_type("basic"), do: :basic
defp parse_auth_type("bearer"), do: :bearer
defp parse_auth_type(nil), do: :api_key
Environment
- Sequin version: v0.14.6 (latest as of 2026-03-05)
- Docker image:
sequin/sequin:latest
Bug Description
sequin config exportproducesauth_type: nonefor Elasticsearch sinks that have no authentication configured. However,sequin config apply(andCONFIG_FILE_PATHboot-time loading) fails becauseSequin.Transforms.parse_auth_type/1does not handle the"none"value.Steps to Reproduce
auth_type: none)sequin config export > config.yamlsequin config apply config.yamlError
If
auth_typeis removed from the YAML entirely, it defaults to:api_keyviaparse_auth_type(nil), which then requiresauth_value— so there's no way to import an Elasticsearch sink without authentication.Root Cause
In
lib/sequin/transforms/transforms.ex(lines 1622-1625):Missing:
defp parse_auth_type("none"), do: :noneThe rest of the codebase correctly supports
:none:lib/sequin/consumers/elasticsearch_sink.ex:15):field :auth_type, Ecto.Enum, values: [:none, :api_key, :basic, :bearer]if auth_type == :none do put_change(changeset, :auth_value, nil)lib/sequin/sinks/elasticsearch/client.ex:131)::none -> [](no auth headers)lib/sequin/transforms/transforms.ex:425): exportsauth_type: sink.auth_typewhich produces"none"Proposed Fix
Add the missing clause:
Environment
sequin/sequin:latest