Skip to content

Cell Provisioning and De-Provisioning

ringctl uses adaptive deployment strategy, i.e it takes reference from the existing tenant_model from a target_ring and replaces only the necessary fields. The cloud provider where a cell should be provisioned must also be provided.

1. Create a new tenant using a cell from the target ring as reference

Section titled “1. Create a new tenant using a cell from the target ring as reference”

A cell from the given Amp environment, ring, and the requested cloud provider will be used as a reference. A tenant model will be created for a new cell, and it will have the given cell ID. (Cell ID needs to be registered with the topology service, so the user must specify it here.)

Terminal window
ringctl cell provision --dry-run --amp_environment <cellsdev|cellsprod> --ring 0 --cloud_provider <aws|gcp> --cell_id <cell_id>
Example Run

Command:

Terminal window
ringctl cell provision --dry-run --local -C ../cells/tissue --cloud_provider aws --ring 0 --cell_id 200

Output:

Terminal window
$ ringctl cell provision --dry-run --local -C ../cells/tissue --cloud_provider aws --ring 0 --cell_id 200
time=2025-08-28T10:07:15.568+09:00 level=WARN msg="DELIVERY_METRICS_URL or DELIVERY_METRICS_TOKEN not set, disabling metrics" DELIVERY_METRICS_URL=""
time=2025-08-28T10:07:15.568+09:00 level=INFO msg="tissue client initialized" instance=https://ops.gitlab.net branch=main dry_run=true amp=cellsdev project=gitlab-com/gl-infra/cells/tissue version=dev-gunknow-dirty local=true
time=2025-08-28T10:07:15.568+09:00 level=INFO msg="adding new tenant" ring=0 amp=cellsdev
time=2025-08-28T10:07:15.568+09:00 level=INFO msg="fetching cells list from ring" ring=0
time=2025-08-28T10:07:15.568+09:00 level=WARN msg="AWS tenant generation requires a manual step. Create an AWS account for this tenant and replace the placeholder_aws_account_id with the generated account ID. Follow this manual process: https://gitlab.com/gitlab-com/gl-infra/tenant-scale/cells-infrastructure/team/-/issues/438#note_2674468049. See https://gitlab.com/gitlab-com/gl-infra/delivery/-/issues/21311 for future plans." new_tenant_id=c01k3q3dwzgeajqxb2 placeholder_aws_account_id=PLACEHOLDER-AWS-ACCOUNT-ID
time=2025-08-28T10:07:15.568+09:00 level=INFO msg="new tenant generated" tenant_id=c01k3q3dwzgeajqxb2 reference_tenant_id=c01k21yz9qqajjfn6z
$ cat ../cells/tissue/rings/cellsdev/-1/c01k3q3dwzgeajqxb2.json
{
"$schema": "https://gitlab-com.gitlab.io/gl-infra/gitlab-dedicated/tenant-model-schema/v1.80.0/tenant-model.json",
"amp_aws_account_id": "537566696576",
"amp_node_role_arns": [
"arn:aws:iam::537566696576:role/restoretest_irsa_role",
"arn:aws:iam::537566696576:role/prepare_irsa_role",
"arn:aws:iam::537566696576:role/onboard_irsa_role",
"arn:aws:iam::537566696576:role/provision_irsa_role",
"arn:aws:iam::537566696576:role/configure_irsa_role",
"arn:aws:iam::537566696576:role/qa_irsa_role"
],
"audit_logging": false,
"aws_account_id": "PLACEHOLDER-AWS-ACCOUNT-ID",
"backup_region": "eu-west-1",
"byod": {
"instance": "staging.gitlab.com"
},
"cells": {
"cell_id": 200,
"database": {
"skip_sequence_alteration": false
},
"topology_service_client": {
"address": "topology-grpc.staging.runway.gitlab.net:443"
}
},
"clickhouse": {
"enabled": false
},
"cloud_provider": "aws",
"cloudflare_waf": {
"enabled": true,
"migration_stage": "COMPLETE",
"proxied": "PROXIED_RESTRICTED"
},
"external_smtp_parameters": {
"authentication": "login",
"domain": "mg.staging.gitlab.com",
"from": "[email protected]",
"host": "smtp.mailgun.org",
"pool": true,
"port": 2525,
"reply": "[email protected]",
"starttls": true,
"tls": false,
"username": "[email protected]"
},
"gitlab_custom_helm_chart": {
"version": "9.1.2-390132"
},
"gitlab_inter_pod_tls_enabled": true,
"gitlab_version": "17.10.7",
"instrumentor_version": "v17.132.0",
"internal_reference": "cell-c01k3q3dwzgeajqxb2",
"managed_domain": "cell-c01k3q3dwzgeajqxb2.gitlab-cells.dev",
"onboarding_state_region": "us-east-1",
"perform_qa": true,
"prerelease_version": "18.4.202508260236-29ee9d9c17d.787b1324c36",
"primary_region": "us-east-1",
"reference_architecture": "ra3k_v3",
"reference_architecture_overlays": [],
"root_ca": {
"aws_account_id": "245991315407",
"region": "us-east-1"
},
"sandbox_account": false,
"site_regions": [
"us-east-1"
],
"tenant_id": "c01k3q3dwzgeajqxb2",
"use_gar_for_prerelease_image": true
}

