Skip to content

Commit 17961ad

Browse files
authored
[feat]: [CDS-39801]: crud for config files override (#36740)
* [CDS-39801]: CRUD for config file overrides * [CDS-39801]: added junit * [CDS-39801]: added missed resource files
1 parent 0bedf89 commit 17961ad

12 files changed

Lines changed: 368 additions & 30 deletions

File tree

120-ng-manager/src/main/java/io/harness/ng/core/environment/resources/EnvironmentResource.java

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,8 @@ public ResponseDTO<EnvironmentResponseDTO> get(@PathParam("environmentIdentifier
9191
@ApiOperation(value = "Create an Environment", nickname = "createEnvironment")
9292
public ResponseDTO<EnvironmentResponseDTO> create(
9393
@QueryParam("accountId") String accountId, @NotNull @Valid EnvironmentRequestDTO environmentRequestDTO) {
94-
Environment environmentEntity = EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false);
94+
Environment environmentEntity =
95+
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false, false);
9596
Environment createdEnvironment = environmentService.create(environmentEntity);
9697
return ResponseDTO.newResponse(
9798
createdEnvironment.getVersion().toString(), EnvironmentMapper.writeDTO(createdEnvironment));
@@ -112,7 +113,8 @@ public ResponseDTO<Boolean> delete(@HeaderParam(IF_MATCH) String ifMatch,
112113
@ApiOperation(value = "Update an environment by identifier", nickname = "updateEnvironment")
113114
public ResponseDTO<EnvironmentResponseDTO> update(@HeaderParam(IF_MATCH) String ifMatch,
114115
@QueryParam("accountId") String accountId, @NotNull @Valid EnvironmentRequestDTO environmentRequestDTO) {
115-
Environment requestEnvironment = EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false);
116+
Environment requestEnvironment =
117+
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false, false);
116118
requestEnvironment.setVersion(isNumeric(ifMatch) ? parseLong(ifMatch) : null);
117119
Environment updatedEnvironment = environmentService.update(requestEnvironment);
118120
return ResponseDTO.newResponse(
@@ -124,7 +126,8 @@ public ResponseDTO<EnvironmentResponseDTO> update(@HeaderParam(IF_MATCH) String
124126
@ApiOperation(value = "Upsert an environment by identifier", nickname = "upsertEnvironment")
125127
public ResponseDTO<EnvironmentResponseDTO> upsert(@HeaderParam(IF_MATCH) String ifMatch,
126128
@QueryParam("accountId") String accountId, @NotNull @Valid EnvironmentRequestDTO environmentRequestDTO) {
127-
Environment requestEnvironment = EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false);
129+
Environment requestEnvironment =
130+
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, false, false);
128131
requestEnvironment.setVersion(isNumeric(ifMatch) ? parseLong(ifMatch) : null);
129132
Environment upsertedEnvironment = environmentService.upsert(requestEnvironment, UpsertOptions.DEFAULT);
130133
return ResponseDTO.newResponse(

120-ng-manager/src/main/java/io/harness/ng/core/environment/resources/EnvironmentResourceV2.java

Lines changed: 26 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,11 +7,13 @@
77

88
package io.harness.ng.core.environment.resources;
99

10+
import static io.harness.beans.FeatureName.NG_SERVICE_CONFIG_FILES_OVERRIDE;
1011
import static io.harness.beans.FeatureName.NG_SERVICE_MANIFEST_OVERRIDE;
1112
import static io.harness.data.structure.EmptyPredicate.isEmpty;
1213
import static io.harness.data.structure.EmptyPredicate.isNotEmpty;
1314
import static io.harness.ng.accesscontrol.PlatformPermissions.VIEW_PROJECT_PERMISSION;
1415
import static io.harness.ng.accesscontrol.PlatformResourceTypes.PROJECT;
16+
import static io.harness.ng.core.environment.mappers.EnvironmentMapper.checkDuplicateConfigFilesIdentifiersWithIn;
1517
import static io.harness.ng.core.environment.mappers.EnvironmentMapper.checkDuplicateManifestIdentifiersWithIn;
1618
import static io.harness.ng.core.environment.mappers.EnvironmentMapper.toNGEnvironmentConfig;
1719
import static io.harness.ng.core.serviceoverride.mapper.NGServiceOverrideEntityConfigMapper.toNGServiceOverrideConfig;
@@ -226,8 +228,10 @@ public class EnvironmentResourceV2 {
226228
environmentRequestDTO.getProjectIdentifier()),
227229
Resource.of(ENVIRONMENT, null, environmentAttributes), ENVIRONMENT_CREATE_PERMISSION);
228230
final boolean ngSvcManifestOverrideEnabled = cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_MANIFEST_OVERRIDE);
229-
Environment environmentEntity =
230-
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled);
231+
final boolean ngSvcConfigFileOverrideEnabled =
232+
cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_CONFIG_FILES_OVERRIDE);
233+
Environment environmentEntity = EnvironmentMapper.toEnvironmentEntity(
234+
accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled, ngSvcConfigFileOverrideEnabled);
231235
orgAndProjectValidationHelper.checkThatTheOrganizationAndProjectExists(environmentEntity.getOrgIdentifier(),
232236
environmentEntity.getProjectIdentifier(), environmentEntity.getAccountId());
233237
Environment createdEnvironment = environmentService.create(environmentEntity);
@@ -279,8 +283,10 @@ public class EnvironmentResourceV2 {
279283
Resource.of(ENVIRONMENT, environmentRequestDTO.getIdentifier()), ENVIRONMENT_UPDATE_PERMISSION);
280284

