apiVersion: v1
kind: Namespace
metadata:
  name: litmus
---
apiVersion: v1
kind: ServiceAccount
metadata:
  name: scheduler
  namespace: litmus
  labels:
    name: scheduler
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: scheduler
  labels:
    name: scheduler
rules:
- apiGroups: [""]
  resources: ["pods","events", "configmaps","services"]
  verbs: ["create","get","list","delete","update","patch"]
- apiGroups: ["apps"]
  resources: ["replicasets","deployments"]
  verbs: ["get","list"]
- apiGroups: ["litmuschaos.io"]
  resources: ["chaosengines","chaosschedules"]
  verbs: ["get","create","update","patch","delete","list","watch","deletecollection"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: scheduler
  labels:
    name: scheduler
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: scheduler
subjects:
- kind: ServiceAccount
  name: scheduler
  namespace: litmus
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: chaos-scheduler
  namespace: litmus
spec:
  replicas: 1
  selector:
    matchLabels:
      name: chaos-scheduler
  template:
    metadata:
      labels:
        name: chaos-scheduler
    spec:
      serviceAccountName: scheduler
      containers:
        - name: chaos-scheduler
          image: litmuschaos/chaos-scheduler:2.9.0
          command:
          - chaos-scheduler
          imagePullPolicy: Always
          env:
            - name: WATCH_NAMESPACE
            - name: POD_NAME
              valueFrom:
                fieldRef:
                  fieldPath: metadata.name
            - name: OPERATOR_NAME
              value: "chaos-scheduler"
---
apiVersion: apiextensions.k8s.io/v1
kind: CustomResourceDefinition
metadata:
  name: chaosschedules.litmuschaos.io
spec:
  group: litmuschaos.io
  names:
    kind: ChaosSchedule
    listKind: ChaosScheduleList
    plural: chaosschedules
    singular: chaosschedule
  scope: Namespaced
  versions:
  - name: v1alpha1
    schema:
      openAPIV3Schema:
        type: object
        properties:
          apiVersion:
            description: 'APIVersion defines the versioned schema of this representation
              of an object. Servers should convert recognized schemas to the latest
              internal value, and may reject unrecognized values. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#resources'
            type: string
          kind:
            description: 'Kind is a string value representing the REST resource this
              object represents. Servers may infer this from the endpoint the client
              submits requests to. Cannot be updated. In CamelCase. More info: https://git.k8s.io/community/contributors/devel/api-conventions.md#types-kinds'
            type: string
          metadata:
            type: object
          spec:
            x-kubernetes-preserve-unknown-fields: true
            type: object
            properties:
              engineTemplateSpec:
                type: object
                properties:
                  jobCleanUpPolicy:
                    type: string
                    pattern: ^(delete|retain)$
                    # alternate ways to do this in case of complex pattern matches
                    #oneOf:
                    #  - pattern: '^delete$'
                    #  - pattern: '^retain$'
                  annotationCheck:
                    type: string
                    pattern: ^(true|false)$
                  defaultAppHealthCheck:
                    type: string
                    pattern: ^(true|false)$ 
                  appinfo:
                    type: object
                    properties:
                      appkind:
                        type: string
                        pattern: ^(^$|deployment|statefulset|daemonset|deploymentconfig|rollout)$
                      applabel:
                        type: string
                      appns:
                        type: string
                  auxiliaryAppInfo:
                    type: string
                  engineState:
                    type: string
                    pattern: ^(active|stop)$
                  chaosServiceAccount:
                    type: string
                  terminationGracePeriodSeconds:
                    type: integer
                  components:
                    type: object
                    properties:
                      runner:
                        x-kubernetes-preserve-unknown-fields: true 
                        type: object
                        properties:
                          image:
                            type: string
                          type:
                            type: string
                            pattern: ^(go)$
                          runnerAnnotations:
                            type: object
                            additionalProperties:
                              type: string
                              properties:
                                key:
                                  type: string
                                  minLength: 1
                                value:
                                  type: string
                                  minLength: 1
                          tolerations:
                            description: Pod's tolerations.
                            items:
                              description: The pod with this Toleration tolerates any taint matches the <key,value,effect> using the matching operator <operator>.
                              properties:
                                effect:
                                  description: Effect to match. Empty means all effects.
                                  type: string
                                key:
                                  description: Taint key the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists.
                                  type: string
                                operator:
                                  description: Operators are Exists or Equal. Defaults to Equal.
                                  type: string
                                tolerationSeconds:
                                  description: Period of time the toleration tolerates the taint.
                                  format: int64
                                  type: integer
                                value:
                                  description: If the operator is Exists, the value should be empty, otherwise just a regular string.
                                  type: string
                              type: object
                            type: array
                  experiments:
                    type: array
                    items:
                      type: object
                      properties:
                        name:
                          type: string
                        spec:
                          type: object
                          properties:
                            probe:
                              type: array
                              items:
                                type: object
                                required:
                                  - runProperties
                                properties:
                                  name:
                                    type: string
                                  type:
                                    type: string
                                    minLength: 1
                                    pattern: ^(k8sProbe|httpProbe|cmdProbe|promProbe)$
                                  k8sProbe/inputs:
                                    type: object
                                    properties:
                                      group:
                                        type: string
                                      version:
                                        type: string
                                      resource:
                                        type: string
                                      namespace:
                                        type: string
                                      fieldSelector:
                                        type: string
                                      labelSelector:
                                        type: string
                                      operation:
                                        type: string
                                        pattern: ^(present|absent|create|delete)$
                                        minLength: 1
                                  cmdProbe/inputs:
                                    type: object
                                    properties:
                                      command:
                                        type: string
                                        minLength: 1
                                      comparator:
                                        type: object
                                        properties:
                                          type:
                                            type: string
                                            minLength: 1
                                            pattern: ^(int|float|string)$
                                          criteria:
                                            type: string
                                          value:
                                            type: string
                                      source:
                                        type: object
                                        properties:
                                          image:
                                            type: string
                                            minLength: 1
                                          hostNetwork:
                                            type: boolean
                                  httpProbe/inputs:
                                    type: object
                                    properties:
                                      url:
                                        type: string
                                        minLength: 1
                                      insecureSkipVerify:
                                        type: boolean
                                      responseTimeout: 
                                        type: integer
                                      method:
                                        type: object
                                        minProperties: 1
                                        properties:
                                          get:
                                            type: object
                                            properties:
                                              criteria:
                                                type: string
                                                minLength: 1
                                              responseCode:
                                                type: string
                                                minLength: 1
                                          post:
                                            type: object
                                            properties:
                                              contentType:
                                                type: string
                                                minLength: 1
                                              body:
                                                type: string
                                              bodyPath: 
                                                type: string
                                              criteria:
                                                type: string
                                                minLength: 1
                                              responseCode:
                                                type: string
                                                minLength: 1                                       
                                  promProbe/inputs:
                                    type: object
                                    properties:
                                      endpoint:
                                        type: string
                                      query:
                                        type: string
                                      queryPath:
                                        type: string
                                      comparator:
                                        type: object
                                        properties:
                                          criteria:
                                            type: string
                                          value:
                                            type: string
                                  runProperties:
                                    type: object
                                    minProperties: 3
                                    required:
                                      - probeTimeout
                                      - interval
                                      - retry
                                    properties:
                                      probeTimeout:
                                        type: integer
                                      interval:
                                        type: integer
                                      retry: 
                                        type: integer
                                      probePollingInterval:
                                        type: integer
                                      initialDelaySeconds:
                                        type: integer
                                      stopOnFailure:
                                        type: boolean
                                  mode:
                                    type: string
                                    pattern: ^(SOT|EOT|Edge|Continuous|OnChaos)$
                                    minLength: 1
                                  data:
                                    type: string
                            components:
                              x-kubernetes-preserve-unknown-fields: true 
                              type: object
                              properties:
                                statusCheckTimeouts:
                                  type: object
                                  properties:
                                    delay:
                                      type: integer
                                    timeout:
                                      type: integer
                                nodeSelector:
                                  type: object
                                  additionalProperties:
                                    type: string
                                    properties:
                                      key:
                                        type: string
                                        minLength: 1
                                        allowEmptyValue: false
                                      value:
                                        type: string
                                        minLength: 1
                                        allowEmptyValue: false
                                experimentImage:
                                  type: string
                                env:
                                  type: array
                                  items:
                                    description: EnvVar represents an environment variable
                                      present in a Container.
                                    properties:
                                      name:
                                        description: Name of the environment variable.
                                          Must be a C_IDENTIFIER.
                                        type: string
                                      value:
                                        description: 'Variable references $(VAR_NAME)
                                          are expanded using the previous defined environment
                                          variables in the container and any service environment
                                          variables. If a variable cannot be resolved,
                                          the reference in the input string will be unchanged.
                                          The $(VAR_NAME) syntax can be escaped with a
                                          double $$, ie: $$(VAR_NAME). Escaped references
                                          will never be expanded, regardless of whether
                                          the variable exists or not. Defaults to "".'
                                        type: string
                                      valueFrom:
                                        description: Source for the environment variable's
                                          value. Cannot be used if value is not empty.
                                        properties:
                                          configMapKeyRef:
                                            description: Selects a key of a ConfigMap.
                                            properties:
                                              key:
                                                description: The key to select.
                                                type: string
                                              name:
                                                description: 'Name of the referent. More
                                                  info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                                                  TODO: Add other useful fields. apiVersion,
                                                  kind, uid?'
                                                type: string
                                              optional:
                                                description: Specify whether the ConfigMap
                                                  or its key must be defined
                                                type: boolean
                                            required:
                                              - key
                                            type: object
                                          fieldRef:
                                            description: 'Selects a field of the pod:
                                              supports metadata.name, metadata.namespace,
                                              metadata.labels, metadata.annotations, spec.nodeName,
                                              spec.serviceAccountName, status.hostIP,
                                              status.podIP.'
                                            properties:
                                              apiVersion:
                                                description: Version of the schema the
                                                  FieldPath is written in terms of, defaults
                                                  to "v1".
                                                type: string
                                              fieldPath:
                                                description: Path of the field to select
                                                  in the specified API version.
                                                type: string
                                            required:
                                              - fieldPath
                                            type: object
                                          resourceFieldRef:
                                            description: 'Selects a resource of the container:
                                              only resources limits and requests (limits.cpu,
                                              limits.memory, limits.ephemeral-storage,
                                              requests.cpu, requests.memory and requests.ephemeral-storage)
                                              are currently supported.'
                                            properties:
                                              containerName:
                                                description: 'Container name: required
                                                  for volumes, optional for env vars'
                                                type: string
                                              divisor:
                                                anyOf:
                                                - type: integer
                                                - type: string
                                                description: Specifies the output format
                                                  of the exposed resources, defaults to
                                                  "1"
                                                pattern: ^(\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))(([KMGTPE]i)|[numkMGTPE]|([eE](\+|-)?(([0-9]+(\.[0-9]*)?)|(\.[0-9]+))))?$
                                                x-kubernetes-int-or-string: true
                                              resource:
                                                description: 'Required: resource to select'
                                                type: string
                                            required:
                                              - resource
                                            type: object
                                          secretKeyRef:
                                            description: Selects a key of a secret in
                                              the pod's namespace
                                            properties:
                                              key:
                                                description: The key of the secret to
                                                  select from.  Must be a valid secret
                                                  key.
                                                type: string
                                              name:
                                                description: 'Name of the referent. More
                                                  info: https://kubernetes.io/docs/concepts/overview/working-with-objects/names/#names
                                                  TODO: Add other useful fields. apiVersion,
                                                  kind, uid?'
                                                type: string
                                              optional:
                                                description: Specify whether the Secret
                                                  or its key must be defined
                                                type: boolean
                                            required:
                                              - key
                                            type: object
                                        type: object
                                    required:
                                      - name
                                    type: object
                                configMaps:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      name:
                                        type: string
                                      mountPath:
                                        type: string
                                secrets:
                                  type: array
                                  items:
                                    type: object
                                    properties:
                                      name:
                                        type: string
                                      mountPath:
                                        type: string
                                experimentAnnotations:
                                  type: object
                                  additionalProperties:
                                    type: string
                                    properties:
                                      key:
                                        type: string
                                        minLength: 1
                                        allowEmptyValue: false
                                      value:
                                        type: string
                                        minLength: 1
                                        allowEmptyValue: false
                                tolerations:
                                  description: Pod's tolerations.
                                  items:
                                    description: The pod with this Toleration tolerates any taint matches the <key,value,effect> using the matching operator <operator>.
                                    properties:
                                      effect:
                                        description: Effect to match. Empty means all effects.
                                        type: string
                                      key:
                                        description: Taint key the toleration applies to. Empty means match all taint keys. If the key is empty, operator must be Exists.
                                        type: string
                                      operator:
                                        description: Operators are Exists or Equal. Defaults to Equal.
                                        type: string
                                      tolerationSeconds:
                                        description: Period of time the toleration tolerates the taint.
                                        format: int64
                                        type: integer
                                      value:
                                        description: If the operator is Exists, the value should be empty, otherwise just a regular string.
                                        type: string
                                    type: object
                                  type: array

              concurrencyPolicy:
                type: string
              scheduleState:
                type: string
              schedule:
                oneOf:
                - required:
                  - now
                - required:
                  - once
                - required:
                  - repeat
                properties:
                  now:
                    type: boolean
                  once:
                    properties:
                      executionTime:
                        format: date-time
                        type: string
                    type: object
                  repeat:
                    properties:
                      timeRange:
                        properties:
                          endTime:
                            format: date-time
                            type: string
                          startTime:
                            format: date-time
                            type: string
                        type: object
                      workHours:
                        properties:
                          includedHours:
                            type: string
                        type: object
                        required:
                        - includedHours
                      workDays:
                        properties:
                          includedDays:
                            pattern: ((Mon|Tue|Wed|Thu|Fri|Sat|Sun)(,))*(Mon|Tue|Wed|Thu|Fri|Sat|Sun)
                            type: string
                        type: object
                        required:
                        - includedDays
                      properties:
                        properties:
                          minChaosInterval:
                            properties:
                              hour:
                                properties:
                                  everyNthHour:
                                    type: integer
                                  minuteOfTheHour:
                                    type: integer
                                type: object
                              minute:
                                properties:
                                  everyNthMinute:
                                    type: integer
                                type: object
                            type: object
                            minProperties: 1
                            maxProperties: 1
                          random:
                            type: boolean
                        type: object
                        required:
                        - minChaosInterval
                    type: object
                    required:
                    - properties
                type: object
          status:
            x-kubernetes-preserve-unknown-fields: true
            type: object
    served: true
    storage: true
    subresources: {}  
  conversion:
    strategy: None
    