2 * Copyright (c) 2014 Cisco Systems, Inc. and others. All rights reserved.
4 * This program and the accompanying materials are made available under the
5 * terms of the Eclipse Public License v1.0 which accompanies this distribution,
6 * and is available at http://www.eclipse.org/legal/epl-v10.html
9 package org.opendaylight.protocol.pcep.pcc.mock.protocol;
11 import java.util.Random;
12 import org.opendaylight.protocol.pcep.PCEPSession;
13 import org.opendaylight.protocol.pcep.PCEPSessionListener;
14 import org.opendaylight.protocol.pcep.PCEPTerminationReason;
15 import org.opendaylight.protocol.pcep.pcc.mock.api.PCCSession;
16 import org.opendaylight.protocol.pcep.pcc.mock.api.PCCTunnelManager;
17 import org.opendaylight.protocol.pcep.pcc.mock.spi.MsgBuilderUtil;
18 import org.opendaylight.protocol.pcep.spi.PCEPErrors;
19 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.crabbe.initiated.rev171025.Pcinitiate;
20 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev171025.Pcrpt;
21 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev171025.Pcupd;
22 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev171025.pcupd.message.pcupd.message.Updates;
23 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.ietf.stateful.rev171025.srp.object.Srp;
24 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.message.rev131007.Pcerr;
25 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.Message;
26 import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.pcep.types.rev131005.open.object.open.Tlvs;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
30 public final class PCCSessionListener implements PCEPSessionListener, PCCSession {
32 private static final Logger LOG = LoggerFactory.getLogger(PCCSessionListener.class);
34 private final boolean errorMode;
35 private final PCCTunnelManager tunnelManager;
36 private final int sessionId;
37 private PCEPSession session;
39 public PCCSessionListener(final int sessionId, final PCCTunnelManager tunnelManager, final boolean errorMode) {
40 this.errorMode = errorMode;
41 this.tunnelManager = tunnelManager;
42 this.sessionId = sessionId;
46 public void onMessage(final PCEPSession session, final Message message) {
47 LOG.trace("Received message: {}", message);
49 //random error message
50 session.sendMessage(createErrorMessage(message));
53 if (message instanceof Pcupd) {
54 final Updates upd = ((Pcupd) message).getPcupdMessage().getUpdates().get(0);
55 this.tunnelManager.onMessagePcupd(upd, this);
56 } else if (message instanceof Pcinitiate) {
57 this.tunnelManager.onMessagePcInitiate(((Pcinitiate) message).getPcinitiateMessage().getRequests().get(0), this);
62 public void onSessionUp(final PCEPSession session) {
63 LOG.debug("Session up.");
64 this.session = session;
65 this.tunnelManager.onSessionUp(this);
69 public void onSessionDown(final PCEPSession session, final Exception e) {
70 LOG.info("Session down with cause : {} or exception: {}", e.getCause(), e, e);
71 this.tunnelManager.onSessionDown(this);
74 } catch (Exception ie) {
75 LOG.warn("Error closing session", ie);
80 public void onSessionTerminated(final PCEPSession session, final PCEPTerminationReason cause) {
81 LOG.info("Session terminated. Cause : {}", cause.toString());
85 public void sendReport(final Pcrpt reportMessage) {
86 this.session.sendMessage(reportMessage);
90 public void sendError(final Pcerr errorMessage) {
91 this.session.sendMessage(errorMessage);
96 return this.sessionId;
100 public Tlvs getRemoteTlvs() {
101 return this.session.getRemoteTlvs();
105 public Tlvs localSessionCharacteristics() {
106 return this.session.localSessionCharacteristics();
109 private final Random rnd = new Random();
111 private PCEPErrors getRandomError() {
112 return PCEPErrors.values()[this.rnd.nextInt(PCEPErrors.values().length)];
115 private Pcerr createErrorMessage(final Message message) {
117 if (message instanceof Pcupd) {
118 srp = ((Pcupd) message).getPcupdMessage().getUpdates().get(0).getSrp();
120 srp = ((Pcinitiate) message).getPcinitiateMessage().getRequests().get(0).getSrp();
122 return MsgBuilderUtil.createErrorMsg(getRandomError(), srp.getOperationId().getValue());