281285
final boolean ngSvcManifestOverrideEnabled = cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_MANIFEST_OVERRIDE);
282-
Environment requestEnvironment =
283-
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled);
286+
final boolean ngSvcConfigFileOverrideEnabled =
287+
cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_CONFIG_FILES_OVERRIDE);
288+
Environment requestEnvironment = EnvironmentMapper.toEnvironmentEntity(
289+
accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled, ngSvcConfigFileOverrideEnabled);
284290
requestEnvironment.setVersion(isNumeric(ifMatch) ? parseLong(ifMatch) : null);
285291
Environment updatedEnvironment = environmentService.update(requestEnvironment);
286292
return ResponseDTO.newResponse(
@@ -308,8 +314,10 @@ public class EnvironmentResourceV2 {
308314
Resource.of(ENVIRONMENT, environmentRequestDTO.getIdentifier()), ENVIRONMENT_UPDATE_PERMISSION);
309315

310316
final boolean ngSvcManifestOverrideEnabled = cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_MANIFEST_OVERRIDE);
311-
Environment requestEnvironment =
312-
EnvironmentMapper.toEnvironmentEntity(accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled);
317+
final boolean ngSvcConfigFileOverrideEnabled =
318+
cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_CONFIG_FILES_OVERRIDE);
319+
Environment requestEnvironment = EnvironmentMapper.toEnvironmentEntity(
320+
accountId, environmentRequestDTO, ngSvcManifestOverrideEnabled, ngSvcConfigFileOverrideEnabled);
313321
requestEnvironment.setVersion(isNumeric(ifMatch) ? parseLong(ifMatch) : null);
314322
orgAndProjectValidationHelper.checkThatTheOrganizationAndProjectExists(requestEnvironment.getOrgIdentifier(),
315323
requestEnvironment.getProjectIdentifier(), requestEnvironment.getAccountId());
@@ -507,22 +515,30 @@ public ResponseDTO<NGEnvironmentConfig> getNGEnvironmentConfig() {
507515
serviceOverridesEntity.getProjectIdentifier(), serviceOverridesEntity.getEnvironmentRef(),
508516
serviceOverridesEntity.getServiceRef());
509517
final boolean ngManifestOverrideEnabled = cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_MANIFEST_OVERRIDE);
510-
validateServiceOverrides(serviceOverridesEntity, ngManifestOverrideEnabled);
518+
final boolean ngConfigOverrideEnabled = cdFeatureFlagHelper.isEnabled(accountId, NG_SERVICE_CONFIG_FILES_OVERRIDE);
519+
validateServiceOverrides(serviceOverridesEntity, ngManifestOverrideEnabled, ngConfigOverrideEnabled);
511520

512521
NGServiceOverridesEntity createdServiceOverride = serviceOverrideService.upsert(serviceOverridesEntity);
513522
return ResponseDTO.newResponse(ServiceOverridesMapper.toResponseWrapper(createdServiceOverride));
514523
}
515524

