import (
"context"
"fmt"
"io"
compute "cloud.google.com/go/compute/apiv1"
computepb "cloud.google.com/go/compute/apiv1/computepb"
"google.golang.org/protobuf/proto"
)
// createTemplate creates a new instance template with the provided name and a specific instance configuration.
func createTemplate(w io.Writer, projectID, templateName string) error {
// projectID := "your_project_id"
// 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 `default` network,
// without specifying a subnetwork.
NetworkInterfaces: []*computepb.NetworkInterface{
{
Name: proto.String("global/networks/default"),
// The template lets the instance use an external IP address.
AccessConfigs: []*computepb.AccessConfig{
{
Name: proto.String("External NAT"),
Type: proto.String(computepb.AccessConfig_ONE_TO_ONE_NAT.String()),
NetworkTier: proto.String(computepb.AccessConfig_PREMIUM.String()),
},
},
},
},
},
},
}
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
}