Skip to content

rvn-eks-addons 0.25.0: username and password as a Grafana sign-in provider - #238

Merged
ravion-ops[bot] merged 3 commits into
mainfrom
devin/1792863343-grafana-basic-provider
Oct 25, 2026
Merged

ravion-ops[bot] merged 3 commits into
mainfrom
devin/1792863343-grafana-basic-provider

Conversation

@devin-ai-integration

@devin-ai-integration devin-ai-integration Bot commented Oct 24, 2026 •

Copy link
Copy Markdown
Contributor
  • In merge queue / Merged
  • Prioritize

Summary

Username and password is now an entry in Grafana's Sign-in providers list, next to the OAuth providers. The separate "Username and password" toggle is gone. This is a deliberate breaking change with no compatibility shim, since no customer uses Grafana sign-in yet. It is stacked on #237, which owns the 0.24.1 bump, so this PR takes the combined 0.25.0.

Terraform

# before
grafana_auth           = { login_form_enabled = true, default_role = "Viewer" }
grafana_auth_providers = []                       # OAuth only

# after
grafana_auth_providers = [{ provider = "basic" }] # default; basic = username and password
grafana_default_role   = "Viewer"
  • basic takes only provider. A validation rejects clients, endpoints, scopes, restrictions, role mapping or settings on it, and the duplicate-provider validation stops it appearing twice.
  • Without basic, grafana.ini gets auth.disable_login_form = true and [auth.basic] enabled = false, exactly as login_form_enabled = false did. basic never becomes an [auth.basic] section of its own; only OAuth entries go through grafana_auth_by_provider.
  • The "no way to sign in" precondition is now just length(grafana_auth_providers) > 0.

Form

  • The grafana_login_form_enabled input is removed. grafana_auth_providers defaults to one "Username and password" card (value: basic, listed first under Provider).
  • show_when: {provider: {not: basic}} hides every OAuth field on that card. The card shows no "Client ID" line, because the description template renders nothing when client_id is empty.

Upgrading prod: root ravion.yaml in flightcontrol pins 0.24.0 with grafana_login_form_enabled: false and Google only. When it bumps to 0.25.0, delete that line and nothing else. Its provider list has no basic entry, so passwords stay off as they are today.

Tests: tofu test -filter=tests/grafana_auth.tftest.hcl passes 38/38, including new runs for basic beside Google, an empty list, OAuth fields on basic, and basic twice. validate, npm test (178) and readme --check also pass. I didn't run the local-dev publish because there's no local Ravion API on this VM.

Link to Devin session: https://app.devin.ai/sessions/b66c5f56571c4ea486860ba193e2bec6
Open in Devin Desktop: https://app.devin.ai/desktop/session/b66c5f56571c4ea486860ba193e2bec6?variant=devin

RetriggerView in GreptileConfidence Score: 4/5

The PR appears safe to merge, with non-blocking fixes for the default fallback and stale role instructions.

Findings

  1. P2 Fallback loses the default provider ▶
  2. P2 Role instructions name removed input ▶
Fix with agent prompt
### Issue 1
compute/eks/addons/rvn-eks-addons-definition.yml:1010-1011
The new default includes `basic`, but the stack mapping still falls back to `[]` when `module.input.grafana_auth_providers` is nil. If Ravion evaluates that mapping before filling in input defaults, enabling Grafana fails the sign-in check instead of using username and password. Change the nil fallback to `[{ provider: basic }]`, while preserving an explicitly supplied empty list.

### Issue 2
compute/eks/addons/README.md:503
The new `grafana_default_role` bullet conflicts with the remaining `grafana_auth.default_role` bullet below it. This PR removes `grafana_auth`, so readers following the old instruction would configure an input they cannot use. Remove the stale bullet and update the remaining `grafana_auth` mention in the `grafana_access` description.

Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!

---

For each issue above, determine whether it is valid and should be fixed. If so, fix it directly.

Summary

