public RecipeStep Dequeue(string executionId) { if (!_appDataFolder.DirectoryExists(Path.Combine(_recipeQueueFolder, executionId))) { return null; } RecipeStep recipeStep = null; int stepIndex = GetFirstStepIndex(executionId); if (stepIndex >= 0) { var stepPath = Path.Combine(_recipeQueueFolder, executionId + Path.DirectorySeparatorChar + stepIndex); // string to xelement var stepElement = XElement.Parse(_appDataFolder.ReadFile(stepPath)); var stepName = stepElement.Element("Name").Value; recipeStep = new RecipeStep { Name = stepName, Step = stepElement.Element(stepName) }; _appDataFolder.DeleteFile(stepPath); } if (stepIndex < 1) { _appDataFolder.DeleteFile(Path.Combine(_recipeQueueFolder, executionId)); } return recipeStep; }
public RecipeStep Dequeue(string executionId) { Logger.Information("Dequeuing recipe steps."); if (!_appDataFolder.DirectoryExists(Path.Combine(_recipeQueueFolder, executionId))) { return null; } RecipeStep recipeStep = null; int stepIndex = GetFirstStepIndex(executionId); if (stepIndex >= 0) { var stepPath = Path.Combine(_recipeQueueFolder, executionId + Path.DirectorySeparatorChar + stepIndex); // string to xelement var stepElement = XElement.Parse(_appDataFolder.ReadFile(stepPath)); var stepName = stepElement.Element("Name").Value; var stepId = stepElement.Attr("Id"); var recipeName = stepElement.Attr("RecipeName"); Logger.Information("Dequeuing recipe step '{0}'.", stepName); recipeStep = new RecipeStep(id: stepId, recipeName: recipeName, name: stepName, step: stepElement.Element(stepName)); _appDataFolder.DeleteFile(stepPath); } if (stepIndex < 0) { _appDataFolder.DeleteFile(Path.Combine(_recipeQueueFolder, executionId)); } return recipeStep; }
public Recipe ParseRecipe(string recipeText) { var recipe = new Recipe(); try { var recipeSteps = new List<RecipeStep>(); TextReader textReader = new StringReader(recipeText); var recipeTree = XElement.Load(textReader, LoadOptions.PreserveWhitespace); textReader.Close(); foreach (var element in recipeTree.Elements()) { // Recipe mETaDaTA if (element.Name.LocalName == "Recipe") { foreach (var metadataElement in element.Elements()) { switch (metadataElement.Name.LocalName) { case "Name": recipe.Name = metadataElement.Value; break; case "Description": recipe.Description = metadataElement.Value; break; case "Author": recipe.Author = metadataElement.Value; break; case "WebSite": recipe.WebSite = metadataElement.Value; break; case "Version": recipe.Version = metadataElement.Value; break; case "IsSetupRecipe": recipe.IsSetupRecipe = !string.IsNullOrEmpty(metadataElement.Value) ? bool.Parse(metadataElement.Value) : false; break; case "ExportUtc": recipe.ExportUtc = !string.IsNullOrEmpty(metadataElement.Value) ? (DateTime?)XmlConvert.ToDateTime(metadataElement.Value, XmlDateTimeSerializationMode.Utc) : null; break; case "Tags": recipe.Tags = metadataElement.Value; break; default: Logger.Error("Unrecognized recipe metadata element {0} encountered. Skipping.", metadataElement.Name.LocalName); break; } } } // Recipe step else { var recipeStep = new RecipeStep { Name = element.Name.LocalName, Step = element }; recipeSteps.Add(recipeStep); } } recipe.RecipeSteps = recipeSteps; } catch (Exception exception) { Logger.Error(exception, "Parsing recipe failed. Recipe text was: {0}.", recipeText); throw; } return recipe; }
public Recipe ParseRecipe(XDocument recipeDocument) { var recipe = new Recipe(); var recipeSteps = new List<RecipeStep>(); var stepId = 0; foreach (var element in recipeDocument.Root.Elements()) { // Recipe metadata. if (element.Name.LocalName == "Recipe") { foreach (var metadataElement in element.Elements()) { switch (metadataElement.Name.LocalName) { case "Name": recipe.Name = metadataElement.Value; break; case "Description": recipe.Description = metadataElement.Value; break; case "Author": recipe.Author = metadataElement.Value; break; case "WebSite": recipe.WebSite = metadataElement.Value; break; case "Version": recipe.Version = metadataElement.Value; break; case "IsSetupRecipe": recipe.IsSetupRecipe = !string.IsNullOrEmpty(metadataElement.Value) ? bool.Parse(metadataElement.Value) : false; break; case "ExportUtc": recipe.ExportUtc = !string.IsNullOrEmpty(metadataElement.Value) ? (DateTime?)XmlConvert.ToDateTime(metadataElement.Value, XmlDateTimeSerializationMode.Utc) : null; break; case "Category": recipe.Category = metadataElement.Value; break; case "Tags": recipe.Tags = metadataElement.Value; break; default: Logger.Warning("Unrecognized recipe metadata element '{0}' encountered; skipping.", metadataElement.Name.LocalName); break; } } } // Recipe step. else { var recipeStep = new RecipeStep(id: (++stepId).ToString(CultureInfo.InvariantCulture), recipeName: recipe.Name, name: element.Name.LocalName, step: element ); recipeSteps.Add(recipeStep); } } recipe.RecipeSteps = recipeSteps; return recipe; }
public void Enqueue(string executionId, RecipeStep step) { var recipeStepElement = new XElement("RecipeStep"); recipeStepElement.Add(new XElement("Name", step.Name)); recipeStepElement.Add(step.Step); if (_appDataFolder.DirectoryExists(Path.Combine(_recipeQueueFolder, executionId))) { int stepIndex = GetLastStepIndex(executionId) + 1; _appDataFolder.CreateFile(Path.Combine(_recipeQueueFolder, executionId + Path.DirectorySeparatorChar + stepIndex), recipeStepElement.ToString()); } else { _appDataFolder.CreateFile( Path.Combine(_recipeQueueFolder, executionId + Path.DirectorySeparatorChar + "0"), recipeStepElement.ToString()); } }
public void Enqueue(string executionId, RecipeStep step) { _queue.Enqueue(step); }
private string CreateTenantData(SetupContext context, IWorkContextScope environment) { // Create site owner. var membershipService = environment.Resolve<IMembershipService>(); var user = membershipService.CreateUser( new CreateUserParams(context.AdminUsername, context.AdminPassword, String.Empty, String.Empty, String.Empty, true)); // Set site owner as current user for request (it will be set as the owner of all content items). var authenticationService = environment.Resolve<IAuthenticationService>(); authenticationService.SetAuthenticatedUserForRequest(user); // Set site name and settings. var siteService = environment.Resolve<ISiteService>(); var siteSettings = siteService.GetSiteSettings().As<SiteSettingsPart>(); siteSettings.SiteSalt = Guid.NewGuid().ToString("N"); siteSettings.SiteName = context.SiteName; siteSettings.SuperUser = context.AdminUsername; siteSettings.SiteCulture = "en-US"; // Add default culture. var cultureManager = environment.Resolve<ICultureManager>(); cultureManager.AddCulture("en-US"); var recipeManager = environment.Resolve<IRecipeManager>(); var recipe = context.Recipe; var executionId = recipeManager.Execute(recipe); // Once the recipe has finished executing, we need to update the shell state to "Running", so add a recipe step that does exactly that. var recipeStepQueue = environment.Resolve<IRecipeStepQueue>(); var recipeStepResultRecordRepository = environment.Resolve<IRepository<RecipeStepResultRecord>>(); var activateShellStep = new RecipeStep(Guid.NewGuid().ToString("N"), recipe.Name, "ActivateShell", new XElement("ActivateShell")); recipeStepQueue.Enqueue(executionId, activateShellStep); recipeStepResultRecordRepository.Create(new RecipeStepResultRecord { ExecutionId = executionId, RecipeName = recipe.Name, StepId = activateShellStep.Id, StepName = activateShellStep.Name }); // Null check: temporary fix for running setup in command line. if (HttpContext.Current != null) { authenticationService.SignIn(user, true); } return executionId; }
public override void Execute(ImportActionContext context) { var recipeDocument = context.RecipeDocument ?? RecipeDocument; if (recipeDocument == null) return; // Give each execution step a chance to augment the recipe step before it will be scheduled. PrepareRecipe(recipeDocument); // Sets the request timeout to a configurable amount of seconds to give enough time to execute custom recipes. if (_orchardServices.WorkContext.HttpContext != null) { _orchardServices.WorkContext.HttpContext.Server.ScriptTimeout = RecipeExecutionTimeout; } // Suspend background task execution. _sweepGenerator.Terminate(); // Import or setup using the specified recipe. var executionId = ResetSite ? Setup(recipeDocument) : ExecuteRecipe(recipeDocument); if(executionId == null) { _orchardServices.Notifier.Warning(T("The recipe contained no steps. No work was scheduled.")); _sweepGenerator.Activate(); return; } // Resume background tasks once import/setup completes. var recipe = _recipeParser.ParseRecipe(recipeDocument); var activateSweepGeneratorStep = new RecipeStep(Guid.NewGuid().ToString("N"), recipe.Name, "ActivateSweepGenerator", new XElement("ActivateSweepGenerator")); _recipeStepQueue.Enqueue(executionId, activateSweepGeneratorStep); _recipeStepResultRepository.Create(new RecipeStepResultRecord { ExecutionId = executionId, RecipeName = recipe.Name, StepId = activateSweepGeneratorStep.Id, StepName = activateSweepGeneratorStep.Name }); context.ExecutionId = executionId; context.RecipeDocument = recipeDocument; }