Skip to content

Latest commit

 

History

History
91 lines (73 loc) · 2.8 KB

merge2.md

File metadata and controls

91 lines (73 loc) · 2.8 KB

Merge (2-way)

2-way merges fields from a source to a destination, overriding the destination fields where they differ.

Merge Rules

Fields are recursively merged using the following rules:

  • scalars

    • if present only in the dest, it keeps its value
    • if present in the src and is non-null, take the src value -- if null, clear it
    • example src: 5, dest: 3 => result: 5
  • non-associative lists -- lists without a merge key

    • if present only in the dest, it keeps its value
    • if present in the src and is non-null, take the src value -- if null, clear it
    • example src: [1, 2, 3], dest: [a, b, c] => result: [1, 2, 3]
  • map keys and fields -- paired by the map-key / field-name

    • if present only in the dest, it keeps its value
    • if present only in the src, it is added to the dest
    • if the field is present in both the src and dest, and the src value is null, the field is removed from the dest
    • if the field is present in both the src and dest, the value is recursively merged
    • example src: {'key1': 'value1', 'key2': 'value2'}, dest: {'key2': 'value0', 'key3': 'value3'} => result: {'key1': 'value1', 'key2': 'value2', 'key3': 'value3'}
  • associative list elements -- paired by the associative key

    • if present only in the dest, it keeps its value in the list
    • if present only in the src, it is added to the dest list
    • if the field is present in both the src and dest, the value is recursively merged

Associative Keys

Associative keys are used to identify "same" elements within 2 different lists, and merge them. The following fields are recognized as associative keys:

[mountPath, devicePath, ip, type, topologyKey, name, containerPort]

Any lists where all of the elements contain associative keys will be merged as associative lists.

Example

Source

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3 # scalar
  template:
    spec:
      containers:  # associative list -- (name)
      - name: nginx
        image: nginx:1.7
        command: ['new_run.sh', 'arg1'] # non-associative list
      - name: sidecar2
        image: sidecar2:v1

Destination

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 1
  template:
    spec:
      containers:
      - name: nginx
        image: nginx:1.6
        command: ['old_run.sh', 'arg0']
      - name: sidecar1
        image: sidecar1:v1

Result

apiVersion: apps/v1
kind: Deployment
spec:
  replicas: 3 # scalar
  template:
    spec:
      containers:  # associative list -- (name)
      - name: nginx
        image: nginx:1.7
        command: ['new_run.sh', 'arg1'] # non-associative list
      - name: sidecar1
        image: sidecar1:v1
      - name: sidecar2
        image: sidecar2:v1