1 # Copyright (c) 2015 SONATA-NFV and Paderborn University
4 # Licensed under the Apache License, Version 2.0 (the "License");
5 # you may not use this file except in compliance with the License.
6 # You may obtain a copy of the License at
8 # http://www.apache.org/licenses/LICENSE-2.0
10 # Unless required by applicable law or agreed to in writing, software
11 # distributed under the License is distributed on an "AS IS" BASIS,
12 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 # See the License for the specific language governing permissions and
14 # limitations under the License.
16 # Neither the name of the SONATA-NFV, Paderborn University
17 # nor the names of its contributors may be used to endorse or promote
18 # products derived from this software without specific prior written
21 # This work has been performed in the framework of the SONATA project,
22 # funded by the European Commission under Grant number 671517 through
23 # the Horizon 2020 and 5G-PPP programmes. The authors would like to
24 # acknowledge the contributions of their colleagues of the SONATA
25 # partner consortium (www.sonata-nfv.eu).
29 class FlowClassifier(object):
30 def __init__(self
, name
):
31 self
.id = str(uuid
.uuid4())
32 self
.tenant_id
= "abcdefghijklmnopqrstuvwxyz123456"
35 self
.ethertype
= "IPv4"
37 self
.source_port_range_min
= None
38 self
.source_port_range_max
= None
39 self
.destination_port_range_min
= None
40 self
.destination_port_range_max
= None
41 self
.source_ip_prefix
= None
42 self
.destination_ip_prefix
= None
43 self
.logical_source_port
= ""
44 self
.logical_destination_port
= ""
45 self
.l7_parameters
= dict()
47 def create_dict(self
, compute
):
50 "tenant_id": self
.tenant_id
,
51 "description": self
.description
,
55 representation
["ethertype"] = self
.ethertype
57 representation
["protocol"] = self
.protocol
58 if self
.source_port_range_min
:
59 representation
["source_port_range_min"] = self
.source_port_range_min
60 if self
.source_port_range_max
:
61 representation
["source_port_range_max"] = self
.source_port_range_max
62 if self
.destination_port_range_min
:
63 representation
["destination_port_range_min"] = self
.destination_port_range_min
64 if self
.destination_port_range_max
:
65 representation
["destination_port_range_max"] = self
.destination_port_range_max
66 if self
.source_ip_prefix
:
67 representation
["source_ip_prefix"] = self
.source_ip_prefix
68 if self
.destination_ip_prefix
:
69 representation
["destination_ip_prefix"] = self
.destination_ip_prefix
70 if len(self
.logical_source_port
):
71 representation
["logical_source_port"] = self
.logical_source_port
72 if len(self
.logical_destination_port
):
73 representation
["logical_destination_port"] = self
.logical_destination_port
74 if len(self
.l7_parameters
.items()):
75 representation
["l7_parameters"] = self
.l7_parameters
80 def get_ether_type_id():
81 if self
.ethertype
== "IPv4":
84 raise RuntimeError("Unhandled ethertype %s" % self
.ethertype
)
86 def get_ip_protocol_id():
92 raise RuntimeError("Unhandled ip protocol %s" % self
.protocol
)
95 match
= ["dl_type=%s" % get_ether_type_id()]
97 match
.append("nw_proto=%s" % get_ip_protocol_id())
98 if self
.source_ip_prefix
:
99 match
.append("nw_src=%s" % self
.source_ip_prefix
)
100 if self
.destination_ip_prefix
:
101 match
.append("nw_dst=%s" % self
.destination_ip_prefix
)
102 if self
.destination_port_range_min
:
103 match
.append("tp_dst=%s" % self
.destination_port_range_min
)
104 return ",".join(match
)