/// <summary> /// Initialization routine /// </summary> private void Initialize() { // load the environment configuration file from UtilsInternal var sr = new FileSettingsReader(ConfigurationManager.AppSettings["ConfigRelativePath"] + Path.DirectorySeparatorChar + environmentName + ".config"); var certThumbprint = sr.ReadValue(SocialPlusCertThumbprint); var clientID = sr.ReadValue(EmbeddedSocialClientIdSetting); var storeLocation = StoreLocation.CurrentUser; var vaultUrl = sr.ReadValue(SocialPlusVaultUrlSetting); ICertificateHelper cert = new CertificateHelper(certThumbprint, clientID, storeLocation); IKeyVaultClient client = new AzureKeyVaultClient(cert); var log = new Log(LogDestination.Console, Log.DefaultCategoryName); var kv = new KV(log, clientID, vaultUrl, certThumbprint, storeLocation, client); var kvReader = new KVSettingsReader(sr, kv); IConnectionStringProvider connectionStringProvider = new ConnectionStringProvider(kvReader); int queueBatchIntervalMs = int.Parse(sr.ReadValue(ServiceBusBatchIntervalMsSetting)); // Lots of things need to be created to create an appsManager. ICTStoreManager tableStoreManager = new CTStoreManager(connectionStringProvider); bool tableInit = false; Exception exception = null; try { // use Task.Run to ensure that the async Initialize routine runs on a threadpool thread Task <bool> task = Task <bool> .Run(() => tableStoreManager.Initialize()); // task.Result blocks until the result is ready tableInit = task.Result; } catch (Exception e) { exception = e; } if (tableInit == false) { string errorMessage = "CTstore version number does not match the expected version number." + Environment.NewLine + "If your tables are empty, then you probably forgot to provision storage." + Environment.NewLine + "If not, then you need to convert the data format and update the storage version number."; Console.WriteLine(errorMessage); if (exception != null) { Console.WriteLine("Exception message:" + exception.Message); } Environment.Exit(0); } ICBStoreManager blobStoreManager = new CBStoreManager(connectionStringProvider); AppsStore appsStore = new AppsStore(tableStoreManager); UsersStore usersStore = new UsersStore(tableStoreManager); ViewsManager viewsManager = new ViewsManager( log, appsStore, usersStore, new UserRelationshipsStore(tableStoreManager), new TopicsStore(tableStoreManager), new TopicRelationshipsStore(tableStoreManager), new CommentsStore(tableStoreManager), new RepliesStore(tableStoreManager), new LikesStore(tableStoreManager), new PinsStore(tableStoreManager), new BlobsStore(blobStoreManager)); PushNotificationsManager pushManager = new PushNotificationsManager(log, new PushRegistrationsStore(tableStoreManager), appsStore, viewsManager, connectionStringProvider); this.appsManager = new AppsManager(appsStore, pushManager); SearchManager searchManager = new SearchManager(log, connectionStringProvider); PopularUsersManager popularUsersManager = new PopularUsersManager(usersStore); QueueManager queueManager = new QueueManager(connectionStringProvider, queueBatchIntervalMs); SearchQueue searchQueue = new SearchQueue(queueManager); this.usersManager = new UsersManager(usersStore, pushManager, popularUsersManager, searchQueue); }
/// <summary> /// Async version of the Main program /// </summary> /// <param name="args">command line args</param> /// <returns>a task</returns> public static async Task AsyncMain(string[] args) { ParseArgs(args); var sr = new FileSettingsReader(ConfigurationManager.AppSettings["ConfigRelativePath"] + Path.DirectorySeparatorChar + environmentName + ".config"); var certThumbprint = sr.ReadValue(SocialPlusCertThumbprint); var clientID = sr.ReadValue(EmbeddedSocialClientIdSetting); var storeLocation = StoreLocation.CurrentUser; var vaultUrl = sr.ReadValue(SocialPlusVaultUrlSetting); ICertificateHelper cert = new CertificateHelper(certThumbprint, clientID, storeLocation); IKeyVaultClient client = new AzureKeyVaultClient(cert); log = new Log(LogDestination.Console, Log.DefaultCategoryName); kv = new KV(log, clientID, vaultUrl, certThumbprint, storeLocation, client); var kvReader = new KVSettingsReader(sr, kv); // Create a null connection string provider needed for blobStoreManager and tableStoreManager NullConnectionStringProvider connectionStringProvider = new NullConnectionStringProvider(); if (doUpgradeStoreVersion) { if (!forceOperation) { Console.WriteLine("You must specify the -Force option when using -UpgradeStoreVersion"); Console.WriteLine("The -UpgradeStoreVersion option is only intended to be used by our version upgrade scripts"); Console.WriteLine("If you are trying to use this by hand, you're probably doing something wrong."); return; } CTStoreManager tableStoreManager = new CTStoreManager(connectionStringProvider); string redisPersistentConnectionString = await kvReader.ReadValueAsync("PersistentRedisConnectionString"); string azureTableStorageConnectionString = await kvReader.ReadValueAsync("AzureStorageConnectionString"); await UpgradeStoreVersion(tableStoreManager, azureTableStorageConnectionString, redisPersistentConnectionString); return; } if (doClean) { DisplayWarning(); } // display current configuration await ValidateAndPrintConfiguration(environmentName, kvReader); if (forceOperation == false) { // get user approval Console.Write("Are you sure you want to proceed? [y/n] : "); ConsoleKeyInfo keyInfo = Console.ReadKey(false); if (keyInfo.KeyChar != 'y') { return; } } // Mr Clean!! Console.WriteLine(); Console.WriteLine(); if (doAll || doSearch) { string searchServiceName = await kvReader.ReadValueAsync("SearchServiceName"); string searchServiceAdminKey = await kvReader.ReadValueAsync("SearchServiceAdminKey"); if (doClean) { // delete search indices await DeleteSearch(searchServiceName, searchServiceAdminKey); } if (doCreate) { // create search indices await ProvisionSearch(searchServiceName, searchServiceAdminKey); } } if (doAll || doQueues) { string serviceBusConnectionString = await kvReader.ReadValueAsync("ServiceBusConnectionString"); if (doClean) { // Delete queues await DeleteServiceBusQueues(serviceBusConnectionString); } if (doCreate) { // Create queues await ProvisionServiceBusQueues(serviceBusConnectionString); } } if (doAll || doTables) { CTStoreManager tableStoreManager = new CTStoreManager(connectionStringProvider); string azureTableStorageConnectionString = await kvReader.ReadValueAsync("AzureStorageConnectionString"); if (doClean) { // Delete tables await DeleteAzureTables(azureTableStorageConnectionString); } if (doCreate) { await ProvisionAzureStorageTables(tableStoreManager, azureTableStorageConnectionString); } } if (doAll || doBlobs) { CBStoreManager blobStoreManager = new CBStoreManager(connectionStringProvider); string azureBlobStorageConnectionString = await kvReader.ReadValueAsync("AzureBlobStorageConnectionString"); if (doClean) { // Delete blobs await DeleteAzureBlobs(blobStoreManager, azureBlobStorageConnectionString); } if (doCreate) { await ProvisionAzureStorageBlobs(blobStoreManager, azureBlobStorageConnectionString); } } if (doAll || doRedis) { if (doClean) { // Delete redis cache string redisVolatileConnectionString = await kvReader.ReadValueAsync("VolatileRedisConnectionString") + ", allowAdmin=1"; string redisPersistentConnectionString = await kvReader.ReadValueAsync("PersistentRedisConnectionString") + ", allowAdmin=1"; DeleteRedisCaches(redisVolatileConnectionString, redisPersistentConnectionString); } if (doCreate) { string redisPersistentConnectionString = await kvReader.ReadValueAsync("PersistentRedisConnectionString"); CTStoreManager tableStoreManager = new CTStoreManager(connectionStringProvider); await ProvisionRedisCaches(redisPersistentConnectionString, tableStoreManager); } } if (doAll || doLogs) { CBStoreManager blobStoreManager = new CBStoreManager(connectionStringProvider); string azureBlobStorageConnectionString = await kvReader.ReadValueAsync("AzureBlobStorageConnectionString"); if (doClean) { // Delete logs await DeleteAzureLogs(azureBlobStorageConnectionString); } if (doCreate) { // No need to create the Azure logs (aka WAD* tables). Azure Diagnostics creates them automatically. } } // bye Console.WriteLine(); Console.WriteLine("All done! Bye!"); Console.WriteLine(); }