Code Duplication    Length = 37-37 lines in 2 locations

lib/exabgp/reactor/api/command/announce.py 2 locations

@@ 303-339 (lines=37) @@
300
    return True
301
302
303
@Command.register('text', 'announce flow')
304
def announce_flow(self, reactor, service, line):
305
    def callback():
306
        try:
307
            descriptions, command = extract_neighbors(line)
308
            peers = match_neighbors(reactor.peers(), descriptions)
309
            if not peers:
310
                self.log_failure('no neighbor matching the command : %s' % command)
311
                reactor.processes.answer_error(service)
312
                yield True
313
                return
314
315
            changes = self.api_flow(command)
316
            if not changes:
317
                self.log_failure('command could not parse flow in : %s' % command)
318
                reactor.processes.answer_error(service)
319
                yield True
320
                return
321
322
            for change in changes:
323
                change.nlri.action = OUT.ANNOUNCE
324
                reactor.configuration.inject_change(peers, change)
325
                self.log_message(
326
                    'flow added to %s : %s' % (', '.join(peers) if peers else 'all peers', change.extensive())
327
                )
328
                yield False
329
330
            reactor.processes.answer_done(service)
331
        except ValueError:
332
            self.log_failure('issue parsing the flow')
333
            reactor.processes.answer_error(service)
334
            yield True
335
        except IndexError:
336
            self.log_failure('issue parsing the flow')
337
            reactor.processes.answer_error(service)
338
            yield True
339
340
    reactor.asynchronous.schedule(service, line, callback())
341
    return True
342
@@ 127-163 (lines=37) @@
124
    return True
125
126
127
@Command.register('text', 'announce vpls')
128
def announce_vpls(self, reactor, service, line):
129
    def callback():
130
        try:
131
            descriptions, command = extract_neighbors(line)
132
            peers = match_neighbors(reactor.peers(), descriptions)
133
            if not peers:
134
                self.log_failure('no neighbor matching the command : %s' % command)
135
                reactor.processes.answer_error(service)
136
                yield True
137
                return
138
139
            changes = self.api_vpls(command)
140
            if not changes:
141
                self.log_failure('command could not parse vpls in : %s' % command)
142
                reactor.processes.answer_error(service)
143
                yield True
144
                return
145
146
            for change in changes:
147
                change.nlri.action = OUT.ANNOUNCE
148
                reactor.configuration.inject_change(peers, change)
149
                self.log_message(
150
                    'vpls added to %s : %s' % (', '.join(peers) if peers else 'all peers', change.extensive())
151
                )
152
                yield False
153
154
            reactor.processes.answer_done(service)
155
        except ValueError:
156
            self.log_failure('issue parsing the vpls')
157
            reactor.processes.answer_error(service)
158
            yield True
159
        except IndexError:
160
            self.log_failure('issue parsing the vpls')
161
            reactor.processes.answer_error(service)
162
            yield True
163
164
    reactor.asynchronous.schedule(service, line, callback())
165
    return True
166