public override bool Init(IDictionary <string, string> jobArgsDictionary)
        {
            Source =
                new SqlConnectionStringBuilder(
                    JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                        JobArgumentNames.SourceDatabase,
                                                        EnvironmentVariableKeys.SqlGallery));

            WarehouseConnection =
                new SqlConnectionStringBuilder(
                    JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                        JobArgumentNames.DestinationDatabase,
                                                        EnvironmentVariableKeys.SqlWarehouse));

            Destination = CloudStorageAccount.Parse(
                JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                    JobArgumentNames.WarehouseStorageAccount, EnvironmentVariableKeys.WarehouseStorage));

            DestinationContainerName = JobConfigurationManager.TryGetArgument(jobArgsDictionary, JobArgumentNames.WarehouseContainerName) ?? DefaultPackageStatsContainerName;

            DestinationContainer  = Destination.CreateCloudBlobClient().GetContainerReference(DestinationContainerName);
            _globalReportBuilders = new Dictionary <string, Func <Task> >(StringComparer.OrdinalIgnoreCase)
            {
                { NuGetClientVersion, () => CreateReport(NuGetClientVersion, "Scripts.DownloadReport_NuGetClientVersion.sql") },
                { Last6Months, () => CreateReport(Last6Months, "Scripts.DownloadReport_Last6Months.sql") },
                { RecentPopularity, () => CreateReport(RecentPopularity, "Scripts.DownloadReport_RecentPopularity.sql") },
                { RecentPopularityDetail, () => CreateReport(RecentPopularityDetail, "Scripts.DownloadReport_RecentPopularityDetail.sql") },
            };

            return(true);
        }
        public override bool Init(IDictionary <string, string> jobArgsDictionary)
        {
            Source =
                new SqlConnectionStringBuilder(
                    JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                        JobArgumentNames.SourceDatabase,
                                                        EnvironmentVariableKeys.SqlGallery));

            OutputDirectory = JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                                  JobArgumentNames.OutputDirectory);

            if (string.IsNullOrEmpty(OutputDirectory))
            {
                Destination = CloudStorageAccount.Parse(
                    JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                        JobArgumentNames.PrimaryDestination, EnvironmentVariableKeys.StoragePrimary));

                DestinationContainerName = JobConfigurationManager.TryGetArgument(jobArgsDictionary, JobArgumentNames.DestinationContainerName) ?? DefaultContainerName;


                DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(DestinationContainerName);
            }

            return(true);
        }
示例#3
0
        public override bool Init(IDictionary <string, string> jobArgsDictionary)
        {
            WarehouseConnection =
                new SqlConnectionStringBuilder(
                    JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                        JobArgumentNames.DestinationDatabase,
                                                        EnvironmentVariableKeys.SqlWarehouse));
            Destination = CloudStorageAccount.Parse(
                JobConfigurationManager.GetArgument(jobArgsDictionary,
                                                    JobArgumentNames.PrimaryDestination, EnvironmentVariableKeys.StoragePrimary));

            DestinationContainerName = JobConfigurationManager.TryGetArgument(jobArgsDictionary, JobArgumentNames.DestinationContainerName) ?? DefaultContainerName;


            DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(DestinationContainerName);

            string rankingCountString = JobConfigurationManager.TryGetArgument(jobArgsDictionary, JobArgumentNames.RankingCount);

            if (string.IsNullOrEmpty(rankingCountString))
            {
                RankingCount = DefaultRankingCount;
            }
            else
            {
                RankingCount = Convert.ToInt32(rankingCountString);
            }

            return(true);
        }
示例#4
0
 protected virtual void LoadDefaults()
 {
     Destination = Destination ?? Config.Storage.Primary;
     if (Destination != null)
     {
         DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(
             String.IsNullOrEmpty(DestinationContainerName) ? _defaultContainerName : DestinationContainerName);
     }
 }
