// Set the Price & Currency on a requested currency name public void Calculate(DiskSize myDiskSize, decimal maxdisks, decimal mincapacity, decimal miniops, decimal minthroughput, TraceWriter log) { decimal DiskCountCapacity = Math.Ceiling(mincapacity / myDiskSize.MaxDataDiskSizeGB); decimal DiskCountIops = Math.Ceiling(miniops / myDiskSize.MaxDataDiskIops); decimal DiskCountThroughput = Math.Ceiling(minthroughput / myDiskSize.MaxDataDiskThroughputMBs); decimal DiskCountNeeded = Math.Max(DiskCountCapacity, DiskCountIops); DiskCountNeeded = Math.Max(DiskCountThroughput, DiskCountNeeded); decimal DiskConfigPrice = DiskCountNeeded * myDiskSize.Price; log.Info("DiskConfigPrice : " + DiskConfigPrice.ToString()); log.Info("DiskPrice : " + DiskPrice.ToString()); log.Info("DiskCountCapacity : " + DiskCountCapacity.ToString()); log.Info("DiskCountIops : " + DiskCountIops.ToString()); log.Info("DiskCountThroughput : " + DiskCountThroughput.ToString()); log.Info("DiskCountNeeded : " + DiskCountNeeded.ToString()); log.Info("MaxDisks : " + maxdisks.ToString()); if (DiskConfigPrice < DiskPrice && DiskCountNeeded <= maxdisks) { DiskPrice = DiskConfigPrice; DiskCurrency = myDiskSize.Currency; DiskType = myDiskSize.Tier; DiskName = myDiskSize.Name; DiskSize = myDiskSize.Size; DiskCapacity = myDiskSize.MaxDataDiskSizeGB; DiskIops = myDiskSize.MaxDataDiskIops; DiskThroughput = myDiskSize.MaxDataDiskThroughputMBs; DiskCount = DiskCountNeeded; DiskConfigCapacity = myDiskSize.MaxDataDiskSizeGB * DiskCountNeeded; DiskConfigIops = myDiskSize.MaxDataDiskIops * DiskCountNeeded; DiskConfigThroughput = myDiskSize.MaxDataDiskThroughputMBs * DiskCountNeeded; DiskConfigDescription = "A striped (raid0) set of " + DiskCountNeeded + " " + myDiskSize.Size + " " + "disk(s)."; } }
public static async Task <HttpResponseMessage> Run([HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", "options", Route = null)] HttpRequestMessage req, TraceWriter log) { // CosmosDB Parameters, retrieved via environment variables string databaseName = Environment.GetEnvironmentVariable("cosmosdbDatabaseName"); string collectionName = Environment.GetEnvironmentVariable("cosmosdbCollectionName"); string mongodbConnectionString = Environment.GetEnvironmentVariable("cosmosdbMongodbConnectionString"); // This endpoint is valid for all MongoDB var client = new MongoClient(mongodbConnectionString); var database = client.GetDatabase(databaseName); var collection = database.GetCollection <BsonDocument>(collectionName); // Region # string region = GetParameter("region", "europe-west", req).ToLower(); log.Info("Region : " + region.ToString()); // Currency # string currency = GetParameter("currency", "EUR", req).ToUpper(); log.Info("Currency : " + currency.ToString()); // Ssd # string disktype = GetParameter("disktype", "all", req).ToLower(); string ssd = GetParameter("ssd", "all", req).ToLower(); string[] ssdfilter = new string[3]; ssdfilter = SSDFilter(disktype, ssd); log.Info("SSD : " + ssd.ToString()); log.Info("Type : " + disktype.ToString()); log.Info("SSD[0] : " + ssdfilter[0]); log.Info("SSD[1] : " + ssdfilter[1]); log.Info("SSD[2] : " + ssdfilter[2]); // IOPS (Min) # decimal iops = Convert.ToDecimal(GetParameter("iops", "1", req)); iops = SetMinimum(iops, 1); log.Info("IOPS : " + iops.ToString()); // Throughput (Min) # decimal throughput = Convert.ToDecimal(GetParameter("throughput", "1", req)); throughput = SetMinimum(throughput, 1); log.Info("Throughput : " + throughput.ToString()); // Data (Disk Capacity) (Min) # decimal data = Convert.ToDecimal(GetParameter("data", "1", req)); data = SetMinimum(data, 1); log.Info("Data : " + data.ToString()); // Max Disks (Min) # decimal maxdisks = Convert.ToDecimal(GetParameter("maxdisks", "64", req)); maxdisks = SetMinimum(maxdisks, 1); log.Info("MaxDisks : " + maxdisks.ToString()); var filterBuilder = Builders <BsonDocument> .Filter; var filter = filterBuilder.Eq("type", "disk") & filterBuilder.Eq("disktype", "md") & filterBuilder.Eq("region", region) & filterBuilder.In("tier", ssdfilter) ; var sort = Builders <BsonDocument> .Sort.Ascending("price"); var cursor = collection.Find <BsonDocument>(filter).Sort(sort).ToCursor(); // Load Application Insights string ApplicationInsightsKey = TelemetryConfiguration.Active.InstrumentationKey = System.Environment.GetEnvironmentVariable("APPINSIGHTS_INSTRUMENTATIONKEY", EnvironmentVariableTarget.Process); TelemetryClient telemetry = new TelemetryClient() { InstrumentationKey = ApplicationInsightsKey }; // Get results and put them into a list of objects DiskConfig myDiskConfig = new DiskConfig(); myDiskConfig.DiskPrice = 999999999; foreach (var document in cursor.ToEnumerable()) { // Get RequestCharge var LastRequestStatistics = database.RunCommand <BsonDocument>(new BsonDocument { { "getLastRequestStatistics", 1 } }); double RequestCharge = (double)LastRequestStatistics["RequestCharge"]; telemetry.TrackMetric("RequestCharge", RequestCharge); // log.Info(document.ToString()); DiskSize myDiskSize = BsonSerializer.Deserialize <DiskSize>(document); // log.Info(myDiskSize.Name); myDiskSize.SetCurrency(currency); myDiskConfig.Calculate(myDiskSize, maxdisks, data, iops, throughput, log); } // Convert to JSON & return it var json = JsonConvert.SerializeObject(myDiskConfig, Formatting.Indented); return(new HttpResponseMessage(HttpStatusCode.OK) { Content = new StringContent(json, Encoding.UTF8, "application/json") }); }