package main
import (
        "fmt"
        "log"
        "code.cloudfoundry.org/garden"
        "code.cloudfoundry.org/garden/client"
        "code.cloudfoundry.org/garden/client/connection"
)
func main() {
        var diskLimit uint64
        gardenClient := client.New(connection.New("tcp", "10.244.0.2:7777"))
        diskLimit = 200000000
        containerSpec := garden.ContainerSpec{
                Image: garden.ImageRef{
                        URI: "docker:///ubuntu#16.04",
                },
                Limits: garden.Limits{
                        Disk: garden.DiskLimits{
                                ByteSoft: diskLimit,
                                ByteHard: diskLimit,
                                Scope:    garden.DiskLimitScopeTotal,
                        },
                },
        }
        container, err := gardenClient.Create(containerSpec)
        if err != nil {
                log.Fatal(err)
        }
        bulkMetricsBefore, err := gardenClient.BulkMetrics([]string{container.Handle()})
        if err != nil {
                log.Fatal(err)
        }
        fmt.Printf("Total bytes limit         : %d (hard) %d (soft)\n", diskLimit, diskLimit)
        fmt.Printf("Total bytes used          : %d\n", bulkMetricsBefore[container.Handle()].Metrics.DiskStat.TotalBytesUsed)
        fmt.Printf("Total bytes remaining     : %d\n", diskLimit-bulkMetricsBefore[container.Handle()].Metrics.DiskStat.TotalBytesUsed)
        fmt.Printf("Exclusive bytes used      : %d\n", bulkMetricsBefore[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed)
        fmt.Printf("Exclusive bytes remaining : %d\n", diskLimit-bulkMetricsBefore[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed)
        fmt.Printf("\n\n=== dd ing a 5mb file in the container ===\n")
        process, err := container.Run(garden.ProcessSpec{
                Path: "/bin/sh",
                Args: []string{"-c", "dd if=/dev/zero of=file.txt count=1 bs=5000000"},
        }, garden.ProcessIO{})
        if err != nil {
                log.Fatal(err)
        }
        exitCode, err := process.Wait()
        if err != nil {
                log.Fatal(err)
        }
        fmt.Printf("=== Process exited with code: %d ===\n\n", exitCode)
        bulkMetricsAfter, err := gardenClient.BulkMetrics([]string{container.Handle()})
        if err != nil {
                log.Fatal(err)
        }
        fmt.Printf("Total bytes limit                   : %d (hard) %d (soft)\n", diskLimit, diskLimit)
        fmt.Printf("Total bytes used                    : %d\n", bulkMetricsAfter[container.Handle()].Metrics.DiskStat.TotalBytesUsed)
        fmt.Printf("Total bytes remaining               : %d\n", diskLimit-bulkMetricsAfter[container.Handle()].Metrics.DiskStat.TotalBytesUsed)
        fmt.Printf("Exclusive bytes used                : %d\n", bulkMetricsAfter[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed)
        fmt.Printf("Exclusive bytes remaining           : %d\n", diskLimit-bulkMetricsAfter[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed)
        fmt.Printf("\nTotal bytes used incremented by     : %d\n", bulkMetricsAfter[container.Handle()].Metrics.DiskStat.TotalBytesUsed-bulkMetricsBefore[container.Handle()].Metrics.DiskStat.TotalBytesUsed)
        fmt.Printf("Exclusive bytes used incremented by : %d\n", bulkMetricsAfter[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed-bulkMetricsBefore[container.Handle()].Metrics.DiskStat.ExclusiveBytesUsed)
}