Example #1
0
        public async Task HandlePrivateEndpointEventsAsync(
            [EventGridTrigger] EventGridEvent eventGridEvent,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log
            )
        {
            string  eventType      = eventGridEvent.EventType;
            dynamic data           = eventGridEvent.Data;
            string  subscriptionId = data.subscriptionId;
            string  resourceId     = eventGridEvent.Subject;

            var durableParameters = new OrchestratorParameters
            {
                SubscriptionId = subscriptionId,
                ResourceId     = resourceId
            };

            string instanceId;

            switch (eventType)
            {
            case "Microsoft.Resources.ResourceWriteSuccess":
                instanceId = await starter.StartNewAsync(nameof(OrchestratePrivateEndpointCreatedAsync), eventGridEvent.Id, durableParameters);

                break;

            //case "Microsoft.Resources.ResourceDeleteSuccess":
            //	instanceId = await starter.StartNewAsync(nameof(OrchestratePrivateEndpointDeletedAsync), eventGridEvent.Id, durableParameters);
            //	break;
            default:
                throw new Exception();
            }

            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
        }
        private async Task <bool> OrchestrateNetworkInterfaceUpdateAsync(IDurableOrchestrationContext context, NetworkInterface nic, DnsEntity dnsEntity)
        {
            // If NIC tags were removed or no longer contains the hostname tag.
            var remove  = nic.Tags == null || !nic.Tags.ContainsKey(hostNameTagName);
            var replace = !remove && !nic.Tags[hostNameTagName].Equals(dnsEntity.Hostname, StringComparison.OrdinalIgnoreCase);
            var removed = false;

            var orchestratorParameters = new OrchestratorParameters
            {
                SubscriptionId = ResourceId.FromString(nic.Id).SubscriptionId,
                ResourceId     = nic.Id
            };

            if (remove || replace)
            {
                removed = await context.CallSubOrchestratorAsync <bool>(nameof(OrchestrateNetworkInterfaceDeleteAsync), orchestratorParameters);
            }

            if (replace && removed)
            {
                return(await context.CallSubOrchestratorAsync <bool>(nameof(OrchestrateNetworkInterfaceWriteAsync), orchestratorParameters));
            }

            return(true);
        }
        public async Task <NetworkInterface> GetNetworkInterfaceAsync([ActivityTrigger] OrchestratorParameters parameters, ILogger log)
        {
            var resourceGroupName    = Constants.ResourceGroupCaptureRegEx.Match(parameters.ResourceId).Groups["resourcegroup"].Value;
            var networkInterfaceName = Constants.NicCaptureRegEx.Match(parameters.ResourceId).Groups["nic"].Value;

            networkManagementService.SetSubscriptionId(parameters.SubscriptionId);
            return(await networkManagementService.GetNetworkInterfaceAsync(resourceGroupName, networkInterfaceName));
        }
Example #4
0
        public async Task <PrivateEndpoint> GetPrivateEndpointAsync([ActivityTrigger] OrchestratorParameters parameters, ILogger log)
        {
            var resourceGroupName   = Constants.ResourceGroupCaptureRegEx.Match(parameters.ResourceId).Groups["resourcegroup"].Value;
            var privateEndpointName = Constants.PrivateEndpointCaptureRegEx.Match(parameters.ResourceId).Groups["privateEndpoint"].Value;

            networkManagementService.SetSubscriptionId(parameters.SubscriptionId);
            return(await networkManagementService.GetPrivateEndpointAsync(resourceGroupName, privateEndpointName));
        }
        public async Task <VirtualMachine> GetVirtualMachineAsync([ActivityTrigger] OrchestratorParameters parameters, ILogger log)
        {
            var resourceGroupName = Constants.ResourceGroupCaptureRegEx.Match(parameters.ResourceId).Groups["resourcegroup"].Value;
            var vmName            = Constants.VmCaptureRegEx.Match(parameters.ResourceId).Groups["vm"].Value;

            computeManagementService.SetSubscriptionId(parameters.SubscriptionId);
            return(await computeManagementService.GetVirtualMachineAsync(resourceGroupName, vmName));
        }
Example #6
0
        public async Task <IActionResult> TestHandleNetworkInterfaceEventsAsync(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] EventGridEvent eventGridEvent,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log
            )
        {
            try
            {
                string  eventType      = eventGridEvent.EventType;
                dynamic data           = eventGridEvent.Data;
                string  subscriptionId = data.subscriptionId;
                string  resourceId     = eventGridEvent.Subject;

                var durableParameters = new OrchestratorParameters
                {
                    SubscriptionId = subscriptionId,
                    ResourceId     = resourceId
                };

                string instanceId;

                switch (eventType)
                {
                case "Microsoft.Resources.ResourceWriteSuccess":
                    instanceId = await starter.StartNewAsync(nameof(NetworkInterfaceEventFunctions.OrchestrateNetworkInterfaceWriteAsync), eventGridEvent.Id, durableParameters);

                    break;

                case "Microsoft.Resources.ResourceDeleteSuccess":
                    instanceId = await starter.StartNewAsync(nameof(NetworkInterfaceEventFunctions.OrchestrateNetworkInterfaceDeleteAsync), eventGridEvent.Id, durableParameters);

                    break;

                default:
                    throw new Exception();
                }
                return(new OkResult());
            }
            catch (Exception ex)
            {
                return(new InternalServerErrorResult());
            }
        }
        public async Task <bool> OrchestrateVirtualMachineDeallocatedAsync([OrchestrationTrigger] IDurableOrchestrationContext context)
        {
            var orchestratorParameters = context.GetInput <OrchestratorParameters>();

            // Get VM that was just deallocated.
            var vm = await context.CallActivityAsync <VirtualMachine>(nameof(GetVirtualMachineAsync), orchestratorParameters);

            foreach (var nic in vm.NetworkProfile.NetworkInterfaces)
            {
                var nicOrchestratorParameters = new OrchestratorParameters
                {
                    SubscriptionId = orchestratorParameters.SubscriptionId,
                    ResourceId     = nic.Id
                };

                await context.CallSubOrchestratorAsync(nameof(NetworkInterfaceEventFunctions.OrchestrateNetworkInterfaceDeleteAsync), nicOrchestratorParameters);
            }

            return(true);
        }
Example #8
0
        public async Task TestHandleVirtualMachineEventsAsync(
            [HttpTrigger(AuthorizationLevel.Function, "post", Route = null)] EventGridEvent eventGridEvent,
            [DurableClient] IDurableOrchestrationClient starter,
            ILogger log
            )
        {
            dynamic data           = eventGridEvent.Data;
            string  subscriptionId = data.subscriptionId;
            string  operationName  = data.operationName;
            string  resourceId     = eventGridEvent.Subject;

            var durableParameters = new OrchestratorParameters
            {
                SubscriptionId = subscriptionId,
                ResourceId     = resourceId
            };

            string instanceId;

            switch (operationName)
            {
            case "Microsoft.Compute/virtualMachines/start/action":
                instanceId = await starter.StartNewAsync(nameof(VirtualMachineEventFunctions.OrchestrateVirtualMachineStartedAsync), eventGridEvent.Id, durableParameters);

                break;

            case "Microsoft.Compute/virtualMachines/deallocate/action":
                instanceId = await starter.StartNewAsync(nameof(VirtualMachineEventFunctions.OrchestrateVirtualMachineDeallocatedAsync), eventGridEvent.Id, durableParameters);

                break;

            default:
                throw new Exception();
            }

            log.LogInformation($"Started orchestration with ID = '{instanceId}'.");
        }