示例#5
0
 private void LoadDefaults()
 {
     WarehouseConnection = WarehouseConnection ?? Config.Sql.Warehouse;
     Destination         = Destination ?? Config.Storage.Legacy;
     if (Destination != null)
     {
         DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(
             String.IsNullOrEmpty(DestinationContainerName) ? BlobContainerNames.LegacyStats : DestinationContainerName);
     }
 }
        public SqlExportArguments(IDictionary <string, string> jobArgsDictionary, string defaultContainerName, string defaultName)
        {
            var connStrBldr = new SqlConnectionStringBuilder(
                JobConfigurationManager.GetArgument(jobArgsDictionary, JobArgumentNames.SourceDatabase, EnvironmentVariableKeys.SqlGallery));

            ConnectionString = connStrBldr.ToString();
            OutputDirectory  = JobConfigurationManager.GetArgument(jobArgsDictionary, JobArgumentNames.OutputDirectory);

            if (string.IsNullOrEmpty(OutputDirectory))
            {
                Destination = CloudStorageAccount.Parse(
                    JobConfigurationManager.GetArgument(jobArgsDictionary, JobArgumentNames.PrimaryDestination, EnvironmentVariableKeys.StoragePrimary));

                DestinationContainerName = JobConfigurationManager.TryGetArgument(jobArgsDictionary, JobArgumentNames.DestinationContainerName) ?? defaultContainerName;
                DestinationContainer     = Destination.CreateCloudBlobClient().GetContainerReference(DestinationContainerName);
            }

            Name = defaultName;
        }
