Skip to content

Commit 4a05518

Browse files
committed
feat: [CI-4981]: Added manager validation for Artifactory and Docker Registry
1 parent 6d3a01d commit 4a05518

25 files changed

Lines changed: 555 additions & 22 deletions

File tree

260-delegate/src/main/java/io/harness/delegate/app/modules/DelegateModule.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,10 @@
6666
import io.harness.connector.service.git.NGGitServiceImpl;
6767
import io.harness.connector.service.scm.ScmDelegateClient;
6868
import io.harness.connector.task.ConnectorValidationHandler;
69+
import io.harness.connector.task.artifactory.ArtifactoryValidationHandler;
6970
import io.harness.connector.task.aws.AwsValidationHandler;
7071
import io.harness.connector.task.azure.AzureValidationHandler;
72+
import io.harness.connector.task.docker.DockerValidationHandler;
7173
import io.harness.connector.task.gcp.GcpValidationTaskHandler;
7274
import io.harness.connector.task.git.GitValidationHandler;
7375
import io.harness.cvng.CVNGDataCollectionDelegateServiceImpl;
@@ -143,7 +145,6 @@
143145
import io.harness.delegate.task.PagerDutySenderDelegateTask;
144146
import io.harness.delegate.task.SlackSenderDelegateTask;
145147
import io.harness.delegate.task.artifactory.ArtifactoryDelegateTask;
146-
import io.harness.delegate.task.artifactory.ArtifactoryValidationHandler;
147148
import io.harness.delegate.task.artifacts.ArtifactSourceDelegateRequest;
148149
import io.harness.delegate.task.artifacts.DelegateArtifactTaskHandler;
149150
import io.harness.delegate.task.artifacts.artifactory.ArtifactoryArtifactDelegateRequest;
@@ -204,7 +205,6 @@
204205
import io.harness.delegate.task.cloudformation.handlers.CloudformationDeleteStackTaskHandler;
205206
import io.harness.delegate.task.cvng.CVConnectorValidationHandler;
206207
import io.harness.delegate.task.docker.DockerTestConnectionDelegateTask;
207-
import io.harness.delegate.task.docker.DockerValidationHandler;
208208
import io.harness.delegate.task.executioncapability.BatchCapabilityCheckTask;
209209
import io.harness.delegate.task.gcp.GcpTask;
210210
import io.harness.delegate.task.gcp.GcpTaskType;

440-connector-nextgen/src/main/java/io/harness/connector/ConnectorModule.java

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111
import static io.harness.annotations.dev.HarnessTeam.DX;
1212

