private void AddVertex(Topology.Node.Node Vertex)
 {
     if (!this.Nodes.ContainsKey(Vertex.Id))
     {
         this.Nodes.Add(Vertex.Id, Vertex);
         this.Graph.AddVertex(Vertex.Id);
     }
 }
        private static void IntentQueueConsumer_OnIntentJobCallback(JObject data)
        {
            try
            {
                var code = Base64Decode(data["Base64IntentCode"].Value <string>());

                var compilerResults = Intent.IntentCompiler.CompileCSharpString(code);

                var tempType = compilerResults.CompiledAssembly.GetType("ShiftPolicy");

                #region Mandatory Properties
                bool     enabled     = (bool)tempType.GetProperty("Enabled").GetGetMethod().Invoke(null, null);
                int      period      = (int)tempType.GetProperty("Period").GetGetMethod().Invoke(null, null);
                DateTime validBefore = (DateTime)tempType.GetProperty("ValidBefore").GetGetMethod().Invoke(null, null);
                #endregion

                // Iterate Node

                Topology.Node.Node iterateNode = new Topology.Node.Node();

                try
                {
                    iterateNode = Topology.Node.Node.FromJson(data["IterateNode"].Value <JToken>().ToString());
                }
                catch (Exception)
                {
                    iterateNode = null;
                }

                //

                if (enabled && validBefore > DateTime.Now)
                {
                    object[] parameters = { igp_topology, mpls_topology, new PathComputation.PathComputation.YggdrasilNM2(), iterateNode };

                    var intentResult = tempType.GetMethod("Intent").Invoke(null, parameters);

                    Console.WriteLine("Response Type: {0}", intentResult.GetType());

                    OutputProcessor.IntentProcessor(intentResult, mpls_topology, igp_topology,
                                                    config.SDNControllerURI, config.SDNControllerUsername, config.SDNControllerPassword,
                                                    config.AnsibleTowerURI, config.AnsibleTowerUsername, config.AnsibleTowerPassword);
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
        }
        public void LoadIGPTopology(Topology.IGP.Topology topology)
        {
            topology.Clear();

            foreach (var record in GetIGPTopology())
            {
                var path = record.Values["p"].As <IPath>();

                Dictionary <long, string> nodeDatabaseIds = new Dictionary <long, string>();
                Dictionary <long, bool>   pseudonodes     = new Dictionary <long, bool>();

                foreach (var node in path.Nodes)
                {
                    string igpRouterIdentifier = TryGetNodePropertyAsString(node, "IGP_Router_Identifier");

                    if (!string.IsNullOrWhiteSpace(igpRouterIdentifier))
                    {
                        nodeDatabaseIds.Add(node.Id, igpRouterIdentifier);

                        Topology.Node.Node n = new Topology.Node.Node()
                        {
                            IgpRouterIdentifier = igpRouterIdentifier,
                            Psn = TryGetNodeProperty <int>(node, "psn"),
                            IPv4RouterIdentifier = TryGetNodePropertyAsString(node, "IPv4_Router_Identifier"),
                            NodeName             = TryGetNodePropertyAsString(node, "Node_Name"),
                            FirstSeen            = TryGetNodeProperty <long>(node, "First_Seen"),
                            LastEvent            = TryGetNodeProperty <long>(node, "Last_Event"),
                            OperationalStatus    = true
                        };

                        if (Regex.IsMatch(igpRouterIdentifier, @"^\d{12}$") && n.Psn == 0)
                        {
                            n.IsPseudonode = false;
                            n.NodeCost     = 1;

                            pseudonodes.Add(node.Id, n.IsPseudonode);
                        }
                        else
                        {
                            if (Regex.IsMatch(igpRouterIdentifier, @"^\d{12}\d+$") && n.Psn != 0)
                            {
                                n.IsPseudonode = true;
                                n.NodeCost     = 0;

                                pseudonodes.Add(node.Id, n.IsPseudonode);
                            }
                        }

                        topology.Update(n);
                    }
                }

                foreach (var link in path.Relationships)
                {
                    Topology.IGP.Link.Link l = new Topology.IGP.Link.Link()
                    {
                        SourceNode                     = nodeDatabaseIds[link.StartNodeId],
                        TargetNode                     = nodeDatabaseIds[link.EndNodeId],
                        Asn                            = TryGetRelProperty <long>(link, "asn"),
                        MaximumLinkBandwidth           = TryGetRelProperty <double>(link, "Maximum_Link_Bandwidth"),
                        MaximumReservableLinkBandwidth = TryGetRelProperty <double>(link, "Maximum_Reservable_Bandwidth"),
                        UnreservedBandwidth            = TryGetRelPropertyAsArray <double>(link, "Unreserved_Bandwidth"),
                        Rtt                            = TryGetRelProperty <long>(link, "rtt"),
                        IPv4InterfaceAddress           = TryGetRelPropertyAsString(link, "IPv4_Interface_Address"),
                        SharedRiskLinkGroups           = TryGetRelPropertyAsArray <long>(link, "Shared_Risk_Link_Groups"),
                        FirstSeen                      = TryGetRelProperty <long>(link, "First_Seen"),
                        LastEvent                      = TryGetRelProperty <long>(link, "Last_Event"),
                        OperationalStatus              = true
                    };

                    if (pseudonodes[link.StartNodeId] || pseudonodes[link.EndNodeId])
                    {
                        l.LinkCost = 0.5;
                    }
                    else
                    {
                        l.LinkCost = 1;
                    }

                    topology.Update(l);
                }
            }
        }
        public Topology.MPLS.Topology LoadMPLSTopology()
        {
            Topology.MPLS.Topology topology = new Topology.MPLS.Topology();

            foreach (var record in GetMPLSTopology())
            {
                var path = record.Values["p"].As <IPath>();

                Dictionary <long, string> nodeIPv4RouterIdentifiersByDatabaseId = new Dictionary <long, string>();
                Dictionary <long, string> nodePCCByDatabaseId = new Dictionary <long, string>();

                foreach (var node in path.Nodes)
                {
                    string ipv4RouterIdentifier = TryGetNodePropertyAsString(node, "IPv4_Router_Identifier");
                    string pcc = TryGetNodePropertyAsString(node, "PCC");

                    if (!string.IsNullOrWhiteSpace(ipv4RouterIdentifier))
                    {
                        nodeIPv4RouterIdentifiersByDatabaseId.Add(node.Id, ipv4RouterIdentifier);
                        nodePCCByDatabaseId.Add(node.Id, pcc);

                        Topology.Node.Node n = new Topology.Node.Node()
                        {
                            IPv4RouterIdentifier = TryGetNodePropertyAsString(node, "IPv4_Router_Identifier"),
                            PCC = pcc,
                            //NodeName = TryGetNodePropertyAsString(node, "Node_Name"),
                            FirstSeen = TryGetNodeProperty <long>(node, "First_Seen"),
                            //LastEvent = TryGetNodeProperty<long>(node, "Last_Event"),
                            OperationalStatus = true
                        };

                        n.IsPseudonode = false;
                        n.NodeCost     = 1;

                        topology.Update(n);
                    }
                }

                foreach (var lsp in path.Relationships)
                {
                    var symbolicPathName = TryGetRelPropertyAsString(lsp, "Symbolic_Path_Name");

                    if (symbolicPathName.Contains("/"))
                    {
                        var hierarchicalSymbolicPathName = symbolicPathName.Split("/".ToCharArray());

                        Topology.MPLS.HierarchicalLabelSwitchedPath.HierarchicalLabelSwitchedPath parent = new Topology.MPLS.HierarchicalLabelSwitchedPath.HierarchicalLabelSwitchedPath(hierarchicalSymbolicPathName[0])
                        {
                            IPv4TunnelSenderAddress   = nodeIPv4RouterIdentifiersByDatabaseId[lsp.StartNodeId],
                            IPv4TunnelEndpointAddress = nodeIPv4RouterIdentifiersByDatabaseId[lsp.EndNodeId]
                        };

                        topology.Update(parent);

                        Topology.MPLS.LabelSwitchedPath.LabelSwitchedPath child = new Topology.MPLS.LabelSwitchedPath.LabelSwitchedPath(parent.Id)
                        {
                            PCC = nodePCCByDatabaseId[lsp.StartNodeId], // Gets the PCC parameter from the StartNode instead of the LSP property, SHIFT PCEP listener is behind Docker Swarm NAT(PAT).
                            IPv4TunnelSenderAddress          = nodeIPv4RouterIdentifiersByDatabaseId[lsp.StartNodeId],
                            IPv4TunnelEndpointAddress        = nodeIPv4RouterIdentifiersByDatabaseId[lsp.EndNodeId],
                            SymbolicPathName                 = symbolicPathName,
                            TunnelIdentifier                 = TryGetRelPropertyAsString(lsp, "Tunnel_Identifier"),
                            ExtendedTunnelIdentifier         = TryGetRelPropertyAsString(lsp, "Extended_Tunnel_Identifier"),
                            ExtendedTunnelIdentifierTunnelId = TryGetRelPropertyAsString(lsp, "Extended_Tunnel_Identifier_tunnel_id"),
                            LspIdentifier     = TryGetRelPropertyAsString(lsp, "LSP_Identifier"),
                            ReservedBandwidth = TryGetRelProperty <long>(lsp, "Reserved_Bandwidth"),
                            Administrative    = TryGetRelProperty <bool>(lsp, "Administrative"),
                            Delegate          = TryGetRelProperty <bool>(lsp, "Delegate"),
                            Operational       = TryGetRelProperty <bool>(lsp, "Operational"),
                            Remove            = TryGetRelProperty <bool>(lsp, "Remove"),
                            Sync = TryGetRelProperty <bool>(lsp, "Sync"),
                            RecordRouteObject = TryGetRelPropertyAsArray <string>(lsp, "Record_Route_Object"),
                            FirstSeen         = TryGetRelProperty <long>(lsp, "First_Seen"),
                            LastEvent         = TryGetRelProperty <long>(lsp, "Last_Event")
                        };

                        topology.Update(child);
                    }
                    else
                    {
                        Topology.MPLS.LabelSwitchedPath.LabelSwitchedPath l = new Topology.MPLS.LabelSwitchedPath.LabelSwitchedPath(null)
                        {
                            PCC = TryGetRelPropertyAsString(lsp, "PCC"),
                            IPv4TunnelSenderAddress          = nodeIPv4RouterIdentifiersByDatabaseId[lsp.StartNodeId],
                            IPv4TunnelEndpointAddress        = nodeIPv4RouterIdentifiersByDatabaseId[lsp.EndNodeId],
                            SymbolicPathName                 = symbolicPathName,
                            TunnelIdentifier                 = TryGetRelPropertyAsString(lsp, "Tunnel_Identifier"),
                            ExtendedTunnelIdentifier         = TryGetRelPropertyAsString(lsp, "Extended_Tunnel_Identifier"),
                            ExtendedTunnelIdentifierTunnelId = TryGetRelPropertyAsString(lsp, "Extended_Tunnel_Identifier_tunnel_id"),
                            LspIdentifier     = TryGetRelPropertyAsString(lsp, "LSP_Identifier"),
                            ReservedBandwidth = TryGetRelProperty <long>(lsp, "Reserved_Bandwidth"),
                            Administrative    = TryGetRelProperty <bool>(lsp, "Administrative"),
                            Delegate          = TryGetRelProperty <bool>(lsp, "Delegate"),
                            Operational       = TryGetRelProperty <bool>(lsp, "Operational"),
                            Remove            = TryGetRelProperty <bool>(lsp, "Remove"),
                            Sync = TryGetRelProperty <bool>(lsp, "Sync"),
                            RecordRouteObject = TryGetRelPropertyAsArray <string>(lsp, "Record_Route_Object"),
                            FirstSeen         = TryGetRelProperty <long>(lsp, "First_Seen"),
                            LastEvent         = TryGetRelProperty <long>(lsp, "Last_Event")
                        };

                        topology.Update(l);
                    }
                }
            }

            return(topology);
        }
        // With Iterate Node
        public IntentJob(string fileName, string intentCode, int period, DateTime validBefore, bool requiresIteration, Topology.Node.Node iterateNode)
        {
            this.FileName         = fileName;
            this.Base64IntentCode = Base64Encode(intentCode);
            this.Period           = period;
            this.ValidBefore      = validBefore;

            this.Due = DateTime.Now;

            this.RequiresIteration = requiresIteration;

            this.IterateNode = iterateNode;
        }