aboutsummaryrefslogtreecommitdiffstats
path: root/GPL/traffic_profiles/trex/trex-stl-ethip6-ip6dst1000000-rnd.py
blob: a372e1ae3b2c6463fa9c7647f3dcafda6c2e796f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
# Copyright (c) 2021 Cisco and/or its affiliates.
#
# SPDX-License-Identifier: Apache-2.0 OR GPL-2.0-or-later
#
# Licensed under the Apache License 2.0 or
# GNU General Public License v2.0 or later;  you may not use this file
# except in compliance with one of these Licenses. You
# may obtain a copy of the Licenses at:
#
#     http://www.apache.org/licenses/LICENSE-2.0
#     https://www.gnu.org/licenses/old-licenses/gpl-2.0-standalone.html
#
# Note: If this file is linked with Scapy, which is GPLv2+, your use of it
# must be under GPLv2+.  If at any point in the future it is no longer linked
# with Scapy (or other GPLv2+ licensed software), you are free to choose
# Apache 2.
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

"""Stream profile for T-rex traffic generator.

Stream profile:
 - Two streams sent in directions 0 --> 1 and 1 --> 0 at the same time.
 - Packet: ETH / IPv6 /
 - Direction 0 --> 1:
   - Source IP address range:      2001:1::1
   - Destination IP address range: 2001:2::0 - 2001:2::F:423F
 - Direction 1 --> 0:
   - Source IP address range:      2001:2::1
   - Destination IP address range: 2001:1::0 - 2001:1::F:423F
"""

from trex.stl.api import *
from profile_trex_stateless_base_class import TrafficStreamsBaseClass


class TrafficStreams(TrafficStreamsBaseClass):
    """Stream profile."""

    def __init__(self):
        """Initialization and setting of streams' parameters."""

        super(TrafficStreamsBaseClass, self).__init__()

        # IPs used in packet headers.
        self.p1_src_start_ip = u"2001:1::1"
        self.p1_dst_start_ip = u"2001:2::0"
        self.p1_dst_end_ip = u"2001:2::F:423F"

        self.p2_src_start_ip = u"2001:2::1"
        self.p2_dst_start_ip = u"2001:1::0"
        self.p2_dst_end_ip = u"2001:1::F:423F"

    def define_packets(self):
        """Defines the packets to be sent from the traffic generator.

        Packet definition: | ETH | IPv6 |

        :returns: Packets to be sent from the traffic generator.
        :rtype: tuple
        """

        base_p1, count_p1 = self._get_start_end_ipv6(
            self.p1_dst_start_ip,
            self.p1_dst_end_ip
        )
        base_p2, count_p2 = self._get_start_end_ipv6(
            self.p2_dst_start_ip,
            self.p2_dst_end_ip
        )

        # Direction 0 --> 1
        base_pkt_a = (
            Ether() /
            IPv6(
                src=self.p1_src_start_ip,
                dst=self.p1_dst_start_ip
            )
        )
        # Direction 1 --> 0
        base_pkt_b = (
            Ether() /
            IPv6(
                src=self.p2_src_start_ip,
                dst=self.p2_dst_start_ip
            )
        )

        # Direction 0 --> 1
        vm1 = STLScVmRaw(
            [
                STLVmFlowVarRepeatableRandom(
                    name=u"ipv6_dst",
                    min_value=base_p1,
                    max_value=base_p1 + count_p1,
                    size=8,
                    seed=1,
                    # Cycle length. TRex does not allow any higher value.
                    limit=(2**24 - 1)
                ),
                STLVmWrFlowVar(
                    fv_name=u"ipv6_dst",
                    pkt_offset=u"IPv6.dst",
                    offset_fixup=8
                )
            ]
        )
        # Direction 1 --> 0
        vm2 = STLScVmRaw(
            [
                STLVmFlowVarRepeatableRandom(
                    name=u"ipv6_dst",
                    min_value=base_p2,
                    max_value=base_p2 + count_p2,
                    size=8,
                    seed=2,
                    limit=(2**24 - 1)
                ),
                STLVmWrFlowVar(
                    fv_name=u"ipv6_dst",
                    pkt_offset=u"IPv6.dst",
                    offset_fixup=8
                )
            ]
        )

        return base_pkt_a, base_pkt_b, vm1, vm2


def register():
    """Register this traffic profile to T-rex.

    Do not change this function.

    :return: Traffic streams.
    :rtype: Object
    """
    return TrafficStreams()
