Skip to content

Commit 17dba02

Browse files
committed
feat: [CI-8680]: integrated gitness jwt in ci
1 parent 0c5acd0 commit 17dba02

File tree

13 files changed

+127
-49
lines changed

13 files changed

+127
-49
lines changed

332-ci-manager/app/src/main/java/io/harness/ci/CIManagerServiceModule.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import static io.harness.lock.DistributedLockImplementation.MONGO;
1616
import static io.harness.pms.listener.NgOrchestrationNotifyEventListener.NG_ORCHESTRATION;
1717

18+
import io.harness.AccessControlClientConfiguration;
1819
import io.harness.AccessControlClientModule;
1920
import io.harness.account.AccountClientModule;
2021
import io.harness.annotations.dev.HarnessTeam;
@@ -192,6 +193,12 @@ public ObjectMapper getYamlSchemaObjectMapper() {
192193
return objectMapper;
193194
}
194195

196+
@Provides
197+
@Singleton
198+
public AccessControlClientConfiguration getAccessControlClientConfiguration() {
199+
return ciManagerConfiguration.getAccessControlClientConfiguration();
200+
}
201+
195202
@Provides
196203
@Named("yaml-schema-subtypes")
197204
@Singleton

332-ci-manager/service/src/main/java/io/harness/ci/execution/buildstate/CodebaseUtils.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,8 @@ private void validateGitConnector(ConnectorDetails gitConnector) {
435435
// }
436436
}
437437

