Skip to content

[FEATURE] Change array collections to key-value if order is not important #121

Open
@chrishumanitec

Description

Detailed description

Some fields fields: files and volumes in containers are arrays. Both of these have a required unique identifier: target which is the path to mount in the container.

Using arrays for this introduces the following complexities:

  • Additional validation is required to verify that no two files and no two volumes use the same path
  • The order is not actually important
  • Arrays are harder to visually parse in yaml compared to objects.

Context

In general, it would make sense for arrays to only be used where order is actually important or there is no unique key.

Possible implementation

The spec can be changed to use oneOf as follows:

{
  "files": {
    "description": "The extra files to mount into the container.",
    "oneOf": [
      {
        "type": "array",
        "items": {
          "type": "object",
          "required": [
            "target"
          ],
          "additionalProperties": false,
          "properties": {
            "target": {
              "description": "The file path to expose in the container.",
              "type": "string",
              "minLength": 1
            },
            "mode": {
              "description": "The optional file access mode in octal encoding. For example 0600.",
              "type": "string",
              "pattern": "^0?[0-7]{3}$"
            },
            "source": {
              "description": "The relative or absolute path to the content file.",
              "type": "string",
              "minLength": 1
            },
            "content": {
              "description": "The inline content for the file.",
              "type": "string"
            },
            "noExpand": {
              "description": "If set to true, the placeholders expansion will not occur in the contents of the file.",
              "type": "boolean"
            }
          },
          "oneOf": [
            {
              "required": [
                "target",
                "content"
              ]
            },
            {
              "required": [
                "target",
                "source"
              ]
            }
          ]
        }
      },
      {
        "type": "object",
        "patternProperties": {
          ".+": {
            "type": "object",
            "additionalProperties": false,
            "properties": {
              "mode": {
                "description": "The optional file access mode in octal encoding. For example 0600.",
                "type": "string",
                "pattern": "^0?[0-7]{3}$"
              },
              "source": {
                "description": "The relative or absolute path to the content file.",
                "type": "string",
                "minLength": 1
              },
              "content": {
                "description": "The inline content for the file.",
                "type": "string"
              },
              "noExpand": {
                "description": "If set to true, the placeholders expansion will not occur in the contents of the file.",
                "type": "boolean"
              }
            }
          },
          "oneOf": [
            {
              "required": [
                "content"
              ]
            },
            {
              "required": [
                "source"
              ]
            }
          ]
        }
      }
    ]
  }
}

Additional information

score-go would need to support both but surface via the existing API. This would mean that implementations using score-go get this for free.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Labels

No labels
No labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions