Replies: 1 comment 4 replies
|
Diving into some of the questions: 1. Who owns Profile composition and lifecycle?The hand-wavy answer is a CI pipeline. That probably doesn't go into enough detail for a scalable architecture, but it's a good foundation to build on top of. One question I have that could help steer the direction of how we approach this is where the dev-container for a repo is defined. In my ultra-limited experience, it's usually in the 2. What should downstream consumers know about extension-defined semantics?Yeah, this is a good one. The goal of the extensions is to provide the minimum actionable information for a downstream adapter to fulfill the listed conditions. Sometimes that means more information up front, in the extension, than others. For example, the S3 extension uses actual S3 operation semantics, which can then be turned into IAM privileges. The NATS extension does the same - lists the streams and specific operations that are needed by the application. In both cases, authn/authz is built into the core understanding of what provisioning means. You legit can't have an S3 bucket or a NATS stream without some sort of clear authz declaration. Meanwhile, the As for how much the adapters need to know and understand, ideally it should be that they can hook up to a service with an admin account (so AWS or NATS service) and use the extension semantics listed in the profile to directly take action against that service's management API. If a profile lists 3. How should resolved extension identity and vocabulary ownership flow to downstream consumers?This is a big question, so I'll answer the bits that I can. Further discussion is 100% warranted. To me, the profile and the extensions that it leverages in order to define conditions is meant to indicate which capabilities are being requested from the downstream platform. If the platform has those capabilities already enabled, then the fulfillment should be easy and the validation/consumption of the profile. But it really only works if the platform knows how to interpret that condition into an actionable integration. Each platform is going to handle that differently. At the end of the day, the extensions are only meant to provide standard vocabulary that we can/should all agree on. Once the condition has been validated against the extension, we no longer need the extension itself. We've proven that the condition meets the structure that was expected, and we can now move on to provisioning. It would be good for a platform to be able to support as many capabilities listed within the extension, e.g. S3 4. Where exactly does demand end and fulfillment begin?This is a good one. And a tough one. With no "right" answer. It really depends on the level of abstraction that makes something actionable to the downstream adapter. If we can say "git" without specifying a specific platform and still provide value, that's fine. If we need to or can say "github" and still be actionable and provide value, also fine. The same can go for data storage, which is why we have To be fair, maybe "git" would have been the right abstraction point instead of "github." Open to feedback on that one. 5. Where does concrete resource identity enter?IMO, that's 100% a platform responsibility. Unless the codebase specifically indicates or hard-codes the resource (and I'd have questions for the developer if they did that), then it's purely a fulfillment consideration. The goal is specifically to leave that downstream of the condition YAML, so that the platform can decide and take action. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
The dev-container Profile composition PoC has now landed in
rc-demos:runtimeconditions/rc-demos#2
That experiment gave me a much clearer picture of one possible workflow:
One thing I particularly like about the result is that the application and the dev-container remain distinct workloads with distinct identities, while the composed result is still an ordinary Runtime Conditions Profile.
Colin asked on the PR whether I’d be interested in thinking through what this could look like as a scalable real-world architecture. Definitely yes.
Rather than jump straight into another implementation, I thought it would be useful to start identifying the architectural boundaries we want to preserve and the questions a scalable design needs to answer.
A downstream experiment that helped expose some of those boundaries
In parallel, I’ve been experimenting with Runtime Conditions as input to PADE:
https://github.com/After-Certainty/rc-pade
The goal there has not been to make PADE part of Runtime Conditions. It has been useful as a concrete downstream consumer for testing the boundary between a Profile describing workload demand and a platform interpreting that demand as capability intent.
One experiment took the actual composed dev-container Profile from
rc-demosand projected its source-control requirement:into PADE capability intent:
The Runtime Conditions Profile did not contain credentials, repository identity, tokens, broker configuration, or fulfillment mechanics.
The resulting PADE
DevelopmentSessionwas also successfully consumed by the existing PADE fulfillment path for the read capability.I don’t take that as evidence that PADE’s current projection mechanism is the architecture we should standardize around. It has mainly been useful for making assumptions concrete enough to discover where the interesting boundaries are.
White paper alignment
The current white-paper draft also seems like a useful architectural anchor:
runtimeconditions/white-paper-artifacts#1
I especially like its framing of Runtime Conditions Profiles as a common reference point between workload demand and platform fulfillment, without replacing service catalogs, deployment manifests, policy systems, or other platform tooling.
That makes me picture the boundary roughly like this:
The lower half could look completely different depending on whether the consumer is Kubernetes, Backstage, PADE, an internal developer platform, or something else.
Questions I think a scalable architecture needs to answer
1. Who owns Profile composition and lifecycle?
The PoC allows an application Profile to be materialized independently and then composed with requirements owned by another execution context, such as a dev-container.
Does that feel like the right fundamental model?
If so, what owns composition in a real system? How do we think about changes, recomposition, provenance, publication, and last-known-good artifacts?
2. What should downstream consumers know about extension-defined semantics?
One thing the PADE experiments exposed is that extensions are intentionally heterogeneous.
For example, different extensions currently express requirements through shapes such as S3
operations[].name, source-controlprovider+access[], HTTP method/path or a spec, Kubernetes verbs/resources/scopes, and NATS resource/action plus resource-specific fields.Assuming a Profile has already gone through extension resolution and validation, what semantic view should a downstream consumer receive?
Should a generic downstream platform inspect the extension-defined fields directly?
Should extension-specific adapters translate them into whatever model the platform understands?
Or should extension resolution produce some intermediate representation that makes vocabulary ownership and semantics explicit to downstream consumers?
My main concern is avoiding a situation where every downstream consumer has to independently reproduce Runtime Conditions' extension-resolution semantics before it can safely interpret a Profile.
3. How should resolved extension identity and vocabulary ownership flow to downstream consumers?
The spec now allows multiple extensions to define the same Condition
kind, withconditions[].extensionselecting a particular definition when specified and the first matching definition in extension resolution order being used otherwise.That makes me wonder what information survives resolution for a downstream consumer.
For example, after resolving:
should a consumer receive or be able to determine the exact immutable extension identifier whose definition was selected?
Should that identity be preserved in provenance, including whether the selection was explicit through
conditions[].extensionor implicit through resolution order?There also seems to be a related question about scope.
conditions[].extensionselects the extension defining the Conditionkind, while interface types, extension-defined fields, and field values have their own resolution rules.Should downstream consumers therefore think in terms of one extension owning a whole Condition, or in terms of resolved ownership for each extension-defined vocabulary element?
Put another way: after validation, how much of extension resolution should a downstream consumer ever need to repeat?
4. Where exactly does demand end and fulfillment begin?
The white-paper draft talks about allowing workloads to express requirements without unnecessarily specifying provider or implementation details.
That makes cases such as this interesting:
Is
githubintrinsic workload demand because the resource being accessed really is GitHub?Or are there cases where the portable demand should simply be Git read/write, with the provider selected later by the environment?
My suspicion is that the distinction depends on whether the provider is part of the identity of the thing being requested or merely one possible implementation.
5. Where does concrete resource identity enter?
The source-control Profile deliberately does not contain a repository URL, credentials, token, account identity, etc., which feels like a useful separation.
But eventually a platform has to join something like:
with:
Does that binding belong in a platform capability catalog, deployment configuration, a policy/binding layer, or some combination?
Those are the main boundaries I’m trying to understand before building much more.
I’m less interested in defending the particular implementation choices in the PoC or
rc-padethan in finding the points where those experiments stop matching the model we want Runtime Conditions to have.If some of these questions already have an intended answer, that would be especially useful context. And if there are other architectural questions we should be asking before thinking about a scalable implementation, I’d love to add them here.
All reactions