Airframe

Why Airframe

Self-service by merge request

A product exists because a file in the catalog says so. A team creates one with a merge request and retires it with another, and every step is on the record.

How one catalog file becomes a product

  1. One file describes the product

    The team adds products/shop.store.ordering.orders.yaml to the catalog: the owning team, the stack, the criticality, the recovery objectives and the monthly budget. The catalog's schema and lint check the file in the merge request's pipeline.

  2. The owners approve

    The catalog names the leads of every journey, domain and context, and the team of every product. The gate approves the request only once current owners have approved it, and binds its own approval to the commit it checked; neither the author's approval nor a committer's counts.

  3. The platform derives the rest

    After the merge, the catalog's pipeline starts a chain of Terraform roots that read it. The domain's project factory creates the product's two Google Cloud projects and their identities, operations creates its dashboards, and the domain's GitLab root creates the repository from the golden path. The hostname follows on the shared edge once the product's first pipeline has deployed it.

  4. The merge request follows the work

    One note on the merged merge request follows the chain as it runs: each pass with its time and link, the new repository's first pipeline, and the moment the product answers at its hostname behind single sign-on. A failure names its job and the next step. A new product runs only once its projects are billed, which is a separate landing-zone merge request within the billing account's project quota.

  5. Retiring is the same file

    Setting the product's status to retiring takes its services off the edge and down to zero instances, and keeps its data. After the entry's retirement date, removed destroys what the product runs and deletes its projects and its repository. Each change of status needs two approvers besides the author, and a removed name stays in the catalog as a tombstone, so it is never reused in its domain.

Try it

Write a catalog entry. This is what the platform derives from it, named as the factories name it at the platform release this site describes.

Criticality label
criticality: 2
Projects
lk-store-returns-xxxx
lk-store-returns-np-xxxx
Pipeline identities
returns-apply@lk-store-returns-xxxx.iam.gserviceaccount.com
returns-plan@lk-store-returns-xxxx.iam.gserviceaccount.com
returns-np-apply@lk-store-returns-np-xxxx.iam.gserviceaccount.com
returns-plan@lk-store-returns-np-xxxx.iam.gserviceaccount.com
Repository
projectairframe/shop/store/ordering/returns
Groups
lk-shop-store-ordering-returns-users@projectairframe.dev
lk-team-store-core@projectairframe.dev
Hostnames
returns.store.shop.projectairframe.dev
returns-np.store.shop.projectairframe.dev
returns-sandbox.store.shop.projectairframe.dev
returns-eph-<iid>.store.shop.projectairframe.dev
Grafana folders and dashboards
shop › store › ordering › returns
returns service
returns SLO
State prefixes
shop/store/ordering/returns/prod/
shop/store/ordering/returns/grafana/
shop/store/ordering/returns/np/
shop/store/ordering/returns/sandbox/
shop/store/ordering/returns/eph/
Budgets
USD 7 / USD 3, alerts at 80% and 100%

What makes it true

A product is created without anyone running a command.
The catalog's pipeline starts the chain of Terraform roots after the merge, and each root applies with a pipeline identity that only a job of its own repository, on a protected ref in its environment, can obtain.
Only the current owners can approve.
The gate reads the ownership model from the catalog's protected main, never from the change it judges, and binds its own approval to the commit it checked; an approval policy makes that approval a condition of merging.
The merge request shows how far along the product is.
After the merge, the catalog's progress job follows the chain, and the gate keeps one note on the merged merge request until the product answers at its hostname, a job fails, or three hours have passed.
Retiring a product takes two approvals besides the author's.
The gate's lifecycle rule asks for two distinct approvers, neither of them the author: one from the product's team and one from the domain's leads or the platform team. The catalog's lifecycle job requires the lifecycle label and the states in order.
A removed name is never reused.
The catalog keeps a tombstone in its list of retired names, and its lint refuses any other product with that name in the domain.