public async Task <ManagedDisk> CreateAsync(
            string subscription,
            string resourceGroup,
            string name,
            string location,
            int size)
        {
            var id     = AzureResourceInnerHelper.CreateForDisk(subscription, resourceGroup, name);
            var result = new ManagedDisk
            {
                Id = id,
            };

            // TODO validate subscription
            using (logger.BeginResourceIdScope("manageddisk", id))
                using (var s = logger.StepInformation("Create managed disk: {0}", name))
                {
                    var disk = new Disk
                    {
                        Location     = location,
                        DiskSizeGB   = size,
                        CreationData = new CreationData("Empty"),
                    };
                    var dr = await computeManagementClient.Disks.CreateOrUpdateAsync(resourceGroup, name, disk);

                    // TODO verify null size
                    result.Size = dr.DiskSizeGB != null ? dr.DiskSizeGB.Value : 1;
                    s.Commit();
                }

            return(result);
        }
        public override async Task <DeleteVolumeResponse> DeleteVolume(
            DeleteVolumeRequest request,
            ServerCallContext context)
        {
            DeleteVolumeResponse response = new DeleteVolumeResponse();
            var id = request.VolumeId;

            using (logger.BeginKeyValueScope("volume_id", id))
                using (var _s = logger.StepInformation("{0}", nameof(DeleteVolume)))
                {
                    try
                    {
                        var ctx = new Helpers.Azure.DataProviderContext <ManagedDiskConfig>();
                        await contextConfig.Provide(ctx);

                        var actx = new AzureAuthConfigProviderContext {
                            Secrets = request.ControllerDeleteSecrets
                        };

                        var provisionService = provisionServiceFactory.Create(provider.Provide(actx), ctx.Result.SubscriptionId);
                        await provisionService.DeleteAsync(AzureResourceInnerHelper.CreateForDisk(
                                                               ctx.Result.SubscriptionId, ctx.Result.ResourceGroupName, id));
                    }
                    catch (Exception ex)
                    {
                        logger.LogError(ex, "Exception in DeleteVolume");
                        throw new RpcException(new Status(StatusCode.Internal, ex.Message));
                    }

                    _s.Commit();
                }

            return(response);
        }