Skip to content

Commit

Permalink
WOR-1436: remove resource creation sub-flight and pre-fetch billing p…
Browse files Browse the repository at this point in the history
…rofile (#393)

* re-apply changes to remove sub-flight without restructuring ArmManager access in resource steps

* fix test

* move in tests from CreateLandingZoneResourcesFlightTest
  • Loading branch information
blakery authored Jan 24, 2024
1 parent ff4156c commit 26383fa
Show file tree
Hide file tree
Showing 12 changed files with 219 additions and 824 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -43,9 +43,7 @@
import bio.terra.landingzone.service.landingzone.azure.model.StartLandingZoneDeletion;
import bio.terra.landingzone.stairway.flight.LandingZoneFlightMapKeys;
import bio.terra.landingzone.stairway.flight.create.CreateLandingZoneFlight;
import bio.terra.landingzone.stairway.flight.create.CreateLandingZoneResourcesFlight;
import bio.terra.landingzone.stairway.flight.delete.DeleteLandingZoneFlight;
import bio.terra.profile.model.ProfileModel;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
Expand Down Expand Up @@ -149,6 +147,9 @@ public AsyncJobResult<StartLandingZoneCreation> startLandingZoneCreationJob(
checkIfLandingZoneWithIdExists(landingZoneId);
checkIfAttaching(azureLandingZoneRequest);

var profile =
bpmService.getBillingProfile(bearerToken, azureLandingZoneRequest.billingProfileId());

final LandingZoneJobBuilder jobBuilder =
azureLandingZoneJobService
.newJob()
Expand All @@ -165,7 +166,11 @@ public AsyncJobResult<StartLandingZoneCreation> startLandingZoneCreationJob(
.addParameter(
LandingZoneFlightMapKeys.LANDING_ZONE_CREATE_PARAMS, azureLandingZoneRequest)
.addParameter(LandingZoneFlightMapKeys.LANDING_ZONE_ID, landingZoneId)
.addParameter(LandingZoneFlightMapKeys.BILLING_PROFILE, profile)
.addParameter(JobMapKeys.RESULT_PATH.getKeyName(), resultPath);

MetricUtils.incrementLandingZoneCreation(azureLandingZoneRequest.definition());

return azureLandingZoneJobService.retrieveStartingAsyncJobResult(
jobBuilder.submit(),
new StartLandingZoneCreation(
Expand All @@ -174,33 +179,6 @@ public AsyncJobResult<StartLandingZoneCreation> startLandingZoneCreationJob(
azureLandingZoneRequest.version()));
}

public String startLandingZoneResourceCreationJob(
String jobId,
LandingZoneRequest landingZoneRequest,
ProfileModel billingProfile,
UUID landingZoneId,
BearerToken bearerToken,
String resultPath) {
var jobDescription =
"Inner flight to create landing zone resources. definition='%s', version='%s'";
MetricUtils.incrementLandingZoneCreation(landingZoneRequest.definition());
return azureLandingZoneJobService
.newJob()
.jobId(jobId)
.description(
String.format(
jobDescription, landingZoneRequest.definition(), landingZoneRequest.version()))
.flightClass(CreateLandingZoneResourcesFlight.class)
.landingZoneRequest(landingZoneRequest)
.operationType(OperationType.CREATE)
.bearerToken(bearerToken)
.addParameter(LandingZoneFlightMapKeys.LANDING_ZONE_CREATE_PARAMS, landingZoneRequest)
.addParameter(LandingZoneFlightMapKeys.LANDING_ZONE_ID, landingZoneId)
.addParameter(JobMapKeys.RESULT_PATH.getKeyName(), resultPath)
.addParameter(LandingZoneFlightMapKeys.BILLING_PROFILE, billingProfile)
.submit();
}

private void checkIfLandingZoneWithIdExists(UUID landingZoneId) {
var maybeExistingLz = landingZoneDao.getLandingZoneIfExists(landingZoneId);
if (maybeExistingLz.isPresent()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,6 @@ public class LandingZoneFlightMapKeys {
public static final String BILLING_PROFILE = "billingProfile";
public static final String ATTACH = "attach";
public static final String STORAGE_ACCOUNT_NAME = "storageAccountName";
public static final String CREATE_LANDING_ZONE_RESOURCES_INNER_FLIGHT_JOB_ID =
"createLandingZoneResourcesInnerFlightJobId";
public static final String CREATE_LANDING_ZONE_PARAMETERS_RESOLVER = "parametersResolver";

private LandingZoneFlightMapKeys() {}
Expand Down

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -35,16 +35,12 @@ public StepResult doStep(FlightContext context) throws InterruptedException, Ret
FlightUtils.validateRequiredEntries(
inputMap,
LandingZoneFlightMapKeys.LANDING_ZONE_CREATE_PARAMS,
LandingZoneFlightMapKeys.LANDING_ZONE_ID);
LandingZoneFlightMapKeys.LANDING_ZONE_ID,
LandingZoneFlightMapKeys.BILLING_PROFILE);
var requestedExternalLandingZoneResource =
inputMap.get(LandingZoneFlightMapKeys.LANDING_ZONE_CREATE_PARAMS, LandingZoneRequest.class);
var landingZoneId = inputMap.get(LandingZoneFlightMapKeys.LANDING_ZONE_ID, UUID.class);

// Read working map parameters
final FlightMap workingMap = context.getWorkingMap();
FlightUtils.validateRequiredEntries(workingMap, LandingZoneFlightMapKeys.BILLING_PROFILE);
var billingProfile =
workingMap.get(LandingZoneFlightMapKeys.BILLING_PROFILE, ProfileModel.class);
var billingProfile = inputMap.get(LandingZoneFlightMapKeys.BILLING_PROFILE, ProfileModel.class);
var landingZoneTarget = LandingZoneTarget.fromBillingProfile(billingProfile);

// Persist the landing zone record
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,21 @@

import bio.terra.landingzone.common.utils.LandingZoneFlightBeanBag;
import bio.terra.landingzone.common.utils.RetryRules;
import bio.terra.landingzone.library.landingzones.definition.ArmManagers;
import bio.terra.landingzone.library.landingzones.definition.factories.LandingZoneStepsDefinitionProviderFactory;
import bio.terra.landingzone.library.landingzones.definition.factories.StepsDefinitionFactoryType;
import bio.terra.landingzone.library.landingzones.management.LandingZoneManager;
import bio.terra.landingzone.model.LandingZoneTarget;
import bio.terra.landingzone.service.landingzone.azure.model.LandingZoneRequest;
import bio.terra.landingzone.stairway.flight.LandingZoneFlightMapKeys;
import bio.terra.landingzone.stairway.flight.ResourceNameProvider;
import bio.terra.landingzone.stairway.flight.create.resource.step.AggregateLandingZoneResourcesStep;
import bio.terra.landingzone.stairway.flight.exception.LandingZoneCreateException;
import bio.terra.stairway.Flight;
import bio.terra.stairway.FlightMap;
import bio.terra.stairway.RetryRule;
import bio.terra.stairway.Step;
import bio.terra.profile.model.ProfileModel;
import bio.terra.stairway.*;
import com.azure.core.management.AzureEnvironment;
import com.azure.core.management.profile.AzureProfile;
import java.util.UUID;

/** Flight for creation of a Landing Zone */
public class CreateLandingZoneFlight extends Flight {
Expand Down Expand Up @@ -43,22 +51,61 @@ private void addCreateSteps(LandingZoneFlightBeanBag flightBeanBag, FlightMap in
addStep(
new CreateSamResourceStep(flightBeanBag.getSamService()), RetryRules.shortExponential());

addStep(
new GetBillingProfileStep(flightBeanBag.getBpmService()), RetryRules.shortExponential());

if (!requestedLandingZone.isAttaching()) {
addStep(
new CreateLandingZoneResourcesFlightStep(
flightBeanBag.getLandingZoneService(),
requestedLandingZone,
LandingZoneFlightMapKeys.CREATE_LANDING_ZONE_RESOURCES_INNER_FLIGHT_JOB_ID));
addStep(
new AwaitCreateLandingZoneResourcesFlightStep(
LandingZoneFlightMapKeys.CREATE_LANDING_ZONE_RESOURCES_INNER_FLIGHT_JOB_ID));
var stepsDefinitionProvider =
LandingZoneStepsDefinitionProviderFactory.create(
StepsDefinitionFactoryType.fromString(requestedLandingZone.definition()));
var landingZoneId = getLandingZoneId(inputParameters, requestedLandingZone);
var resourceNameProvider = new ResourceNameProvider(landingZoneId);
var parametersResolverProvider = flightBeanBag.getParametersResolverProvider();

var landingZoneProtectedDataConfiguration =
flightBeanBag.getLandingZoneProtectedDataConfiguration();
var armManagers = getArmManagers(flightBeanBag, inputParameters);

stepsDefinitionProvider
.get(
armManagers,
parametersResolverProvider,
resourceNameProvider,
landingZoneProtectedDataConfiguration)
.forEach(pair -> addStep(pair.getLeft(), pair.getRight()));

// last step to aggregate results
addStep(new AggregateLandingZoneResourcesStep(), RetryRules.shortExponential());
}

addStep(
new CreateAzureLandingZoneDbRecordStep(flightBeanBag.getLandingZoneDao()),
RetryRules.shortDatabase());
}

private UUID getLandingZoneId(FlightMap inputParameters, LandingZoneRequest landingZoneRequest) {
// landing zone identifier can come in request's body or we generate it and keep it separately
if (landingZoneRequest.landingZoneId().isPresent()) {
return landingZoneRequest.landingZoneId().get();
} else {
var landingZoneId = inputParameters.get(LandingZoneFlightMapKeys.LANDING_ZONE_ID, UUID.class);
if (landingZoneId == null) {
throw new LandingZoneCreateException("Unable to find landing zone identifier in input map");
}
return landingZoneId;
}
}

protected ArmManagers getArmManagers(
LandingZoneFlightBeanBag flightBeanBag, FlightMap inputParameters) {
var billingProfile =
inputParameters.get(LandingZoneFlightMapKeys.BILLING_PROFILE, ProfileModel.class);
var landingZoneTarget = LandingZoneTarget.fromBillingProfile(billingProfile);
var azureProfile =
new AzureProfile(
landingZoneTarget.azureTenantId(),
landingZoneTarget.azureSubscriptionId(),
AzureEnvironment.AZURE);
return LandingZoneManager.createArmManagers(
flightBeanBag.getAzureCredentialsProvider().getTokenCredential(),
azureProfile,
flightBeanBag.getAzureCustomerUsageConfiguration().getUsageAttribute());
}
}

This file was deleted.

Loading

0 comments on commit 26383fa

Please sign in to comment.