This release moves username-and-password sign-in into grafana_auth_providers as basic and replaces grafana_auth with grafana_default_role.

  • Grafana sign-in methods now come from one provider list.

Removing compatibility with grafana_auth and grafana_login_form_enabled is intentional. devin-ai-integration[bot] explicitly described this as a breaking change with no compatibility shim because no customer uses Grafana sign-in yet.

Checks were based on source inspection; tests and the external form were not run.

Diagram
%%{init: {'theme': 'neutral'}}%%
flowchart TD
  A[grafana_auth_providers] --> B{Contains basic?}
  B -->|Yes| C[Keep password sign-in]
  B -->|No| D[Disable login form and HTTP basic auth]
  A --> E[Exclude basic from OAuth entries]
  E --> F[OAuth settings and secret references]
  C --> G[grafana.ini]
  D --> G
  F --> G
  H[grafana_default_role] --> G
Loading

Reviews (1) · Last reviewed commit: "rvn-eks-addons 0.25.0: username and pass..." · Reviewed by Greptile

…vider

Co-Authored-By: brandon <brandon@flightcontrol.dev>
@devin-ai-integration

Copy link
Copy Markdown
Contributor Author

I'll fix CI failures and address comments from users with write access. I'll skip comments containing "(aside)".

  • Disable automatic comment, CI, and merge conflict monitoring

Comment thread compute/eks/addons/rvn-eks-addons-definition.yml
Comment thread compute/eks/addons/README.md
…op stale grafana_auth docs

Co-Authored-By: brandon <brandon@flightcontrol.dev>
@github-actions
github-actions Bot requested a review from flybayer October 24, 2026 17:46
@ravion-ops

ravion-ops Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Resolved: this PR is in the merge queue at ffaf29f.

@devin-ai-integration
devin-ai-integration Bot changed the base branch from devin/1792862973-eks-addons-cert-manager-copy to main October 25, 2026 16:30
@github-actions

Copy link
Copy Markdown

Ravion Module Publish Plan

Dry run only. No Ravion API mutations were made.

Module Current Version New Version Description
rvn-eks-addons 0.24.1 0.25.0 Username and password is now one of Grafana's sign-in providers instead of a separate toggle, and new clusters start with it. The cert-manager setting now explains that it is for TLS that ends inside the cluster, and that load balancer HTTPS with Ravion-managed domains or ACM certificates doesn't need it.

Diffs

rvn-eks-addons 0.24.1 -> 0.25.0

--- remote
+++ compiled
   - id: section_grafana_sign_in
     label: Grafana sign-in
     type: section
-  - default: true
-    description: Grafana's built-in sign-in for local users, including the generated admin. Turning it off removes the login form and password access to the API, so only the providers below can sign in.
-    id: grafana_login_form_enabled
-    label: Username and password
-    show_when:
-      grafana_enabled: true
-    type: boolean
   - default: Viewer
-    description: Grafana role an account gets the first time it signs in through a provider, unless the provider's role mapping says otherwise.
+    description: Grafana role an account gets the first time it signs in through an OAuth provider, unless the provider's role mapping says otherwise.
     id: grafana_default_role
     label: Role for new accounts
     show_when:
@@
         value: Editor
       - label: Admin
         value: Admin
-  - description: Grafana's OAuth providers people can sign in with, each a button on Grafana's sign-in page. Google, GitHub and gitlab.com need allowed domains, organizations, teams or groups, since anyone with an account there could otherwise sign in.
+  - default:
+      - provider: basic
+    description: How people sign in to Grafana. Without Username and password there is no login form and no password works, including the generated admin's. Google, GitHub and gitlab.com need allowed domains, organizations, teams or groups, since anyone with an account there could otherwise sign in.
     id: grafana_auth_providers
     item_description: Client ID {client_id}
     item_inputs:
-      - description: Which of Grafana's OAuth providers this is.
+      - description: Username and password, or one of Grafana's OAuth providers.
         id: provider
         label: Provider
         required: true
         type: string
         values:
