Skip to content

Commit bf50359

Browse files
[feat]: [CDS-41440]: Add ARM/BP endpoints from CG to NG (#36385)
* [CDS-41440]: Add ARM/BP endpoints from CG to NG
1 parent 92c62e9 commit bf50359

12 files changed

Lines changed: 282 additions & 1 deletion

File tree

120-ng-manager/src/main/java/io/harness/ng/core/resources/azure/AzureResource.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import io.harness.cdng.infra.yaml.InfrastructureDefinitionConfig;
2323
import io.harness.cdng.k8s.resources.azure.dtos.AzureClustersDTO;
2424
import io.harness.cdng.k8s.resources.azure.dtos.AzureDeploymentSlotsDTO;
25+
import io.harness.cdng.k8s.resources.azure.dtos.AzureLocationsDTO;
26+
import io.harness.cdng.k8s.resources.azure.dtos.AzureManagementGroupsDTO;
2527
import io.harness.cdng.k8s.resources.azure.dtos.AzureResourceGroupsDTO;
2628
import io.harness.cdng.k8s.resources.azure.dtos.AzureSubscriptionsDTO;
2729
import io.harness.cdng.k8s.resources.azure.dtos.AzureWebAppNamesDTO;
@@ -302,4 +304,33 @@ private InfrastructureDefinitionConfig getInfrastructureDefinitionConfig(
302304
return InfrastructureEntityConfigMapper.toInfrastructureConfig(infrastructureEntity)
303305
.getInfrastructureDefinitionConfig();
304306
}
307+
308+
@GET
309+
@Path("management-groups")
310+
@ApiOperation(value = "Gets azure management groups", nickname = "getManagementGroups")
311+
public ResponseDTO<AzureManagementGroupsDTO> getManagementGroups(
312+
@NotNull @QueryParam("connectorRef") String azureConnectorIdentifier,
313+
@NotNull @QueryParam(NGCommonEntityConstants.ACCOUNT_KEY) String accountId,
314+
@NotNull @QueryParam(NGCommonEntityConstants.ORG_KEY) String orgIdentifier,
315+
@NotNull @QueryParam(NGCommonEntityConstants.PROJECT_KEY) String projectIdentifier) {
316+
IdentifierRef connectorRef =
317+
IdentifierRefHelper.getIdentifierRef(azureConnectorIdentifier, accountId, orgIdentifier, projectIdentifier);
318+
return ResponseDTO.newResponse(
319+
azureResourceService.getAzureManagementGroups(connectorRef, orgIdentifier, projectIdentifier));
320+
}
321+
322+
@GET
323+
@Path("locations")
324+
@ApiOperation(value = "Gets azure locations defined for a subscription", nickname = "getLocationsBySubscription")
325+
public ResponseDTO<AzureLocationsDTO> getLocations(
326+
@NotNull @QueryParam("connectorRef") String azureConnectorIdentifier,
327+
@QueryParam("subscriptionId") String subscriptionId,
328+
@NotNull @QueryParam(NGCommonEntityConstants.ACCOUNT_KEY) String accountId,
329+
@NotNull @QueryParam(NGCommonEntityConstants.ORG_KEY) String orgIdentifier,
330+
@NotNull @QueryParam(NGCommonEntityConstants.PROJECT_KEY) String projectIdentifier) {
331+
IdentifierRef connectorRef =
332+
IdentifierRefHelper.getIdentifierRef(azureConnectorIdentifier, accountId, orgIdentifier, projectIdentifier);
333+
return ResponseDTO.newResponse(
334+
azureResourceService.getLocations(connectorRef, orgIdentifier, projectIdentifier, subscriptionId));
335+
}
305336
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
/*
2+
* Copyright 2022 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.cdng.k8s.resources.azure.dtos;
9+
10+
import static io.harness.annotations.dev.HarnessTeam.CDP;
11+
12+
import io.harness.annotations.dev.OwnedBy;
13+
14+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
15+
import io.swagger.v3.oas.annotations.media.Schema;
16+
import java.util.List;
17+
import lombok.Builder;
18+
import lombok.Value;
19+
20+
@Value
21+
@Builder
22+
@JsonIgnoreProperties(ignoreUnknown = true)
23+
@OwnedBy(CDP)
24+
@Schema(name = "AzureLocationsDTO", description = "Azure response for locations")
25+
public class AzureLocationsDTO {
26+
List<String> locations;
27+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/*
2+
* Copyright 2022 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.cdng.k8s.resources.azure.dtos;
9+
10+
import static io.harness.annotations.dev.HarnessTeam.CDP;
11+
12+
import io.harness.annotations.dev.OwnedBy;
13+
import io.harness.delegate.beans.azure.ManagementGroupData;
14+
15+
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
16+
import io.swagger.v3.oas.annotations.media.Schema;
17+
import java.util.List;
18+
import lombok.Builder;
19+
import lombok.Value;
20+
21+
@Value
22+
@Builder
23+
@JsonIgnoreProperties(ignoreUnknown = true)
24+
@OwnedBy(CDP)
25+
@Schema(name = "AzureManagementGroupsDTO", description = "Azure response for management groups")
26+
public class AzureManagementGroupsDTO {
27+
List<ManagementGroupData> managementGroups;
28+
}

125-cd-nextgen/src/main/java/io/harness/cdng/k8s/resources/azure/service/AzureResourceService.java

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@
1313
import io.harness.cdng.azure.resources.dtos.AzureTagsDTO;
1414
import io.harness.cdng.k8s.resources.azure.dtos.AzureClustersDTO;
1515
import io.harness.cdng.k8s.resources.azure.dtos.AzureDeploymentSlotsDTO;
16+
import io.harness.cdng.k8s.resources.azure.dtos.AzureLocationsDTO;
17+
import io.harness.cdng.k8s.resources.azure.dtos.AzureManagementGroupsDTO;
1618
import io.harness.cdng.k8s.resources.azure.dtos.AzureResourceGroupsDTO;
1719
import io.harness.cdng.k8s.resources.azure.dtos.AzureSubscriptionsDTO;
1820
import io.harness.cdng.k8s.resources.azure.dtos.AzureWebAppNamesDTO;
@@ -35,4 +37,10 @@ AzureDeploymentSlotsDTO getAppServiceDeploymentSlots(IdentifierRef connectorRef,
3537

3638
AzureTagsDTO getTags(
3739
IdentifierRef connectorRef, String orgIdentifier, String projectIdentifier, String subscriptionId);
40+
41+
AzureManagementGroupsDTO getAzureManagementGroups(
42+
IdentifierRef connectorRef, String orgIdentifier, String projectIdentifier);
43+
44+
AzureLocationsDTO getLocations(
45+
IdentifierRef connectorRef, String orgIdentifier, String projectIdentifier, String subscriptionId);
3846
}

125-cd-nextgen/src/main/java/io/harness/cdng/k8s/resources/azure/service/AzureResourceServiceImpl.java

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,17 @@
1717
import io.harness.cdng.k8s.resources.azure.dtos.AzureClustersDTO;
1818
import io.harness.cdng.k8s.resources.azure.dtos.AzureDeploymentSlotDTO;
1919
import io.harness.cdng.k8s.resources.azure.dtos.AzureDeploymentSlotsDTO;
20+
import io.harness.cdng.k8s.resources.azure.dtos.AzureLocationsDTO;
21+
import io.harness.cdng.k8s.resources.azure.dtos.AzureManagementGroupsDTO;
2022
import io.harness.cdng.k8s.resources.azure.dtos.AzureResourceGroupDTO;
2123
import io.harness.cdng.k8s.resources.azure.dtos.AzureResourceGroupsDTO;
2224
import io.harness.cdng.k8s.resources.azure.dtos.AzureSubscriptionDTO;
2325
import io.harness.cdng.k8s.resources.azure.dtos.AzureSubscriptionsDTO;
2426
import io.harness.cdng.k8s.resources.azure.dtos.AzureWebAppNamesDTO;
2527
import io.harness.delegate.beans.azure.response.AzureClustersResponse;
2628
import io.harness.delegate.beans.azure.response.AzureDeploymentSlotsResponse;
29+
import io.harness.delegate.beans.azure.response.AzureLocationsResponse;
30+
import io.harness.delegate.beans.azure.response.AzureMngGroupsResponse;
2731
import io.harness.delegate.beans.azure.response.AzureResourceGroupsResponse;
2832
import io.harness.delegate.beans.azure.response.AzureSubscriptionsResponse;
2933
import io.harness.delegate.beans.azure.response.AzureTagsResponse;
@@ -37,6 +41,7 @@
3741

3842
import com.google.inject.Inject;
3943
import com.google.inject.Singleton;
44+
import com.hazelcast.aws.utility.StringUtil;
4045
import java.util.Collections;
4146
import java.util.HashMap;
4247
import java.util.List;
@@ -229,4 +234,46 @@ public AzureTagsDTO getTags(
229234
.collect(Collectors.toList()))
230235
.build();
231236
}
237+
238+
@Override
239+
public AzureManagementGroupsDTO getAzureManagementGroups(
240+
IdentifierRef connectorRef, String orgIdentifier, String projectIdentifier) {
241+
AzureConnectorDTO connector = azureHelperService.getConnector(connectorRef);
242+
BaseNGAccess baseNGAccess =
243+
azureHelperService.getBaseNGAccess(connectorRef.getAccountIdentifier(), orgIdentifier, projectIdentifier);
244+
List<EncryptedDataDetail> encryptionDetails = azureHelperService.getEncryptionDetails(connector, baseNGAccess);
245+
246+
AzureTaskParams azureTaskParamsTaskParams = AzureTaskParams.builder()
247+
.azureTaskType(AzureTaskType.LIST_MNG_GROUP)
248+
.azureConnector(connector)
249+
.encryptionDetails(encryptionDetails)
250+
.delegateSelectors(connector.getDelegateSelectors())
251+
.build();
252+
AzureMngGroupsResponse response = (AzureMngGroupsResponse) azureHelperService.executeSyncTask(
253+
azureTaskParamsTaskParams, baseNGAccess, "Azure list management groups task failure due to error");
254+
return AzureManagementGroupsDTO.builder().managementGroups(response.getManagementGroups()).build();
255+
}
256+
257+
@Override
258+
public AzureLocationsDTO getLocations(
259+
IdentifierRef connectorRef, String orgIdentifier, String projectIdentifier, String subscriptionId) {
260+
AzureConnectorDTO connector = azureHelperService.getConnector(connectorRef);
261+
BaseNGAccess baseNGAccess =
262+
azureHelperService.getBaseNGAccess(connectorRef.getAccountIdentifier(), orgIdentifier, projectIdentifier);
263+
List<EncryptedDataDetail> encryptionDetails = azureHelperService.getEncryptionDetails(connector, baseNGAccess);
264+
Map<AzureAdditionalParams, String> additionalParams = new HashMap<>(Collections.emptyMap());
265+
if (StringUtil.isNotEmpty(subscriptionId)) {
266+
additionalParams.put(AzureAdditionalParams.SUBSCRIPTION_ID, subscriptionId);
267+
}
268+
AzureTaskParams azureTaskParamsTaskParams = AzureTaskParams.builder()
269+
.azureTaskType(AzureTaskType.LIST_SUBSCRIPTION_LOCATIONS)
270+
.azureConnector(connector)
271+
.encryptionDetails(encryptionDetails)
272+
.delegateSelectors(connector.getDelegateSelectors())
273+
.additionalParams(additionalParams)
274+
.build();
275+
AzureLocationsResponse response = (AzureLocationsResponse) azureHelperService.executeSyncTask(
276+
azureTaskParamsTaskParams, baseNGAccess, "Azure list locations task failure due to error");
277+
return AzureLocationsDTO.builder().locations(response.getLocations()).build();
278+
}
232279
}

260-delegate/src/test/resources/kryo-registrations.txt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1745,6 +1745,8 @@
17451745
55502:io.harness.delegate.beans.instancesync.info.AzureSshWinrmServerInstanceInfo
17461746
55503:io.harness.delegate.beans.instancesync.info.AwsSshWinrmServerInstanceInfo
17471747
55504:io.harness.delegate.beans.ci.vm.steps.VmBackgroundStep
1748+
55505:io.harness.delegate.beans.azure.response.AzureLocationsResponse
1749+
55506:io.harness.delegate.beans.azure.response.AzureMngGroupsResponse
17481750
56335:io.harness.delegate.task.gitpolling.request.GitPollingTaskParameters
17491751
56336:io.harness.delegate.task.gitpolling.github.GitHubPollingDelegateRequest
17501752
56337:io.harness.delegate.task.gitpolling.GitPollingSourceType

930-delegate-tasks/src/main/java/software/wings/delegatetasks/azure/AzureAsyncTaskHelper.java

Lines changed: 70 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
import io.harness.artifact.ArtifactUtilities;
2222
import io.harness.artifacts.beans.BuildDetailsInternal;
2323
import io.harness.artifacts.comparator.BuildDetailsInternalComparatorDescending;
24+
import io.harness.azure.AzureEnvironmentType;
2425
import io.harness.azure.client.AzureAuthorizationClient;
2526
import io.harness.azure.client.AzureComputeClient;
2627
import io.harness.azure.client.AzureContainerRegistryClient;
@@ -36,12 +37,16 @@
3637
import io.harness.connector.ConnectivityStatus;
3738
import io.harness.connector.ConnectorValidationResult;
3839
import io.harness.data.encoding.EncodingUtils;
40+
import io.harness.delegate.beans.DelegateResponseData;
41+
import io.harness.delegate.beans.azure.ManagementGroupData;
3942
import io.harness.delegate.beans.azure.response.AzureAcrTokenTaskResponse;
4043
import io.harness.delegate.beans.azure.response.AzureClustersResponse;
4144
import io.harness.delegate.beans.azure.response.AzureDeploymentSlotResponse;
4245
import io.harness.delegate.beans.azure.response.AzureDeploymentSlotsResponse;
4346
import io.harness.delegate.beans.azure.response.AzureHostResponse;
4447
import io.harness.delegate.beans.azure.response.AzureHostsResponse;
48+
import io.harness.delegate.beans.azure.response.AzureLocationsResponse;
49+
import io.harness.delegate.beans.azure.response.AzureMngGroupsResponse;
4550
import io.harness.delegate.beans.azure.response.AzureRegistriesResponse;
4651
import io.harness.delegate.beans.azure.response.AzureRepositoriesResponse;
4752
import io.harness.delegate.beans.azure.response.AzureResourceGroupsResponse;
@@ -73,7 +78,10 @@
7378
import com.microsoft.azure.management.appservice.DeploymentSlot;
7479
import com.microsoft.azure.management.containerregistry.Registry;
7580
import com.microsoft.azure.management.resources.Subscription;
81+
import com.microsoft.azure.management.resources.fluentcore.arm.Region;
7682
import com.microsoft.azure.management.resources.fluentcore.arm.models.HasName;
83+
import java.util.ArrayList;
84+
import java.util.Arrays;
7785
import java.util.HashMap;
7886
import java.util.List;
7987
import java.util.Map;
@@ -641,4 +649,66 @@ public AzureAcrTokenTaskResponse getAcrLoginToken(
641649
.commandExecutionStatus(CommandExecutionStatus.SUCCESS)
642650
.build();
643651
}
652+
653+
public AzureMngGroupsResponse listMngGroup(
654+
List<EncryptedDataDetail> encryptionDetails, AzureConnectorDTO azureConnector) {
655+
log.info("Fetching Azure management groups");
656+
AzureConfig azureConfig = AcrRequestResponseMapper.toAzureInternalConfig(azureConnector.getCredential(),
657+
encryptionDetails, azureConnector.getCredential().getAzureCredentialType(),
658+
azureConnector.getAzureEnvironmentType(), secretDecryptionService);
659+
660+
AzureMngGroupsResponse azureMngGroupsResponse =
661+
AzureMngGroupsResponse.builder()
662+
.managementGroups(azureManagementClient.listManagementGroups(azureConfig)
663+
.stream()
664+
.map(group
665+
-> ManagementGroupData.builder()
666+
.name(group.getName())
667+
.id(group.getId())
668+
.displayName(group.getProperties().getDisplayName())
669+
.build())
670+
.collect(Collectors.toList()))
671+
.commandExecutionStatus(CommandExecutionStatus.SUCCESS)
672+
.build();
673+
674+
log.info(format("Retrieved %d management groups", azureMngGroupsResponse.getManagementGroups().size()));
675+
return azureMngGroupsResponse;
676+
}
677+
678+
public AzureLocationsResponse listSubscriptionLocations(
679+
List<EncryptedDataDetail> encryptionDetails, AzureConnectorDTO azureConnector, String subscriptionId) {
680+
log.info("Fetching Azure locations");
681+
AzureConfig azureConfig = AcrRequestResponseMapper.toAzureInternalConfig(azureConnector.getCredential(),
682+
encryptionDetails, azureConnector.getCredential().getAzureCredentialType(),
683+
azureConnector.getAzureEnvironmentType(), secretDecryptionService);
684+
AzureLocationsResponse azureLocationsResponse =
685+
AzureLocationsResponse.builder()
686+
.locations(
687+
new ArrayList<>(azureManagementClient.listLocationsBySubscriptionId(azureConfig, subscriptionId)))
688+
.commandExecutionStatus(CommandExecutionStatus.SUCCESS)
689+
.build();
690+
log.info(format("Retrieved %d locations", azureLocationsResponse.getLocations().size()));
691+
return azureLocationsResponse;
692+
}
693+
694+
public DelegateResponseData listLocations(
695+
List<EncryptedDataDetail> encryptionDetails, AzureConnectorDTO azureConnector) {
696+
log.info("Fetching Azure locations");
697+
AzureConfig azureConfig = AcrRequestResponseMapper.toAzureInternalConfig(azureConnector.getCredential(),
698+
encryptionDetails, azureConnector.getCredential().getAzureCredentialType(),
699+
azureConnector.getAzureEnvironmentType(), secretDecryptionService);
700+
AzureEnvironmentType azureEnvironmentType = azureConfig.getAzureEnvironmentType();
701+
AzureLocationsResponse azureLocationsResponse =
702+
AzureLocationsResponse.builder()
703+
.locations(Arrays.stream(Region.values())
704+
.filter(region
705+
-> (AzureEnvironmentType.AZURE_US_GOVERNMENT == azureEnvironmentType)
706+
== AzureUtils.AZURE_GOV_REGIONS_NAMES.contains(region.name()))
707+
.map(Region::label)
708+
.collect(Collectors.toList()))
709+
.commandExecutionStatus(CommandExecutionStatus.SUCCESS)
710+
.build();
711+
log.info(format("Retrieved %d locations", azureLocationsResponse.getLocations().size()));
712+
return azureLocationsResponse;
713+
}
644714
}

930-delegate-tasks/src/main/java/software/wings/delegatetasks/azure/AzureTask.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,19 @@ public DelegateResponseData run(TaskParameters parameters) {
5959
ConnectorValidationResult connectorValidationResult = azureValidationHandler.validate(azureTaskParams);
6060
connectorValidationResult.setDelegateId(getDelegateId());
6161
return AzureValidateTaskResponse.builder().connectorValidationResult(connectorValidationResult).build();
62+
case LIST_MNG_GROUP:
63+
return azureAsyncTaskHelper.listMngGroup(
64+
azureTaskParams.getEncryptionDetails(), azureTaskParams.getAzureConnector());
65+
case LIST_SUBSCRIPTION_LOCATIONS:
66+
if (azureTaskParams.getAdditionalParams() != null
67+
&& azureTaskParams.getAdditionalParams().get(AzureAdditionalParams.SUBSCRIPTION_ID) != null) {
68+
return azureAsyncTaskHelper.listSubscriptionLocations(azureTaskParams.getEncryptionDetails(),
69+
azureTaskParams.getAzureConnector(),
70+
azureTaskParams.getAdditionalParams().get(AzureAdditionalParams.SUBSCRIPTION_ID));
71+
} else {
72+
return azureAsyncTaskHelper.listLocations(
73+
azureTaskParams.getEncryptionDetails(), azureTaskParams.getAzureConnector());
74+
}
6275
case LIST_SUBSCRIPTIONS:
6376
return azureAsyncTaskHelper.listSubscriptions(
6477
azureTaskParams.getEncryptionDetails(), azureTaskParams.getAzureConnector());
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
/*
2+
* Copyright 2022 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.delegate.beans.azure.response;
9+
10+
import io.harness.annotations.dev.HarnessTeam;
11+
import io.harness.annotations.dev.OwnedBy;
12+
13+
import java.util.List;
14+
import lombok.Data;
15+
import lombok.NoArgsConstructor;
16+
import lombok.experimental.SuperBuilder;
17+
18+
@Data
19+
@SuperBuilder
20+
@NoArgsConstructor
21+
@OwnedBy(HarnessTeam.CDP)
22+
public class AzureLocationsResponse extends AzureDelegateTaskResponse {
23+
private List<String> locations;
24+
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/*
2+
* Copyright 2022 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.delegate.beans.azure.response;
9+
10+
import io.harness.annotations.dev.HarnessTeam;
11+
import io.harness.annotations.dev.OwnedBy;
12+
import io.harness.delegate.beans.azure.ManagementGroupData;
13+
14+
import java.util.List;
15+
import lombok.Data;
16+
import lombok.NoArgsConstructor;
17+
import lombok.experimental.SuperBuilder;
18+
19+
@Data
20+
@SuperBuilder
21+
@NoArgsConstructor
22+
@OwnedBy(HarnessTeam.CDP)
23+
public class AzureMngGroupsResponse extends AzureDelegateTaskResponse {
24+
private List<ManagementGroupData> managementGroups;
25+
}

0 commit comments

Comments
 (0)