package main

import (
	"context"
	"path"
	"runtime"

	"go.skia.org/infra/go/common"
	"go.skia.org/infra/go/gce"
	"go.skia.org/infra/go/sklog"
)

const (
	IMAGE_DESCRIPTION = "Base image for all Skia servers."
	IMAGE_FAMILY      = "skia-pushable-base"
	INSTANCE_NAME     = "skia-pushable-base-maker"
	SETUP_SCRIPT      = "~/setup_script.sh"
)

func BaseConfig() *gce.Instance {
	// The setup script has to be run in an interactive terminal. Make sure
	// it ends up on the machine and we'll ask the user to run it.
	_, filename, _, _ := runtime.Caller(0)
	dir := path.Dir(filename)

	vm := &gce.Instance{
		BootDisk: &gce.Disk{
			Name:        INSTANCE_NAME,
			SourceImage: "projects/debian-cloud/global/images/debian-9-stretch-v20170829",
			Type:        gce.DISK_TYPE_PERSISTENT_STANDARD,
		},
		MachineType: gce.MACHINE_TYPE_STANDARD_4,
		Name:        INSTANCE_NAME,
		Os:          gce.OS_LINUX,
		Scopes: []string{
			"https://www.googleapis.com/auth/cloud-platform",
		},
		SetupScript: path.Join(dir, "setup-script.sh"),
		User:        gce.USER_DEFAULT,
	}

	return vm
}

func main() {
	common.Init()

	// Create the GCloud object.
	g, err := gce.NewLocalGCloud(gce.PROJECT_ID_SERVER, gce.ZONE_DEFAULT)
	if err != nil {
		sklog.Fatal(err)
	}
	if err := g.CheckSsh(); err != nil {
		sklog.Fatal(err)
	}

	vm := BaseConfig()

	// Delete the instance if it already exists, to ensure that we're in a
	// clean state.
	if err := g.Delete(vm, true, true); err != nil {
		sklog.Fatal(err)
	}

	// Create/Setup the instance.
	if err := g.CreateAndSetup(context.Background(), vm, false); err != nil {
		sklog.Fatal(err)
	}

	// Capture the image.
	if err := g.CaptureImage(vm, IMAGE_FAMILY, IMAGE_DESCRIPTION); err != nil {
		sklog.Fatal(err)
	}
}