+          - description: Grafana's login form for local users, including the generated admin
+            label: Username and password
+            value: basic
           - label: Google
             value: google
           - label: GitHub
@@
       - description: Client ID of the OAuth application. Leave blank when Secrets below gives it as GF_AUTH_<PROVIDER>_CLIENT_ID. Its redirect URI is https://<hostname>/login/<provider>, for example /login/google or /login/generic_oauth.
         id: client_id
         label: Client ID
+        show_when:
+          provider:
+            not: basic
         type: string
       - description: Secrets Manager ARN containing the client secret as plain text. External Secrets reads it into the cluster; it is never a Helm value. Leave blank when Secrets below gives it as GF_AUTH_<PROVIDER>_CLIENT_SECRET.
         id: client_secret_arn
         label: Client secret ARN
         placeholder: arn:aws:secretsmanager:us-east-2:111122223333:secret:grafana-oauth-client-secret
+        show_when:
+          provider:
+            not: basic
         type: string
       - description: Directory (tenant) ID of the app registration. Roles come from the app registration's app roles.
         id: tenant_id
@@
         id: scopes
         label: Scopes
         placeholder: openid email profile
+        show_when:
+          provider:
+            not: basic
         type: string
       - add_button_label: Add domain
         description: Email domains whose accounts can sign in. For Google, your Google Workspace domains.
         id: allowed_domains
         label: Allowed domains
         placeholder: example.com
+        show_when:
+          provider:
+            not: basic
         type: string_array
       - add_button_label: Add organization
         description: GitHub organizations, Entra ID tenant IDs, or the provider's organizations whose members can sign in.
@@
         placeholder: contains(groups[*], 'grafana-admins') && 'Admin' || 'Viewer'
         show_when:
           provider:
-            not: azuread
+            not:
+              - azuread
+              - basic
         type: string
       - collapsible: true
         default: {}
         description: "Any other key of Grafana's [auth.<provider>] section, as JSON, passed through verbatim, such as {\"auto_login\": \"true\"}. The client secret goes in the ARN above, never here."
         id: settings
         label: Other Grafana settings
+        show_when:
+          provider:
+            not: basic
         type: object
     item_label: Sign-in provider
     item_title:
@@
   - **Shared load balancer** routes the hostname on the HTTPS listener of the shared private or public ALB. The private ALB keeps Grafana inside the VPC and the networks connected to it, such as a VPN or a Tailscale subnet router; the public ALB puts its sign-in page on the internet. Point the hostname's DNS at `private_alb_dns_name` or `public_alb_dns_name`.
   - **Kubernetes Ingress** gives Grafana an Ingress for the hostname with TLS, served by the controller of the ingress class you name, with any annotations it needs. With the Tailscale Kubernetes operator's `tailscale` class and a `<name>.<tailnet>.ts.net` hostname, Grafana becomes one device on the tailnet with a Let's Encrypt certificate, and nothing else in the VPC is reachable through it. Install the class's controller first: the AWS Load Balancer Controller refuses an Ingress whose class does not exist yet.
 
-  **Grafana sign-in** is Grafana's own: username and password for local users, and any of Grafana's OAuth providers side by side (Google, GitHub, GitLab, Microsoft Entra ID, Okta, or any OpenID Connect provider through generic OAuth), each configured under Grafana's own setting names. Each provider's client secret is a Secrets Manager ARN that External Secrets reads into the cluster. Register `https://<hostname>/login/<provider>` as the OAuth application's redirect URI.
+  **Grafana sign-in** is Grafana's own: a list of sign-in providers, username and password for local users (the default) and any of Grafana's OAuth providers side by side (Google, GitHub, GitLab, Microsoft Entra ID, Okta, or any OpenID Connect provider through generic OAuth), each configured under Grafana's own setting names. Without username and password, Grafana has no login form and accepts no password, including the generated admin's. Each provider's client secret is a Secrets Manager ARN that External Secrets reads into the cluster. Register `https://<hostname>/login/<provider>` as the OAuth application's redirect URI.
 
   **Several destinations that render are a fallback chain, not a merge.** Ravion reads the first one that can answer right now - the in-cluster store, then CloudWatch Logs; Amazon Managed Prometheus when selected, then Prometheus through Thanos, then Container Insights - and says which store it is showing. It never merges two of them for the same service, which would show every line twice.
 