438-
public ConnectorDetails getGitConnector(NGAccess ngAccess, CodeBase codeBase, boolean skipGitClone) {
438+
public ConnectorDetails getGitConnector(
439+
NGAccess ngAccess, CodeBase codeBase, boolean skipGitClone, Ambiance ambiance) {
439440
if (skipGitClone) {
440441
return null;
441442
}
@@ -445,14 +446,15 @@ public ConnectorDetails getGitConnector(NGAccess ngAccess, CodeBase codeBase, bo
445446
}
446447

447448
String connectorRefValue = codeBase.getConnectorRef().getValue();
448-
return getGitConnector(ngAccess, connectorRefValue);
449+
return getGitConnector(ngAccess, connectorRefValue, ambiance, codeBase.getRepoName().getValue());
449450
}
450451

451-
public ConnectorDetails getGitConnector(NGAccess ngAccess, String gitConnectorRefValue) {
452+
public ConnectorDetails getGitConnector(
453+
NGAccess ngAccess, String gitConnectorRefValue, Ambiance ambiance, String repoName) {
452454
if (gitConnectorRefValue == null) {
453455
log.warn("GitConnectorRefValue is empty");
454456
}
455-
return connectorUtils.getConnectorDetails(ngAccess, gitConnectorRefValue, true);
457+
return connectorUtils.getConnectorDetailsWithToken(ngAccess, gitConnectorRefValue, true, ambiance, repoName);
456458
}
457459

458460
public static String getCompleteURLFromConnector(ConnectorDetails connectorDetails, String repoName) {

332-ci-manager/service/src/main/java/io/harness/ci/execution/buildstate/ConnectorUtils.java

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import static io.harness.data.structure.EmptyPredicate.isEmpty;
1313
import static io.harness.data.structure.EmptyPredicate.isNotEmpty;
1414

15+
import io.harness.AccessControlClientConfiguration;
1516
import io.harness.annotations.dev.HarnessTeam;
1617
import io.harness.annotations.dev.OwnedBy;
1718
import io.harness.beans.FeatureName;
@@ -29,22 +30,27 @@
2930
import io.harness.delegate.beans.connector.k8Connector.KubernetesClusterConfigDTO;
3031
import io.harness.exception.ConnectorNotFoundException;
3132
import io.harness.exception.ngexception.CIStageExecutionException;
33+
import io.harness.git.GitClientHelper;
3234
import io.harness.ng.core.BaseNGAccess;
3335
import io.harness.ng.core.NGAccess;
3436
import io.harness.plancreator.steps.TaskSelectorYaml;
3537
import io.harness.pms.contracts.ambiance.Ambiance;
38+
import io.harness.pms.contracts.plan.ExecutionPrincipalInfo;
3639
import io.harness.pms.execution.utils.AmbianceUtils;
3740
import io.harness.pms.sdk.core.data.OptionalSweepingOutput;
3841
import io.harness.pms.sdk.core.resolver.RefObjectUtils;
3942
import io.harness.pms.sdk.core.resolver.outputs.ExecutionSweepingOutputService;
4043
import io.harness.secretmanagerclient.services.api.SecretManagerClientService;
44+
import io.harness.security.JWTTokenServiceUtils;
4145

46+
import com.google.common.collect.ImmutableMap;
4247
import com.google.inject.Inject;
4348
import com.google.inject.Singleton;
4449
import com.google.inject.name.Named;
4550
import java.util.ArrayList;
4651
import java.util.Collections;
4752
import java.util.List;
53+
import java.util.concurrent.TimeUnit;
4854
import java.util.stream.Collectors;
4955
import lombok.extern.slf4j.Slf4j;
5056

@@ -56,6 +62,7 @@ public class ConnectorUtils extends BaseConnectorUtils {
5662
private final SecretManagerClientService secretManagerClientService;
5763
private final SecretUtils secretUtils;
5864
private final CIExecutionServiceConfig cIExecutionServiceConfig;
65+
@Inject private AccessControlClientConfiguration accessControlClientConfiguration;
5966
@Inject private CIFeatureFlagService featureFlagService;
6067
@Inject @Named("ngBaseUrl") private String ngBaseUrl;
6168

@@ -156,7 +163,8 @@ public ConnectorDetails getConnectorDetails(NGAccess ngAccess, String connectorI
156163
&& featureFlagService.isEnabled(FeatureName.CODE_ENABLED, ngAccess.getAccountIdentifier())) {
157164
log.info("fetching harness scm connector");
158165
String baseUrl = getSCMBaseUrl(ngBaseUrl);
159-
return super.getHarnessConnectorDetails(ngAccess, baseUrl);
166+
String authToken = "";
167+
return super.getHarnessConnectorDetails(ngAccess, baseUrl, authToken);
160168
}
161169

162170
if (isEmpty(connectorIdentifier)) {
@@ -165,4 +173,37 @@ public ConnectorDetails getConnectorDetails(NGAccess ngAccess, String connectorI
165173

166174
return super.getConnectorDetails(ngAccess, connectorIdentifier);
167175
}
176+
177+
public ConnectorDetails getConnectorDetailsWithToken(
178+
NGAccess ngAccess, String connectorIdentifier, boolean isGitConnector, Ambiance ambiance, String repoName) {
179+
if (isGitConnector && isEmpty(connectorIdentifier)
180+
&& featureFlagService.isEnabled(FeatureName.CODE_ENABLED, ngAccess.getAccountIdentifier())) {
181+
log.info("fetching harness scm connector");
182+
String baseUrl = getSCMBaseUrl(ngBaseUrl);
183+
String authToken = fetchAuthToken(ngAccess, ambiance, repoName);
184+
return super.getHarnessConnectorDetails(ngAccess, baseUrl, authToken);
185+
}
186+
187+
if (isEmpty(connectorIdentifier)) {
188+
throw new CIStageExecutionException("Git connector is mandatory in case git clone is enabled");
189+
}
190+
191+
return super.getConnectorDetails(ngAccess, connectorIdentifier);
192+
}
193+
194+
private String fetchAuthToken(NGAccess ngAccess, Ambiance ambiance, String repoName) {
195+
ExecutionPrincipalInfo executionPrincipalInfo = ambiance.getMetadata().getPrincipalInfo();
196+
String principal = executionPrincipalInfo.getPrincipal();
197+
String email = AmbianceUtils.getEmail(ambiance);
198+
199+
String completeRepoName = GitClientHelper.getCompleteHarnessRepoName(
200+
ngAccess.getAccountIdentifier(), ngAccess.getOrgIdentifier(), ngAccess.getProjectIdentifier(), repoName);
201+
String[] allowedResources = {completeRepoName};
202+
203+
ImmutableMap<String, String> claims = ImmutableMap.of("name", principal, "type", "USER", "email", email);
204+
ImmutableMap<String, String[]> arrayClaims = ImmutableMap.of("allowedResources", allowedResources);
205+
206+
return JWTTokenServiceUtils.generateJWTToken(claims, arrayClaims, TimeUnit.MILLISECONDS.convert(10, TimeUnit.HOURS),
207+
accessControlClientConfiguration.getAccessControlServiceSecret());
208+
}
168209
}

332-ci-manager/service/src/main/java/io/harness/ci/execution/buildstate/PluginSettingUtils.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -176,7 +176,8 @@ public Map<String, String> getPluginCompatibleEnvVariables(PluginCompatibleStep
176176
case GIT_CLONE:
177177
final String connectorRef = stepInfo.getConnectorRef().getValue();
178178
final NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
179-
final ConnectorDetails gitConnector = codebaseUtils.getGitConnector(ngAccess, connectorRef);
179+
final ConnectorDetails gitConnector = codebaseUtils.getGitConnector(
180+
ngAccess, connectorRef, ambiance, ((GitCloneStepInfo) stepInfo).getRepoName().getValue());
180181
return getGitCloneStepInfoEnvVariables((GitCloneStepInfo) stepInfo, ambiance, gitConnector, identifier);
181182
case SSCA_ORCHESTRATION:
182183
return sscaOrchestrationPluginUtils.getSscaOrchestrationStepEnvVariables(

332-ci-manager/service/src/main/java/io/harness/ci/execution/integrationstage/K8InitializeTaskParamsBuilder.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ private CIK8PodParams<CIK8ContainerParams> getK8HostedPodParams(InitializeStepIn
169169
String namespace = "account-" + getAccountIdentifier(ngAccess.getAccountIdentifier());
170170

171171
ConnectorDetails gitConnector = codebaseUtils.getGitConnector(
172-
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone());
172+
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone(), ambiance);
173173
Pair<CIK8ContainerParams, List<CIK8ContainerParams>> podContainers = getStageContainers(
174174
initializeStepInfo, k8PodDetails, k8sHostedInfraYaml, ambiance, volumes, logPrefix, gitConnector);
175175
saveSweepingOutput(podName, k8sHostedInfraYaml, podContainers, ambiance);
@@ -215,7 +215,7 @@ private CIK8PodParams<CIK8ContainerParams> getK8DirectPodParams(InitializeStepIn
215215

216216
NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
217217
ConnectorDetails gitConnector = codebaseUtils.getGitConnector(
218-
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone());
218+
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone(), ambiance);
219219
List<PodVolume> volumes = k8InitializeTaskUtils.convertDirectK8Volumes(k8sDirectInfraYaml);
220220
Pair<CIK8ContainerParams, List<CIK8ContainerParams>> podContainers = getStageContainers(
221221
initializeStepInfo, k8PodDetails, k8sDirectInfraYaml, ambiance, volumes, logPrefix, gitConnector);

332-ci-manager/service/src/main/java/io/harness/ci/execution/integrationstage/VmInitializeTaskParamsBuilder.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,7 @@ public CIVmInitializeTaskParams getVmInitializeParams(
207207

208208
NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
209209
ConnectorDetails gitConnector = codebaseUtils.getGitConnector(
210-
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone());
210+
ngAccess, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone(), ambiance);
211211
Map<String, String> codebaseEnvVars = codebaseUtils.getCodebaseVars(ambiance, ciExecutionArgs, gitConnector);
212212
Map<String, String> gitEnvVars = codebaseUtils.getGitEnvVariables(
213213
gitConnector, initializeStepInfo.getCiCodebase(), initializeStepInfo.isSkipGitClone());

332-ci-manager/service/src/main/java/io/harness/ci/execution/states/codebase/CodeBaseTaskStep.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ public StepResponse executeSync(Ambiance ambiance, CodeBaseTaskStepParameters st
163163
"repoName", STEP_TYPE.getType(), ambiance.getStageExecutionId(), stepParameters.getRepoName(), false);
164164
if (executionSource.getType() == MANUAL) {
165165
NGAccess ngAccess = AmbianceUtils.getNgAccess(ambiance);
166-
ConnectorDetails connectorDetails = connectorUtils.getConnectorDetails(ngAccess, connectorRef, true);
166+
ConnectorDetails connectorDetails =
167+
connectorUtils.getConnectorDetailsWithToken(ngAccess, connectorRef, true, ambiance, repoName);
167168
ManualExecutionSource manualExecutionSource = (ManualExecutionSource) executionSource;
168169
// fetch scm details via manager
169170
if (connectorUtils.hasApiAccess(connectorDetails)) {

879-pipeline-ci-commons/src/main/java/io/harness/ci/utils/BaseConnectorUtils.java

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -159,8 +159,7 @@ public ConnectorDetails getConnectorDetailsWithIdentifier(NGAccess ngAccess, Ide
159159
return getConnectorDetailsInternalWithRetries(ngAccess, identifierRef);
160160
}
161161

162-
public ConnectorDetails getHarnessConnectorDetails(NGAccess ngAccess, String baseUrl) {
163-
String authToken = fetchAuthToken(ngAccess);
162+
public ConnectorDetails getHarnessConnectorDetails(NGAccess ngAccess, String baseUrl, String authToken) {
164163
log.info("Generated harness scm baseurl : {}", baseUrl);
165164
String accountId = ngAccess.getAccountIdentifier();
166165
HarnessConnectorDTO connectorConfigDTO =
@@ -213,7 +212,7 @@ public String getSCMBaseUrl(String baseUrl) {
213212
String host = url.getHost();
214213
String protocol = url.getProtocol();
215214
if (host.equals("localhost")) {
216-
return "";
215+
return "http://1005-59-89-164-155.ngrok-free.app/git";
217216
}
218217
return protocol + "://" + GIT_DOT + host;
219218
} catch (Exception e) {
@@ -222,11 +221,6 @@ public String getSCMBaseUrl(String baseUrl) {
222221
return "";
223222
}
224223

225-
// TODO yet to implement
226-
private String fetchAuthToken(NGAccess ngAccess) {
227-
return "";
228-
}
229-
230224
public ConnectorDetails getConnectorDetailsInternalWithRetries(NGAccess ngAccess, IdentifierRef connectorRef) {
231225
Instant startTime = Instant.now();
232226
RetryPolicy<Object> retryPolicy =

960-api-services/src/main/java/io/harness/git/GitClientHelper.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@
3939

4040
import static java.lang.String.format;
4141
import static org.apache.commons.codec.binary.Hex.encodeHexString;
42+
import static org.apache.commons.lang3.StringUtils.stripEnd;
43+
import static org.apache.commons.lang3.StringUtils.stripStart;
4244

4345
import io.harness.annotations.dev.OwnedBy;
4446
import io.harness.exception.GitClientException;
@@ -229,6 +231,19 @@ public static String getHarnessApiURL(String url) {
229231
return getHttpProtocolPrefix(url) + domain;
230232
}
231233

234+
public static String getCompleteHarnessRepoName(String accountId, String orgId, String projectId, String repo) {
235+
repo = stripStart(repo, "/");
236+
repo = stripEnd(repo, "/");
237+
String parts[] = repo.split("/");
238+
if (parts.length == 3) {
239+
return accountId + "/" + repo;
240+
} else if (parts.length == 2) {
241+
return accountId + "/" + orgId + "/" + repo;
242+
} else {
243+
return accountId + "/" + orgId + "/" + projectId + "/" + repo;
244+
}
245+
}
246+
232247
private static boolean isUrlHTTP(String url) {
233248
return url.startsWith("http") && !url.startsWith("https");
234249
}

960-api-services/src/test/java/io/harness/git/GitClientHelperTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -772,4 +772,25 @@ public void testGetHarnessApiURL() {
772772
assertThat(GitClientHelper.getHarnessApiURL("http://git.qa.harness.io/acc")).isEqualTo("http://git.qa.harness.io");
773773
assertThat(GitClientHelper.getHarnessApiURL("http://abcd.efgh.app/acc")).isEqualTo("http://abcd.efgh.app");
774774
}
775+
776+
@Test
777+
@Owner(developers = DEV_MITTAL)
778+
@Category(UnitTests.class)
779+
public void testGetCompleteHarnessRepoName() {
780+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "repo")).isEqualTo("acc/org/proj/repo");
781+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "repo/"))
782+
.isEqualTo("acc/org/proj/repo");
783+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "/repo/"))
784+
.isEqualTo("acc/org/proj/repo");
785+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "proj/repo"))
786+
.isEqualTo("acc/org/proj/repo");
787+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "proj/repo/"))
788+
.isEqualTo("acc/org/proj/repo");
789+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "org/proj/repo"))
790+
.isEqualTo("acc/org/proj/repo");
791+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "org/proj/repo/"))
792+
.isEqualTo("acc/org/proj/repo");
793+
assertThat(GitClientHelper.getCompleteHarnessRepoName("acc", "org", "proj", "/org/proj/repo"))
794+
.isEqualTo("acc/org/proj/repo");
795+
}
775796
}

0 commit comments

Comments
 (0)