public ComponentDeploymentGraph GetComponentDeploymentGraph(EnvironmentDeploymentPlan environmentDeploymentPlan) { var componentVertices = new Dictionary <string, ComponentDeploymentVertex>(); foreach (var componentDependancy in environmentDeploymentPlan.DeploymentPlans) { var version = componentDependancy.ComponentFrom == null ? null : componentDependancy.ComponentFrom.Version; var deploymentDuration = componentDependancy.ComponentFrom == null ? null : componentDependancy.ComponentFrom.DeploymentDuration; var componentVertex = new ComponentDeploymentVertex(componentDependancy.Id, componentDependancy.Name, version, componentDependancy.Action, deploymentDuration); componentVertices.Add(componentDependancy.Name, componentVertex); } var componentEdges = new List <ComponentDeploymentEdge>(); foreach (var componentDependancy in environmentDeploymentPlan.DeploymentPlans) { if (componentDependancy.ComponentFrom == null) { continue; } var source = componentVertices[componentDependancy.Name]; foreach (var dependancy in componentDependancy.ComponentFrom.Dependancies) { ComponentDeploymentVertex target; var targetExists = componentVertices.TryGetValue(dependancy, out target); if (!targetExists) { //The dependancy points to a vertex that does not exist (spelling mistake/dependant components have changed their name/component dependancies have changed) target = new ComponentDeploymentVertex(dependancy, dependancy, null, PlanAction.Skip, null, false); componentVertices.Add(dependancy, target); } var componentEdge = new ComponentDeploymentEdge(source, target); componentEdges.Add(componentEdge); } } var componentDependanciesAdjacencyGraph = new ComponentDeploymentGraph(); componentDependanciesAdjacencyGraph.AddVertexRange(componentVertices.Values); componentDependanciesAdjacencyGraph.AddEdgeRange(componentEdges); return(componentDependanciesAdjacencyGraph); }
public void BranchDeployment() { if (!CanBranchDeployment) { return; } IsLoadingData = true; Task.Factory.StartNew(() => { try { var deploymentPlanner = new OctopusDeploymentPlanner(_octopusUrl, _octopusApiKey); var componentFilter = new ComponentFilter { Expressions = ComponentFilterExpressions.Select(x => x.Text).ToList(), Include = ComponentFilterInclude }; var branchDeploymentPlans = deploymentPlanner.GetBranchDeploymentPlans(_selectedBranchDeploymentEnvironment.Name, _selectedBranchDeploymentBranch.Name, _doNotUseDifferentialDeploymentForBranchDeployment, componentFilter); EnvironmentDeploymentPlan = branchDeploymentPlans.EnvironmentDeploymentPlan; var deploymentScheduler = new DeploymentScheduler(); var componentGraph = deploymentScheduler.GetComponentDeploymentGraph(EnvironmentDeploymentPlan); Graph = componentGraph.ToBidirectionalGraph(); EnvironmentDeployment = deploymentScheduler.GetEnvironmentDeployment(componentGraph); EnvironmentDeploymentSaveFileName = "branch " + _selectedBranchDeploymentBranch.Name + " to " + _selectedBranchDeploymentEnvironment.Name + ".json"; EnvironmentToDeployTo = _selectedBranchDeploymentEnvironment; } catch { EnvironmentDeploymentPlan = new EnvironmentDeploymentPlan(new List <ComponentDeploymentPlan>()); Graph = null; EnvironmentDeployment = new EnvironmentDeployment(new List <ProductDeployment>()); EnvironmentDeploymentSaveFileName = string.Empty; EnvironmentToDeployTo = null; } }).ContinueWith(task => { IsLoadingData = false; }); }
private EnvironmentDeploymentPlan GetEnvironmentDeploymentPlan() { var componentDeploymentPlans = new List <ComponentDeploymentPlan>() { new ComponentDeploymentPlan() { Id = "a", Name = "a", Action = PlanAction.Skip, ComponentFrom = new Component() { Dependancies = {}, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 100) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "b", Name = "b", Action = PlanAction.Change, ComponentFrom = new Component() { Dependancies = { "a", "c" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "c", Name = "c", Action = PlanAction.Skip, ComponentFrom = new Component() { Dependancies = { "b" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "d", Name = "d", Action = PlanAction.Change, ComponentFrom = new Component() { Dependancies = { "a" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "e", Name = "e", Action = PlanAction.Skip, ComponentFrom = new Component() { Dependancies = { "d" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 60) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "f", Name = "f", Action = PlanAction.Change, ComponentFrom = new Component() { Dependancies = { "e" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "g", Name = "g", Action = PlanAction.Remove, ComponentFrom = new Component() { Dependancies = { "d" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "h", Name = "h", Action = PlanAction.Change, ComponentFrom = new Component() { Dependancies = { "d", "e" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 10) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "x", Name = "x", Action = PlanAction.Skip, ComponentFrom = new Component() { Dependancies = {}, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 20) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "y", Name = "y", Action = PlanAction.Change, ComponentFrom = new Component() { Dependancies = { "x" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 40) }, ComponentTo = null }, new ComponentDeploymentPlan() { Id = "z", Name = "z", Action = PlanAction.Skip, ComponentFrom = new Component() { Dependancies = { "y" }, Version = new SemVer("1.0.0.0"), DeploymentDuration = new TimeSpan(0, 0, 50) }, ComponentTo = null }, }; var environmentDeploymentPlan = new EnvironmentDeploymentPlan(componentDeploymentPlans); return(environmentDeploymentPlan); }