1313
import io.harness.annotations.dev.OwnedBy;
14+
import io.harness.artifacts.docker.client.DockerRestClientFactory;
15+
import io.harness.artifacts.docker.client.DockerRestClientFactoryImpl;
1416
import io.harness.aws.AwsClient;
1517
import io.harness.aws.AwsClientImpl;
1618
import io.harness.azure.client.AzureAuthorizationClient;
@@ -120,6 +122,7 @@ protected void configure() {
120122
bind(GcpClient.class).to(GcpClientImpl.class);
121123
bind(AzureAuthorizationClient.class).to(AzureAuthorizationClientImpl.class);
122124
bind(NGGitService.class).to(NGGitServiceImpl.class);
125+
bind(DockerRestClientFactory.class).to(DockerRestClientFactoryImpl.class);
123126
bind(GitClientV2.class).to(GitClientV2Impl.class);
124127
bind(ScmDelegateClient.class).to(ScmDelegateClientImpl.class);
125128
bind(NGConnectorSecretManagerService.class).to(NGConnectorSecretManagerServiceImpl.class);

440-connector-nextgen/src/main/java/io/harness/connector/ConnectorRegistryFactory.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,8 +114,10 @@
114114
import io.harness.connector.mappers.sumologicmapper.SumoLogicEntityToDTO;
115115
import io.harness.connector.task.ConnectorValidationHandler;
116116
import io.harness.connector.task.NotSupportedValidationHandler;
117+
import io.harness.connector.task.artifactory.ArtifactoryValidationHandler;
117118
import io.harness.connector.task.aws.AwsValidationHandler;
118119
import io.harness.connector.task.azure.AzureValidationHandler;
120+
import io.harness.connector.task.docker.DockerValidationHandler;
119121
import io.harness.connector.task.gcp.GcpValidationTaskHandler;
120122
import io.harness.connector.task.git.GitValidationHandler;
121123
import io.harness.connector.validator.ArtifactoryConnectionValidator;
@@ -221,7 +223,7 @@ public class ConnectorRegistryFactory {
221223
registrar.put(ConnectorType.DOCKER,
222224
new ConnectorRegistrar(ConnectorCategory.ARTIFACTORY, DockerConnectionValidator.class,
223225
DockerConnectorValidationParamsProvider.class, DockerDTOToEntity.class, DockerEntityToDTO.class,
224-
NotSupportedValidationHandler.class));
226+
DockerValidationHandler.class));
225227
registrar.put(ConnectorType.GCP,
226228
new ConnectorRegistrar(ConnectorCategory.CLOUD_PROVIDER, GcpConnectorValidator.class,
227229
GcpValidationParamsProvider.class, GcpDTOToEntity.class, GcpEntityToDTO.class,
@@ -240,7 +242,7 @@ public class ConnectorRegistryFactory {
240242
registrar.put(ConnectorType.ARTIFACTORY,
241243
new ConnectorRegistrar(ConnectorCategory.ARTIFACTORY, ArtifactoryConnectionValidator.class,
242244
ArtifactoryValidationParamsProvider.class, ArtifactoryDTOToEntity.class, ArtifactoryEntityToDTO.class,
243-
NotSupportedValidationHandler.class));
245+
ArtifactoryValidationHandler.class));
244246
registrar.put(ConnectorType.JIRA,
245247
new ConnectorRegistrar(ConnectorCategory.TICKETING, JiraConnectorValidator.class,
246248
JiraValidationParamsProvider.class, JiraDTOToEntity.class, JiraEntityToDTO.class,
Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
package io.harness.connector.validator;
2+
3+
import io.harness.connector.ConnectorValidationResult;
4+
import io.harness.connector.ManagerExecutable;
5+
import io.harness.delegate.beans.DelegateResponseData;
6+
import io.harness.delegate.beans.artifactory.ArtifactoryTaskResponse;
7+
import io.harness.delegate.beans.connector.ConnectorConfigDTO;
8+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryConnectorDTO;
9+
import io.harness.delegate.beans.connector.docker.DockerConnectorDTO;
10+
import io.harness.delegate.beans.connector.docker.DockerTestConnectionTaskResponse;
11+
import io.harness.exception.InvalidRequestException;
12+
13+
public abstract class AbstractArtifactConnectorValidator extends AbstractConnectorValidator {
14+
public boolean shouldExecuteOnDelegate(ConnectorConfigDTO connectorConfigDTO) {
15+
Boolean executeOnDelegate = Boolean.TRUE;
16+
if (connectorConfigDTO instanceof ManagerExecutable) {
17+
executeOnDelegate = ((ManagerExecutable) connectorConfigDTO).getExecuteOnDelegate();
18+
}
19+
return executeOnDelegate;
20+
}
21+
22+
public ConnectorValidationResult validate(ConnectorConfigDTO connectorConfigDTO, String accountIdentifier,
23+
String orgIdentifier, String projectIdentifier, String identifier) {
24+
boolean executeOnDelegate = shouldExecuteOnDelegate(connectorConfigDTO);
25+
if (!executeOnDelegate) {
26+
return super.validateConnectorViaManager(
27+
connectorConfigDTO, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
28+
} else {
29+
DelegateResponseData responseData =
30+
super.validateConnector(connectorConfigDTO, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
31+
return getValidationResult(connectorConfigDTO, responseData);
32+
}
33+
}
34+
35+
private ConnectorValidationResult getValidationResult(
36+
ConnectorConfigDTO connectorConfigDTO, DelegateResponseData delegateResponseData) {
37+
if (connectorConfigDTO instanceof ArtifactoryConnectorDTO) {
38+
return ((ArtifactoryTaskResponse) delegateResponseData).getConnectorValidationResult();
39+
} else if (connectorConfigDTO instanceof DockerConnectorDTO) {
40+
return ((DockerTestConnectionTaskResponse) delegateResponseData).getConnectorValidationResult();
41+
}
42+
throw new InvalidRequestException("Invalid connector type found during connection test");
43+
}
44+
}

440-connector-nextgen/src/main/java/io/harness/connector/validator/ArtifactoryConnectionValidator.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,6 @@
1414
import io.harness.connector.ConnectorResponseDTO;
1515
import io.harness.connector.ConnectorValidationResult;
1616
import io.harness.delegate.beans.artifactory.ArtifactoryTaskParams;
17-
import io.harness.delegate.beans.artifactory.ArtifactoryTaskResponse;
1817
import io.harness.delegate.beans.connector.ConnectorConfigDTO;
1918
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryConnectorDTO;
2019
import io.harness.delegate.task.TaskParameters;
@@ -24,7 +23,7 @@
2423

2524
@Slf4j
2625
@Singleton
27-
public class ArtifactoryConnectionValidator extends AbstractConnectorValidator {
26+
public class ArtifactoryConnectionValidator extends AbstractArtifactConnectorValidator {
2827
@Override
2928
public <T extends ConnectorConfigDTO> TaskParameters getTaskParameters(
3029
T connectorConfig, String accountIdentifier, String orgIdentifier, String projectIdentifier) {
@@ -46,9 +45,7 @@ public String getTaskType() {
4645
@Override
4746
public ConnectorValidationResult validate(ConnectorConfigDTO connectorDTO, String accountIdentifier,
4847
String orgIdentifier, String projectIdentifier, String identifier) {
49-
ArtifactoryTaskResponse responseData = (ArtifactoryTaskResponse) super.validateConnector(
50-
connectorDTO, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
51-
return responseData.getConnectorValidationResult();
48+
return super.validate(connectorDTO, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
5249
}
5350

5451
@Override

440-connector-nextgen/src/main/java/io/harness/connector/validator/DockerConnectionValidator.java

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
1515
import io.harness.delegate.beans.connector.docker.DockerAuthCredentialsDTO;
1616
import io.harness.delegate.beans.connector.docker.DockerConnectorDTO;
1717
import io.harness.delegate.beans.connector.docker.DockerTestConnectionTaskParams;
18-
import io.harness.delegate.beans.connector.docker.DockerTestConnectionTaskResponse;
1918
import io.harness.delegate.task.TaskParameters;
2019

2120
import com.google.inject.Singleton;
2221
import lombok.extern.slf4j.Slf4j;
2322

2423
@Slf4j
2524
@Singleton
26-
public class DockerConnectionValidator extends AbstractConnectorValidator {
25+
public class DockerConnectionValidator extends AbstractArtifactConnectorValidator {
2726
@Override
2827
public <T extends ConnectorConfigDTO> TaskParameters getTaskParameters(
2928
T connectorConfig, String accountIdentifier, String orgIdentifier, String projectIdentifier) {
@@ -45,9 +44,7 @@ public String getTaskType() {
4544
@Override
4645
public ConnectorValidationResult validate(ConnectorConfigDTO dockerConnector, String accountIdentifier,
4746
String orgIdentifier, String projectIdentifier, String identifier) {
48-
DockerTestConnectionTaskResponse responseData = (DockerTestConnectionTaskResponse) super.validateConnector(
49-
dockerConnector, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
50-
return responseData.getConnectorValidationResult();
47+
return super.validate(dockerConnector, accountIdentifier, orgIdentifier, projectIdentifier, identifier);
5148
}
5249

5350
@Override
Lines changed: 125 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,125 @@
1+
/*
2+
* Copyright 2021 Harness Inc. All rights reserved.
3+
* Use of this source code is governed by the PolyForm Free Trial 1.0.0 license
4+
* that can be found in the licenses directory at the root of this repository, also available at
5+
* https://polyformproject.org/wp-content/uploads/2020/05/PolyForm-Free-Trial-1.0.0.txt.
6+
*/
7+
8+
package io.harness.connector.validator;
9+
10+
import static io.harness.connector.ConnectivityStatus.SUCCESS;
11+
12+
import static org.assertj.core.api.Assertions.assertThat;
13+
import static org.joor.Reflect.on;
14+
import static org.mockito.Matchers.any;
15+
import static org.mockito.Mockito.mock;
16+
import static org.mockito.Mockito.when;
17+
18+
import io.harness.CategoryTest;
19+
import io.harness.artifactory.ArtifactoryClientImpl;
20+
import io.harness.category.element.UnitTests;
21+
import io.harness.connector.ConnectorInfoDTO;
22+
import io.harness.connector.ConnectorResponseDTO;
23+
import io.harness.connector.ConnectorValidationResult;
24+
import io.harness.connector.heartbeat.ArtifactoryValidationParamsProvider;
25+
import io.harness.connector.heartbeat.ConnectorValidationParamsProvider;
26+
import io.harness.connector.helper.DecryptionHelper;
27+
import io.harness.connector.helper.EncryptionHelper;
28+
import io.harness.connector.services.ConnectorService;
29+
import io.harness.connector.task.ConnectorValidationHandler;
30+
import io.harness.connector.task.artifactory.ArtifactoryRequestMapper;
31+
import io.harness.connector.task.artifactory.ArtifactoryValidationHandler;
32+
import io.harness.delegate.beans.connector.ConnectorType;
33+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryAuthCredentialsDTO;
34+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryAuthType;
35+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryAuthenticationDTO;
36+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryConnectorDTO;
37+
import io.harness.delegate.beans.connector.artifactoryconnector.ArtifactoryUsernamePasswordAuthDTO;
38+
import io.harness.encryption.Scope;
39+
import io.harness.encryption.SecretRefData;
40+
import io.harness.rule.Owner;
41+
import io.harness.rule.OwnerRule;
42+
43+
import java.util.Map;
44+
import java.util.Optional;
45+
import lombok.extern.slf4j.Slf4j;
46+
import org.junit.Before;
47+
import org.junit.Test;
48+
import org.junit.experimental.categories.Category;
49+
import org.mockito.InjectMocks;
50+
import org.mockito.Matchers;
51+
import org.mockito.Mock;
52+
import org.mockito.MockitoAnnotations;
53+
54+
@Slf4j
55+
public class ArtifactoryConnectionValidatorTest extends CategoryTest {
56+
@Mock private EncryptionHelper encryptionHelper;
57+
@Mock private ConnectorService connectorService;
58+
@Mock private DecryptionHelper decryptionHelper;
59+
@Mock private ArtifactoryClientImpl artifactoryService;
60+
ArtifactoryRequestMapper artifactoryRequestMapper = new ArtifactoryRequestMapper();
61+
@Mock private Map<String, ConnectorValidationHandler> connectorTypeToConnectorValidationHandlerMap;
62+
@Mock private Map<String, ConnectorValidationParamsProvider> connectorValidationParamsProviderMap;
63+
@InjectMocks private ArtifactoryConnectionValidator artifactoryConnectionValidator;
64+
65+
@Before
66+
public void setUp() throws Exception {
67+
MockitoAnnotations.initMocks(this);
68+
}
69+
70+
@Test
71+
@Owner(developers = OwnerRule.DEV_MITTAL)
72+
@Category(UnitTests.class)
73+
public void validateTestViaManager() {
74+
String artifactoryUrl = "url";
75+
String artifactoryUserName = "ArtifactoryUserName";
76+
String passwordRefIdentifier = "passwordRefIdentifier";
77+
SecretRefData passwordSecretRef = SecretRefData.builder()
78+
.identifier(passwordRefIdentifier)
79+
.scope(Scope.ACCOUNT)
80+
.decryptedValue("password".toCharArray())
81+
.build();
82+
83+
ArtifactoryAuthCredentialsDTO artifactoryAuthCredentialsDTO = ArtifactoryUsernamePasswordAuthDTO.builder()
84+
.username(artifactoryUserName)
85+
.passwordRef(passwordSecretRef)
86+
.build();
87+
88+
ArtifactoryAuthenticationDTO artifactoryAuthenticationDTO = ArtifactoryAuthenticationDTO.builder()
89+
.authType(ArtifactoryAuthType.USER_PASSWORD)
90+
.credentials(artifactoryAuthCredentialsDTO)
91+
.build();
92+
ArtifactoryConnectorDTO artifactoryConnectorDTO = ArtifactoryConnectorDTO.builder()
93+
.artifactoryServerUrl(artifactoryUrl)
94+
.auth(artifactoryAuthenticationDTO)
95+
.executeOnDelegate(false)
96+
.build();
97+
when(connectorService.get(any(), any(), any(), any()))
98+
.thenReturn(Optional.of(ConnectorResponseDTO.builder()
99+
.connector(ConnectorInfoDTO.builder()
100+
.connectorType(ConnectorType.ARTIFACTORY)
101+
.identifier("identifier")
102+
.projectIdentifier("projectIdentifier")
103+
.orgIdentifier("orgIdentifier")
104+
.build())
105+
.build()));
106+
107+
ArtifactoryValidationHandler artifactoryValidationHandler = mock(ArtifactoryValidationHandler.class);
108+
when(artifactoryService.validateArtifactServer(any())).thenReturn(true);
109+
on(artifactoryValidationHandler).set("decryptionHelper", decryptionHelper);
110+
on(artifactoryValidationHandler).set("artifactoryService", artifactoryService);
111+
on(artifactoryValidationHandler).set("artifactoryRequestMapper", artifactoryRequestMapper);
112+
when(artifactoryValidationHandler.validate(any(), any())).thenCallRealMethod();
113+
when(connectorTypeToConnectorValidationHandlerMap.get(Matchers.eq("Artifactory")))
114+
.thenReturn(artifactoryValidationHandler);
115+
116+
ArtifactoryValidationParamsProvider artifactoryValidationParamsProvider = new ArtifactoryValidationParamsProvider();
117+
on(artifactoryValidationParamsProvider).set("encryptionHelper", encryptionHelper);
118+
when(connectorValidationParamsProviderMap.get(Matchers.eq("Artifactory")))
119+
.thenReturn(artifactoryValidationParamsProvider);
120+
121+
ConnectorValidationResult validationResult = artifactoryConnectionValidator.validate(
122+
artifactoryConnectorDTO, "accountIdentifier", "orgIdentifier", "projectIdentifier", "identifier");
123+
assertThat(validationResult.getStatus()).isEqualTo(SUCCESS);
124+
}
125+
}

0 commit comments

Comments
 (0)