@@
   - Each load balancer's security group is automatically allowed to reach pods through the EKS cluster security group (all TCP ports).
   - Because `TargetGroupBinding` depends on the controller, enabling any load balancer automatically installs the **load balancer controller** - there is nothing extra to configure.
 
-  Terraform source: [ravionhq/modules/compute/eks/addons](https://github.com/ravionhq/modules/tree/rvn-eks-addons@0.24.1/compute/eks/addons)
+  Terraform source: [ravionhq/modules/compute/eks/addons](https://github.com/ravionhq/modules/tree/rvn-eks-addons@0.25.0/compute/eks/addons)
 
   ## Prerequisites
 
@@
   | Existing log bucket    | No       | Creates one          | Store logs in an existing bucket instead of `ravion-loki-<cluster>-<account>` |
   | In-cluster Grafana     | No       | `false`              | Grafana in the cluster, wired to the selected logs, metrics and traces stores |
   | Access                 | No       | `false`              | Grafana over HTTPS at a hostname, on the private (default) or public ALB, or through a Kubernetes Ingress |
-  | Username and password  | No       | `true`               | Grafana's built-in sign-in; off leaves only the providers |
-  | Sign-in providers      | No       | None                 | Any of Google, GitHub, GitLab, Microsoft Entra ID, Okta and generic OAuth |
+  | Sign-in providers      | No       | Username and password | Username and password, and any of Google, GitHub, GitLab, Microsoft Entra ID, Okta and generic OAuth |
   | Grafana read access    | No       | `false`              | Read-only IAM role for Amazon Managed Grafana over the AMP workspace |
   | Ravion EKS Management  | No       | `true`               | Registers the cluster, installs Operator, and enables in-cluster deployments |
   | Public ALB             | No       | `true`               | Shared internet-facing ALB (HTTPS with ACM certificate) |
@@
         execution_environment_overrides:
           security_group: << module.input.ravion_runner_security_group_id >>
         plan_permissions: '<< module.input.terraform_plan_default_policies_enabled == false ? {"replace": module.input.terraform_plan_iam_policy_arns} : (module.input.terraform_plan_iam_policy_arns ? {"attach": module.input.terraform_plan_iam_policy_arns} : nil) >>'
-        ref: rvn-eks-addons@0.24.1
+        ref: rvn-eks-addons@0.25.0
         repo: https://github.com/ravionhq/modules
         stack_id: <<stack.id>>
         terraform_variables:
@@
             listener_rule_priority: << module.input.grafana_listener_rule_priority >>
             load_balancer: << module.input.grafana_load_balancer || "private" >>
             method: << module.input.grafana_access_method || "load_balancer" >>
-          grafana_auth:
-            default_role: << module.input.grafana_default_role || "Viewer" >>
-            login_form_enabled: "<< module.input.grafana_login_form_enabled != nil ? module.input.grafana_login_form_enabled : true >>"
-          grafana_auth_providers: "<< module.input.grafana_auth_providers != nil ? module.input.grafana_auth_providers : [] >>"
+          grafana_auth_providers: '<< module.input.grafana_auth_providers != nil ? module.input.grafana_auth_providers : [{"provider": "basic"}] >>'
+          grafana_default_role: << module.input.grafana_default_role || "Viewer" >>
           grafana_enabled: << module.input.grafana_enabled >>
           grafana_environment_variables: "<< module.input.grafana_environment_variables != nil ? module.input.grafana_environment_variables : [] >>"
           grafana_role_creation_enabled: << module.input.grafana_role_creation_enabled >>

@ravion-ops
ravion-ops Bot merged commit 3c795fd into main Oct 25, 2026
27 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant