#cloud-config

write_files:
  - path: /opt/bin/kube-net-update.sh
    permissions: 0755
    content: |
      #!/bin/sh
      set -x -e
      nh=${ETCD_WATCH_KEY##*/}
      net=$ETCD_WATCH_VALUE
      case $ETCD_WATCH_ACTION in
      set) ip route replace $net via $nh dev eth2 metric 900 ;;
      expire) ip route del $net via $nh metric 900 ;;
      esac
  - path: /opt/bin/download-release.sh
    permissions: 0755
    content: |
      #!/bin/bash
      OBJECT_URL="CLOUD_FILES_URL"
      echo "Downloading release ($OBJECT_URL)"
      wget "${OBJECT_URL}" -O /opt/kubernetes.tar.gz
      echo "Unpacking release"
      rm -rf /opt/kubernetes || false
      tar xzf /opt/kubernetes.tar.gz -C /opt/

coreos:
  etcd:
    name: kubernetes-minion-INDEX
    discovery: https://discovery.etcd.io/DISCOVERY_ID
    addr: $private_ipv4:4001
    peer-addr: $private_ipv4:7001
    peer-bind-addr: $private_ipv4:7001

  fleet:
    public-ip: $private_ipv4
    metadata: kubernetes_role=minion

  update:
    reboot-strategy: etcd-lock

  units:
    - name: etcd.service
      command: start
    - name: fleet.service
      command: start
    - name: download-release.service
      command: start
      content: |
        [Unit]
        Description=Downloads Kubernetes Release
        After=network-online.target
        Requires=network-online.target
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/bin/bash /opt/bin/download-release.sh
    - name: minion-kubelet.service
      command: start
      content: |
        [Unit]
        Description=Kubernetes Kubelet
        Documentation=https://github.com/GoogleCloudPlatform/kubernetes
        After=network-online.target
        Requires=network-online.target
        After=docker.service
        Requires=docker.service
        After=download-release.service
        Requires=download-release.service
        [Service]
        ExecStartPre=/usr/bin/ln -sf /opt/kubernetes/server/bin/kubelet /opt/bin/kubelet
        ExecStart=/opt/bin/kubelet --address=$private_ipv4 --hostname_override=$private_ipv4 --etcd_servers=http://127.0.0.1:4001 --logtostderr=true --config=/opt/kubernetes-manifests --cluster_dns=DNS_SERVER_IP --cluster_domain=DNS_DOMAIN
        Restart=always
        RestartSec=2
    - name: minion-proxy.service
      command: start
      content: |
        [Unit]
        Description=Kubernetes Proxy
        Documentation=https://github.com/GoogleCloudPlatform/kubernetes
        After=network-online.target
        Requires=network-online.target
        After=docker.service
        Requires=docker.service
        After=download-release.service
        Requires=download-release.service
        [Service]
        ExecStartPre=/usr/bin/ln -sf /opt/kubernetes/server/bin/kube-proxy /opt/bin/kube-proxy
        ExecStart=/opt/bin/kube-proxy --bind_address=$private_ipv4 --etcd_servers=http://127.0.0.1:4001 --logtostderr=true --v=2
        Restart=always
        RestartSec=2
    - name: minion-advertiser.service
      command: start
      content: |
        [Unit]
        Description=Kubernetes Minion Advertiser
        After=etcd.service
        Requires=etcd.service
        After=minion-kubelet.service
        [Service]
        ExecStart=/bin/sh -c 'while :; do etcdctl set /corekube/minions/$private_ipv4 $private_ipv4 --ttl 300; sleep 120; done'
        Restart=always
        RestartSec=120
    - name: net-advertiser.service
      command: start
      content: |
        [Unit]
        Description=Kubernetes Network Advertiser
        After=etcd.service
        Requires=etcd.service
        After=minion-kubelet.service
        [Service]
        ExecStart=/bin/sh -c 'eth2_ip=$$(ip -o -f inet a show dev eth2 | sed "s/.* inet \([0-9.]\+\).*/\1/"); while :; do etcdctl set /corekube/net/$$eth2_ip 10.240.INDEX.0/24 --ttl 300; sleep 120; done'
        Restart=always
        RestartSec=120
    - name: net-router.service
      command: start
      content: |
        [Unit]
        Description=Kubernetes Network Router
        After=etcd.service
        Requires=etcd.service
        After=minion-kubelet.service
        [Service]
        ExecStart=/usr/bin/etcdctl exec-watch --recursive /corekube/net -- /opt/bin/kube-net-update.sh
        Restart=always
        RestartSec=120
    - name: cbr0.netdev
      command: start
      content: |
        [NetDev]
        Kind=bridge
        Name=cbr0
    - name: cbr0.network
      command: start
      content: |
        [Match]
        Name=cbr0

        [Network]
        Address=10.240.INDEX.1/24
    - name: nat.service
      command: start
      content: |
        [Unit]
        Description=NAT container->outside traffic

        [Service]
        ExecStart=/usr/sbin/iptables -t nat -A POSTROUTING -o eth0 -s 10.240.INDEX.0/24 -j MASQUERADE
        ExecStart=/usr/sbin/iptables -t nat -A POSTROUTING -o eth1 -s 10.240.INDEX.0/24 -j MASQUERADE
        RemainAfterExit=yes
        Type=oneshot
    - name: docker.service
      command: start
      content: |
        [Unit]
        After=network.target
        Description=Docker Application Container Engine
        Documentation=http://docs.docker.io

        [Service]
        ExecStartPre=/bin/mount --make-rprivate /
        ExecStart=/usr/bin/docker -d -H fd:// -b cbr0 --iptables=false
        Restart=always
        RestartSec=30

        [Install]
        WantedBy=multi-user.target
    - name: format-data.service
      command: start
      content: |
        [Unit]
        Description=Formats data drive
        [Service]
        Type=oneshot
        RemainAfterExit=yes
        ExecStart=/usr/sbin/wipefs -f /dev/xvde1
        ExecStart=/usr/sbin/mkfs.btrfs -f /dev/xvde1
    - name: var-lib-docker-volumes.mount
      command: start
      content: |
        [Unit]
        Description=Mount data drive to /var/lib/docker/volumes
        Requires=format-data.service
        After=format-data.service
        Before=docker.service
        [Mount]
        What=/dev/xvde1
        Where=/var/lib/docker/volumes
        Type=btrfs
