aboutsummaryrefslogtreecommitdiff
path: root/libarcfire.py
blob: 60bce47efa8e6aa3bb8a4df3b3d8b9e440692c61 (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
#
# A library to manage ARCFIRE experiments
#

# Base class for DIFs
#
# @name [string] DIF name
# @members [iterable] Nodes belonging to the DIF
#
class DIF:
    def __init__(self, name, members):
        self.name = name
        self.members = dict()
        if members != None:
            for m in members:
                self.members[m] = m

    def __repr__(self):
        return "%s: %s" % (self.name, str(sorted(self.members)))

    def node_add(node_name):
        self.members[node_name] = node_name

    def node_del(node_name):
        del self.members[node_name]


# Shim over Ethernet
#
# @link_speed [int] Speed of the Ethernet network, in Mbps
#
class ShimEthDIF(DIF):
    def __init__(self, name, link_speed = 0, members = None):
        DIF.__init__(self, name, members)
        self.link_speed = int(link_speed)
        if self.link_speed < 0:
            raise ValueError("link_speed must be a non-negative number")


# A policy
#
# @component: RINA component to which the policy applies to
# @name: Name of the policy
# @parameters: A dictionary of (key, values) pairs representing policy-specific
#              parameters
class Policy:
    def __init__(self, component, name, **kwargs):
        self.component = component
        self.name = name
        self.parameters = kwargs

    def __repr__(self):
        s = "%s:%s" % (self.component, self.name)
        if self.parameters:
            s += "%s" % self.parameters
        return s


# Normal DIF
class NormalDIF(DIF):
    def __init__(self, name, members = None):
        DIF.__init__(self, name, members)
        self.policies = dict()

    def policy_add(self, policy):
        self.policies[policy.component] = policy

    def policy_del(self, component):
        del self.policies[component]

    def __repr__(self):
        s = DIF.__repr__(self)
        if self.policies:
            s += " policies=["
        for p in self.policies:
            s += "%s," % self.policies[p]
        if self.policies:
            s += "]"
        return s


# Base class for ARCFIRE experiments
#
# @name [string] Name of the experiment
#
class Experiment:
    def __init__(self, name):
        self.name = name
        self.difs = dict()

    def __repr__(self):
        s = "%s:" % self.name
        for d in self.difs:
            s += "\n    %s" % self.difs[d]

        return s

    def dif_add(self, dif):
        self.difs[dif.name] = dif

    def dif_del(self, dif_name):
        del self.difs[dif_name]

    def run(self):
        print("[experiment %s] start" % self.name)
        print("[experiment %s] end" % self.name)