19 from topologylistener
import db
20 from topologylistener
import exc
21 from topologylistener
import model
23 logger = logging.getLogger(__name__)
27 q = textwrap.dedent(
""" 28 MERGE (target:link_props { 29 src_switch: $src_switch, 32 dst_switch: $dst_switch}) 34 target.time_create=$time_create, 35 target.time_modify=$time_modify 36 ON MATCH SET target.time_modify=$time_modify""")
38 for link
in sorted(batch):
40 time_fields = [link.time_create, link.time_modify]
44 p[
'time_create'], p[
'time_modify'] = time_fields
46 logger.info(
'Ensure link property %s exists', link)
47 db.log_query(
'create link props', q, p)
52 db_subject =
fetch(tx, subject)
53 return model.LinkProps.new_from_db(db_subject)
57 logger.info(
"Delete %s request", subject)
58 q = textwrap.dedent(
""" 59 MATCH (target:link_props) 60 WHERE target.src_switch=$src_switch, 61 AND target.src_port=$src_port, 62 AND target.dst_port=$dst_port, 63 AND target.dst_switch=$dst_switch 66 p = _make_match(subject)
68 db.log_query(
'delete link props', q, p)
71 db_subject = db.fetch_one(cursor)[
'target']
75 return model.LinkProps.new_from_db(db_subject)
79 logger.info(
'Delete link props by mask %s', mask)
81 p = _make_match_by_mask(mask)
84 mask,
'reject to drop all link props in DB')
86 where = [
'target.{0}=${0}'.
format(x)
for x
in p]
87 q =
'MATCH (target:link_props)\n' 89 q +=
'WHERE ' +
'\n AND '.join(where)
90 q +=
'\nRETURN target, id(target) as ref' 91 db.log_query(
'pre delete link props fetch', q, p)
95 for db_record
in tx.run(q, p):
96 persistent.append(model.LinkProps.new_from_db(db_record[
'target']))
97 refs.append(db_record[
'ref'])
99 q =
'MATCH (target:link_props)\n' 100 q +=
'WHERE id(target) in [{}]'.
format(
', '.join(str(x)
for x
in refs))
101 q +=
'\nDELETE target' 102 db.log_query(
'delete link props', q, {})
109 origin, updated_props =
set_props(tx, subject)
115 db_subject =
fetch(tx, subject)
116 origin, update = db.locate_changes(db_subject, subject.props_db_view())
118 q = textwrap.dedent(
""" 119 MATCH (target:link_props) 120 WHERE id(target)=$target_id 121 """) + db.format_set_fields(
122 db.escape_fields(update), field_prefix=
'target.')
123 p = {
'target_id': db.neo_id(db_subject)}
125 db.log_query(
'propagate link props to ISL', q, p)
128 return origin, update.keys()
139 name:
'source.' + name
for name
in fields}
140 q = textwrap.dedent(
""" 141 MATCH (source:link_props) 142 WHERE source.src_switch = $src_switch 143 AND source.src_port = $src_port 144 AND source.dst_switch = $dst_switch 145 AND source.dst_port = $dst_port 147 (:switch {name: source.src_switch}) 150 src_switch: source.src_switch, 151 src_port: source.src_port, 152 dst_switch: source.dst_switch, 153 dst_port: source.dst_port 156 (:switch {name: source.dst_switch}) 157 """) + db.format_set_fields(
158 db.escape_fields(copy_fields, raw_values=
True),
159 field_prefix=
'target.')
160 p = _make_match(subject)
161 db.log_query(
'link props to ISL', q, p)
166 p = _make_match(subject)
167 q = textwrap.dedent(
""" 168 MATCH (target:link_props { 169 src_switch: $src_switch, 171 dst_switch: $dst_switch, 172 dst_port: $dst_port}) 175 db.log_query(
'link props update', q, p)
176 cursor = tx.run(q, p)
179 db_object = db.fetch_one(cursor)[
'target']
186 def _make_match_by_mask(mask):
188 for endpoint, prefix
in (
189 (mask.source,
'src_'),
190 (mask.dest,
'dst_')):
193 match.update(_make_endpoint_match(endpoint, prefix))
195 return {k: v
for k, v
in match.items()
if v
is not None}
198 def _make_match(subject):
199 match = _make_endpoint_match(subject.source,
'src_')
200 match.update(_make_endpoint_match(subject.dest,
'dst_'))
202 masked_fields = {k
for k
in match
if match[k]
is None}
205 subject,
'Match field(s) without value: {}'.
format(
206 ', '.join(repr(x)
for x
in sorted(masked_fields))))
210 def _make_endpoint_match(endpoint, prefix):
212 prefix +
'switch': endpoint.dpid,
213 prefix +
'port': endpoint.port}
def drop_by_mask(tx, mask)
def set_props_and_propagate_to_isl(tx, subject)
def set_props(tx, subject)
def create_if_missing(tx, batch)
def push_props_to_isl(tx, subject, fields)