2. [For AWS cells only] Create AWS account

Section titled “2. [For AWS cells only] Create AWS account”

We don’t have a guide for creating this account at the moment. The steps in this issue thread can be followed to create an AWS account in the appropriate Amp environment.

Once the AWS account is created, replace the string PLACEHOLDER-AWS-ACCOUNT-ID with the generated AWS account ID in the local tenant model file.

The tenant model for the new cell will be created in your local copy of cells/tissue at rings/${amp_environment}/-1/${tenant_id}.json. The cell must always be placed in the quarantine ring -1 at this stage. Create a feature branch from the latest default branch, commit this file, and create a merge request in the cells/tissue project. The canonical code for cells/tissue is on the https://ops.gitlab.net GitLab instance.

Once an MR has been created, the deployment pipeline to trigger Instrumentor stages can be triggered using ringctl. The MR does not need to be merged at this stage.

Terminal window
ringctl cell deploy --amp_environment <cellsdev|cellsprod> <tenant_id> --only-gitlab-upgrade=false --branch <feature_branch_name>

When all the Instrumentor stages pass successfully, the MR that introduces the cell should be merged into the default branch.

  • Once the pipeline completes successfully, access your cell through the domain specified in the managed_domain field of the TENANT_MODEL
  • Example: https://cell-<tenant_id>.gitlab-cells.dev

Moving Cells between Rings is a logical operation that only impacts when the destination ring receives a new patch. Cells in Quarentine (-1) Ring do not recieve any automation. All other Rings will receive operations in order.

  1. Using ringctl:

    Terminal window
    % ringctl cell quarantine <cell-id> --ring <ring-id> -b <branch-name>
    Example Run
    Terminal window
    % ringctl cell quarantine c01j2t2v563b55mswz --ring 0 -b jts/test
    time=2025-04-01T15:49:04.424-04:00 level=WARN msg="DELIVERY_METRICS_URL or DELIVERY_METRICS_TOKEN not set, disabling metrics" DELIVERY_METRICS_URL=""
    time=2025-04-01T15:49:04.424-04:00 level=WARN msg="using default text icons; please select your preferred set of icons and store the value in the ringctl.yml file"
    time=2025-04-01T15:49:04.530-04:00 level=INFO msg="tissue client initialized" instance=https://ops.gitlab.net branch=jts/test dry_run=false amp=cellsdev project=gitlab-com/gl-infra/cells/tissue version=dev-g92b52bf-dirty local=false
    time=2025-04-01T15:49:04.864-04:00 level=WARN msg="branch not found, searching in default branch" branch=jts/test default_branch=main
    New branch: jts/test
    You can open a merge request visiting
    https://ops.gitlab.net/gitlab-com/gl-infra/cells/tissue/-/merge_requests/new?merge_request%5Bsource_branch%5D=jts%2Ftest
    time=2025-04-01T15:49:06.670-04:00 level=INFO msg="cell operation" ring=-1 amp=cellsdev action=move url=https://ops.gitlab.net/gitlab-com/gl-infra/cells/tissue/-/commit/6ac6e3fca1b34cbc1022c966e4f7a2028bf5899e
    time=2025-04-01T15:49:06.671-04:00 level=INFO msg="Successfully quarantined cell" cell_id=c01j2t2v563b55mswz
  2. Open the Merge Request using the provided log output containing a link

  3. Obtain review, approval, and merge the MR.

How to Move a Cell Out of the Quarantine Ring

Section titled “How to Move a Cell Out of the Quarantine Ring”

This is currently a manual process.

  1. Interrogate the target cell configuration and the target Ring destination
  2. Validate the version of Instrumentor is the same.
  3. Validation the configuration of the cell is the same.
  4. Validate the version of GitLab is installed, is the same.
  5. If any of the above differ, create a patch to address any concerns.
  6. If the target cell is in a sane state, create an MR which moves the JSON file from the -1 directory to the target Ring directory
  7. Obtain review, approval and merge the MR.
  1. Ensure the target cell is in the quarantine ring:

    • If not already there, create an MR to move the cell definition to the -1 folder (quarantine ring)
    • Get the MR approved and merged
  2. Trigger the tear-down pipeline:

    Terminal window
    ringctl cell deprovision --cell <tenant_id> --ring -1 -e <cellsdev|cellsprod>
  3. Remove the cell definition:

    • After the tear-down pipeline completes successfully, create an MR to delete the cell definition file from cells/tissue
    • Get the MR approved and merged