import (
"context"
"fmt"
"io"
compute "cloud.google.com/go/compute/apiv1"
computepb "cloud.google.com/go/compute/apiv1/computepb"
"google.golang.org/protobuf/proto"
)
// createTemplateWithSubnet creates an instance template that uses a provided subnet.
func createTemplateWithSubnet(w io.Writer, projectID, network, subnetwork, templateName string) error {
// projectID := "your_project_id"
// network := "projects/project/global/networks/network"
// subnetwork := "projects/project/regions/region/subnetworks/subnetwork"
// templateName := "your_template_name"
ctx := context.Background()
instanceTemplatesClient, err := compute.NewInstanceTemplatesRESTClient(ctx)
if err != nil {
return fmt.Errorf("NewInstanceTemplatesRESTClient: %w", err)
}
defer instanceTemplatesClient.Close()
req := &computepb.InsertInstanceTemplateRequest{
Project: projectID,
InstanceTemplateResource: &computepb.InstanceTemplate{
Name: proto.String(templateName),
Properties: &computepb.InstanceProperties{
// The template describes the size and source image of the boot disk
// to attach to the instance.
Disks: []*computepb.AttachedDisk{
{
InitializeParams: &computepb.AttachedDiskInitializeParams{
DiskSizeGb: proto.Int64(250),
SourceImage: proto.String("projects/debian-cloud/global/images/family/debian-11"),
},
AutoDelete: proto.Bool(true),
Boot: proto.Bool(true),
},
},
MachineType: proto.String("e2-standard-4"),
// The template connects the instance to the specified network and subnetwork.
NetworkInterfaces: []*computepb.NetworkInterface{
{
Network: proto.String(network),
Subnetwork: proto.String(subnetwork),
},
},
},
},
}
op, err := instanceTemplatesClient.Insert(ctx, req)
if err != nil {
return fmt.Errorf("unable to create instance template: %w", err)
}
if err = op.Wait(ctx); err != nil {
return fmt.Errorf("unable to wait for the operation: %w", err)
}
fmt.Fprintf(w, "Instance template created\n")
return nil
}