---
apiVersion: apps/v1
kind: DaemonSet
metadata:
  annotations:
    deprecated.daemonset.template.generation: "1"
    kubernetes.io/description: |
      This daemon set launches the Open vSwitch daemon.
    release.openshift.io/version: 4.6.52
  creationTimestamp: "2022-03-08T10:38:11Z"
  generation: 1
  managedFields:
  - apiVersion: apps/v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:deprecated.daemonset.template.generation: {}
          f:kubernetes.io/description: {}
          f:release.openshift.io/version: {}
        f:ownerReferences:
          .: {}
          k:{"uid":"b48e3238-e625-4cc0-acf5-5166b34864a9"}:
            .: {}
            f:apiVersion: {}
            f:blockOwnerDeletion: {}
            f:controller: {}
            f:kind: {}
            f:name: {}
            f:uid: {}
      f:spec:
        f:revisionHistoryLimit: {}
        f:selector:
          f:matchLabels:
            .: {}
            f:app: {}
        f:template:
          f:metadata:
            f:labels:
              .: {}
              f:app: {}
              f:component: {}
              f:openshift.io/component: {}
              f:type: {}
          f:spec:
            f:affinity:
              .: {}
              f:nodeAffinity:
                .: {}
                f:requiredDuringSchedulingIgnoredDuringExecution:
                  .: {}
                  f:nodeSelectorTerms: {}
            f:containers:
              k:{"name":"openvswitch"}:
                .: {}
                f:command: {}
                f:image: {}
                f:imagePullPolicy: {}
                f:name: {}
                f:readinessProbe:
                  .: {}
                  f:exec:
                    .: {}
                    f:command: {}
                  f:failureThreshold: {}
                  f:initialDelaySeconds: {}
                  f:periodSeconds: {}
                  f:successThreshold: {}
                  f:timeoutSeconds: {}
                f:resources:
                  .: {}
                  f:requests:
                    .: {}
                    f:cpu: {}
                    f:memory: {}
                f:securityContext:
                  .: {}
                  f:privileged: {}
                f:terminationMessagePath: {}
                f:terminationMessagePolicy: {}
                f:volumeMounts:
                  .: {}
                  k:{"mountPath":"/etc/openvswitch"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                  k:{"mountPath":"/host"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                    f:readOnly: {}
                  k:{"mountPath":"/lib/modules"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                    f:readOnly: {}
                  k:{"mountPath":"/run"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                  k:{"mountPath":"/sys"}:
                    .: {}
                    f:mountPath: {}
                    f:name: {}
                    f:readOnly: {}
            f:dnsPolicy: {}
            f:hostNetwork: {}
            f:nodeSelector:
              .: {}
              f:kubernetes.io/os: {}
            f:priorityClassName: {}
            f:restartPolicy: {}
            f:schedulerName: {}
            f:securityContext: {}
            f:serviceAccount: {}
            f:serviceAccountName: {}
            f:terminationGracePeriodSeconds: {}
            f:tolerations: {}
            f:volumes:
              .: {}
              k:{"name":"host-config-openvswitch"}:
                .: {}
                f:hostPath:
                  .: {}
                  f:path: {}
                  f:type: {}
                f:name: {}
              k:{"name":"host-modules"}:
                .: {}
                f:hostPath:
                  .: {}
                  f:path: {}
                  f:type: {}
                f:name: {}
              k:{"name":"host-run"}:
                .: {}
                f:hostPath:
                  .: {}
                  f:path: {}
                  f:type: {}
                f:name: {}
              k:{"name":"host-slash"}:
                .: {}
                f:hostPath:
                  .: {}
                  f:path: {}
                  f:type: {}
                f:name: {}
              k:{"name":"host-sys"}:
                .: {}
                f:hostPath:
                  .: {}
                  f:path: {}
                  f:type: {}
                f:name: {}
        f:updateStrategy:
          f:rollingUpdate:
            .: {}
            f:maxUnavailable: {}
          f:type: {}
      f:status:
        f:currentNumberScheduled: {}
        f:desiredNumberScheduled: {}
        f:numberReady: {}
    manager: cluster-network-operator
    operation: Update
    time: "2022-03-08T10:50:14Z"
  name: ovs
  namespace: openshift-sdn
  ownerReferences:
  - apiVersion: operator.openshift.io/v1
    blockOwnerDeletion: true
    controller: true
    kind: Network
    name: cluster
    uid: b48e3238-e625-4cc0-acf5-5166b34864a9
  resourceVersion: "22529"
  selfLink: /apis/apps/v1/namespaces/openshift-sdn/daemonsets/ovs
  uid: bb69a0b2-e1b9-40de-be1a-2ef10cd41b70
spec:
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: ovs
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: ovs
        component: network
        openshift.io/component: network
        type: infra
    spec:
      affinity:
        nodeAffinity:
          requiredDuringSchedulingIgnoredDuringExecution:
            nodeSelectorTerms:
            - matchExpressions:
              - key: network.operator.openshift.io/external-openvswitch
                operator: DoesNotExist
      containers:
      - command:
        - /bin/bash
        - -c
        - |
          #!/bin/bash
          set -euo pipefail
          export SYSTEMD_IGNORE_CHROOT=yes

          # systemctl cannot be used in a separate PID namespace to reach
          # the systemd running in PID 1. Therefore we need to use the dbus API
          systemctl_restart(){
            gdbus call \
              --system \
              --dest org.freedesktop.systemd1 \
              --object-path /org/freedesktop/systemd1/unit/"$(svc_encode_name ${1})"_2eservice \
              --method org.freedesktop.systemd1.Unit.Restart "replace"
          }
          svc_encode_name(){
            # systemd encodes some characters, so far we only need to encode
            # the character "-" but there may be more in the future.
            echo "${1//-/_2d}"
          }

          # Check to see if ovs is provided by the node:
          if [ -f /host/var/run/ovs-config-executed ]; then
            echo "openvswitch is running in systemd"
            # In some very strange corner cases, the owner for /run/openvswitch
            # can be wrong, so we need to clean up and restart.
            ovs_uid=$(chroot /host id -u openvswitch)
            ovs_gid=$(chroot /host id -g openvswitch)
            chown -R "${ovs_uid}:${ovs_gid}" /run/openvswitch
            if [[ ! -S /run/openvswitch/db.sock ]]; then
              systemctl_restart ovsdb-server
            fi
            # Don't need to worry about restoring flows; this can only change if we've rebooted
            exec tail -F /host/var/log/openvswitch/ovs-vswitchd.log /host/var/log/openvswitch/ovsdb-server.log
          else
            echo "openvswitch is running in container"
            # if another process is listening on the cni-server socket, wait until it exits
            retries=0
            while true; do
              if /usr/share/openvswitch/scripts/ovs-ctl status &>/dev/null; then
                echo "warning: Another process is currently managing OVS, waiting 15s ..." 2>&1
                sleep 15 & wait
                (( retries += 1 ))
              else
                break
              fi
              if [[ "${retries}" -gt 40 ]]; then
                echo "error: Another process is currently managing OVS, exiting" 2>&1
                exit 1
              fi
            done

            function quit {
                # Save the flows
                echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Saving flows ..." 2>&1
                bridges=$(ovs-vsctl -- --real list-br)
                TMPDIR=/var/run/openvswitch /usr/share/openvswitch/scripts/ovs-save save-flows $bridges > /var/run/openvswitch/flows.sh
                echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Saved flows" 2>&1

                # Don't allow ovs-vswitchd to clear datapath flows on exit
                kill -9 $(cat /var/run/openvswitch/ovs-vswitchd.pid 2>/dev/null) 2>/dev/null || true
                kill $(cat /var/run/openvswitch/ovsdb-server.pid 2>/dev/null) 2>/dev/null || true
                exit 0
            }
            trap quit SIGTERM

            function deletePid {
                rm /var/run/openvswitch/ovs-vswitchd.pid
                rm /var/run/openvswitch/ovsdb-server.pid
            }
            trap deletePid EXIT

            chown -R openvswitch:openvswitch /var/run/openvswitch
            chown -R openvswitch:openvswitch /etc/openvswitch

            # launch OVS
            # Start the ovsdb so that we can prep it before we start the ovs-vswitchd
            /usr/share/openvswitch/scripts/ovs-ctl start --ovs-user=openvswitch:openvswitch --no-ovs-vswitchd --system-id=random --no-monitor

            # Set the flow-restore-wait to true so ovs-vswitchd will wait till flows are restored
            ovs-vsctl --no-wait set Open_vSwitch . other_config:flow-restore-wait=true

            # Restrict the number of pthreads ovs-vswitchd creates to reduce the
            # amount of RSS it uses on hosts with many cores
            # https://bugzilla.redhat.com/show_bug.cgi?id=1571379
            # https://bugzilla.redhat.com/show_bug.cgi?id=1572797
            if [[ `nproc` -gt 12 ]]; then
                ovs-vsctl --no-wait set Open_vSwitch . other_config:n-revalidator-threads=4
                ovs-vsctl --no-wait set Open_vSwitch . other_config:n-handler-threads=10
            fi

            # And finally start the ovs-vswitchd now the DB is prepped
            /usr/share/openvswitch/scripts/ovs-ctl start --ovs-user=openvswitch:openvswitch --no-ovsdb-server --system-id=random --no-monitor

            # Load any flows that we saved
            echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Loading previous flows ..." 2>&1
            if [[ -f /var/run/openvswitch/flows.sh ]]; then

              # There's a bug in the ovs-save script which causes flows.sh to specify
              # OpenFlow14, replace that to OpenFlow13 which is the only version we support.
              sed -i 's/OpenFlow[0-9][0-9]/OpenFlow13/g' /var/run/openvswitch/flows.sh

              echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Adding br0 if it doesn't exist ..." 2>&1
              /usr/bin/ovs-vsctl --may-exist add-br br0 -- set Bridge br0 fail_mode=secure protocols=OpenFlow13
              echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Created br0, now adding flows ..." 2>&1
              mv /var/run/openvswitch/flows.sh /var/run/openvswitch/flows-old.sh
              sh -x /var/run/openvswitch/flows-old.sh
              echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Done restoring the existing flows ..." 2>&1
              rm /var/run/openvswitch/flows-old.sh
            fi

            echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Remove other config ..." 2>&1
            ovs-vsctl --no-wait --if-exists remove Open_vSwitch . other_config flow-restore-wait=true
            echo "$(date -u "+%Y-%m-%d %H:%M:%S") info: Removed other config ..." 2>&1

            tail -F --pid=$(cat /var/run/openvswitch/ovs-vswitchd.pid) /var/log/openvswitch/ovs-vswitchd.log &
            tail -F --pid=$(cat /var/run/openvswitch/ovsdb-server.pid) /var/log/openvswitch/ovsdb-server.log &
            wait
          fi
        image: quay.io/openshift-release-dev/ocp-v4.0-art-dev@sha256:980d20b31cdcd9db0a94e393b53799985ea399bbe8dbd552bf2e27e32cf0be7e
        imagePullPolicy: IfNotPresent
        name: openvswitch
        readinessProbe:
          exec:
            command:
            - /bin/bash
            - -c
            - |
              #!/bin/bash
              /usr/bin/ovs-vsctl -t 5 show > /dev/null
          failureThreshold: 3
          initialDelaySeconds: 15
          periodSeconds: 5
          successThreshold: 1
          timeoutSeconds: 6
        resources:
          requests:
            cpu: 100m
            memory: 400Mi
        securityContext:
          privileged: true
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: FallbackToLogsOnError
        volumeMounts:
        - mountPath: /lib/modules
          name: host-modules
          readOnly: true
        - mountPath: /run
          name: host-run
        - mountPath: /sys
          name: host-sys
          readOnly: true
        - mountPath: /etc/openvswitch
          name: host-config-openvswitch
        - mountPath: /host
          name: host-slash
          readOnly: true
      dnsPolicy: ClusterFirst
      hostNetwork: true
      nodeSelector:
        kubernetes.io/os: linux
      priorityClassName: system-node-critical
      restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      serviceAccount: sdn
      serviceAccountName: sdn
      terminationGracePeriodSeconds: 30
      tolerations:
      - operator: Exists
      volumes:
      - hostPath:
          path: /lib/modules
          type: ""
        name: host-modules
      - hostPath:
          path: /run
          type: ""
        name: host-run
      - hostPath:
          path: /sys
          type: ""
        name: host-sys
      - hostPath:
          path: /var/lib/openvswitch
          type: DirectoryOrCreate
        name: host-config-openvswitch
      - hostPath:
          path: /
          type: ""
        name: host-slash
  updateStrategy:
    rollingUpdate:
      maxUnavailable: 10%
    type: RollingUpdate
status:
  currentNumberScheduled: 6
  desiredNumberScheduled: 6
  numberAvailable: 6
  numberMisscheduled: 0
  numberReady: 6
  observedGeneration: 1
  updatedNumberScheduled: 6