516-
private void validateServiceOverrides(
517-
NGServiceOverridesEntity serviceOverridesEntity, boolean ngManifestOverrideEnabled) {
525+
private void validateServiceOverrides(NGServiceOverridesEntity serviceOverridesEntity,
526+
boolean ngManifestOverrideEnabled, boolean ngConfigOverrideEnabled) {
518527
final NGServiceOverrideConfig serviceOverrideConfig = toNGServiceOverrideConfig(serviceOverridesEntity);
519528
if (serviceOverrideConfig.getServiceOverrideInfoConfig() != null) {
520529
if (!ngManifestOverrideEnabled
521530
&& isNotEmpty(serviceOverrideConfig.getServiceOverrideInfoConfig().getManifests())) {
522531
throw new InvalidRequestException(
523-
"Manifest Override is not supported with FF disabled NG_SERVICE_MANIFEST_OVERRIDE");
532+
"Manifest Override is not supported with FF disabled NG_SERVICE_MANIFEST_OVERRIDE");
524533
}
534+
if (!ngConfigOverrideEnabled
535+
&& isNotEmpty(serviceOverrideConfig.getServiceOverrideInfoConfig().getConfigFiles())) {
536+
throw new InvalidRequestException(
537+
"Config Files Override is not supported with FF disabled NG_SERVICE_CONFIG_FILES_OVERRIDE");
538+
}
539+
525540
checkDuplicateManifestIdentifiersWithIn(serviceOverrideConfig.getServiceOverrideInfoConfig().getManifests());
541+
checkDuplicateConfigFilesIdentifiersWithIn(serviceOverrideConfig.getServiceOverrideInfoConfig().getConfigFiles());
526542
}
527543
}
528544

127-cd-nextgen-entities/src/main/java/io/harness/ng/core/environment/beans/NGEnvironmentGlobalOverride.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import io.harness.annotation.RecasterAlias;
1111
import io.harness.annotations.dev.HarnessTeam;
1212
import io.harness.annotations.dev.OwnedBy;
13+
import io.harness.cdng.configfile.ConfigFileWrapper;
1314
import io.harness.cdng.manifest.yaml.ManifestConfigWrapper;
1415
import io.harness.data.structure.EmptyPredicate;
1516
import io.harness.pms.yaml.YamlNode;
@@ -31,6 +32,7 @@
3132
@OwnedBy(HarnessTeam.CDP)
3233
public class NGEnvironmentGlobalOverride implements Visitable {
3334
List<ManifestConfigWrapper> manifests;
35+
List<ConfigFileWrapper> configFiles;
3436

3537
@JsonProperty(YamlNode.UUID_FIELD_NAME)
3638
@Getter(onMethod_ = { @ApiModelProperty(hidden = true) })
@@ -43,6 +45,9 @@ public VisitableChildren getChildrenToWalk() {
4345
if (EmptyPredicate.isNotEmpty(manifests)) {
4446
manifests.forEach(manifest -> children.add("manifests", manifest));
4547
}
48+
if (EmptyPredicate.isNotEmpty(configFiles)) {
49+
configFiles.forEach(configFile -> children.add("configFiles", configFile));
50+
}
4651
return children;
4752
}
4853
}

127-cd-nextgen-entities/src/main/java/io/harness/ng/core/environment/mappers/EnvironmentMapper.java

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
import static java.lang.String.format;
1919

2020
import io.harness.annotations.dev.OwnedBy;
21+
import io.harness.cdng.configfile.ConfigFile;
22+
import io.harness.cdng.configfile.ConfigFileWrapper;
2123
import io.harness.cdng.manifest.yaml.ManifestConfig;
2224
import io.harness.cdng.manifest.yaml.ManifestConfigWrapper;
2325
import io.harness.exception.InvalidRequestException;
@@ -38,27 +40,29 @@
3840
import java.util.Optional;
3941
import java.util.Set;
4042
import java.util.stream.Collectors;
43+
import java.util.stream.Stream;
4144
import javax.validation.ConstraintViolation;
4245
import javax.validation.Valid;
4346
import javax.validation.Validation;
4447
import javax.validation.Validator;
4548
import javax.validation.ValidatorFactory;
4649
import lombok.experimental.UtilityClass;
50+
import org.jetbrains.annotations.NotNull;
4751

