1 # Copyright 2017-2018 Intel 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.
18 from lcm.pub.database.models import OOFDataModel
19 from lcm.pub.utils import values
21 logger = logging.getLogger(__name__)
24 class PlaceVnfs(object):
25 def __init__(self, data):
28 self.request_id = data.get("requestId")
30 def validateCallbackResponse(self):
32 logger.error("Error occurred in Homing: OOF Async Callback Response is empty")
34 if self.data.get('requestStatus') == "completed" and self.data.get("requestId"):
35 if self.data.get("solutions").get("placementSolutions") is not None:
36 self.placements = self.data.get("solutions").get("placementSolutions")
37 logger.debug("Got placement solutions in OOF Async Callback response")
40 logger.error("Error occurred in Homing: OOF Async Callback Response "
41 "does not contain placement solution")
44 if self.data.get("statusMessage"):
46 "Error occurred in Homing: Request has not been completed, the request status is %s, "
47 "the status message is %s" % (self.data.get('requestStatus'), self.data.get("statusMessage")))
50 "Error occurred in Homing: Request has not been completed, the request status is %s, "
51 % self.data.get('requestStatus'))
55 params = ["locationId", "vimId", "oof_directives", "cloudOwner"]
57 if not self.validateCallbackResponse():
58 logger.error("OOF request Failed")
59 self.update_response_to_db(self.request_id, self.data.get("requestStatus"), "none", "none",
62 if self.placements == [] or self.placements == [[]]:
63 logger.debug("No solution found for request %s " % self.request_id)
64 self.update_response_to_db(self.request_id, self.data.get("requestStatus"), "none", "none",
67 for item in self.placements:
68 if not isinstance(item, list):
69 self.update_response_to_db(self.request_id, self.data.get("requestStatus"), "none", "none",
72 for placement in item:
73 assignmentInfo = placement.get("assignmentInfo")
74 if not assignmentInfo or not placement.get("solution"):
76 "No assignment info/Solution inside Homing response for request %s"
78 self.update_response_to_db(self.request_id, self.data.get("requestStatus"), "none", "none",
81 for info in assignmentInfo:
82 if info.get("key") in params:
83 vim_info[info.get("key")] = info.get("value")
84 if not vim_info.get("oof_directives"):
85 logger.warn("Missing flavor info as no directive found in response")
86 self.update_response_to_db(self.request_id,
87 self.data.get("requestStatus"), "none", "none",
90 vduinfo = self.get_info_from_directives(
91 vim_info['oof_directives'])
93 self.update_response_to_db(self.request_id,
94 self.data.get("requestStatus"), "none", "none",
98 cloud_owner = placement.get("solution").get("cloudOwner") \
99 if placement.get("solution").get("cloudOwner") \
100 else vim_info.get("cloudOwner")
101 location_id = vim_info.get("locationId")
102 if not cloud_owner or not location_id:
103 self.update_response_to_db(self.request_id,
104 self.data.get("requestStatus"), "none", "none",
107 vim_id = vim_info['vimId'] if vim_info.get('vimId') \
108 else cloud_owner + "_" + location_id
109 self.update_response_to_db(requestId=self.request_id,
110 requestStatus=self.data.get("requestStatus"),
112 cloudOwner=cloud_owner,
113 cloudRegionId=values.ignore_case_get(vim_info, "locationId"),
116 "Placement solution has been stored for request %s " % self.request_id)
119 def get_info_from_directives(self, directives):
121 for directive in directives.get("directives"):
122 if directive.get("type") == "tosca.nodes.nfv.Vdu.Compute":
123 vdu = {"vduName": directive.get("id")}
124 other_directives = []
125 for item in directive.get("directives"):
126 if item.get("type") == "flavor_directives":
127 for attribute in item.get("attributes"):
128 vdu[attribute.get("attribute_name")] = attribute.get("attribute_value")
130 other_directives.append(item)
132 other_directives = json.dumps(other_directives)
133 vdu['directive'] = other_directives
136 logger.warn("Find unrecognized type %s " % directive.get("type"))
138 vduinfo = json.dumps(vduinfo)
141 logger.warn("No OOF directive for VDU")
144 def update_response_to_db(self, requestId, requestStatus, vimId, cloudOwner,
145 cloudRegionId, vduInfo):
146 OOFDataModel.objects.filter(request_id=requestId).update(
147 request_status=requestStatus,
149 cloud_owner=cloudOwner,
150 cloud_region_id=cloudRegionId,