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);
        }