---
apiVersion: v1
kind: Pod
metadata:
  annotations:
    k8s.ovn.org/pod-networks: '{"default":{"ip_addresses":["10.129.0.10/23"],"mac_address":"7a:be:ac:81:00:0b","gateway_ips":["10.129.0.1"],"ip_address":"10.129.0.10/23","gateway_ip":"10.129.0.1"}}'
    k8s.v1.cni.cncf.io/network-status: |-
      [{
          "name": "ovn-kubernetes",
          "interface": "eth0",
          "ips": [
              "10.129.0.10"
          ],
          "mac": "7a:be:ac:81:00:0b",
          "default": true,
          "dns": {}
      }]
    k8s.v1.cni.cncf.io/networks-status: |-
      [{
          "name": "ovn-kubernetes",
          "interface": "eth0",
          "ips": [
              "10.129.0.10"
          ],
          "mac": "7a:be:ac:81:00:0b",
          "default": true,
          "dns": {}
      }]
  creationTimestamp: "2020-05-26T14:18:28Z"
  generateName: dns-default-
  labels:
    controller-revision-hash: 9ff9f46c8
    dns.operator.openshift.io/daemonset-dns: default
    pod-template-generation: "1"
  managedFields:
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:generateName: {}
        f:labels:
          .: {}
          f:controller-revision-hash: {}
          f:dns.operator.openshift.io/daemonset-dns: {}
          f:pod-template-generation: {}
        f:ownerReferences:
          .: {}
          k:{"uid":"36c809b7-8e79-4e62-87ac-17e092782955"}:
            .: {}
            f:apiVersion: {}
            f:blockOwnerDeletion: {}
            f:controller: {}
            f:kind: {}
            f:name: {}
            f:uid: {}
      f:spec:
        f:affinity:
          .: {}
          f:nodeAffinity:
            .: {}
            f:requiredDuringSchedulingIgnoredDuringExecution:
              .: {}
              f:nodeSelectorTerms: {}
        f:containers:
          k:{"name":"dns"}:
            .: {}
            f:args: {}
            f:command: {}
            f:image: {}
            f:imagePullPolicy: {}
            f:livenessProbe:
              .: {}
              f:failureThreshold: {}
              f:httpGet:
                .: {}
                f:path: {}
                f:port: {}
                f:scheme: {}
              f:initialDelaySeconds: {}
              f:periodSeconds: {}
              f:successThreshold: {}
              f:timeoutSeconds: {}
            f:name: {}
            f:ports:
              .: {}
              k:{"containerPort":5353,"protocol":"TCP"}:
                .: {}
                f:containerPort: {}
                f:name: {}
                f:protocol: {}
              k:{"containerPort":5353,"protocol":"UDP"}:
                .: {}
                f:containerPort: {}
                f:name: {}
                f:protocol: {}
            f:readinessProbe:
              .: {}
              f:failureThreshold: {}
              f:httpGet:
                .: {}
                f:path: {}
                f:port: {}
                f:scheme: {}
              f:initialDelaySeconds: {}
              f:periodSeconds: {}
              f:successThreshold: {}
              f:timeoutSeconds: {}
            f:resources:
              .: {}
              f:limits:
                .: {}
                f:memory: {}
              f:requests:
                .: {}
                f:cpu: {}
                f:memory: {}
            f:terminationMessagePath: {}
            f:terminationMessagePolicy: {}
            f:volumeMounts:
              .: {}
              k:{"mountPath":"/etc/coredns"}:
                .: {}
                f:mountPath: {}
                f:name: {}
                f:readOnly: {}
          k:{"name":"dns-node-resolver"}:
            .: {}
            f:command: {}
            f:env:
              .: {}
              k:{"name":"CLUSTER_DOMAIN"}:
                .: {}
                f:name: {}
                f:value: {}
              k:{"name":"NAMESERVER"}:
                .: {}
                f:name: {}
                f:value: {}
              k:{"name":"SERVICES"}:
                .: {}
                f:name: {}
                f:value: {}
            f:image: {}
            f:imagePullPolicy: {}
            f:name: {}
            f:resources:
              .: {}
              f:requests:
                .: {}
                f:cpu: {}
            f:securityContext:
              .: {}
              f:privileged: {}
            f:terminationMessagePath: {}
            f:terminationMessagePolicy: {}
            f:volumeMounts:
              .: {}
              k:{"mountPath":"/etc/hosts"}:
                .: {}
                f:mountPath: {}
                f:name: {}
          k:{"name":"kube-rbac-proxy"}:
            .: {}
            f:args: {}
            f:image: {}
            f:imagePullPolicy: {}
            f:name: {}
            f:ports:
              .: {}
              k:{"containerPort":9154,"protocol":"TCP"}:
                .: {}
                f:containerPort: {}
                f:name: {}
                f:protocol: {}
            f:resources:
              .: {}
              f:requests:
                .: {}
                f:cpu: {}
                f:memory: {}
            f:terminationMessagePath: {}
            f:terminationMessagePolicy: {}
            f:volumeMounts:
              .: {}
              k:{"mountPath":"/etc/tls/private"}:
                .: {}
                f:mountPath: {}
                f:name: {}
                f:readOnly: {}
        f:dnsPolicy: {}
        f:enableServiceLinks: {}
        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":"config-volume"}:
            .: {}
            f:configMap:
              .: {}
              f:defaultMode: {}
              f:items: {}
              f:name: {}
            f:name: {}
          k:{"name":"hosts-file"}:
            .: {}
            f:hostPath:
              .: {}
              f:path: {}
              f:type: {}
            f:name: {}
          k:{"name":"metrics-tls"}:
            .: {}
            f:name: {}
            f:secret:
              .: {}
              f:defaultMode: {}
              f:secretName: {}
    manager: kube-controller-manager
    operation: Update
    time: "2020-05-26T14:18:28Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          .: {}
          f:k8s.ovn.org/pod-networks: {}
    manager: ovnkube
    operation: Update
    time: "2020-05-26T14:18:29Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:metadata:
        f:annotations:
          f:k8s.v1.cni.cncf.io/network-status: {}
          f:k8s.v1.cni.cncf.io/networks-status: {}
    manager: multus
    operation: Update
    time: "2020-05-26T14:18:35Z"
  - apiVersion: v1
    fieldsType: FieldsV1
    fieldsV1:
      f:status:
        f:conditions:
          k:{"type":"ContainersReady"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Initialized"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
          k:{"type":"Ready"}:
            .: {}
            f:lastProbeTime: {}
            f:lastTransitionTime: {}
            f:status: {}
            f:type: {}
        f:containerStatuses: {}
        f:hostIP: {}
        f:phase: {}
        f:podIP: {}
        f:podIPs:
          .: {}
          k:{"ip":"10.129.0.10"}:
            .: {}
            f:ip: {}
        f:startTime: {}
    manager: kubelet
    operation: Update
    time: "2020-05-26T14:19:01Z"
  name: dns-default-nlh2v
  namespace: openshift-dns
  ownerReferences:
  - apiVersion: apps/v1
    blockOwnerDeletion: true
    controller: true
    kind: DaemonSet
    name: dns-default
    uid: 36c809b7-8e79-4e62-87ac-17e092782955
  resourceVersion: "6380"
  selfLink: /api/v1/namespaces/openshift-dns/pods/dns-default-nlh2v
  uid: 31a2e3b7-14cb-4f2a-8b96-829b5b3f59f2
spec:
  affinity:
    nodeAffinity:
      requiredDuringSchedulingIgnoredDuringExecution:
        nodeSelectorTerms:
        - matchFields:
          - key: metadata.name
            operator: In
            values:
            - ip-10-0-162-213.ec2.internal
  containers:
  - args:
    - -conf
    - /etc/coredns/Corefile
    command:
    - coredns
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:156211b7caac58589cfd2a498863527996ab23350556a2d2ddff2f0916c77665
    imagePullPolicy: IfNotPresent
    livenessProbe:
      failureThreshold: 5
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 60
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 5
    name: dns
    ports:
    - containerPort: 5353
      name: dns
      protocol: UDP
    - containerPort: 5353
      name: dns-tcp
      protocol: TCP
    readinessProbe:
      failureThreshold: 3
      httpGet:
        path: /health
        port: 8080
        scheme: HTTP
      initialDelaySeconds: 10
      periodSeconds: 10
      successThreshold: 1
      timeoutSeconds: 10
    resources:
      limits:
        memory: 512Mi
      requests:
        cpu: 50m
        memory: 70Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: FallbackToLogsOnError
    volumeMounts:
    - mountPath: /etc/coredns
      name: config-volume
      readOnly: true
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: dns-token-tspn9
      readOnly: true
  - args:
    - --logtostderr
    - --secure-listen-address=:9154
    - --tls-cipher-suites=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256
    - --upstream=http://127.0.0.1:9153/
    - --tls-cert-file=/etc/tls/private/tls.crt
    - --tls-private-key-file=/etc/tls/private/tls.key
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:29f0d4919af5f9159b3bdc4deb8929b0e9320640dd4985546ca68b87d1cadf30
    imagePullPolicy: IfNotPresent
    name: kube-rbac-proxy
    ports:
    - containerPort: 9154
      name: metrics
      protocol: TCP
    resources:
      requests:
        cpu: 10m
        memory: 40Mi
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: File
    volumeMounts:
    - mountPath: /etc/tls/private
      name: metrics-tls
      readOnly: true
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: dns-token-tspn9
      readOnly: true
  - command:
    - /bin/bash
    - -c
    - |
      #!/bin/bash
      set -uo pipefail

      trap 'jobs -p | xargs kill || true; wait; exit 0' TERM

      OPENSHIFT_MARKER="openshift-generated-node-resolver"
      HOSTS_FILE="/etc/hosts"
      TEMP_FILE="/etc/hosts.tmp"

      IFS=', ' read -r -a services <<< "${SERVICES}"

      # Make a temporary file with the old hosts file's attributes.
      cp -f --attributes-only "${HOSTS_FILE}" "${TEMP_FILE}"

      while true; do
        declare -A svc_ips
        for svc in "${services[@]}"; do
          # Fetch service IP from cluster dns if present. We make several tries
          # to do it: IPv4, IPv6, IPv4 over TCP and IPv6 over TCP. The two last ones
          # are for deployments with Kuryr on older OpenStack (OSP13) - those do not
          # support UDP loadbalancers and require reaching DNS through TCP.
          cmds=('dig -t A @"${NAMESERVER}" +short "${svc}.${CLUSTER_DOMAIN}"'
                'dig -t AAAA @"${NAMESERVER}" +short "${svc}.${CLUSTER_DOMAIN}"'
                'dig -t A +tcp @"${NAMESERVER}" +short "${svc}.${CLUSTER_DOMAIN}"'
                'dig -t AAAA +tcp @"${NAMESERVER}" +short "${svc}.${CLUSTER_DOMAIN}"')
          for i in ${!cmds[*]}
          do
            ips=($(eval "${cmds[i]}"))
            if [[ "$?" -eq 0 && "${#ips[@]}" -ne 0 ]]; then
              svc_ips["${svc}"]="${ips[@]}"
              break
            fi
          done
        done

        # Update /etc/hosts only if we get valid service IPs
        # We will not update /etc/hosts when there is coredns service outage or api unavailability
        # Stale entries could exist in /etc/hosts if the service is deleted
        if [[ "${#svc_ips[@]}" -ne 0 ]]; then
          # Build a new hosts file from /etc/hosts with our custom entries filtered out
          grep -v "# ${OPENSHIFT_MARKER}" "${HOSTS_FILE}" > "${TEMP_FILE}"

          # Append resolver entries for services
          for svc in "${!svc_ips[@]}"; do
            for ip in ${svc_ips[${svc}]}; do
              echo "${ip} ${svc} ${svc}.${CLUSTER_DOMAIN} # ${OPENSHIFT_MARKER}" >> "${TEMP_FILE}"
            done
          done

          # TODO: Update /etc/hosts atomically to avoid any inconsistent behavior
          # Replace /etc/hosts with our modified version if needed
          cmp "${TEMP_FILE}" "${HOSTS_FILE}" || cp -f "${TEMP_FILE}" "${HOSTS_FILE}"
          # TEMP_FILE is not removed to avoid file create/delete and attributes copy churn
        fi
        sleep 60 & wait
        unset svc_ips
      done
    env:
    - name: SERVICES
      value: image-registry.openshift-image-registry.svc
    - name: NAMESERVER
      value: 172.30.0.10
    - name: CLUSTER_DOMAIN
      value: cluster.local
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:1c0250a6bf12b77a50d0c159d90a772568a8c163401af4cf356dc38deea2258a
    imagePullPolicy: IfNotPresent
    name: dns-node-resolver
    resources:
      requests:
        cpu: 5m
    securityContext:
      privileged: true
    terminationMessagePath: /dev/termination-log
    terminationMessagePolicy: FallbackToLogsOnError
    volumeMounts:
    - mountPath: /etc/hosts
      name: hosts-file
    - mountPath: /var/run/secrets/kubernetes.io/serviceaccount
      name: dns-token-tspn9
      readOnly: true
  dnsPolicy: Default
  enableServiceLinks: true
  nodeName: ip-10-0-162-213.ec2.internal
  nodeSelector:
    kubernetes.io/os: linux
  priority: 2000001000
  priorityClassName: system-node-critical
  restartPolicy: Always
  schedulerName: default-scheduler
  securityContext: {}
  serviceAccount: dns
  serviceAccountName: dns
  terminationGracePeriodSeconds: 30
  tolerations:
  - key: node-role.kubernetes.io/master
    operator: Exists
  - effect: NoExecute
    key: node.kubernetes.io/not-ready
    operator: Exists
  - effect: NoExecute
    key: node.kubernetes.io/unreachable
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/disk-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/memory-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/pid-pressure
    operator: Exists
  - effect: NoSchedule
    key: node.kubernetes.io/unschedulable
    operator: Exists
  volumes:
  - configMap:
      defaultMode: 420
      items:
      - key: Corefile
        path: Corefile
      name: dns-default
    name: config-volume
  - hostPath:
      path: /etc/hosts
      type: File
    name: hosts-file
  - name: metrics-tls
    secret:
      defaultMode: 420
      secretName: dns-default-metrics-tls
  - name: dns-token-tspn9
    secret:
      defaultMode: 420
      secretName: dns-token-tspn9
status:
  conditions:
  - lastProbeTime: null
    lastTransitionTime: "2020-05-26T14:18:28Z"
    status: "True"
    type: Initialized
  - lastProbeTime: null
    lastTransitionTime: "2020-05-26T14:18:51Z"
    status: "True"
    type: Ready
  - lastProbeTime: null
    lastTransitionTime: "2020-05-26T14:18:51Z"
    status: "True"
    type: ContainersReady
  - lastProbeTime: null
    lastTransitionTime: "2020-05-26T14:18:28Z"
    status: "True"
    type: PodScheduled
  containerStatuses:
  - containerID: cri-o://c4110f7ee8de880d0879efecfadcab25fc04b11f2fbc354ff557f0390526bdb3
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:156211b7caac58589cfd2a498863527996ab23350556a2d2ddff2f0916c77665
    imageID: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:156211b7caac58589cfd2a498863527996ab23350556a2d2ddff2f0916c77665
    lastState: {}
    name: dns
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2020-05-26T14:18:38Z"
  - containerID: cri-o://4cb1cd872f3eeef70710039ef5ccc0f529d6ff41d608f5625ce0daad113d9175
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:1c0250a6bf12b77a50d0c159d90a772568a8c163401af4cf356dc38deea2258a
    imageID: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:1c0250a6bf12b77a50d0c159d90a772568a8c163401af4cf356dc38deea2258a
    lastState: {}
    name: dns-node-resolver
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2020-05-26T14:18:42Z"
  - containerID: cri-o://d07ccbc5c154c4edc365c91f75ea3c2b804cb1e0ef08373da1cf0c1f455e7410
    image: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:29f0d4919af5f9159b3bdc4deb8929b0e9320640dd4985546ca68b87d1cadf30
    imageID: registry.svc.ci.openshift.org/ci-ln-6vywnkk/stable@sha256:29f0d4919af5f9159b3bdc4deb8929b0e9320640dd4985546ca68b87d1cadf30
    lastState: {}
    name: kube-rbac-proxy
    ready: true
    restartCount: 0
    started: true
    state:
      running:
        startedAt: "2020-05-26T14:18:39Z"
  hostIP: 10.0.162.213
  phase: Running
  podIP: 10.129.0.10
  podIPs:
  - ip: 10.129.0.10
  qosClass: Burstable
  startTime: "2020-05-26T14:18:28Z"