示例#7
0
        protected internal override async Task Execute()
        {
            PackageDatabase = PackageDatabase ?? Config.Sql.GetConnectionString(KnownSqlConnection.Legacy);
            Source          = Source ?? Config.Storage.Backup;
            Destination     = Destination ?? Config.Storage.Primary;

            PackageDatabase.TrimNetworkProtocol();

            SourceContainer = Source.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(SourceContainerName) ? BlobContainerNames.Backups : SourceContainerName);
            DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(DestinationContainerName) ? BlobContainerNames.LegacyPackages : DestinationContainerName);
            Log.PreparingToSync(Source.Credentials.AccountName, SourceContainer.Name, Destination.Credentials.AccountName, DestinationContainer.Name, PackageDatabase.DataSource, PackageDatabase.InitialCatalog);

            // Gather packages
            Log.GatheringListOfPackages(PackageDatabase.DataSource, PackageDatabase.InitialCatalog);
            IList <PackageRef> packagesInDB;

            using (var connection = await PackageDatabase.ConnectTo())
            {
                packagesInDB = (await connection.QueryAsync <PackageRef>(@"
                    SELECT pr.Id, p.NormalizedVersion AS Version, p.Hash, p.LastEdited
                    FROM Packages p
                    INNER JOIN PackageRegistrations pr ON p.PackageRegistrationKey = pr.[Key]"))
                               .ToList();
            }
            Log.GatheredListOfPackages(packagesInDB.Count, PackageDatabase.DataSource, PackageDatabase.InitialCatalog);

            if (!WhatIf)
            {
                await DestinationContainer.CreateIfNotExistsAsync();
            }

            // Collect a list of packages in destination with metadata
            Log.GatheringDestinationPackages(Destination.BlobEndpoint.ToString(), DestinationContainer.Name);
            var destinationPackages = await LoadPackagesAtDestination();

            Log.GatheredDestinationPackagesList(Destination.BlobEndpoint.ToString(), DestinationContainer.Name, destinationPackages.Count);

            Log.CalculatingCopyOrOverwritePackages(packagesInDB.Count, destinationPackages.Count);
            var packagesToCopyOrOverwrite = PackagesToCopyOrOverwrite(packagesInDB, destinationPackages);

            Log.CalculatedCopyOrOverwritePackages(packagesInDB.Count, packagesToCopyOrOverwrite.Count);

            Log.StartingSync(packagesToCopyOrOverwrite.Count);
            if (packagesToCopyOrOverwrite.Count > 0)
            {
                var policy = new SharedAccessBlobPolicy();
                policy.SharedAccessStartTime  = DateTimeOffset.Now;
                policy.SharedAccessExpiryTime = DateTimeOffset.Now + TimeSpan.FromHours(2) + TimeSpan.FromMinutes(2 * packagesToCopyOrOverwrite.Count);
                policy.Permissions            = SharedAccessBlobPermissions.Read;
                var sourceContainerSharedAccessUri = SourceContainer.GetSharedAccessSignature(policy);
                Log.SharedAccessSignatureURI(sourceContainerSharedAccessUri);

                foreach (var packageRef in packagesToCopyOrOverwrite)
                {
                    await CopyOrOverwritePackage(sourceContainerSharedAccessUri, StorageHelpers.GetPackageBackupBlobName(packageRef),
                                                 StorageHelpers.GetPackageBlobName(packageRef), packageRef.Hash);

                    if ((Invocation.NextVisibleAt - DateTimeOffset.UtcNow) < TimeSpan.FromMinutes(1))
                    {
                        // Running out of time! Extend the job
                        Log.ExtendingJobLeaseWhileSyncingProgresses();
                        await Extend(TimeSpan.FromMinutes(5));

                        Log.ExtendedJobLease();
                    }
                    else
                    {
                        Log.JobLeaseOk();
                    }
                }
            }

            Log.CalculatingDeletePackages(destinationPackages.Count, packagesInDB.Count);
            var packagesToDelete = PackagesToDelete(packagesInDB, destinationPackages);

            Log.CalculatedDeletePackages(packagesToDelete.Count, destinationPackages.Count);

            if (packagesToDelete.Count > 0)
            {
                foreach (var packageBlobName in packagesToDelete)
                {
                    await DeletePackage(packageBlobName);

                    if ((Invocation.NextVisibleAt - DateTimeOffset.UtcNow) < TimeSpan.FromMinutes(1))
                    {
                        // Running out of time! Extend the job
                        Log.ExtendingJobLeaseWhileSyncingProgresses();
                        await Extend(TimeSpan.FromMinutes(5));

                        Log.ExtendedJobLease();
                    }
                    else
                    {
                        Log.JobLeaseOk();
                    }
                }
            }
            Log.StartedSync();
        }
        protected internal override async Task Execute()
        {
            Source      = Source ?? Config.Storage.Legacy;
            Destination = Destination ?? Config.Storage.Backup;

            SourceContainer = Source.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(SourceContainerName) ? BlobContainerNames.Backups : SourceContainerName);
            DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(DestinationContainerName) ? BlobContainerNames.Backups : DestinationContainerName);
            Log.PreparingToTransfer(Source.Credentials.AccountName, SourceContainer.Name, Destination.Credentials.AccountName, DestinationContainer.Name);

            // Gather packages
            Log.GatheringListOfPackages(Source.BlobEndpoint.ToString(), SourceContainer.Name);
            var sourcePackages = await LoadBlobList(Log, Source, SourceContainer);

            Log.GatheredListOfPackages(sourcePackages.Count, Source.BlobEndpoint.ToString(), SourceContainer.Name);

            if (!WhatIf)
            {
                await DestinationContainer.CreateIfNotExistsAsync();
            }

            // Collect a list of packages in destination with metadata
            Log.GatheringListOfPackages(Destination.BlobEndpoint.ToString(), DestinationContainer.Name);
            var destinationPackages = await LoadBlobList(Log, Destination, DestinationContainer);

            Log.GatheredListOfPackages(destinationPackages.Count, Destination.BlobEndpoint.ToString(), DestinationContainer.Name);

            Log.CalculatingCopyPackages(sourcePackages.Count, destinationPackages.Count);
            var packageBlobsToCopy = sourcePackages.Where(p => !destinationPackages.Contains(p)).ToList();

            Log.CalculatedCopyPackages(sourcePackages.Count, packageBlobsToCopy.Count);

            Log.StartingTransfer(packageBlobsToCopy.Count);

            if (packageBlobsToCopy.Count > 0)
            {
                var policy = new SharedAccessBlobPolicy();
                policy.Permissions = SharedAccessBlobPermissions.Read;

                foreach (var packageBlobName in packageBlobsToCopy)
                {
                    await CopyPackageToDestination(policy, packageBlobName);

                    if ((Invocation.NextVisibleAt - DateTimeOffset.UtcNow) < TimeSpan.FromMinutes(1))
                    {
                        // Running out of time! Extend the job
                        Log.ExtendingJobLeaseWhileTransferProgresses();
                        await Extend(TimeSpan.FromMinutes(5));

                        Log.ExtendedJobLease();
                    }
                    else
                    {
                        Log.JobLeaseOk();
                    }
                }
            }

            Log.StartedTransfer();
        }
        protected internal override async Task Execute()
        {
            var now = DateTimeOffset.UtcNow;

            // Load default data if not provided
            PackageDatabase = PackageDatabase ?? Config.Sql.GetConnectionString(KnownSqlConnection.Legacy);
            Source          = Source ?? Config.Storage.Legacy;
            Destination     = Destination ?? Config.Storage.Legacy;
            SourceContainer = Source.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(SourceContainerName) ? BlobContainerNames.LegacyPackages : SourceContainerName);
            DestinationContainer = Destination.CreateCloudBlobClient().GetContainerReference(
                String.IsNullOrEmpty(DestinationContainerName) ? BlobContainerNames.Backups : DestinationContainerName);
            Log.PreparingToBackup(Source.Credentials.AccountName, SourceContainer.Name, Destination.Credentials.AccountName, DestinationContainer.Name, PackageDatabase.DataSource, PackageDatabase.InitialCatalog);

            // Gather packages
            Log.GatheringListOfPackages(PackageDatabase.DataSource, PackageDatabase.InitialCatalog);
            IList <PackageRef> packages;

            using (var connection = await PackageDatabase.ConnectTo()) {
                packages = (await connection.QueryAsync <PackageRef>(@"
                    SELECT pr.Id, p.NormalizedVersion AS Version, p.Hash
                    FROM Packages p
                    INNER JOIN PackageRegistrations pr ON p.PackageRegistrationKey = pr.[Key]"))
                           .ToList();
            }
            Log.GatheredListOfPackages(packages.Count, PackageDatabase.DataSource, PackageDatabase.InitialCatalog);

            // Collect a list of backups
            Log.GatheringBackupList(Destination.Credentials.AccountName, DestinationContainer.Name);
            var backups = await LoadBackupsList();

            Log.GatheredBackupList(Destination.Credentials.AccountName, DestinationContainer.Name, backups.Count);

            // Calculate needed backups
            Log.CalculatingBackupSet(packages.Count, backups.Count);
            var backupSet = CalculateBackupSet(packages, backups);

            Log.CalculatedBackupSet(packages.Count, backupSet.Count);

            if (!WhatIf)
            {
                await DestinationContainer.CreateIfNotExistsAsync();
            }

            Log.StartingBackup(packages.Count);
            if (RunInParallel)
            {
                Parallel.ForEach(
                    backupSet,
                    new ParallelOptions()
                {
                    MaxDegreeOfParallelism = TaskPerCoreFactor * Environment.ProcessorCount
                },
                    t => BackupPackage(t.Item1, t.Item2).Wait());
            }
            else
            {
                foreach (var backupRecord in backupSet)
                {
                    await BackupPackage(backupRecord.Item1, backupRecord.Item2);

                    if ((Invocation.NextVisibleAt - DateTimeOffset.UtcNow) < TimeSpan.FromMinutes(1))
                    {
                        // Running out of time! Extend the job
                        Log.ExtendingJobLeaseWhileBackupProgresses();
                        await Extend(TimeSpan.FromMinutes(5));

                        Log.ExtendedJobLease();
                    }
                    else
                    {
                        Log.JobLeaseOk();
                    }
                }
            }
            Log.StartedBackup();
        }