Revert "operator: use GCP REST API for instance templates (#3361)" (#3544)

This reverts commit effb086cd3.
This commit is contained in:
Moritz Sanft 2024-12-11 17:04:13 +01:00 committed by GitHub
parent 37e21b2ff0
commit be1deb7d4b
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 113 additions and 94 deletions

View file

@ -29,7 +29,6 @@ go_library(
"@com_github_spf13_afero//:afero", "@com_github_spf13_afero//:afero",
"@com_google_cloud_go_compute//apiv1", "@com_google_cloud_go_compute//apiv1",
"@com_google_cloud_go_compute//apiv1/computepb", "@com_google_cloud_go_compute//apiv1/computepb",
"@org_golang_google_api//compute/v1:compute",
"@org_golang_google_api//googleapi", "@org_golang_google_api//googleapi",
"@org_golang_google_api//iterator", "@org_golang_google_api//iterator",
"@org_golang_google_protobuf//proto", "@org_golang_google_protobuf//proto",
@ -62,7 +61,6 @@ go_test(
"@com_github_stretchr_testify//require", "@com_github_stretchr_testify//require",
"@com_google_cloud_go_compute//apiv1", "@com_google_cloud_go_compute//apiv1",
"@com_google_cloud_go_compute//apiv1/computepb", "@com_google_cloud_go_compute//apiv1/computepb",
"@org_golang_google_api//compute/v1:compute",
"@org_golang_google_api//googleapi", "@org_golang_google_api//googleapi",
"@org_golang_google_api//iterator", "@org_golang_google_api//iterator",
"@org_golang_google_protobuf//proto", "@org_golang_google_protobuf//proto",

View file

@ -12,7 +12,6 @@ import (
compute "cloud.google.com/go/compute/apiv1" compute "cloud.google.com/go/compute/apiv1"
"cloud.google.com/go/compute/apiv1/computepb" "cloud.google.com/go/compute/apiv1/computepb"
"github.com/googleapis/gax-go/v2" "github.com/googleapis/gax-go/v2"
computeREST "google.golang.org/api/compute/v1"
) )
type projectAPI interface { type projectAPI interface {
@ -28,9 +27,13 @@ type instanceAPI interface {
} }
type instanceTemplateAPI interface { type instanceTemplateAPI interface {
Get(projectID, template string) (*computeREST.InstanceTemplate, error) Close() error
Delete(projectID, template string) (*computeREST.Operation, error) Get(ctx context.Context, req *computepb.GetInstanceTemplateRequest,
Insert(projectID string, template *computeREST.InstanceTemplate) (*computeREST.Operation, error) opts ...gax.CallOption) (*computepb.InstanceTemplate, error)
Delete(ctx context.Context, req *computepb.DeleteInstanceTemplateRequest,
opts ...gax.CallOption) (Operation, error)
Insert(ctx context.Context, req *computepb.InsertInstanceTemplateRequest,
opts ...gax.CallOption) (Operation, error)
} }
type instanceGroupManagersAPI interface { type instanceGroupManagersAPI interface {

View file

@ -14,7 +14,6 @@ import (
compute "cloud.google.com/go/compute/apiv1" compute "cloud.google.com/go/compute/apiv1"
"github.com/spf13/afero" "github.com/spf13/afero"
computeREST "google.golang.org/api/compute/v1"
) )
// Client is a client for the Google Compute Engine. // Client is a client for the Google Compute Engine.
@ -49,17 +48,12 @@ func New(ctx context.Context, configPath string) (*Client, error) {
return nil, err return nil, err
} }
closers = append(closers, insAPI) closers = append(closers, insAPI)
templAPI, err := compute.NewInstanceTemplatesRESTClient(ctx)
// TODO(msanft): Go back to protobuf-based API when it supports setting
// a confidential instance type.
// See https://github.com/googleapis/google-cloud-go/issues/10873 for the current status.
restClient, err := computeREST.NewService(ctx)
if err != nil { if err != nil {
_ = closeAll(closers) _ = closeAll(closers)
return nil, err return nil, err
} }
templAPI := computeREST.NewInstanceTemplatesService(restClient) closers = append(closers, templAPI)
groupAPI, err := compute.NewInstanceGroupManagersRESTClient(ctx) groupAPI, err := compute.NewInstanceGroupManagersRESTClient(ctx)
if err != nil { if err != nil {
_ = closeAll(closers) _ = closeAll(closers)
@ -87,6 +81,7 @@ func (c *Client) Close() error {
closers := []closer{ closers := []closer{
c.projectAPI, c.projectAPI,
c.instanceAPI, c.instanceAPI,
c.instanceTemplateAPI,
c.instanceGroupManagersAPI, c.instanceGroupManagersAPI,
c.diskAPI, c.diskAPI,
} }

View file

@ -12,7 +12,6 @@ import (
compute "cloud.google.com/go/compute/apiv1" compute "cloud.google.com/go/compute/apiv1"
"cloud.google.com/go/compute/apiv1/computepb" "cloud.google.com/go/compute/apiv1/computepb"
"github.com/googleapis/gax-go/v2" "github.com/googleapis/gax-go/v2"
computeREST "google.golang.org/api/compute/v1"
"google.golang.org/api/iterator" "google.golang.org/api/iterator"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
@ -48,7 +47,7 @@ func (a stubInstanceAPI) Get(_ context.Context, _ *computepb.GetInstanceRequest,
} }
type stubInstanceTemplateAPI struct { type stubInstanceTemplateAPI struct {
template *computeREST.InstanceTemplate template *computepb.InstanceTemplate
getErr error getErr error
deleteErr error deleteErr error
insertErr error insertErr error
@ -58,16 +57,30 @@ func (a stubInstanceTemplateAPI) Close() error {
return nil return nil
} }
func (a stubInstanceTemplateAPI) Get(_, _ string) (*computeREST.InstanceTemplate, error) { func (a stubInstanceTemplateAPI) Get(_ context.Context, _ *computepb.GetInstanceTemplateRequest,
_ ...gax.CallOption,
) (*computepb.InstanceTemplate, error) {
return a.template, a.getErr return a.template, a.getErr
} }
func (a stubInstanceTemplateAPI) Delete(_, _ string) (*computeREST.Operation, error) { func (a stubInstanceTemplateAPI) Delete(_ context.Context, _ *computepb.DeleteInstanceTemplateRequest,
return &computeREST.Operation{}, a.deleteErr _ ...gax.CallOption,
) (Operation, error) {
return &stubOperation{
&computepb.Operation{
Name: proto.String("name"),
},
}, a.deleteErr
} }
func (a stubInstanceTemplateAPI) Insert(_ string, _ *computeREST.InstanceTemplate) (*computeREST.Operation, error) { func (a stubInstanceTemplateAPI) Insert(_ context.Context, _ *computepb.InsertInstanceTemplateRequest,
return &computeREST.Operation{}, a.insertErr _ ...gax.CallOption,
) (Operation, error) {
return &stubOperation{
&computepb.Operation{
Name: proto.String("name"),
},
}, a.insertErr
} }
type stubInstanceGroupManagersAPI struct { type stubInstanceGroupManagersAPI struct {

View file

@ -12,27 +12,26 @@ import (
compute "cloud.google.com/go/compute/apiv1" compute "cloud.google.com/go/compute/apiv1"
"cloud.google.com/go/compute/apiv1/computepb" "cloud.google.com/go/compute/apiv1/computepb"
"github.com/googleapis/gax-go/v2" "github.com/googleapis/gax-go/v2"
computeREST "google.golang.org/api/compute/v1"
) )
type instanceTemplateClient struct { type instanceTemplateClient struct {
*computeREST.InstanceTemplatesService *compute.InstanceTemplatesClient
} }
func (c *instanceTemplateClient) Close() error { func (c *instanceTemplateClient) Close() error {
return nil // no-op return c.InstanceTemplatesClient.Close()
} }
func (c *instanceTemplateClient) Get(project, template string) (*computeREST.InstanceTemplate, error) { func (c *instanceTemplateClient) Delete(ctx context.Context, req *computepb.DeleteInstanceTemplateRequest,
return c.InstanceTemplatesService.Get(project, template).Do() opts ...gax.CallOption,
) (Operation, error) {
return c.InstanceTemplatesClient.Delete(ctx, req, opts...)
} }
func (c *instanceTemplateClient) Delete(project, template string) (*computeREST.Operation, error) { func (c *instanceTemplateClient) Insert(ctx context.Context, req *computepb.InsertInstanceTemplateRequest,
return c.InstanceTemplatesService.Delete(project, template).Do() opts ...gax.CallOption,
} ) (Operation, error) {
return c.InstanceTemplatesClient.Insert(ctx, req, opts...)
func (c *instanceTemplateClient) Insert(projectID string, template *computeREST.InstanceTemplate) (*computeREST.Operation, error) {
return c.InstanceTemplatesService.Insert(projectID, template).Do()
} }
type instanceGroupManagersClient struct { type instanceGroupManagersClient struct {

View file

@ -16,7 +16,6 @@ import (
"github.com/edgelesssys/constellation/v2/internal/constants" "github.com/edgelesssys/constellation/v2/internal/constants"
updatev1alpha1 "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/api/v1alpha1" updatev1alpha1 "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/api/v1alpha1"
cspapi "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/internal/cloud/api" cspapi "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/internal/cloud/api"
computeREST "google.golang.org/api/compute/v1"
"google.golang.org/api/iterator" "google.golang.org/api/iterator"
) )
@ -50,22 +49,29 @@ func (c *Client) SetScalingGroupImage(ctx context.Context, scalingGroupID, image
} }
// clone template with desired image // clone template with desired image
if instanceTemplate.Name == "" { if instanceTemplate.Name == nil {
return fmt.Errorf("instance template of scaling group %q has no name", scalingGroupID) return fmt.Errorf("instance template of scaling group %q has no name", scalingGroupID)
} }
instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage = imageURI instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage = &imageURI
newTemplateName, err := generateInstanceTemplateName(instanceTemplate.Name) newTemplateName, err := generateInstanceTemplateName(*instanceTemplate.Name)
if err != nil { if err != nil {
return err return err
} }
instanceTemplate.Name = newTemplateName instanceTemplate.Name = &newTemplateName
if _, err := c.instanceTemplateAPI.Insert(project, instanceTemplate); err != nil { op, err := c.instanceTemplateAPI.Insert(ctx, &computepb.InsertInstanceTemplateRequest{
Project: project,
InstanceTemplateResource: instanceTemplate,
})
if err != nil {
return fmt.Errorf("cloning instance template: %w", err) return fmt.Errorf("cloning instance template: %w", err)
} }
if err := op.Wait(ctx); err != nil {
return fmt.Errorf("waiting for cloned instance template: %w", err)
}
newTemplateURI := joinInstanceTemplateURI(project, newTemplateName) newTemplateURI := joinInstanceTemplateURI(project, newTemplateName)
// update instance group manager to use new template // update instance group manager to use new template
op, err := c.instanceGroupManagersAPI.SetInstanceTemplate(ctx, &computepb.SetInstanceTemplateInstanceGroupManagerRequest{ op, err = c.instanceGroupManagersAPI.SetInstanceTemplate(ctx, &computepb.SetInstanceTemplateInstanceGroupManagerRequest{
InstanceGroupManager: instanceGroupName, InstanceGroupManager: instanceGroupName,
Project: project, Project: project,
Zone: zone, Zone: zone,
@ -129,7 +135,10 @@ func (c *Client) ListScalingGroups(ctx context.Context, uid string) ([]cspapi.Sc
if len(templateURI) < 1 { if len(templateURI) < 1 {
continue // invalid template URI continue // invalid template URI
} }
template, err := c.instanceTemplateAPI.Get(c.projectID, templateURI[len(templateURI)-1]) template, err := c.instanceTemplateAPI.Get(ctx, &computepb.GetInstanceTemplateRequest{
Project: c.projectID,
InstanceTemplate: templateURI[len(templateURI)-1],
})
if err != nil { if err != nil {
retErr = errors.Join(retErr, fmt.Errorf("getting instance template %q: %w", templateURI[len(templateURI)-1], err)) retErr = errors.Join(retErr, fmt.Errorf("getting instance template %q: %w", templateURI[len(templateURI)-1], err))
continue continue
@ -190,7 +199,7 @@ func (c *Client) ListScalingGroups(ctx context.Context, uid string) ([]cspapi.Sc
return results, nil return results, nil
} }
func (c *Client) getScalingGroupTemplate(ctx context.Context, scalingGroupID string) (*computeREST.InstanceTemplate, error) { func (c *Client) getScalingGroupTemplate(ctx context.Context, scalingGroupID string) (*computepb.InstanceTemplate, error) {
project, zone, instanceGroupName, err := splitInstanceGroupID(scalingGroupID) project, zone, instanceGroupName, err := splitInstanceGroupID(scalingGroupID)
if err != nil { if err != nil {
return nil, err return nil, err
@ -210,19 +219,22 @@ func (c *Client) getScalingGroupTemplate(ctx context.Context, scalingGroupID str
if err != nil { if err != nil {
return nil, fmt.Errorf("splitting instance template name: %w", err) return nil, fmt.Errorf("splitting instance template name: %w", err)
} }
instanceTemplate, err := c.instanceTemplateAPI.Get(instanceTemplateProject, instanceTemplateName) instanceTemplate, err := c.instanceTemplateAPI.Get(ctx, &computepb.GetInstanceTemplateRequest{
InstanceTemplate: instanceTemplateName,
Project: instanceTemplateProject,
})
if err != nil { if err != nil {
return nil, fmt.Errorf("getting instance template %q: %w", instanceTemplateName, err) return nil, fmt.Errorf("getting instance template %q: %w", instanceTemplateName, err)
} }
return instanceTemplate, nil return instanceTemplate, nil
} }
func instanceTemplateSourceImage(instanceTemplate *computeREST.InstanceTemplate) (string, error) { func instanceTemplateSourceImage(instanceTemplate *computepb.InstanceTemplate) (string, error) {
if instanceTemplate.Properties == nil || if instanceTemplate.Properties == nil ||
len(instanceTemplate.Properties.Disks) == 0 || len(instanceTemplate.Properties.Disks) == 0 ||
instanceTemplate.Properties.Disks[0].InitializeParams == nil || instanceTemplate.Properties.Disks[0].InitializeParams == nil ||
instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage == "" { instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage == nil {
return "", errors.New("instance template has no source image") return "", errors.New("instance template has no source image")
} }
return uriNormalize(instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage), nil return uriNormalize(*instanceTemplate.Properties.Disks[0].InitializeParams.SourceImage), nil
} }

View file

@ -16,7 +16,6 @@ import (
cspapi "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/internal/cloud/api" cspapi "github.com/edgelesssys/constellation/v2/operators/constellation-node-operator/internal/cloud/api"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
computeREST "google.golang.org/api/compute/v1"
"google.golang.org/protobuf/proto" "google.golang.org/protobuf/proto"
) )
@ -24,7 +23,7 @@ func TestGetScalingGroupImage(t *testing.T) {
testCases := map[string]struct { testCases := map[string]struct {
scalingGroupID string scalingGroupID string
instanceGroupManagerTemplateID *string instanceGroupManagerTemplateID *string
instanceTemplate *computeREST.InstanceTemplate instanceTemplate *computepb.InstanceTemplate
getInstanceGroupManagerErr error getInstanceGroupManagerErr error
getInstanceTemplateErr error getInstanceTemplateErr error
wantImage string wantImage string
@ -33,12 +32,12 @@ func TestGetScalingGroupImage(t *testing.T) {
"getting image works": { "getting image works": {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image"),
}, },
}, },
}, },
@ -73,8 +72,8 @@ func TestGetScalingGroupImage(t *testing.T) {
"instance template has no disks": { "instance template has no disks": {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Properties: &computeREST.InstanceProperties{}, Properties: &computepb.InstanceProperties{},
}, },
wantErr: true, wantErr: true,
}, },
@ -113,7 +112,7 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID string scalingGroupID string
imageURI string imageURI string
instanceGroupManagerTemplateID *string instanceGroupManagerTemplateID *string
instanceTemplate *computeREST.InstanceTemplate instanceTemplate *computepb.InstanceTemplate
getInstanceGroupManagerErr error getInstanceGroupManagerErr error
getInstanceTemplateErr error getInstanceTemplateErr error
setInstanceTemplateErr error setInstanceTemplateErr error
@ -124,13 +123,13 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image-2", imageURI: "projects/project/global/images/image-2",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Name: "instance-template", Name: proto.String("instance-template"),
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image-1", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image-1"),
}, },
}, },
}, },
@ -141,13 +140,13 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image", imageURI: "projects/project/global/images/image",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Name: "instance-template", Name: proto.String("instance-template"),
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image"),
}, },
}, },
}, },
@ -183,8 +182,8 @@ func TestSetScalingGroupImage(t *testing.T) {
"instance template has no disks": { "instance template has no disks": {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Properties: &computeREST.InstanceProperties{}, Properties: &computepb.InstanceProperties{},
}, },
wantErr: true, wantErr: true,
}, },
@ -192,12 +191,12 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image-2", imageURI: "projects/project/global/images/image-2",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image-1", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image-1"),
}, },
}, },
}, },
@ -209,13 +208,13 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image-2", imageURI: "projects/project/global/images/image-2",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Name: "instance-template-999999999999999999999", Name: proto.String("instance-template-999999999999999999999"),
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image-1", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image-1"),
}, },
}, },
}, },
@ -227,13 +226,13 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image-2", imageURI: "projects/project/global/images/image-2",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Name: "instance-template", Name: proto.String("instance-template"),
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image-1", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image-1"),
}, },
}, },
}, },
@ -246,13 +245,13 @@ func TestSetScalingGroupImage(t *testing.T) {
scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group", scalingGroupID: "projects/project/zones/zone/instanceGroupManagers/instance-group",
imageURI: "projects/project/global/images/image-2", imageURI: "projects/project/global/images/image-2",
instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"), instanceGroupManagerTemplateID: proto.String("projects/project/global/instanceTemplates/instance-template"),
instanceTemplate: &computeREST.InstanceTemplate{ instanceTemplate: &computepb.InstanceTemplate{
Name: "instance-template", Name: proto.String("instance-template"),
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Disks: []*computeREST.AttachedDisk{ Disks: []*computepb.AttachedDisk{
{ {
InitializeParams: &computeREST.AttachedDiskInitializeParams{ InitializeParams: &computepb.AttachedDiskInitializeParams{
SourceImage: "https://www.googleapis.com/compute/v1/projects/project/global/images/image-1", SourceImage: proto.String("https://www.googleapis.com/compute/v1/projects/project/global/images/image-1"),
}, },
}, },
}, },
@ -449,8 +448,8 @@ func TestListScalingGroups(t *testing.T) {
}, },
}, },
instanceTemplateAPI: &stubInstanceTemplateAPI{ instanceTemplateAPI: &stubInstanceTemplateAPI{
template: &computeREST.InstanceTemplate{ template: &computepb.InstanceTemplate{
Properties: &computeREST.InstanceProperties{ Properties: &computepb.InstanceProperties{
Labels: tc.templateLabels, Labels: tc.templateLabels,
}, },
}, },