lass="nb">echo "No more VIRL candidate hosts available, failing." exit 127 fi element=$[ $RANDOM % $num_hosts ] virl_server_candidate=${VIRL_SERVERS[$element]} virl_server_status=$(ssh ${SSH_OPTIONS} ${VIRL_USERNAME}@${virl_server_candidate} cat $VIRL_SERVER_STATUS_FILE 2>&1) echo VIRL HOST $virl_server_candidate status is \"$virl_server_status\" if [ "$virl_server_status" == "$VIRL_SERVER_EXPECTED_STATUS" ] then # Candidate is in good status. Select this server. VIRL_SERVER="$virl_server_candidate" else # Candidate is in bad status. Remove from array. VIRL_SERVERS=("${VIRL_SERVERS[@]:0:$element}" "${VIRL_SERVERS[@]:$[$element+1]}") fi done SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" # Download VPP and HC packages from the current branch echo Downloading packages... bash ${SCRIPT_DIR}/resources/tools/scripts/download_hc_pkgs.sh ${STREAM} ${OS} if [ "${OS}" == "centos7" ]; then VPP_PKGS=(*.rpm) else VPP_PKGS=(*.deb) fi echo ${VPP_PKGS[@]} VIRL_DIR_LOC="/tmp" VPP_PKGS_FULL=(${VPP_PKGS[@]}) # Prepend directory location at remote host to package file list for index in "${!VPP_PKGS_FULL[@]}"; do VPP_PKGS_FULL[${index}]=${VIRL_DIR_LOC}/${VPP_PKGS_FULL[${index}]} done echo "Updated file names: " ${VPP_PKGS_FULL[@]} cat ${VIRL_PKEY} # Copy the files to VIRL hosts DONE="" for index in "${!VIRL_SERVER[@]}"; do # Do not copy files in case they have already been copied to the VIRL host [[ "${DONE[@]}" =~ "${VIRL_SERVER[${index}]}" ]] && copy=0 || copy=1 if [ "${copy}" -eq "0" ]; then echo "files have already been copied to the VIRL host ${VIRL_SERVER[${index}]}" else if [ "${OS}" == "centos7" ]; then scp ${SSH_OPTIONS} *.rpm \ ${VIRL_USERNAME}@${VIRL_SERVER[${index}]}:${VIRL_DIR_LOC}/ else scp ${SSH_OPTIONS} *.deb \ ${VIRL_USERNAME}@${VIRL_SERVER[${index}]}:${VIRL_DIR_LOC}/ fi result=$? if [ "${result}" -ne "0" ]; then echo "Failed to copy files to VIRL host ${VIRL_SERVER[${index}]}" echo ${result} exit ${result} else echo "files successfully copied to the VIRL host ${VIRL_SERVER[${index}]}" fi DONE+=(${VIRL_SERVER[${index}]}) fi done # Start a simulation on VIRL server echo "Starting simulation on VIRL server" function stop_virl_simulation { ssh ${SSH_OPTIONS} ${VIRL_USERNAME}@${VIRL_SERVER}\ "stop-testcase ${VIRL_SID}" } VIRL_SID=$(ssh ${SSH_OPTIONS} \ ${VIRL_USERNAME}@${VIRL_SERVER} \ "start-testcase -c ${VIRL_TOPOLOGY} -r ${VIRL_RELEASE} ${VPP_PKGS_FULL[@]}") retval=$? if [ "${retval}" -ne "0" ]; then echo "VIRL simulation start failed" exit ${retval} fi if [[ ! "${VIRL_SID}" =~ session-[a-zA-Z0-9_]{6} ]]; then echo "No VIRL session ID reported." exit 127 fi # Upon script exit, cleanup the simulation execution trap stop_virl_simulation EXIT echo ${VIRL_SID} ssh_do ${VIRL_USERNAME}@${VIRL_SERVER} cat /scratch/${VIRL_SID}/topology.yaml # Download the topology file from virl session scp ${SSH_OPTIONS} \ ${VIRL_USERNAME}@${VIRL_SERVER}:/scratch/${VIRL_SID}/topology.yaml \ topologies/enabled/topology.yaml retval=$? if [ "${retval}" -ne "0" ]; then echo "Failed to copy topology file from VIRL simulation" exit ${retval} fi virtualenv --system-site-packages env . env/bin/activate echo pip install pip install -r ${SCRIPT_DIR}/requirements.txt pykwalify -s ${SCRIPT_DIR}/resources/topology_schemas/3_node_topology.sch.yaml \ -s ${SCRIPT_DIR}/resources/topology_schemas/topology.sch.yaml \ -d ${SCRIPT_DIR}/topologies/enabled/topology.yaml \ -vvv if [ "$?" -ne "0" ]; then echo "Topology schema validation failed." echo "However, the tests will start." fi # TODO(CSIT-994): reenable NSH PYTHONPATH=`pwd` pybot -L TRACE -W 136\ -v TOPOLOGY_PATH:${SCRIPT_DIR}/topologies/enabled/topology.yaml \ --suite "tests.honeycomb.func" \ --include HC_FUNC \ --exclude hc_nshORhc_rest_only \ --noncritical EXPECTED_FAILING \ --variable HC_ODL:${ODL} \ tests/ RETURN_STATUS=$? # Get Honeycomb log file from virl host scp ${SSH_OPTIONS} \ ${VIRL_USERNAME}@${VIRL_SERVER}:/scratch/${VIRL_SID}/honeycomb.log . || true # Get ODL karaf log file from virl host scp ${SSH_OPTIONS} \ ${VIRL_USERNAME}@${VIRL_SERVER}:/scratch/${VIRL_SID}/karaf.log . || true # Archive JOB artifacts in jenkins for i in ${JOB_ARCHIVE_ARTIFACTS[@]}; do cp $( readlink -f ${i} | tr '\n' ' ' ) ${JOB_ARCHIVE_DIR}/ done # Archive JOB artifacts to logs.fd.io for i in ${LOG_ARCHIVE_ARTIFACTS[@]}; do cp $( readlink -f ${i} | tr '\n' ' ' ) ${LOG_ARCHIVE_DIR}/ done exit ${RETURN_STATUS}