Repository navigation
Release prep: v1 API, security fixes, ApiKey permission enforcement, README rewrite - #16
Merged
Merged
Conversation
…Set serviceName The README is rewritten around what the operator actually does: installing, each resource with examples checked against the generated CRDs, the namespace permission model, deletion, known limitations, building, and releasing with GitVersion. The install command now notes that Helm skips the prerelease builds main publishes. Deployed Instances generated their admin and first-run passwords with Random.Shared, which is not a secure source, and always put a special character first. They now come from RandomNumberGenerator, drawn uniformly and guaranteed one character of each class. The StatefulSet's serviceName named the ServiceAccount rather than the Service. It is now set to the Service on creation only, since the field is immutable; existing StatefulSets keep theirs.
The apiKeys.set* flags in an Instance's spec.permissions were accepted but never checked, so any namespace allowed to create ApiKeys could assign itself System or Organization. They are now enforced, with defaults by sensitivity: Ingest and Public only send events and are allowed unless denied; Read, Write, Project, System and Organization must be granted. An ApiKey asking for more than it may is refused whole, with the reason in its status, and its key in Seq is left as it was. The operator's own key was never recognised as such: it is named <instance>-operator, but the check looked for <instance>. It now matches, so that key bypasses these checks as intended.
…Secrets The OIDC client secret and Entra client key were read back from Seq into status.info.auth, where anyone with the view role could read them. Status now shows "<set>" in their place. Nothing reads status back: changes are detected against what Seq returns, so redacting does not cause the settings to be rewritten each reconcile. The secrets can now be given as clientSecretRef / clientKeyRef, a key of a Secret in the Instance's namespace, so they need not appear in the spec either. The plain-text fields still work and are documented as deprecated; setting both forms is refused.
…etions and cross-namespace Secrets - deployment.envFrom threw on every reconcile: the container's EnvFrom list was never created. - The default Instance permissions omitted Signals, so a Signal in the Instance's own namespace was refused unless spec.permissions was set. - If recording a newly created object's ID failed (the status write, or an ApiKey's token Secret), the retry created it again, since most kinds cannot be found in Seq without the ID. The new object is now removed before the error surfaces. - Deleting an entity whose Instance was gone, or being deleted and unreachable, held its finalizer forever, and with it any namespace being deleted. It is now released, leaving the object in Seq; nothing could reach Seq to remove it without the Instance anyway. - Secret references naming another namespace were followed with the operator's cluster-wide access, letting anyone able to create an Instance read any Secret through remote.auth. They are now refused.
…ecated Every kind is now served at seq.k8s.datalust.co/v1 with exactly the v1alpha1 schema, and v1 is the storage version. The v1alpha1 entity types share the v1 spec and status types and declare nothing of their own, so the API server converts between the versions by relabelling apiVersion (conversion: None) and no webhook is needed. The operator works in v1 throughout. The chart marks every non-storage version deprecated, with a warning naming its replacement, since KubeOps has no attribute for it. A server-side dry run of the resulting CRDs against a live cluster still storing v1alpha1 is accepted. Classes are renamed from V1alpha1* to V1*, except the legacy finalizer shims, whose class names are their finalizer identifiers. V1alpha1Condition becomes V1EntityCondition, since V1Condition is taken by the Kubernetes client.
wasabii
force-pushed
the
claude/project-release-readiness-8ea870
branch
from
October 18, 2026 16:10
d333cac to
389f80e
Compare
Every object the operator created before v1 (an Instance's StatefulSet, Service, ServiceAccount, login Secret and operator ApiKey, and each ApiKey's token Secret) carries an owner reference naming seq.k8s.datalust.co/v1alpha1. The Kubernetes client's IsOwnedBy compares apiVersion as well as UID, so once the operator read its Instances as v1 it no longer recognised any of them: a deployed Instance would fail every reconcile with a StatefulSet conflict. Ownership is now decided by UID, as the garbage collector does, and owner references are rewritten to v1 whenever the operator updates the object, so none outlive v1alpha1.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
API version
v1is introduced as the storage version. Every kind is served atseq.k8s.datalust.co/v1with exactly thev1alpha1schema.v1alpha1stays served but deprecated, sokubectlwarns whenever it's used.conversion: None: the API server converts by relabellingapiVersion, and existing objects carry over untouched.v1throughout. TheV1alpha1*classes are renamed toV1*. The legacy finalizer shims keep their names, since their names are the finalizer identifiers. New tests check that the two versions can't drift apart.Security
SystemorOrganization. Defaults now follow sensitivity:IngestandPublicare allowed unless denied, and everything else must be granted. A key asking for too much is refused whole, and its existing key in Seq is left untouched.remote.authon Instances andsecretRefon ApiKeys. Before, the operator followed them with its cluster-wide access.<set>instead of the value. Secrets can now also come from a Secret viaclientSecretRef/clientKeyRef; the plain-text fields are deprecated.RandomNumberGenerator. They previously usedRandom.Shared, which isn't a secure source.Bugs
deployment.envFromno longer crashes every reconcile.spec.permissionswas set.<instance>-operator).serviceNamenames the Service instead of the ServiceAccount. This only applies to new StatefulSets, because the field is immutable.Docs
Upgrade impact
The README's Upgrading section covers each change. On the labs cluster nothing needs to change:
Ingestonly.Testing
v1stored,v1alpha1served and deprecated, identical schemas, andconversion: None. It also renders the chart.v1alpha1only.