diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index cbfea516e..38356993c 100644 --- a/windows-builder/builder/builder/gce.go +++ b/windows-builder/builder/builder/gce.go @@ -32,10 +32,11 @@ const ( // Server encapsulates a GCE Instance. type Server struct { - context *context.Context - projectID string - service *compute.Service - instance *compute.Instance + context *context.Context + projectID string + vpcProjectID string + service *compute.Service + instance *compute.Instance Remote } @@ -72,7 +73,8 @@ func NewServer(ctx context.Context, bs *BuilderServer) *Server { log.Fatalf("Cannot create new server without project ID: %+v", err) return nil } - s := &Server{projectID: projectID} + s := &Server{projectID: projectID, vpcProjectID: *bs.NetworkProjectId} + log.Printf("ProjectID: %s, VPCProjectID: %s", s.projectID, s.vpcProjectID) log.Printf("Starting GCE service in project %s", projectID) err = s.newGCEService(ctx) @@ -169,6 +171,15 @@ func (s *Server) newInstance(bs *BuilderServer) error { } } + var projectNetwork string + if s.vpcProjectID == "" { + projectNetwork = s.projectID + } else { + projectNetwork = s.vpcProjectID + } + + log.Printf("Project Network: %s", projectNetwork) + instance := &compute.Instance{ Name: name, MachineType: prefix + s.projectID + "/zones/" + *bs.Zone + "/machineTypes/" + machineType, @@ -196,8 +207,8 @@ func (s *Server) newInstance(bs *BuilderServer) error { NetworkInterfaces: []*compute.NetworkInterface{ &compute.NetworkInterface{ AccessConfigs: accessConfigs, - Network: prefix + s.projectID + "/global/networks/" + *bs.VPC, - Subnetwork: prefix + s.projectID + "/regions/" + *bs.Region + "/subnetworks/" + *bs.Subnet, + Network: prefix + projectNetwork + "/global/networks/" + *bs.VPC, + Subnetwork: prefix + projectNetwork + "/regions/" + *bs.Region + "/subnetworks/" + *bs.Subnet, }, }, ServiceAccounts: []*compute.ServiceAccount{ @@ -212,7 +223,7 @@ func (s *Server) newInstance(bs *BuilderServer) error { Scheduling: &compute.Scheduling{ Preemptible: *bs.Preemptible, }, - Tags: &compute.Tags { + Tags: &compute.Tags{ Items: bs.GetTags(), }, } @@ -261,7 +272,7 @@ func (s *Server) DeleteInstance(bs *BuilderServer) error { } // getInternalIP gets an internal IP for an instance. -func(s *Server) getInternalIP(bs *BuilderServer) (string, error) { +func (s *Server) getInternalIP(bs *BuilderServer) (string, error) { err := s.refreshInstance(bs) if err != nil { log.Printf("Error refreshing instance: %+v", err) @@ -291,7 +302,16 @@ func (s *Server) getExternalIP(bs *BuilderServer) (string, error) { // setFirewallRule allows ingress on WinRM port. func (s *Server) setFirewallRule(bs *BuilderServer) error { - list, err := s.service.Firewalls.List(s.projectID).Do() + var projectNetwork string + if s.vpcProjectID == "" { + projectNetwork = s.projectID + } else { + projectNetwork = s.vpcProjectID + } + + log.Printf("Project Network in Firewall: %s", projectNetwork) + + list, err := s.service.Firewalls.List(projectNetwork).Do() if err != nil { log.Printf("Could not list GCE firewalls: %+v", err) return err @@ -305,7 +325,7 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { firewallRule := &compute.Firewall{ Allowed: []*compute.FirewallAllowed{ - &compute.FirewallAllowed{ + { IPProtocol: "tcp", Ports: []string{"5986"}, }, @@ -313,9 +333,9 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { Direction: "INGRESS", Name: "allow-winrm-ingress", SourceRanges: []string{"0.0.0.0/0"}, - Network: prefix + s.projectID + "/global/networks/" + *bs.VPC, + Network: prefix + projectNetwork + "/global/networks/" + *bs.VPC, } - _, err = s.service.Firewalls.Insert(s.projectID, firewallRule).Do() + _, err = s.service.Firewalls.Insert(projectNetwork, firewallRule).Do() if err != nil { log.Printf("Error setting firewall rule: %v", err) return err @@ -323,7 +343,7 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { return nil } -//WindowsPasswordConfig stores metadata to be sent to GCE. +// WindowsPasswordConfig stores metadata to be sent to GCE. type WindowsPasswordConfig struct { key *rsa.PrivateKey password string @@ -334,7 +354,7 @@ type WindowsPasswordConfig struct { ExpireOn time.Time `json:"expireOn"` } -//WindowsPasswordResponse stores data received from GCE. +// WindowsPasswordResponse stores data received from GCE. type WindowsPasswordResponse struct { UserName string `json:"userName"` PasswordFound bool `json:"passwordFound"` diff --git a/windows-builder/builder/builder/remote.go b/windows-builder/builder/builder/remote.go index 5a991d759..7043a9b12 100644 --- a/windows-builder/builder/builder/remote.go +++ b/windows-builder/builder/builder/remote.go @@ -29,20 +29,21 @@ type Remote struct { } type BuilderServer struct { - ImageUrl *string - VPC *string - Subnet *string - Region *string - Zone *string - Labels *string - MachineType *string - Preemptible *bool - DiskSizeGb *int64 - DiskType *string - ServiceAccount *string - Tags *string - UseInternalNet *bool - CreateExternalIP *bool + ImageUrl *string + VPC *string + Subnet *string + Region *string + Zone *string + Labels *string + MachineType *string + Preemptible *bool + DiskSizeGb *int64 + DiskType *string + ServiceAccount *string + Tags *string + UseInternalNet *bool + CreateExternalIP *bool + NetworkProjectId *string } // Wait for server to be available. @@ -199,7 +200,7 @@ func (bs *BuilderServer) GetLabelsMap() map[string]string { if *bs.Labels == "" { return nil } - + var labelsMap map[string]string for _, label := range strings.Split(*bs.Labels, ",") { @@ -225,12 +226,12 @@ func (bs *BuilderServer) GetLabelsMap() map[string]string { } func (bs *BuilderServer) GetTags() []string { - if *bs.Tags == "" { - return nil - } + if *bs.Tags == "" { + return nil + } var tags []string - for _, tag := range strings.Split(*bs.Tags, ",") { + for _, tag := range strings.Split(*bs.Tags, ",") { tags = append(tags, strings.TrimSpace(tag)) } return tags diff --git a/windows-builder/builder/main.go b/windows-builder/builder/main.go index 647502b80..bc6e158ed 100644 --- a/windows-builder/builder/main.go +++ b/windows-builder/builder/main.go @@ -1,12 +1,12 @@ package main import ( - "os/signal" "context" - "syscall" "flag" "log" "os" + "os/signal" + "syscall" "github.com/GoogleCloudPlatform/cloud-builders-community/windows-builder/builder/builder" ) @@ -19,7 +19,7 @@ var ( notCopyWorkspace = flag.Bool("not-copy-workspace", false, "If copy workspace or not") workspacePath = flag.String("workspace-path", "/workspace", "The directory to copy data from") workspaceBucket = flag.String("workspace-bucket", "", "The bucket to copy the directory to. Defaults to {project-id}_cloudbuild") - image = flag.String("image", "windows-cloud/global/images/windows-server-2019-dc-for-containers-v20191210", "Windows image to start the server from") + image = flag.String("image", "windows-cloud/global/images/windows-2019", "Windows image to start the server from") network = flag.String("network", "default", "The VPC name to use when creating the Windows server") subnetwork = flag.String("subnetwork", "default", "The Subnetwork name to use when creating the Windows server") region = flag.String("region", "us-central1", "The region name to use when creating the Windows server") @@ -35,6 +35,7 @@ var ( tags = flag.String("tags", "", "List of strings eparated by comma to add when creating the Windows server") useInternalNet = flag.Bool("use-internal-network", false, "Communicate with Windows server over the internal network") createExternalIP = flag.Bool("create-external-ip", false, "Create an external IP address when using internal network") + networkProjectId = flag.String("networkProjectId", "", "Use when you have a network in a different project") ) func main() { @@ -69,6 +70,7 @@ func main() { Tags: tags, UseInternalNet: useInternalNet, CreateExternalIP: createExternalIP, + NetworkProjectId: networkProjectId, } s = builder.NewServer(ctx, bs) r = &s.Remote