Skip to content

feat(model): an ApplicationComponent provisions the TechnologyServices it creates - #208

Merged
ionos-landgraf-vin merged 1 commit into
mainfrom
feat/provisions
Oct 26, 2026
Merged

ionos-landgraf-vin merged 1 commit into
mainfrom
feat/provisions

Conversation

@ionos-landgraf-vin

Copy link
Copy Markdown
Collaborator

Fixes #206

Summary

  • New relation ApplicationComponent provisions technologyServices (TechnologyService): the services a controller, operator, pipeline or job creates and keeps in their desired state (Crossplane, Cluster API, Terraform controller, ...).
  • Direction differs from the issue's proposal, on purpose. The issue proposes provisionedBy on the TechnologyService, 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 like servedBy and exposes, and the issue's goals still hold:
    • the service page lists its provisioner as incoming "provisions" (inverse view, no label work needed);
    • the impact of a provisioner is what it reaches, so outgoing_transitive / the dependency graph from the component follow the edge to the services it builds;
    • only TechnologyService targets load (anything else is a ResourceError, so archsight lint rejects it).
  • Not a runtime dependency (the service keeps running while the provisioner is down, only changes stop), so it is not dependsOn; servedBy stays where the component itself runs, suppliedBy what 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: the kind descriptions of both kinds, "Where a Component Runs" (table row and paragraph) and the verb table of "Direction of Relations" in docs/modeling.md (there is no suppliedBy text in docs/architecture.md to put it next to). Example: Payments:ClusterOperator provisions Payments:Cluster and is servedBy the compute platform.

Test plan

  • test/application_component_provisions_test.rb: component lists the service, the service lists it as incoming and not as servedBy; the service declares nothing upwards (provisionedBy is rejected); transitive reach; no cycle when the provisioner also runs in the service; non-service targets rejected; the example
  • bundle exec rake test (2469 runs, 0 failures), bundle exec rubocop, archsight lint on 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

…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>
@ionos-landgraf-vin
ionos-landgraf-vin merged commit 3ad81cd into main Oct 26, 2026
8 checks passed
@ionos-landgraf-vin
ionos-landgraf-vin deleted the feat/provisions branch October 26, 2026 06:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

feat: TechnologyService provisionedBy ApplicationComponent

1 participant