From e6e3b8297c7d4ce30e9134c0dab9c0171ba69251 Mon Sep 17 00:00:00 2001 From: Orlando Burli Date: Tue, 16 Jan 2024 22:48:16 -0400 Subject: [PATCH 1/5] feat: add flag for remote vpc project --- windows-builder/builder/builder/gce.go | 30 ++++++++++------- windows-builder/builder/builder/remote.go | 39 ++++++++++++----------- windows-builder/builder/main.go | 8 +++-- 3 files changed, 44 insertions(+), 33 deletions(-) diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index cbfea516e..918ae45a8 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,7 @@ 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("Starting GCE service in project %s", projectID) err = s.newGCEService(ctx) @@ -169,6 +170,13 @@ func (s *Server) newInstance(bs *BuilderServer) error { } } + var projectNetwork string + if s.vpcProjectID == "" { + projectNetwork = s.projectID + } else { + projectNetwork = s.vpcProjectID + } + instance := &compute.Instance{ Name: name, MachineType: prefix + s.projectID + "/zones/" + *bs.Zone + "/machineTypes/" + machineType, @@ -196,8 +204,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 +220,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 +269,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) @@ -323,7 +331,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 +342,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 From ec9a8d66fe792d365d65a56c4677077671e758ae Mon Sep 17 00:00:00 2001 From: Orlando Burli Date: Wed, 17 Jan 2024 10:54:20 -0400 Subject: [PATCH 2/5] feat: adding some debug info --- windows-builder/builder/builder/gce.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index 918ae45a8..08052e68c 100644 --- a/windows-builder/builder/builder/gce.go +++ b/windows-builder/builder/builder/gce.go @@ -74,6 +74,7 @@ func NewServer(ctx context.Context, bs *BuilderServer) *Server { return nil } 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) @@ -177,6 +178,8 @@ func (s *Server) newInstance(bs *BuilderServer) error { projectNetwork = s.vpcProjectID } + log.Printf("Project Network: %s", projectNetwork) + instance := &compute.Instance{ Name: name, MachineType: prefix + s.projectID + "/zones/" + *bs.Zone + "/machineTypes/" + machineType, From 602f97e65dac76ccb09d739963434da932363c5a Mon Sep 17 00:00:00 2001 From: Orlando Burli Date: Wed, 17 Jan 2024 10:55:46 -0400 Subject: [PATCH 3/5] feat: fix firewall project --- windows-builder/builder/builder/gce.go | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index 08052e68c..43190dca0 100644 --- a/windows-builder/builder/builder/gce.go +++ b/windows-builder/builder/builder/gce.go @@ -302,6 +302,13 @@ func (s *Server) getExternalIP(bs *BuilderServer) (string, error) { // setFirewallRule allows ingress on WinRM port. func (s *Server) setFirewallRule(bs *BuilderServer) error { + var projectNetwork string + if s.vpcProjectID == "" { + projectNetwork = s.projectID + } else { + projectNetwork = s.vpcProjectID + } + list, err := s.service.Firewalls.List(s.projectID).Do() if err != nil { log.Printf("Could not list GCE firewalls: %+v", err) @@ -324,7 +331,7 @@ 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() if err != nil { From ddfb920e1250faff6212c8fd694b4b4e7d93f02f Mon Sep 17 00:00:00 2001 From: Orlando Burli Date: Wed, 17 Jan 2024 11:01:42 -0400 Subject: [PATCH 4/5] feat: fix firewall project --- windows-builder/builder/builder/gce.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index 43190dca0..74d902b49 100644 --- a/windows-builder/builder/builder/gce.go +++ b/windows-builder/builder/builder/gce.go @@ -309,6 +309,8 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { projectNetwork = s.vpcProjectID } + log.Printf("Project Network in Firewall: %s", projectNetwork) + list, err := s.service.Firewalls.List(s.projectID).Do() if err != nil { log.Printf("Could not list GCE firewalls: %+v", err) From 80365239bd867f5d52cd6d9384940cbc47fdf83f Mon Sep 17 00:00:00 2001 From: Orlando Burli Date: Wed, 17 Jan 2024 12:00:21 -0400 Subject: [PATCH 5/5] feat: fix firewall project --- windows-builder/builder/builder/gce.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/windows-builder/builder/builder/gce.go b/windows-builder/builder/builder/gce.go index 74d902b49..38356993c 100644 --- a/windows-builder/builder/builder/gce.go +++ b/windows-builder/builder/builder/gce.go @@ -311,7 +311,7 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { log.Printf("Project Network in Firewall: %s", projectNetwork) - list, err := s.service.Firewalls.List(s.projectID).Do() + list, err := s.service.Firewalls.List(projectNetwork).Do() if err != nil { log.Printf("Could not list GCE firewalls: %+v", err) return err @@ -325,7 +325,7 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { firewallRule := &compute.Firewall{ Allowed: []*compute.FirewallAllowed{ - &compute.FirewallAllowed{ + { IPProtocol: "tcp", Ports: []string{"5986"}, }, @@ -335,7 +335,7 @@ func (s *Server) setFirewallRule(bs *BuilderServer) error { SourceRanges: []string{"0.0.0.0/0"}, 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