public override async Task Remove(ManagedIdentity model) { var stage = "initialization"; string subscriptionId = null; try { var azure = _azureFactory[model.Environment]; subscriptionId = azure.SubscriptionId; stage = "resourceGroupValidation"; if (!await azure.ResourceGroups.ContainAsync(model.ResourceGroupName)) { return; } stage = "identityFinding"; var identities = await azure.Identities.ListByResourceGroupAsync(model.ResourceGroupName); var identity = identities.FirstOrDefault(x => x.Name == model.IdentityName); if (identity == null) { return; } stage = "scaleSetFinding"; var scaleSets = await azure.VirtualMachineScaleSets.ListAsync(); stage = "scaleSetIdentityUnassignment"; Task UnassignIdentityFromScaleSet(IVirtualMachineScaleSet scaleSet) => GetActor <IScaleSetIdentityActor>(ScaleSetIdentityActor.ActorIdPrefix + scaleSet.Id) .Remove(new ScaleSetIdentity { Environment = model.Environment, ManagedIdentityId = identity.Id, }); var scaleSetAssignmentTasks = scaleSets.Select(UnassignIdentityFromScaleSet); await Task.WhenAll(scaleSetAssignmentTasks); stage = "identityDeletion"; await azure.Identities.DeleteByIdAsync(identity.Id); } catch (Exception e) { var errorEvent = new ManagedIdentityActorError(e) { Stage = stage, SubscriptionId = subscriptionId, EnvironmentName = model.Environment.ToString(), IdentityName = model.IdentityName, ResourceGroupName = model.ResourceGroupName, }; _bigBrother.Publish(errorEvent); throw; } }
public override async Task <ManagedIdentity> Add(ManagedIdentity model) { // TODO: remove this custom error logging when a more generic solution is available var stage = "initialization"; string subscriptionId = null; try { var azure = _azureFactory[model.Environment]; subscriptionId = azure.SubscriptionId; stage = "resourceGroupValidation"; var resourceGroup = await azure.ResourceGroups.GetByNameAsync(model.ResourceGroupName); stage = "identityFinding"; var identities = await azure.Identities.ListByResourceGroupAsync(model.ResourceGroupName); var identity = identities.FirstOrDefault(x => x.Name == model.IdentityName); if (identity == null) { stage = "identityCreation"; identity = await azure.Identities .Define(model.IdentityName) .WithRegion(resourceGroup.RegionName) .WithExistingResourceGroup(resourceGroup) .CreateAsync(); } model.IdentityId = identity.Id; stage = "scaleSetValidation"; var scaleSets = await azure.VirtualMachineScaleSets.ListAsync(); stage = "scaleSetIdentityAssignment"; Task AssignIdentityToScaleSet(IVirtualMachineScaleSet scaleSet) => GetActor <IScaleSetIdentityActor>(ScaleSetIdentityActor.ActorIdPrefix + scaleSet.Id) .Add(new ScaleSetIdentity { Environment = model.Environment, ManagedIdentityId = identity.Id, }); var scaleSetAssignmentTasks = scaleSets.Select(AssignIdentityToScaleSet); await Task.WhenAll(scaleSetAssignmentTasks); model.State = EntityStateEnum.Created; return(model); } catch (Exception e) { var errorEvent = new ManagedIdentityActorError(e) { Stage = stage, SubscriptionId = subscriptionId, EnvironmentName = model.Environment.ToString(), IdentityName = model.IdentityName, ResourceGroupName = model.ResourceGroupName, }; _bigBrother.Publish(errorEvent); throw; } }