Transform Sets

A TransformSet custom resource (CR) is used to save and reuse the set of Transforms to be used in Restore Actions, Restore Cluster Actions and Policies.

Example TransformSet Operations

Create a TransformSet

The following example illustrates how to create a transform set that contains two transforms, one of which changes the deadline parameter value to 300 seconds and another one scales deployments to 3 replicas.

$ cat > sample-transform-set.yaml <<EOF
apiVersion: config.kio.kasten.io/v1alpha1
kind: TransformSet
metadata:
  name: sample-transformset
  namespace: kasten-io
spec:
  comment: "Transform Set Example"
  transforms:
    - subject:
        resource: deployments
      name: progressDeadlineSeconds5m
      json:
        - op: replace
          path: /spec/progressDeadlineSeconds
          value: 300
    - subject:
        resource: deployments
      name: scaleDeployment3
      json:
        - op: replace
          path: /spec/replicas
          value: 3
EOF

$ kubectl apply -f sample-transform-set.yaml
transformset.config.kio.kasten.io/sample-transformset created

# make sure it initializes and validates properly
$ kubectl get transformsets.config.kio.kasten.io --namespace kasten-io -w
NAME                  STATUS    AGE
sample-transformset   Success   30s

Update a TransformSet

To update a TransformSet, edit the spec portion of a TransformSet CR using your preferred method of submitting resource changes with kubectl.

$ kubectl apply -f sample-transform-set-updated.yaml
transformset.config.kio.kasten.io/sample-transformset configured

Once the change is submitted, K10 will re-validate the TransformSet and update .status.validation accordingly.

$ kubectl get transformsets.config.kio.kasten.io --namespace kasten-io -w
NAME                  STATUS    AGE
sample-transformset   Failed    25m
sample-transformset   Success   30m

Since K10 processes API object changes asynchronously, to avoid confusion with a previous TransformSet status, it is recommended as convention that the status portion of the TransformSet is omitted when submitting changes.

Warning

A transform set is invalid if it has no transforms or if one of the transforms it contains is invalid.

Using a TransformSet

The following example illustrates how to use a TransformSet in a RestoreAction.

$ cat > restore-action-with-transform-set.yaml <<EOF
apiVersion: actions.kio.kasten.io/v1alpha1
kind: RestoreAction
metadata:
  generateName: restore-nginx-
  namespace: nginx
spec:
  subject:
    kind: RestorePoint
    name: backup-nginx-sdxg2
    namespace: nginx
  targetNamespace: nginx
  transforms:
    - json: []
      transformSetRef:
        name: sample-transformset
        namespace: kasten-io
EOF

$ kubectl create -f restore-action-with-transform-set.yaml
restoreaction.actions.kio.kasten.io/restore-nginx-l69nd created

The TransformSet will be applied to the restored application.

Delete a TransformSet

A TransformSet can be deleted using the following command.

# delete transformset "sample-transformset" for K10 installed in "kasten-io"
$ kubectl delete transformsets.config.kio.kasten.io sample-transformset --namespace kasten-io
transformset.config.kio.kasten.io "sample-transformset" deleted

TransformSet API Type

The following is a complete specification of a TransformSet CR.

To learn more about the transforms structure, see Transforms.

# Standard Kubernetes API Version declaration. Required.
apiVersion: config.kio.kasten.io/v1alpha1
# Standard Kubernetes Kind declaration. Required.
kind: TransformSet
# Standard Kubernetes metadata. Required.
metadata:
  # TransformSet name. May be any valid Kubernetes object name. Required.
  # TransformSet name is not mutable once created.
  name: sample-transformset
  # TransformSet namespace. Required.
  namespace: kasten-io
# TransformSet parameters. Required.
spec:
  # User friendly comment describing the transform set. Optional.
  comment:
  # The list of transforms. Required.
  transforms:
    # Specifies which resource artifacts to apply this transform to. Required.
    # At least one filter should be set.
    - subject:
        # Resource group. Optional.
        group: apps
        # Resource version. Optional.
        version: v1
        # Resource type. Optional.
        resource: deployments
        # Resource name. Optional.
        name: my-app
      # The name of the transform. Required.
      name: 'copyRelease'
      # An array of RFC-6902 JSON patch-like operations. Required.
      json:
        # Operation name. Required.
        # Transforms support six command operations:
        #   # 'test' - checks that an element exists (and equals the value / matches the regexp if specified)
        #   # 'add' - inserts a new element to the resource definition
        #   # 'remove' - deletes an existing element from the resource definition
        #   # 'copy' - duplicates an element, overwriting the value in the new path if it already exists
        #   # 'move' - relocates an element, overwriting the value in the new path if it already exists
        #   # 'replace' - replaces an existing element with a new element
        - op: copy
          # Source reference for operation. Optional.
          # Required and valid only for 'move' and 'copy' operations.
          from: '/metadata/labels/release'
          # Target reference for operation. Required for every operation.
          path: '/spec/template/metadata/labels/release'
          # Regex to match expression. Optional.
          # When used with 'copy', 'move' or 'replace' operation,
          # the transform will match the target text against the `regex`
          # and substitute regex capturing groups with `value`.
          # When used with 'test' operation,
          # the transform will match the target text against the `regex`.
          regex: 'prod-v.*'
          # Value is any valid JSON. Optional.
          # Required for 'add' and 'replace' operations.
          # Required for 'copy' and 'move' operations only when used along with `regex`.
          # 'test' operation can use either `regex` or `value`.
          value: 'prod'
# Status of the TransformSet. Users should not set any data here.
status:
  # Object generation last observed by the controller
  observedGeneration: 2
  # Validation status of the TransformSet
  # Valid values are:
  #   # Success – successfully initialized and validated
  #   # Failed - not properly initialized or validated
  #   # Indeterminate – indicate an indeterminate validation status for multi-cluster TransformSets.
  validation: Success
  # An array of any validation or initialization errors encountered.
  error: null