Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
02/19/13 08:46:01 (11 years ago)
Author:
fschoepp
Message:

#1888:

  • Experiments will be saved as JSON elements within the blob store.
  • Added simple model and JSON converters.
  • Backend stores and runs experiments.
  • Updated interfaces to save/read experiments.
  • Added a binding to automatically map incoming JSON ajax requests to experiment models.
  • Added the javascript DatatypeMapper to map parameter inputs to the right html elements and vice versa.
  • Added smartwizard to generate Wizards for creating new experiments (New.cshtml).
File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/OaaS/HeuristicLab.Services.Optimization.Controller/Azure/DAL.cs

    r9215 r9227  
    99using System.Diagnostics;
    1010using HeuristicLab.Services.Optimization.ControllerService.Model;
     11using HeuristicLab.Services.Optimization.ControllerService.Parsers;
    1112
    1213namespace HeuristicLab.Services.Optimization.ControllerService.Azure {
     
    1516    public static readonly string SCENARIO_BLOB_CONTAINER = "scenario";
    1617    public static readonly string EXPERIMENT_TABLE = "Experiment";
     18    public static readonly string EXPERIMENT_BLOB_CONTAINER = "experiment";
    1719    public static readonly string CLOUD_SETTINGS_KEY = "Cloudia.WindowsAzure.Storage";
     20
     21   
    1822  }
    1923
     
    97101    }
    98102
    99     public ExperimentEntity(string user, Experiment experiment) {
     103    public ExperimentEntity(string user, string experimentName, string experimentUrl) {
    100104      PartitionKey = "ScenarioPartition";
    101       RowKey = user + "_" + experiment.Name;
    102       var scenarios = "";
    103       foreach (var scen in experiment.Scenarios) {
    104         scenarios += scen.Id + ",";
    105       }
    106       Scenarios = scenarios.Remove(scenarios.Length - 1);
     105      RowKey = user + "_" + experimentName;     
    107106      User = user;
     107      ExperimentJsonUrl = experimentUrl;
    108108    }
    109109
    110110    public string User { get; set; }
    111111
    112     public string Scenarios { get; set; }
     112    public string ExperimentJsonUrl { get; set; }
    113113
    114114  }
     
    122122        return false;
    123123
    124       TableServiceContext serviceContext = TableClient.GetDataServiceContext();
    125       TableClient.CreateTableIfNotExist(AzureConstants.EXPERIMENT_TABLE);
    126       var entity = new ExperimentEntity(username, experiment);
     124      // TODO: Save the whole experiment, not just the algorithm names!!!
     125      CloudBlobContainer container = BlobClient.GetContainerReference(AzureConstants.EXPERIMENT_BLOB_CONTAINER);
     126      container.CreateIfNotExist();
     127      // For now we store it as JSON element in the blob store
     128      // TODO: Make sure, that all required properties are part of the experiment!!
     129      var experimentJson = AlgorithmConverter.ConvertJson(experiment);
     130      Guid experimentJsonGuid = Guid.NewGuid();
     131      var experimentJsonId = experiment.Name + "_" + experimentJsonGuid.ToString();
     132      var blob = container.GetBlobReference(experimentJsonId);     
     133      blob.UploadText(experimentJson);
     134
     135      TableServiceContext serviceContext = TableClient.GetDataServiceContext();     
     136      TableClient.CreateTableIfNotExist(AzureConstants.EXPERIMENT_TABLE);
     137      var entity = new ExperimentEntity(username, experiment.Name, blob.Uri.ToString());
    127138      serviceContext.AddObject(AzureConstants.EXPERIMENT_TABLE, entity);
    128139      serviceContext.SaveChangesWithRetries();
     
    139150      if (entity == null)
    140151        return false;
     152
     153      if (entity.ExperimentJsonUrl != null) {
     154        CloudBlobContainer container = BlobClient.GetContainerReference(AzureConstants.EXPERIMENT_BLOB_CONTAINER);
     155        container.CreateIfNotExist();
     156        var blob = container.GetBlobReference(entity.ExperimentJsonUrl);
     157        blob.DeleteIfExists();
     158      }
    141159
    142160      serviceContext.DeleteObject(entity);
     
    156174      }
    157175
    158       var exp = Convert(entity);
    159       return exp;
    160     }
    161 
    162     private Experiment Convert(ExperimentEntity entity) {
    163       var exp = new Experiment() { Name = entity.RowKey.Split('_')[1] };
    164       foreach (var scenarioName in entity.Scenarios.Split(','))
    165         exp.Scenarios.Add(new OptimizationScenario() { Id = scenarioName });
    166       return exp;
    167     }
     176      CloudBlobContainer container = BlobClient.GetContainerReference(AzureConstants.EXPERIMENT_BLOB_CONTAINER);
     177      container.CreateIfNotExist();
     178      var blob = container.GetBlobReference(entity.ExperimentJsonUrl);
     179      return AlgorithmConverter.ConvertExperimentSimple(blob.DownloadText());
     180    }
     181
     182    //private Experiment Convert(ExperimentEntity entity, string entityJson) {
     183    //  // TODO: Read the whole experiment, not just the names!
     184    //  var exp = new Experiment() { Name = entity.RowKey.Split('_')[1] };
     185    //  foreach (var scenarioName in entity.Algorithms.Split(','))
     186    //    exp.Algorithm.Add(new Algorithm() { Name = scenarioName });
     187    //  return exp;
     188    //}
    168189
    169190    public IEnumerable<Model.Experiment> GetExperiments(string user) {
     
    174195                    select e).ToList();
    175196      var experiments = new List<Experiment>();
     197      CloudBlobContainer container = BlobClient.GetContainerReference(AzureConstants.EXPERIMENT_BLOB_CONTAINER);
     198      container.CreateIfNotExist();
    176199      foreach (var entity in entites) {
    177         experiments.Add(Convert(entity));
     200        var blob = container.GetBlobReference(entity.ExperimentJsonUrl);
     201        experiments.Add(AlgorithmConverter.ConvertExperimentSimple(blob.DownloadText()));
    178202      }
    179203      return experiments;
     204    }
     205
     206
     207    public Experiment GetExperimentByName(string username, string scenario) {
     208      TableServiceContext serviceContext = TableClient.GetDataServiceContext();
     209      TableClient.CreateTableIfNotExist(AzureConstants.EXPERIMENT_TABLE);
     210      var entity = (from e in serviceContext.CreateQuery<ExperimentEntity>(AzureConstants.EXPERIMENT_TABLE)
     211                      where e.RowKey == username + "_" + scenario
     212                      select e).FirstOrDefault();
     213      if (entity == null || entity.ExperimentJsonUrl == null) {
     214        return null;
     215      }
     216
     217      CloudBlobContainer container = BlobClient.GetContainerReference(AzureConstants.EXPERIMENT_BLOB_CONTAINER);
     218      container.CreateIfNotExist();
     219      var blob = container.GetBlobReference(entity.ExperimentJsonUrl);
     220      var exp = AlgorithmConverter.ConvertExperimentSimple(blob.DownloadText());
     221      return exp;
    180222    }
    181223  }
     
    224266      get {
    225267        if (expDao == null) {
    226           expDao = new ExperimentDao() { TableClient = StorageAccount.CreateCloudTableClient() };
     268          expDao = new ExperimentDao() { TableClient = StorageAccount.CreateCloudTableClient(), BlobClient = StorageAccount.CreateCloudBlobClient() };
    227269        }
    228270        return expDao;
Note: See TracChangeset for help on using the changeset viewer.