Passed
Push — master ( 259507...dfca6c )
by Humberto
01:30 queued 12s
created

GroupMod.__repr__()   A

Complexity

Conditions 1

Size

Total Lines 2
Code Lines 2

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 1
CRAP Score 1.125

Importance

Changes 0
Metric Value
eloc 2
dl 0
loc 2
ccs 1
cts 2
cp 0.5
rs 10
c 0
b 0
f 0
cc 1
nop 1
crap 1.125
1
"""Modify Group Entry Message."""
2 1
from enum import IntEnum
3
4 1
from pyof.foundation.base import GenericMessage
5 1
from pyof.foundation.basic_types import (
6
    FixedTypeList, Pad, UBInt8, UBInt16, UBInt32)
7 1
from pyof.v0x04.common.header import Header, Type
8 1
from pyof.v0x04.controller2switch.common import Bucket
9
10 1
__all__ = ('GroupMod', 'GroupModCommand', 'GroupType', 'Group',
11
           'ListOfBuckets')
12
13
14 1
class Group(IntEnum):
15
    """Group numbering. Groups can use any number up to attr:`OFPG_MAX`."""
16
17
    #: Last usable group number.
18 1
    OFPG_MAX = 0xffffff00
19
    #: Fake groups.
20
    #: Represents all groups for group delete commands.
21 1
    OFPG_ALL = 0xfffffffc
22
    #: Wildcard group used only for flow stats requests.
23
    #  Select all flows regardless of group (including flows with no group).
24 1
    OFPG_ANY = 0xffffffff
25
26
27 1
class GroupModCommand(IntEnum):
28
    """Group commands."""
29
30
    #: New group.
31 1
    OFPGC_ADD = 0
32
    #: Modify all matching groups.
33 1
    OFPGC_MODIFY = 1
34
    #: Delete all matching groups.
35 1
    OFPGC_DELETE = 2
36
37
38 1
class GroupType(IntEnum):
39
    """Group types. Range [128, 255] is reserved for experimental use."""
40
41
    #: All (multicast/broadcast) group.
42 1
    OFPGT_ALL = 0
43
    #: Select group.
44 1
    OFPGT_SELECT = 1
45
    #: Indirect group.
46 1
    OFPGT_INDIRECT = 2
47
    #: Fast failover group.
48 1
    OFPGT_FF = 3
49
50
51 1
class ListOfBuckets(FixedTypeList):
52
    """List of buckets.
53
54
    Represented by instances of Bucket.
55
    """
56
57 1
    def __init__(self, items=None):
58
        """Create a ListOfBuckets with the optional parameters below.
59
60
        Args:
61
            items (Bucket): Instance or a list of instances.
62
        """
63 1
        super().__init__(pyof_class=Bucket, items=items)
64
65
66 1
class GroupMod(GenericMessage):
67
    """Group setup and teardown (controller -> datapath)."""
68
69 1
    header = Header(message_type=Type.OFPT_GROUP_MOD)
70 1
    command = UBInt16(enum_ref=GroupModCommand)
71 1
    group_type = UBInt8()
72
    #: Pad to 64 bits.
73 1
    pad = Pad(1)
74 1
    group_id = UBInt32()
75 1
    buckets = ListOfBuckets()
76
77 1
    def __init__(self, xid=None, command=None, group_type=None, group_id=None,
78
                 buckets=None):
79
        """Create a GroupMod with the optional parameters below.
80
81
        Args:
82
            xid (int): Header's transaction id. Defaults to random.
83
            command (GroupModCommand): One of OFPGC_*.
84
            group_type (GroupType): One of OFPGT_*.
85
            group_id (int): Group identifier.
86
            buckets (:class:`ListOfBuckets`): The length of the bucket
87
                array is inferred from the length field in the header.
88
        """
89 1
        super().__init__(xid)
90 1
        self.command = command
91 1
        self.group_type = group_type
92 1
        self.group_id = group_id
93 1
        self.buckets = buckets
94
95 1
    def __repr__(self):
96
        return (f"{type(self).__name__}(xid={self.header.xid}, {self.command},"
97
                f" group_type={self.group_type}, group_id={self.group_id},"
98
                f" buckets={self.buckets!r})")
99