From afbb4cc3bb695bf85e28d37b3ffc10e92264b338 Mon Sep 17 00:00:00 2001 From: Darshan Vandra Date: Thu, 31 Jan 2019 18:32:58 +0530 Subject: [PATCH] workflow: add ping-mesh workflow --- statics/js/components/workflow.js | 2 +- statics/workflows/ping-mesh.yaml | 103 ++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 statics/workflows/ping-mesh.yaml diff --git a/statics/js/components/workflow.js b/statics/js/components/workflow.js index 12ab91129b..8e73b79fa1 100644 --- a/statics/js/components/workflow.js +++ b/statics/js/components/workflow.js @@ -17,7 +17,7 @@ Vue.component('item', {
- +
diff --git a/statics/workflows/ping-mesh.yaml b/statics/workflows/ping-mesh.yaml new file mode 100644 index 0000000000..4af51fe982 --- /dev/null +++ b/statics/workflows/ping-mesh.yaml @@ -0,0 +1,103 @@ +--- +UUID: "784c3329-0f47-449b-5c58-2d207bcfb501" +name: "Ping Mesh (ICMP/TCP/UDP)" +description: "Check Connectivity from Multiple Source to Single Destination" +parameters: + - name: protocol + description: Protocol + type: choice + default: icmp4 + values: + - description: "Protocol : ICMPv4/Echo request" + value: icmp4 + - description: "Protocol : TCP/IPv4" + value: tcp4 + - description: "Protocol : UDP/IPv4" + value: udp4 + - name: source + description: Source Nodes (Enter a Gremlin Query to select Source Nodes) + type: string + - name: destination + description: Destination Node (Select Destination Node) + type: node +source: | + function PingMesh(protocol, source, to) { + var sources = []; + var result = {}; + var From = {}; + var query = source.slice(2,) + client.gremlin.query(source).then(function(nodes) { + nodes.forEach(function(node) { + sources.push(node.Metadata.TID); + }); + }) + var capture = new Capture(); + capture.GremlinQuery = "G.V().Has('TID', '" + to + "')"; + var packetInjection = new PacketInjection(); + return client.captures.create(capture).then(function (c) { + capture = c + }).then(function () { + return sleep(1000) + }).then(function () { + sources.forEach(function(s) { + packetInjection.Src = "G.V().Has('TID', '" + s + "')" + packetInjection.Dst = "G.V().Has('TID', '" + to + "')" + packetInjection.Count = 5 + return client.G.V().Has("TID", to).then( + function (nodes) { + if (nodes[0].Metadata.Neutron && nodes[0].Metadata.Neutron.IPV4) { + packetInjection.DstIP = nodes[0].Metadata.Neutron.IPV4[0] + } + if (nodes[0].Metadata.ExtID && nodes[0].Metadata.ExtID["attached-mac"]) { + packetInjection.DstMAC = nodes[0].Metadata.ExtID["attached-mac"] + } + if (protocol == "icmp4") { + packetInjection.Type = protocol; + packetInjection.ICMPID = Math.floor(Math.random() * 65535); + } + if (protocol == "tcp4" || protocol == "udp4") { + packetInjection.Type = protocol; + packetInjection.SrcPort = 1024 + Math.floor(Math.random() * (65535-1024)); + packetInjection.DstPort = 1024 + Math.floor(Math.random() * (65535-1024)); + } + }).then(function () { + return client.G.V().Has("TID", s) + }).then(function (nodes) { + if (nodes[0].Metadata.Neutron && nodes[0].Metadata.Neutron.IPV4) { + packetInjection.SrcIP = nodes[0].Metadata.Neutron.IPV4[0] + } + if (nodes[0].Metadata.ExtID && nodes[0].Metadata.ExtID["attached-mac"]) { + packetInjection.SrcMAC = nodes[0].Metadata.ExtID["attached-mac"] + } else { + packetInjection.SrcIP = nodes[0].Metadata.IPV4[0] + } + From[s] = packetInjection; + From[s].SrcIP = From[s].SrcIP.split("/")[0] + return client.packetInjections.create(packetInjection) + }) + }); + }).then(function () { + return sleep(1000) + }).then(function () { + sources.forEach(function(s) { + if (protocol == "icmp4") { + client.G.Flows().Has("ICMP.ID", From[s].ICMPID, "Network.A", From[s].SrcIP).then(function(flows) { + result[s] = {"Connected" : flows.length > 0 && flows[0].Metric.ABPackets > 0, "Replied" : flows.length > 0 && flows[0].Metric.BAPackets > 0}; + return result + }) + } else { + transport_protocol = protocol.toUpperCase().split(4)[0]; + client.G.Flows().Has("Transport.A", From[s].SrcPort, "Transport.B", From[s].DstPort, "Transport.Protocol", transport_protocol, "Network.A", From[s].SrcIP).then(function(flows) { + result[s] = {"Connected" : flows.length > 0 && flows[0].Metric.ABPackets > 0, "Replied" : flows.length > 0 && flows[0].Metric.BAPackets > 0}; + return result + }) + } + }); + }).then(function () { + return result + }).finally(function () { + return client.captures.delete(capture.UUID) + }).catch(function () { + return client.captures.delete(capture.UUID) + }); + }