From 9dbe94dae8a4e63bca33fc9ed9e9aede805406b8 Mon Sep 17 00:00:00 2001 From: Himanshu Date: Thu, 16 Jan 2025 22:47:28 +0530 Subject: [PATCH] feat(provider/google): Support private worker pool in gcb CI (#1301) * Support GCB worker pool * Add test for pool option --------- Co-authored-by: Himanshu Gusain <184409974+himanhsugusain@users.noreply.github.com> --- .../igor/gcb/GoogleCloudBuildClient.java | 6 ++++ .../igor/gcb/GoogleCloudBuildTest.java | 29 +++++++++++++++++++ 2 files changed, 35 insertions(+) diff --git a/igor-web/src/main/java/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildClient.java b/igor-web/src/main/java/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildClient.java index e1d9eaf45..6ed923076 100644 --- a/igor-web/src/main/java/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildClient.java +++ b/igor-web/src/main/java/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildClient.java @@ -55,6 +55,12 @@ GoogleCloudBuildClient create(GoogleCredentials credentials, String projectId) { } Operation createBuild(Build build) { + if (build.getOptions() != null && build.getOptions().getPool() != null) { + String[] parts = build.getOptions().getPool().getName().split("/"); + String parent = "projects/" + parts[1] + "/locations/" + parts[3]; + return executor.execute( + () -> cloudBuild.projects().locations().builds().create(parent, build)); + } return executor.execute(() -> cloudBuild.projects().builds().create(projectId, build)); } diff --git a/igor-web/src/test/groovy/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildTest.java b/igor-web/src/test/groovy/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildTest.java index 4cb87d951..e142d0c18 100644 --- a/igor-web/src/test/groovy/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildTest.java +++ b/igor-web/src/test/groovy/com/netflix/spinnaker/igor/gcb/GoogleCloudBuildTest.java @@ -36,6 +36,7 @@ import com.google.api.services.cloudbuild.v1.model.BuildTrigger; import com.google.api.services.cloudbuild.v1.model.ListBuildTriggersResponse; import com.google.api.services.cloudbuild.v1.model.Operation; +import com.google.api.services.cloudbuild.v1.model.PoolOption; import com.google.api.services.cloudbuild.v1.model.RepoSource; import com.netflix.spinnaker.igor.RedisConfig; import com.netflix.spinnaker.igor.config.LockManagerConfig; @@ -135,6 +136,34 @@ public void presentAccountTest() throws Exception { assertThat(stubCloudBuildService.findUnmatchedRequests().getRequests()).isEmpty(); } + public void presentAccountTestWithPoolOption() throws Exception { + PoolOption poolOption = new PoolOption(); + poolOption.setName( + "projects/spinnaker-gcb-test-2/locations/gcb-location/workerPools/test-pool"); + BuildOptions buildOptions = new BuildOptions().setPool(poolOption); + String buildRequest = objectMapper.writeValueAsString(buildRequest().setOptions(buildOptions)); + String taggedBuild = objectMapper.writeValueAsString(taggedBuild()); + String buildResponse = objectMapper.writeValueAsString(buildResponse()); + String operationResponse = objectMapper.writeValueAsString(operationResponse()); + stubCloudBuildService.stubFor( + WireMock.post( + urlEqualTo("/v1/projects/spinnaker-gcb-test-2/locations/gcb-locations/builds")) + .withHeader("Authorization", equalTo("Bearer test-token")) + .withRequestBody(equalToJson(taggedBuild)) + .willReturn(aResponse().withStatus(200).withBody(operationResponse))); + + mockMvc + .perform( + post("/gcb/builds/create/gcb-account") + .accept(MediaType.APPLICATION_JSON) + .contentType(MediaType.APPLICATION_JSON) + .content(buildRequest)) + .andExpect(status().is(200)) + .andExpect(content().json(buildResponse)); + + assertThat(stubCloudBuildService.findUnmatchedRequests().getRequests()).isEmpty(); + } + @Test public void updateBuildTest() throws Exception { String buildId = "f0fc7c14-6035-4e5c-bda1-4848a73af5b4";