4852
@OwnedBy(PIPELINE)
4953
@UtilityClass
5054
public class EnvironmentMapper {
5155
ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
5256
Validator validator = factory.getValidator();
5357

54-
public Environment toEnvironmentEntity(
55-
String accountId, EnvironmentRequestDTO environmentRequestDTO, boolean ngSvcManifestOverrideEnabled) {
58+
public Environment toEnvironmentEntity(String accountId, EnvironmentRequestDTO environmentRequestDTO,
59+
boolean ngSvcManifestOverrideEnabled, boolean ngSvcConfigFilesOverrideEnabled) {
5660
final Environment environment;
5761
if (isNotEmpty(environmentRequestDTO.getYaml())) {
5862
NGEnvironmentConfig ngEnvironmentConfig = toNGEnvironmentConfig(environmentRequestDTO);
5963

6064
validate(ngEnvironmentConfig);
61-
validateEnvGlobalManifestsOverrides(ngEnvironmentConfig, ngSvcManifestOverrideEnabled);
65+
validateEnvGlobalOverrides(ngEnvironmentConfig, ngSvcManifestOverrideEnabled, ngSvcConfigFilesOverrideEnabled);
6266

6367
environment = toNGEnvironmentEntity(accountId, ngEnvironmentConfig, environmentRequestDTO.getColor());
6468
environment.setYaml(environmentRequestDTO.getYaml());
@@ -213,34 +217,65 @@ public static String toYaml(@Valid NGEnvironmentConfig ngEnvironmentConfig) {
213217
}
214218
}
215219

216-
private void validateEnvGlobalManifestsOverrides(
217-
NGEnvironmentConfig ngEnvironmentConfig, boolean ngSvcManifestOverrideEnabled) {
220+
private void validateEnvGlobalOverrides(NGEnvironmentConfig ngEnvironmentConfig, boolean ngSvcManifestOverrideEnabled,
221+
boolean ngSvcConfigFileOverrideEnabled) {
218222
if (ngEnvironmentConfig.getNgEnvironmentInfoConfig() != null
219223
&& ngEnvironmentConfig.getNgEnvironmentInfoConfig().getNgEnvironmentGlobalOverride() != null) {
220-
if (!ngSvcManifestOverrideEnabled) {
224+
if (!ngSvcManifestOverrideEnabled
225+
&& isNotEmpty(
226+
ngEnvironmentConfig.getNgEnvironmentInfoConfig().getNgEnvironmentGlobalOverride().getManifests())) {
221227
throw new InvalidRequestException(
222228
"Manifest Override is not supported with FF NG_SERVICE_MANIFEST_OVERRIDE disabled");
223229
}
230+
if (!ngSvcConfigFileOverrideEnabled
231+
&& isNotEmpty(
232+
ngEnvironmentConfig.getNgEnvironmentInfoConfig().getNgEnvironmentGlobalOverride().getConfigFiles())) {
233+
throw new InvalidRequestException(
234+
"Config Files Override is not supported with FF disabled NG_SERVICE_CONFIG_FILES_OVERRIDE");
235+
}
236+
224237
final NGEnvironmentGlobalOverride environmentGlobalOverride =
225238
ngEnvironmentConfig.getNgEnvironmentInfoConfig().getNgEnvironmentGlobalOverride();
226239
checkDuplicateManifestIdentifiersWithIn(environmentGlobalOverride.getManifests());
240+
checkDuplicateConfigFilesIdentifiersWithIn(environmentGlobalOverride.getConfigFiles());
227241
}
228242
}
229243

230244
public static void checkDuplicateManifestIdentifiersWithIn(List<ManifestConfigWrapper> manifests) {
231245
if (isEmpty(manifests)) {
232246
return;
233247
}
248+
final Stream<String> identifierStream =
249+
manifests.stream().map(ManifestConfigWrapper::getManifest).map(ManifestConfig::getIdentifier);
250+
Set<String> duplicateIds = getDuplicateIdentifiers(identifierStream);
251+
if (isNotEmpty(duplicateIds)) {
252+
throw new InvalidRequestException(format("Found duplicate manifest identifiers [%s]",
253+
duplicateIds.stream().map(Object::toString).collect(Collectors.joining(","))));
254+
}
255+
}
256+
257+
public static void checkDuplicateConfigFilesIdentifiersWithIn(List<ConfigFileWrapper> configFiles) {
258+
if (isEmpty(configFiles)) {
259+
return;
260+
}
261+
final Stream<String> identifierStream =
262+
configFiles.stream().map(ConfigFileWrapper::getConfigFile).map(ConfigFile::getIdentifier);
263+
Set<String> duplicateIds = getDuplicateIdentifiers(identifierStream);
264+
if (isNotEmpty(duplicateIds)) {
265+
throw new InvalidRequestException(format("Found duplicate configFiles identifiers [%s]",
266+
duplicateIds.stream().map(Object::toString).collect(Collectors.joining(","))));
267+
}
268+
}
269+
270+
@NotNull
271+
private static Set<String> getDuplicateIdentifiers(Stream<String> identifierStream) {
234272
Set<String> uniqueIds = new HashSet<>();
235273
Set<String> duplicateIds = new HashSet<>();
236-
manifests.stream().map(ManifestConfigWrapper::getManifest).map(ManifestConfig::getIdentifier).forEach(id -> {
274+
identifierStream.forEach(id -> {
237275
if (!uniqueIds.add(id)) {
238276
duplicateIds.add(id);
239277
}
240278
});
241-
if (isNotEmpty(duplicateIds)) {
242-
throw new InvalidRequestException(format("Found duplicate manifest identifiers [%s]",
243-
duplicateIds.stream().map(Object::toString).collect(Collectors.joining(","))));
244-
}
279+
return duplicateIds;
245280
}
246281
}

127-cd-nextgen-entities/src/main/java/io/harness/ng/core/serviceoverride/mapper/NGServiceOverrideEntityConfigMapper.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import static io.harness.data.structure.EmptyPredicate.isNotEmpty;
1212

1313
import io.harness.annotations.dev.OwnedBy;
14+
import io.harness.cdng.configfile.ConfigFileWrapper;
1415
import io.harness.cdng.manifest.yaml.ManifestConfigWrapper;
1516
import io.harness.exception.InvalidRequestException;
1617
import io.harness.ng.core.serviceoverride.beans.NGServiceOverridesEntity;
@@ -38,12 +39,15 @@ public NGServiceOverrideConfig toNGServiceOverrideConfig(NGServiceOverridesEntit
3839
// Todo : Refactor it (Tathagat)
3940
List<NGVariable> variableOverride = null;
4041
List<ManifestConfigWrapper> manifestsList = null;
42+
List<ConfigFileWrapper> configFiles = null;
4143
if (isNotEmpty(serviceOverridesEntity.getYaml())) {
4244
try {
4345
final NGServiceOverrideConfig config =
4446
YamlPipelineUtils.read(serviceOverridesEntity.getYaml(), NGServiceOverrideConfig.class);
45-
variableOverride = config.getServiceOverrideInfoConfig().getVariables();
46-
manifestsList = config.getServiceOverrideInfoConfig().getManifests();
47+
final NGServiceOverrideInfoConfig serviceOverrideInfoConfig = config.getServiceOverrideInfoConfig();
48+
variableOverride = serviceOverrideInfoConfig.getVariables();
49+
manifestsList = serviceOverrideInfoConfig.getManifests();
50+
configFiles = serviceOverrideInfoConfig.getConfigFiles();
4751
} catch (IOException e) {
4852
throw new InvalidRequestException("Cannot create service ng service config due to " + e.getMessage());
4953
}
@@ -54,6 +58,7 @@ public NGServiceOverrideConfig toNGServiceOverrideConfig(NGServiceOverridesEntit
5458
.serviceRef(serviceOverridesEntity.getServiceRef())
5559
.variables(variableOverride)
5660
.manifests(manifestsList)
61+
.configFiles(configFiles)
5762
.build())
5863
.build();
5964
}

127-cd-nextgen-entities/src/main/java/io/harness/ng/core/serviceoverride/yaml/NGServiceOverrideInfoConfig.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010
import io.harness.annotations.dev.HarnessTeam;
1111
import io.harness.annotations.dev.OwnedBy;
12+
import io.harness.cdng.configfile.ConfigFileWrapper;
1213
import io.harness.cdng.manifest.yaml.ManifestConfigWrapper;
1314
import io.harness.yaml.core.variables.NGVariable;
1415

@@ -45,4 +46,5 @@ public class NGServiceOverrideInfoConfig {
4546
@NotNull String serviceRef;
4647
List<NGVariable> variables;
4748
List<ManifestConfigWrapper> manifests;
49+
List<ConfigFileWrapper> configFiles;
4850
}

0 commit comments

Comments
 (0)