1 # Copyright 2016 ZTE Corporation.
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
19 from lcm.ns.sfcs.utils import get_fp_model_by_fp_inst_id
20 from lcm.pub.database.models import FPInstModel, NfInstModel, CPInstModel, PortInstModel, VNFCInstModel
21 from lcm.pub.msapi import extsys
22 from lcm.pub.msapi import sdncdriver
24 logger = logging.getLogger(__name__)
27 class CreatePortPairGroup(object):
28 def __init__(self, data):
29 self.fp_inst_id = data["fpinstid"]
30 self.ns_model_data = data["ns_model_data"]
31 self.ns_inst_id = data["nsinstid"]
32 self.fp_model = get_fp_model_by_fp_inst_id(self.ns_model_data,
34 self.port_pair_groups = []
35 self.port_pair_group_db_infos = []
36 self.sdncontrollerid = ""
39 logger.info("CreatePortPairGroup start")
40 self.init_port_pair_group(self.fp_model)
41 self.create_port_pair_and_groups()
42 self.save_port_pair_group_info_2_db()
43 logger.info("CreatePortPairGroup end")
45 def create_port_pair_and_groups(self):
46 for port_pair_group_info in self.port_pair_groups:
47 port_pairs_info = port_pair_group_info.get("portpair")
49 for port_pair_info in port_pairs_info:
50 port_pair_ids.append(self.create_port_pair(port_pair_info))
51 self.create_port_pair_and_group(port_pair_ids)
53 def save_port_pair_group_info_2_db(self):
54 logger.info("portpairgroups in fpinstmodel:%s" % self.port_pair_group_db_infos)
55 FPInstModel.objects.filter(fpinstid=self.fp_inst_id).update(
56 portpairgroups=json.JSONEncoder().encode(self.port_pair_group_db_infos))
58 def create_port_pair_and_group(self, port_pair_ids):
59 # url = const.port_pair_group_url
61 "sdnControllerId": self.sdncontrollerid,
62 "url": extsys.get_sdn_controller_by_id(self.sdncontrollerid)["url"],
63 "portPairs": port_pair_ids
65 port_pair_group_id = sdncdriver.create_port_pair_group(port_pair_group)
66 port_pair_group_info = {
67 "groupid": port_pair_group_id,
68 "portpair": port_pair_ids}
70 self.port_pair_group_db_infos.append(port_pair_group_info)
72 def create_port_pair(self, port_pair_info):
73 # url = const.port_pair_url
74 port_pair_info.update({
75 "sdnControllerId": self.sdncontrollerid,
76 "url": extsys.get_sdn_controller_by_id(self.sdncontrollerid)["url"]})
77 return sdncdriver.create_port_pair(port_pair_info)
79 def init_port_pair_group(self, fp_model):
80 forwarder_list = fp_model["forwarder_list"]
81 self.sdncontrollerid = FPInstModel.objects.filter(fpinstid=self.fp_inst_id).get().sdncontrollerid
83 while index < len(forwarder_list):
84 if (forwarder_list[index]["type"] == "cp"):
85 index += self.generate_port_pair_group_cp(index, forwarder_list)
87 index += self.generate_port_pair_group_vnf(index, forwarder_list)
90 logger.info("port pair group: %s" % self.port_pair_groups)
92 def generate_port_pair_group_cp(self, index, forwarder_list):
93 cur_forwarder = forwarder_list[index]["node_name"]
94 cur_cp_model_info = self.get_cp_model_info_by_cpid(cur_forwarder)
95 if (index < len(forwarder_list) - 1 and forwarder_list[index + 1]["type"] == "cp"):
96 next_forward = forwarder_list[index + 1]["node_name"]
97 next_cp_model_info = self.get_cp_model_info_by_cpid(next_forward)
98 if (cur_cp_model_info["pnf_id"] == next_cp_model_info["pnf_id"]): # same port pair group
99 self.generate_port_pair_group_type_cp(cur_cp_model_info, next_cp_model_info)
101 self.generate_port_pair_group_type_cp(cur_cp_model_info, cur_cp_model_info)
104 def generate_port_pair_group_vnf(self, index, forwarder_list):
106 cur_vnf_id = forwarder_list[index]["node_name"]
107 cur_forwarder = forwarder_list[index]["capability"]
108 self.vnf_model_in_ns_info = self.get_vnf_model_info_by_vnf_id(cur_vnf_id)
109 vnf_inst_database_info = NfInstModel.objects.filter(vnf_id=self.vnf_model_in_ns_info["vnf_id"],
110 ns_inst_id=self.ns_inst_id).get()
111 self.vnf_inst_database_info = vnf_inst_database_info
112 logger.info("VNFD MODEL : %s" % vnf_inst_database_info.vnfd_model)
113 vnfd_model_info = json.loads(vnf_inst_database_info.vnfd_model)
114 # vnfd_model_info = json.dumps(vnf_inst_database_info.vnfd_model)
115 # vnfd_model_info = json.dumps(self.vnf_inst_database_info.vnfd_model)
116 self.vnfd_model_info = vnfd_model_info
117 logger.info("forward list: %s" % forwarder_list)
118 logger.info("current fowarder : %s" % cur_forwarder)
119 cpd_id = self.get_cpdid_info_forwarder(vnfd_model_info, cur_forwarder)
120 self.cp_model_in_vnf = self.get_cp_from_vnfd_model(cpd_id)
121 vnfc_inst_infos = VNFCInstModel.objects.filter(nfinstid=vnf_inst_database_info.nfinstid)
122 if not vnfc_inst_infos:
123 logger.error("VNFCInstModel is None")
125 logger.info("vnfc instance id: %s" % vnfc_inst_infos.get().vnfcinstanceid)
126 logger.info("cpd id: %s" % cpd_id)
128 for vnfc_inst_info in vnfc_inst_infos:
129 cp_db_info = CPInstModel.objects.filter(cpdid=cpd_id,
130 # ownertype=OWNER_TYPE.VNF,
132 ownerid=vnfc_inst_info.vnfcinstanceid).get()
134 cp_inst_infos.append(cp_db_info)
135 if not cp_inst_infos:
136 logger.error("CPInstModel is None")
138 logger.info("cp info : %s" % cp_inst_infos)
140 if (index < len(forwarder_list) - 1 and forwarder_list[index + 1]["type"] == "vnf"):
141 next_vnf_id = forwarder_list[index + 1]["node_name"]
142 if (cur_vnf_id != next_vnf_id):
143 for cp_inst_info in cp_inst_infos:
144 port_pairs.append(self.generate_port_pair_group(cp_inst_info, cp_inst_info))
146 next_forwarder = forwarder_list[index]["capability"]
147 next_forwarder_cpd_id = self.get_cpdid_info_forwarder(vnfd_model_info, next_forwarder)
149 vnfc_inst_infos = VNFCInstModel.objects.filter(nfinstid=vnf_inst_database_info.nfinstid)
151 if not vnfc_inst_infos:
152 logger.error("VNFCInstModel is None")
154 next_cp_inst_infos = []
155 for vnfc_inst_info in vnfc_inst_infos:
156 next_cp_db_info = CPInstModel.objects.filter(cpdid=next_forwarder_cpd_id,
157 # ownertype=OWNER_TYPE.VNF,
159 ownerid=vnfc_inst_info.vnfcinstanceid).get()
161 next_cp_inst_infos.append(next_cp_db_info)
163 port_pairs.append(self.generate_port_pair_group(cp_inst_infos[0], next_cp_inst_infos[0]))
167 for cp_inst_info in cp_inst_infos:
168 port_pairs.append(self.generate_port_pair_group(cp_inst_info, cp_inst_info))
169 self.port_pair_groups.append(
171 "portpair": port_pairs
176 def generate_port_pair_group_type_cp(self, ingress_cp_model_info, egress_cp_model_info):
178 request_reclassification = False
181 if ingress_cp_model_info["pnf_id"] == "":
184 pnf_model_info = self.get_pnf_model_info_by_cpid(ingress_cp_model_info["pnf_id"])
185 sf_type = "pnf_" + pnf_model_info["properties"]["pnf_type"]
186 nsh_aware = pnf_model_info["properties"]["nsh_aware"]
187 request_reclassification = pnf_model_info["properties"]["request_reclassification"]
188 sf_param = pnf_model_info["properties"]
189 sf_param["mng-address"] = pnf_model_info["properties"]["management_address"]
192 "nshAware": nsh_aware,
193 "requestReclassification": request_reclassification,
195 "encapsulation": ingress_cp_model_info["properties"]["sfc_encapsulation"],
196 "ip": ingress_cp_model_info["properties"]["ip_address"],
197 "mac": ingress_cp_model_info["properties"]["mac_address"],
198 "portName": ingress_cp_model_info["properties"].get("interface_name")
201 "encapsulation": egress_cp_model_info["properties"]["sfc_encapsulation"],
202 "ip": egress_cp_model_info["properties"]["ip_address"],
203 "mac": egress_cp_model_info["properties"]["mac_address"],
204 "portName": egress_cp_model_info["properties"].get("interface_name")
208 self.port_pair_groups.append(
210 "portpair": [port_pair_info]
214 def generate_port_pair_group(self, ingress_cp_inst_info, egress_cp_inst_info):
215 if (ingress_cp_inst_info.relatedport != ""):
216 ingress_port = ingress_cp_inst_info.relatedport
218 ingress_port = CPInstModel.objects.filter(cpinstanceid=ingress_cp_inst_info.relatedcp,
220 ownerid=self.vnf_inst_database_info.nfinstid).get().relatedport
221 if (egress_cp_inst_info.relatedport != ""):
222 egress_port = egress_cp_inst_info.relatedport
224 egress_port = CPInstModel.objects.filter(cpinstanceid=egress_cp_inst_info.relatedcp,
226 ownerid=self.vnf_inst_database_info.nfinstid).get().relatedport
227 ingress_port_inst_info = PortInstModel.objects.filter(portid=ingress_port).get()
228 egress_port_inst_info = PortInstModel.objects.filter(portid=egress_port).get()
231 "sfType": "vnf_" + self.vnf_model_in_ns_info["properties"]["vnf_type"],
232 "nshAware": self.vnf_model_in_ns_info["properties"]["nsh_aware"],
233 "requestReclassification": self.vnf_model_in_ns_info["properties"]["request_reclassification"],
235 "encapsulation": ingress_port_inst_info.sfcencapsulation,
236 "ip": ingress_port_inst_info.ipaddress,
237 "mac": ingress_port_inst_info.macaddress
240 "encapsulation": egress_port_inst_info.sfcencapsulation,
241 "ip": egress_port_inst_info.ipaddress,
242 "mac": egress_port_inst_info.macaddress
244 "sfParam": self.vnf_model_in_ns_info["properties"]
246 return port_pair_info
248 def get_cp_from_vnfd_model(self, cpdid):
249 for cp_model in self.vnfd_model_info["cps"]:
250 if cp_model["cp_id"] == cpdid:
253 def get_pnf_model_info_by_cpid(self, pnfid):
254 for pnf_model_info in self.ns_model_data["pnfs"]:
255 if (pnf_model_info["pnf_id"] == pnfid):
256 return pnf_model_info
258 def get_cp_model_info_by_cpid(self, cpid):
259 for cp_model_info in self.ns_model_data["cps"]:
260 if (cp_model_info["cp_id"] == cpid):
263 def get_vnf_model_info_by_vnf_id(self, vnfid):
264 for vnf_model_info in self.ns_model_data["vnfs"]:
265 if (vnf_model_info["vnf_id"] == vnfid):
266 return vnf_model_info
268 def get_cpdid_info_forwarder(self, vnf_model, forwarder):
269 logger.info("vnf_exposed %s" % type(vnf_model))
270 # logger.info("vnf_exposed %s" % json.loads(vnf_model))
271 # vnf_model = json.loads(vnf_model)
272 logger.info("vnf_exposed %s" % type(vnf_model["vnf_exposed"]))
273 logger.info("vnf_exposed %s" % vnf_model["vnf_exposed"])
274 logger.info("foward_cps %s" % vnf_model["vnf_exposed"]["forward_cps"])
275 for forwarder_info in vnf_model["vnf_exposed"]["forward_cps"]:
276 if (forwarder_info["key_name"] == forwarder):
277 return forwarder_info["cp_id"]