# resource-labels Specification ## Purpose TBD - created by archiving change add-key-value-labels. Update Purpose after archive. ## Requirements ### Requirement: Resource stores labels as key-value pairs Each resource SHALL have a Labels property that stores arbitrary string key-value pairs. Labels SHALL be initialized to an empty collection and MUST NOT be null. #### Scenario: New resource has empty labels - **WHEN** a resource is created - **THEN** the resource has an empty Labels collection #### Scenario: Labels are stored per resource - **WHEN** a label with key "env" and value "production" is added to resource "web-01" - **THEN** resource "web-01" has Labels containing "env" -> "production" - **AND** other resources are unaffected ### Requirement: User can add a label to a resource The system SHALL allow users to add a label (key-value pair) to any resource via CLI and Web UI. #### Scenario: Add label via CLI - **WHEN** user runs `rpk servers label add web-01 --key env --value production` - **THEN** resource "web-01" has label "env" with value "production" - **AND** the change is persisted to YAML #### Scenario: Add label via Web UI - **WHEN** user opens the resource card, clicks add label, enters key "owner" and value "team-a", and submits - **THEN** the resource has label "owner" with value "team-a" - **AND** the change is persisted #### Scenario: Add label to existing key overwrites value - **WHEN** resource "web-01" has label "env" with value "staging" - **AND** user adds label "env" with value "production" - **THEN** resource "web-01" has label "env" with value "production" ### Requirement: User can remove a label from a resource The system SHALL allow users to remove a label by key from any resource via CLI and Web UI. #### Scenario: Remove label via CLI - **WHEN** resource "web-01" has label "env" with value "production" - **AND** user runs `rpk servers label remove web-01 --key env` - **THEN** resource "web-01" no longer has label "env" - **AND** the change is persisted to YAML #### Scenario: Remove label via Web UI - **WHEN** resource has label "owner" with value "team-a" - **AND** user clicks remove on that label in the resource card - **THEN** the resource no longer has label "owner" - **AND** the change is persisted #### Scenario: Remove nonexistent key is no-op - **WHEN** resource "web-01" does not have label "env" - **AND** user runs `rpk servers label remove web-01 --key env` - **THEN** no error occurs - **AND** the resource is unchanged ### Requirement: Labels persist in YAML Labels SHALL be serialized and deserialized from the YAML resource file. Existing resources without a labels section SHALL deserialize with an empty Labels collection. #### Scenario: Labels are written to YAML - **WHEN** resource "web-01" has labels "env: production" and "owner: team-a" - **AND** the resource is saved - **THEN** the YAML file contains a labels section for that resource with the key-value pairs #### Scenario: Legacy YAML without labels deserializes correctly - **WHEN** resource in YAML has no labels section - **THEN** the resource deserializes with an empty Labels collection ### Requirement: Labels are displayed in resource views The system SHALL display labels in resource describe output (CLI) and resource cards (Web UI). #### Scenario: Describe shows labels - **WHEN** resource "web-01" has labels "env: production" and "owner: team-a" - **AND** user runs `rpk servers describe web-01` - **THEN** the output includes the labels in key-value format #### Scenario: Resource card shows labels - **WHEN** resource has label "env" with value "production" - **AND** user views the resource card in Web UI - **THEN** the label is displayed ### Requirement: Label key and value are validated The system SHALL validate label key and value before adding. Key and value MUST be non-empty after trimming. Key length MUST NOT exceed 50 characters. Value length MUST NOT exceed 200 characters. #### Scenario: Empty key is rejected - **WHEN** user attempts to add a label with empty or whitespace-only key - **THEN** a validation error is returned - **AND** the resource is not updated #### Scenario: Empty value is rejected - **WHEN** user attempts to add a label with empty or whitespace-only value - **THEN** a validation error is returned - **AND** the resource is not updated #### Scenario: Key exceeds length limit is rejected - **WHEN** user attempts to add a label with key longer than 50 characters - **THEN** a validation error is returned - **AND** the resource is not updated #### Scenario: Value exceeds length limit is rejected - **WHEN** user attempts to add a label with value longer than 200 characters - **THEN** a validation error is returned - **AND** the resource is not updated #### Scenario: Add label for nonexistent resource fails - **WHEN** user attempts to add a label to a resource that does not exist - **THEN** a not-found error is returned - **AND** no change is persisted