16 package org.openkilda.pce.provider;
35 import org.apache.commons.lang3.tuple.Pair;
36 import org.neo4j.driver.v1.AccessMode;
37 import org.neo4j.driver.v1.Driver;
38 import org.neo4j.driver.v1.Record;
39 import org.neo4j.driver.v1.Session;
40 import org.neo4j.driver.v1.StatementResult;
41 import org.neo4j.driver.v1.Value;
42 import org.neo4j.driver.v1.Values;
43 import org.neo4j.driver.v1.exceptions.ClientException;
44 import org.neo4j.driver.v1.exceptions.TransientException;
45 import org.slf4j.Logger;
46 import org.slf4j.LoggerFactory;
48 import java.util.ArrayList;
49 import java.util.LinkedList;
50 import java.util.List;
54 private static final Logger logger = LoggerFactory.getLogger(
NeoDriver.class);
56 private final Driver driver;
69 return getPath(flow, network, strategy);
80 List<PathNode> forwardNodes =
new LinkedList<>();
81 List<PathNode> reverseNodes =
new LinkedList<>();
83 if (!flow.isOneSwitchFlow()) {
85 Pair<LinkedList<SimpleIsl>, LinkedList<SimpleIsl>> biPath = getPathFromNetwork(flow, network, strategy);
86 if (biPath.getLeft().size() == 0 || biPath.getRight().size() == 0) {
91 LinkedList<SimpleIsl> forwardIsl = biPath.getLeft();
93 latency += isl.getLatency();
94 forwardNodes.add(
new PathNode(isl.getSrcDpid(), isl.getSrcPort(),
95 seqId++, (long) isl.getLatency()));
96 forwardNodes.add(
new PathNode(isl.getDstDpid(), isl.getDstPort(), seqId++, 0L));
100 LinkedList<SimpleIsl> reverseIsl = biPath.getRight();
102 reverseNodes.add(
new PathNode(isl.getSrcDpid(), isl.getSrcPort(),
103 seqId++, (long) isl.getLatency()));
104 reverseNodes.add(
new PathNode(isl.getDstDpid(), isl.getDstPort(), seqId++, 0L));
107 }
catch (TransientException e) {
109 }
catch (ClientException e) {
113 logger.info(
"No path computation for one-switch flow");
122 private Pair<LinkedList<SimpleIsl>, LinkedList<SimpleIsl>> getPathFromNetwork(
Flow flow,
AvailableNetwork network,
129 flow.getSourceSwitch(), flow.getDestinationSwitch(), 35);
131 flow.getDestinationSwitch(), flow.getSourceSwitch(), 35);
133 LinkedList<SimpleIsl> forwardPath = forward.
getPath();
134 LinkedList<SimpleIsl> reversePath = reverse.getPath(forwardPath);
138 Pair<LinkedList<SimpleIsl>, LinkedList<SimpleIsl>>
path = Pair.of(forwardPath, reversePath);
149 List<FlowInfo> flows =
new ArrayList<>();
150 String subject =
"MATCH (:switch)-[f:flow]->(:switch) " 151 +
"RETURN f.flowid as flow_id, " 152 +
" f.cookie as cookie, " 153 +
" f.meter_id as meter_id, " 154 +
" f.transit_vlan as transit_vlan, " 155 +
" f.src_switch as src_switch";
157 try (Session session = driver.session(AccessMode.READ)) {
158 StatementResult
result = session.run(subject);
160 for (Record record :
result.list()) {
162 .setFlowId(record.get(
"flow_id").asString())
163 .setSrcSwitchId(record.get(
"src_switch").asString())
164 .setCookie(record.get(
"cookie").asLong())
165 .setMeterId(safeAsInt(record.get(
"meter_id")))
176 List<Flow> found =
getFlows(flowId);
177 return found.size() > 0 ? found : null;
182 String where =
"WHERE f.flowid= $flow_id ";
183 Value parameters = Values.parameters(
"flow_id", flowId);
184 return loadFlows(where, parameters);
189 String noWhere =
" ";
190 return loadFlows(noWhere, null);
194 private List<Flow> loadFlows(String whereClause, Value parameters) {
196 "MATCH (:switch)-[f:flow]->(:switch) " 198 +
"RETURN f.flowid as flowid, " 199 +
"f.bandwidth as bandwidth, " 200 +
"f.ignore_bandwidth as ignore_bandwidth, " 201 +
"f.cookie as cookie, " 202 +
"f.description as description, " 203 +
"f.last_updated as last_updated, " 204 +
"f.src_switch as src_switch, " 205 +
"f.dst_switch as dst_switch, " 206 +
"f.src_port as src_port, " 207 +
"f.dst_port as dst_port, " 208 +
"f.src_vlan as src_vlan, " 209 +
"f.dst_vlan as dst_vlan, " 210 +
"f.flowpath as path, " 211 +
"f.meter_id as meter_id, " 212 +
"f.transit_vlan as transit_vlan";
214 logger.debug(
"Executing getFlows Query: {}", q);
216 try (Session session = driver.session(AccessMode.READ)) {
217 StatementResult queryResults = session.run(q, parameters);
218 List<Flow> results =
new ArrayList<>();
219 for (Record record : queryResults.list()) {
221 results.add(adapter.
getFlow());
232 +
"sw.name as name, " 233 +
"sw.address as address, " 234 +
"sw.hostname as hostname, " 235 +
"sw.description as description, " 236 +
"sw.controller as controller, " 237 +
"sw.state as state " 238 +
"order by sw.name";
239 logger.debug(
"Executing getSwitches Query: {}", q);
241 List<SwitchInfoData> results =
new LinkedList<>();
242 try (Session session = driver.session(AccessMode.READ)) {
243 StatementResult queryResults = session.run(q);
244 for (Record record : queryResults.list()) {
246 sw.
setAddress(record.get(
"address").asString());
251 String
status = record.get(
"state").asString();
266 "MATCH (:switch)-[isl:isl]->(:switch) " 268 +
"isl.src_switch as src_switch, " 269 +
"isl.src_port as src_port, " 270 +
"isl.dst_switch as dst_switch, " 271 +
"isl.dst_port as dst_port, " 272 +
"isl.speed as speed, " 273 +
"isl.max_bandwidth as max_bandwidth, " 274 +
"isl.latency as latency, " 275 +
"isl.available_bandwidth as available_bandwidth, " 276 +
"isl.status as status " 277 +
"order by isl.src_switch";
279 logger.debug(
"Executing getSwitches Query: {}", q);
280 try (Session session = driver.session(AccessMode.READ)) {
282 StatementResult queryResults = session.run(q);
283 List<IslInfoData> results =
new LinkedList<>();
284 for (Record record : queryResults.list()) {
288 src.
setPortNo(safeAsInt(record.get(
"src_port")));
291 List<PathNode> pathNodes =
new ArrayList<>();
296 dst.
setPortNo(safeAsInt(record.get(
"dst_port")));
300 String
status = record.get(
"status").asString();
304 safeAsInt(record.get(
"latency")),
306 safeAsInt(record.get(
"speed")),
308 safeAsInt(record.get(
"available_bandwidth"))
void setTimestamp(long timestamp)
void setController(String controller)
LinkedList< SimpleIsl > getPath()
void setSwitchId(final SwitchId switchId)
void setPortNo(final int portNo)
List< Flow > getFlow(String flowId)
List< Flow > getFlows(String flowId)
ImmutablePair< PathInfoData, PathInfoData > getPath(Flow flow, Strategy strategy)
List< IslInfoData > getIsls()
List< SwitchInfoData > getSwitches()
void setState(final SwitchState state)
List< Flow > getAllFlows()
void setSegLatency(final long latency)
void setSwitchId(final SwitchId switchId)
AvailableNetwork removeSelfLoops()
ImmutablePair< PathInfoData, PathInfoData > getPath(Flow flow, AvailableNetwork network, Strategy strategy)
static int safeAsInt(Value val)
void setHostname(String hostname)
AvailableNetwork getAvailableNetwork(boolean ignoreBandwidth, long requestedBandwidth)
List< FlowInfo > getFlowInfo()
void setAddress(String address)
FlowInfo setTransitVlanId(int transitVlanId)
void setDescription(String description)