Repository navigation
feat(model): an ApplicationComponent provisions the TechnologyServices it creates - #208
Merged
Merged
Conversation
…s it creates A TechnologyService (a fleet of clusters, a database cluster, a VM pool) could not say which software creates it: an operator or controller that reconciles the platform could only be named in prose, so "what does this controller build" and "what breaks when it breaks" were not answerable. The relation is written on the component and points down, like every relation (technology never points up to application): ApplicationComponent provisions technologyServices. The service page lists the provisioner as incoming, the impact of a provisioner is what it reaches (its outgoing relations). It is not a runtime dependency: a provisioned service keeps running while the provisioner is down. servedBy stays where the component itself runs, suppliedBy what the service is made of. Documented in both kind descriptions and in "Where a Component Runs" and the direction table of the modeling guide. The examples get an operator that provisions the payments cluster and runs on the compute platform. Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
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.
Fixes #206
Summary
ApplicationComponentprovisionstechnologyServices(TechnologyService): the services a controller, operator, pipeline or job creates and keeps in their desired state (Crossplane, Cluster API, Terraform controller, ...).provisionedByon theTechnologyService, which points from technology up to application and breaks the top-down rule ("a relation is written on an element and points to what it depends on",docs/modeling.md"Direction of Relations"; the graph is a DAG). Written on the component it points down likeservedByandexposes, and the issue's goals still hold:outgoing_transitive/ the dependency graph from the component follow the edge to the services it builds;TechnologyServicetargets load (anything else is aResourceError, soarchsight lintrejects it).dependsOn;servedBystays where the component itself runs,suppliedBywhat the service is made of. A provisioner that also runs in the service it builds is no cycle (both edges go component to service).docs/modeling.md(there is nosuppliedBytext indocs/architecture.mdto put it next to). Example:Payments:ClusterOperatorprovisionsPayments:Clusterand isservedBythe compute platform.Test plan
test/application_component_provisions_test.rb: component lists the service, the service lists it as incoming and not asservedBy; the service declares nothing upwards (provisionedByis rejected); transitive reach; no cycle when the provisioner also runs in the service; non-service targets rejected; the examplebundle exec rake test(2469 runs, 0 failures),bundle exec rubocop,archsight linton the examples,steep check(only the 2 existing warnings); the generated OpenAPI schema picks the relation up and validates every example instance🤖 Generated with Claude Code