{ "$id": "https://github.com/redhat-chaos/krkn/", "$schema": "https://json-schema.org/draft/2020-12/schema", "title": "Kraken Arcaflow scenarios", "description": "Serial execution of Arcaflow Python plugins. See https://github.com/arcaflow for details.", "type": "array", "minContains": 1, "items": { "oneOf": [ { "type": "object", "properties": { "id": { "type": "string", "const": "kill-pods" }, "config": { "$defs": { "KillPodConfig": { "type": "object", "properties": { "namespace_pattern": { "type": "string", "format": "regex", "title": "Namespace pattern", "description": "Regular expression for target pod namespaces." }, "name_pattern": { "type": "string", "format": "regex", "title": "Name pattern", "description": "Regular expression for target pods. Required if label_selector is not set." }, "kill": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of pods to kill", "description": "How many pods should we attempt to kill?" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target pods. Required if name_pattern is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "timeout": { "type": "integer", "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "backoff": { "type": "integer", "default": 1, "title": "Backoff", "description": "How many seconds to wait between checks for the target pod status." }, "krkn_pod_recovery_time": { "type": "integer", "default": 30, "title": "Recovery Time", "description": "The Expected Recovery time fo the pod (used by Krkn to monitor the pod lifecycle)." } }, "required": [ "namespace_pattern" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "namespace_pattern": { "type": "string", "format": "regex", "title": "Namespace pattern", "description": "Regular expression for target pod namespaces." }, "name_pattern": { "type": "string", "format": "regex", "title": "Name pattern", "description": "Regular expression for target pods. Required if label_selector is not set." }, "kill": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of pods to kill", "description": "How many pods should we attempt to kill?" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target pods. Required if name_pattern is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "timeout": { "type": "integer", "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "backoff": { "type": "integer", "default": 1, "title": "Backoff", "description": "How many seconds to wait between checks for the target pod status." }, "krkn_pod_recovery_time": { "type": "integer", "default": 30, "title": "Recovery Time", "description": "The Expected Recovery time fo the pod (used by Krkn to monitor the pod lifecycle)." } }, "required": [ "namespace_pattern" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "wait-for-pods" }, "config": { "$defs": { "WaitForPodsConfig": { "type": "object", "properties": { "namespace_pattern": { "type": "string", "format": "regex" }, "name_pattern": { "type": "string", "format": "regex" }, "label_selector": { "type": "string", "minLength": 1 }, "count": { "type": "integer", "minimum": 1, "default": 1, "title": "Pod count", "description": "Wait for at least this many pods to exist" }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "How many seconds to wait for?" }, "backoff": { "type": "integer", "default": 1, "title": "Backoff", "description": "How many seconds to wait between checks for the target pod status." }, "kubeconfig_path": { "type": "string" } }, "required": [ "namespace_pattern" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "namespace_pattern": { "type": "string", "format": "regex" }, "name_pattern": { "type": "string", "format": "regex" }, "label_selector": { "type": "string", "minLength": 1 }, "count": { "type": "integer", "minimum": 1, "default": 1, "title": "Pod count", "description": "Wait for at least this many pods to exist" }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "How many seconds to wait for?" }, "backoff": { "type": "integer", "default": 1, "title": "Backoff", "description": "How many seconds to wait between checks for the target pod status." }, "kubeconfig_path": { "type": "string" } }, "required": [ "namespace_pattern" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "run_python" }, "config": { "$defs": { "RunPythonFileInput": { "type": "object", "properties": { "filename": { "type": "string" } }, "required": [ "filename" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "filename": { "type": "string" } }, "required": [ "filename" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "vmware-node-start" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "vmware-node-stop" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "vmware-node-reboot" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "vmware-node-terminate" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "verify_session": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": true, "title": "Verify API Session", "description": "Verifies the vSphere client session. It is enabled by default" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "ibmcloud-node-start" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "ibmcloud-node-stop" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "ibmcloud-node-reboot" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "properties": { "id": { "type": "string", "const": "ibmcloud-node-terminate" }, "config": { "$defs": { "NodeScenarioConfig": { "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "type": "object", "properties": { "name": { "type": "string", "title": "Name", "description": "Name(s) for target nodes. Required if label_selector is not set." }, "runs": { "type": "integer", "minimum": 1, "default": 1, "title": "Number of runs per node", "description": "Number of times to inject each scenario under actions (will perform on same node each time)" }, "label_selector": { "type": "string", "minLength": 1, "title": "Label selector", "description": "Kubernetes label selector for the target nodes. Required if name is not set.\nSee https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ for details." }, "timeout": { "type": "integer", "minimum": 1, "default": 180, "title": "Timeout", "description": "Timeout to wait for the target pod(s) to be removed in seconds." }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of nodes to perform action/select that match the label selector." }, "skip_openshift_checks": { "anyOf": [ { "title": "Boolean", "type": "boolean" }, { "title": "String", "type": "string", "enum": [ "yes", "y", "true", "on", "enable", "enabled", "1", "no", "n", "false", "off", "disable", "disabled", "0" ] }, { "title": "Integer", "type": "integer", "maximum": 1, "minimum": 0 } ], "default": false, "title": "Skip Openshift Checks", "description": "Skip checking the status of the openshift nodes." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Path to your Kubeconfig file. Defaults to ~/.kube/config.\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." } }, "required": [], "additionalProperties": false, "dependentRequired": { "name": [ "skip_openshift_checks" ] } } }, "required": [ "id", "config" ] }, { "type": "object", "title": "pod_network_outage Arcaflow scenarios", "properties": { "id": { "type": "string", "const": "pod_network_outage" }, "config": { "$defs": { "InputParams": { "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "direction": { "type": "array", "items": { "type": "string" }, "default": [ "ingress", "egress" ], "title": "Direction", "description": "List of directions to apply filtersDefault both egress and ingress." }, "ingress_ports": { "type": "array", "items": { "type": "integer" }, "default": [], "title": "Ingress ports", "description": "List of ports to block traffic onDefault [], i.e. all ports" }, "egress_ports": { "type": "array", "items": { "type": "integer" }, "default": [], "title": "Egress ports", "description": "List of ports to block traffic onDefault [], i.e. all ports" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 120, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "direction": { "type": "array", "items": { "type": "string" }, "default": [ "ingress", "egress" ], "title": "Direction", "description": "List of directions to apply filtersDefault both egress and ingress." }, "ingress_ports": { "type": "array", "items": { "type": "integer" }, "default": [], "title": "Ingress ports", "description": "List of ports to block traffic onDefault [], i.e. all ports" }, "egress_ports": { "type": "array", "items": { "type": "integer" }, "default": [], "title": "Egress ports", "description": "List of ports to block traffic onDefault [], i.e. all ports" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 120, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] }, { "type": "object", "title": "pod_egress_shaping Arcaflow scenarios", "properties": { "id": { "type": "string", "const": "pod_egress_shaping" }, "config": { "$defs": { "EgressParams": { "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 90, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." }, "execution_type": { "type": "string", "default": "parallel", "title": "Execution Type", "description": "The order in which the ingress filters are applied. Execution type can be 'serial' or 'parallel'" }, "network_params": { "type": "object", "propertyNames": {}, "additionalProperties": { "type": "string" }, "title": "Network Parameters", "description": "The network filters that are applied on the interface. The currently supported filters are latency, loss and bandwidth" } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 90, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." }, "execution_type": { "type": "string", "default": "parallel", "title": "Execution Type", "description": "The order in which the ingress filters are applied. Execution type can be 'serial' or 'parallel'" }, "network_params": { "type": "object", "propertyNames": {}, "additionalProperties": { "type": "string" }, "title": "Network Parameters", "description": "The network filters that are applied on the interface. The currently supported filters are latency, loss and bandwidth" } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] }, { "type": "object", "title": "pod_ingress_shaping Arcaflow scenarios", "properties": { "id": { "type": "string", "const": "pod_ingress_shaping" }, "config": { "$defs": { "IngressParams": { "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "network_params": { "type": "object", "propertyNames": {}, "additionalProperties": { "type": "string" }, "title": "Network Parameters", "description": "The network filters that are applied on the interface. The currently supported filters are latency, loss and bandwidth" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 90, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." }, "execution_type": { "type": "string", "default": "parallel", "title": "Execution Type", "description": "The order in which the ingress filters are applied. Execution type can be 'serial' or 'parallel'" } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "type": "object", "properties": { "namespace": { "type": "string", "minLength": 1, "title": "Namespace", "description": "Namespace of the pod to which filter need to be appliedfor details." }, "network_params": { "type": "object", "propertyNames": {}, "additionalProperties": { "type": "string" }, "title": "Network Parameters", "description": "The network filters that are applied on the interface. The currently supported filters are latency, loss and bandwidth" }, "kubeconfig_path": { "type": "string", "title": "Kubeconfig path", "description": "Kubeconfig file as string\nSee https://kubernetes.io/docs/concepts/configuration/organize-cluster-access-kubeconfig/ for details." }, "pod_name": { "type": "string", "title": "Pod name", "description": "When label_selector is not specified, pod matching the name will beselected for the chaos scenario" }, "label_selector": { "type": "string", "title": "Label selector", "description": "Kubernetes label selector for the target pod. When pod_name is not specified, pod with matching label_selector is selected for chaos scenario" }, "kraken_config": { "type": "string", "title": "Kraken Config", "description": "Path to the config file of Kraken. Set this field if you wish to publish status onto Cerberus" }, "test_duration": { "type": "integer", "minimum": 1, "default": 90, "title": "Test duration", "description": "Duration for which each step of the ingress chaos testing is to be performed." }, "wait_duration": { "type": "integer", "minimum": 1, "default": 300, "title": "Wait Duration", "description": "Wait duration for finishing a test and its cleanup.Ensure that it is significantly greater than wait_duration" }, "instance_count": { "type": "integer", "minimum": 1, "default": 1, "title": "Instance Count", "description": "Number of pods to perform action/select that match the label selector." }, "execution_type": { "type": "string", "default": "parallel", "title": "Execution Type", "description": "The order in which the ingress filters are applied. Execution type can be 'serial' or 'parallel'" } }, "required": [ "namespace" ], "additionalProperties": false, "dependentRequired": {} } }, "required": [ "id", "config" ] } ] } }