# A daemonset to create /dev/loopX device nodes before they are
# needed.
#
# Normally, new nodes are created dynamically by the kernel. But nodes
# in a KIND cluster are started with a copy of /dev from the host and
# loop devices created later on do not show up in that static /dev
# (https://github.com/kubernetes-sigs/kind/issues/1248). Creating
# "enough" (100 in this daemonset) in advance avoids running out of
# loop devices.
apiVersion: apps/v1
kind: DaemonSet
metadata:
  name: create-loop-devs
  namespace: kube-system
  labels:
    app: create-loop-devs
spec:
  selector:
    matchLabels:
      name: create-loop-devs
  template:
    metadata:
      labels:
        name: create-loop-devs
    spec:
      tolerations:
        - operator: Exists
          effect: NoSchedule
      containers:
        - name: loopdev
          command:
            - sh
            - -c
            - |
              while true; do
                for i in $(seq 0 1000); do
                    if ! [ -e /dev/loop$i ]; then
                      mknod /dev/loop$i b 7 $i
                    fi
                done
                sleep 100000000
              done
          image: gcr.io/k8s-staging-test-infra/alpine:latest
          imagePullPolicy: IfNotPresent
          resources: {}
          securityContext:
            privileged: true
          volumeMounts:
            - name: dev
              mountPath: /dev
      volumes:
        - name: dev
          hostPath:
            path: /dev
