diff options
author | 2017-09-28 10:03:40 -0700 | |
---|---|---|
committer | 2017-09-28 10:14:55 -0700 | |
commit | bd886d918ef2adbabd16c61fdd2e47984e21dfd7 (patch) | |
tree | d41683dffa58fd698df450d148fab3cc2521b0c5 /django/engagementmanager/views_helper.py | |
parent | 474554adad912f3edb7ddc3ad14406abb369fb3c (diff) |
initial seed code commit VVP-5
Change-Id: I6560c87ef48a6d0d1fe8197c7c6439c7e6ad653f
Signed-off-by: Paul McGoldrick <paul.mcgoldrick@att.com>
Diffstat (limited to 'django/engagementmanager/views_helper.py')
-rwxr-xr-x | django/engagementmanager/views_helper.py | 347 |
1 files changed, 347 insertions, 0 deletions
diff --git a/django/engagementmanager/views_helper.py b/django/engagementmanager/views_helper.py new file mode 100755 index 0000000..418290b --- /dev/null +++ b/django/engagementmanager/views_helper.py @@ -0,0 +1,347 @@ +# +# ============LICENSE_START========================================== +# org.onap.vvp/engagementmgr +# =================================================================== +# Copyright © 2017 AT&T Intellectual Property. All rights reserved. +# =================================================================== +# +# Unless otherwise specified, all software contained herein is licensed +# under the Apache License, Version 2.0 (the “License”); +# you may not use this software except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# +# +# Unless otherwise specified, all documentation contained herein is licensed +# under the Creative Commons License, Attribution 4.0 Intl. (the “License”); +# you may not use this documentation except in compliance with the License. +# You may obtain a copy of the License at +# +# https://creativecommons.org/licenses/by/4.0/ +# +# Unless required by applicable law or agreed to in writing, documentation +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# ============LICENSE_END============================================ +# +# ECOMP is a trademark and service mark of AT&T Intellectual Property. +from django.conf import settings +from django.utils import timezone +from engagementmanager.apps import bus_service +from engagementmanager.bus.messages.activity_event_message import \ + ActivityEventMessage +from engagementmanager.slack_client.api import SlackClient +from engagementmanager.models import IceUserProfile, Engagement, \ + DeploymentTarget, VF, Role, NextStep, ECOMPRelease +from engagementmanager.serializers import VFModelSerializer +from engagementmanager.service.checklist_state_service import \ + insert_to_recent_engagements +from engagementmanager.service.engagement_service import \ + update_or_insert_to_recent_engagements +from engagementmanager.service.logging_service import LoggingServiceFactory +from engagementmanager.service.nextstep_service import NextStepSvc +from engagementmanager.utils.constants import Constants, NextStepType, \ + NextStepState, RecentEngagementActionType, Roles +from engagementmanager.utils.activities_data import \ + UserJoinedEngagementActivityData +from engagementmanager.utils.validator import logEncoding +from engagementmanager.vm_integration import vm_client +import random +import re + + +logger = LoggingServiceFactory.get_logger() + + +def addEntityIfNotExist(entity, entityObj): + entResultSet = entity.objects.filter(uuid=entityObj.uuid) + + if entResultSet.exists(): + logger.debug(str(entityObj) + " Exists with UUID |" + entityObj.uuid) + was_created = False + else: + entityObj.save() + was_created = True + + return entity.objects.get(uuid=entityObj.uuid), was_created + + +def createEngagement(user, manual_el_id=False): + eng_manual_id = str(timezone.now().year) + "-" + \ + str(Engagement.objects.count() + 31) + eng = Engagement( + engagement_manual_id=eng_manual_id, creator=user) + elUser = None + randUser = None + elRole = Role.objects.get(name=Roles.el.name) # @UndefinedVariable + if user.role == elRole: + manual_el_id = user.email + + # Attaching EL and Peer Reviewer to the Engagment + if user.role != elRole: + if not manual_el_id: + # Fetch a random EL + qs = IceUserProfile.objects.all().filter(role=elRole) # @UndefinedVariable + if qs.count() > 0: + randUser = qs[random.randint(0, qs.count() - 1)] + elUser = IceUserProfile.objects.get(uuid=randUser.uuid) + else: + # Set el manually, for example when using import from xls el is + # already assigned + elUser = IceUserProfile.objects.get(email=manual_el_id) + else: + logger.debug("Since the user " + user.full_name + + " is an EL, no need to find another one") + elUser = user + + logger.debug("Selected engagement lead=" + elUser.full_name) + eng.reviewer = elUser + + # Fetch another random el to be a Peer Reviewer + qs = IceUserProfile.objects.all().filter( + role=elRole, user__is_active=True).exclude(uuid=elUser.uuid) # @UndefinedVariable + prUser = None + if qs.count() > 0: + randUser = qs[random.randint(0, qs.count() - 1)] + prUser = IceUserProfile.objects.get(uuid=randUser.uuid) + eng.peer_reviewer = prUser + logger.debug("Selected peer reviewer=" + prUser.full_name) + + engObj, was_created = addEntityIfNotExist(Engagement, eng) + + return engObj, elUser, prUser + + +def is_str_supports_git_naming_convention(item): + """ + validates that string can contain only letters, digits hyphen and dot. Also, String cannot end with dot + """ + return bool(re.compile("^[a-zA-Z0-9-]*$").match(item)) + + +def createVF(user, request): + """ + Create DeploymentTarget + Create Engagement + Create Application_Service_Infrastructure + Create VF + """ + dataList = request.data + vfList = [] + + for data in dataList: + logger.debug("Processing VF - " + str(data)) + + if ('virtual_function' not in data or not data['virtual_function'] or + 'version' not in data or not data['version'] or + 'target_lab_entry_date' not in data or not data['target_lab_entry_date'] or + 'target_aic_uuid' not in data or not data['target_aic_uuid'] or + 'ecomp_release' not in data or not data['ecomp_release'] or + 'is_service_provider_internal' not in data): + raise KeyError("One of the input parameters are missing") + + # Set el manually, for example when using import from xls el is + # already assigned + if 'manual_el_id' in data: + manual_el_id = data['manual_el_id'] + else: + manual_el_id = False + engObj, elUser, prUser = createEngagement(user, manual_el_id) + + if engObj is None or elUser is None: + raise ValueError("Couldn't fetch engagement or engagement lead") + + if user is not None and engObj is not None: + NextStepSvc().create_default_next_steps(user, engObj, elUser) + + i_target_aic_uuid = data['target_aic_uuid'] + dtObj = DeploymentTarget.objects.get(uuid=i_target_aic_uuid) + + i_ecomp_release = data['ecomp_release'] + ecompObj = ECOMPRelease.objects.get(uuid=i_ecomp_release) + + i_vfName = data['virtual_function'] + if not is_str_supports_git_naming_convention(i_vfName): + msg = "VF Name can contain only letters, digits hyphen and dot. VF Name cannot end with dot" + logger.error(msg) + raise ValueError(msg) + i_vfVersion = data['version'] + i_is_service_provider_internal = data['is_service_provider_internal'] + i_target_lab_entry_date = data['target_lab_entry_date'] + + vf = VF(name=i_vfName, + version=i_vfVersion, + engagement=engObj, + deployment_target=dtObj, + ecomp_release=ecompObj, + is_service_provider_internal=i_is_service_provider_internal, + vendor=user.company, + target_lab_entry_date=i_target_lab_entry_date + ) + + vfObj, was_created = addEntityIfNotExist(VF, vf) + + insert_to_recent_engagements( + user, RecentEngagementActionType.NEW_VF_CREATED.name, vfObj) # @UndefinedVariable + + addUsersToEngTeam(engObj.uuid, [user, elUser, prUser]) + sendSlackNotifications(engObj.uuid, [user, elUser, prUser]) + # trigger repo creation as soon as vf is created and users are added to + # team + if was_created: + vm_client.fire_event_in_bg('send_provision_new_vf_event', vfObj) + vfData = VFModelSerializer(vfObj).data + vfList.append(vfData) + + return vfList + + +def updateValidationDetails(request): + # if data['target_aic_uuid'] is not None and data['target_aic_uuid'] != "": + data = request.data + logger.debug("Processing VF_Details - " + str(data)) + vf = VF.objects.get(uuid=data['vf_uuid']) + if 'target_aic_uuid' in data: + dt_obj = DeploymentTarget.objects.get(uuid=data['target_aic_uuid']) + vf.deployment_target = dt_obj + if 'ecomp_release' in data: # is not None and data['ecomp_release'] != "": + ecomp_obj = ECOMPRelease.objects.get(uuid=data['ecomp_release']) + vf.ecomp_release = ecomp_obj + if 'version' in data: + vf.version = data['version'] + vf.save() + + +def checkAndModifyIfSSHNextStepExist(user): + SSHStep = None + qs = NextStep.objects.filter( + owner=user, next_step_type=NextStepType.set_ssh.name) # @UndefinedVariable + if qs is None or qs.count() == 0: + return None + else: + SSHStep = NextStep.objects.get( + owner=user, next_step_type=NextStepType.set_ssh.name) # @UndefinedVariable + + # @UndefinedVariable + if SSHStep.state in (NextStepState.Incomplete.name) and user.ssh_public_key: + SSHStep.state = 'Completed' + SSHStep.last_update_time = timezone.now() + SSHStep.last_update_type = 'Completed' + SSHStep.save() + + return SSHStep + + +def addUsersToEngTeam(eng_uuid, newUserList): + """ + If the user isn't an EL and their doesn't have an SSH step then create personal SSH next step for him. + """ + engObj = Engagement.objects.get(uuid=eng_uuid) + vfObj = engObj.vf + el_user = IceUserProfile.objects.get(uuid=engObj.reviewer.uuid) + if not el_user: + el_user = newUserList[1] + for newUser in newUserList: + engObj.engagement_team.add(newUser) + update_or_insert_to_recent_engagements( + newUser.uuid, vfObj, RecentEngagementActionType.JOINED_TO_ENGAGEMENT.name) # @UndefinedVariable + SSHStep = checkAndModifyIfSSHNextStepExist(newUser) + if not SSHStep and newUser != el_user: + NextStepSvc().create_default_next_steps_for_user(newUser, el_user) + if vfObj is not None: + activity_data = UserJoinedEngagementActivityData( + vfObj, newUserList, engObj) + bus_service.send_message(ActivityEventMessage(activity_data)) + + +def sendSlackNotifications(eng_uuid, newUserList): + """ + Send Slack notifications to the reviewer, peer reviewer and also the engagements channel + """ + # get the engagement + engagement = Engagement.objects.get(uuid=eng_uuid) + engagement_manual_id = "" + if engagement is not None: + engagement_manual_id = engagement.engagement_manual_id + + # get the vf + vf = VF.objects.get(engagement__uuid=eng_uuid) + vf_name = "" + if vf is not None: + vf_name = vf.name + + # get the creator + creator = engagement.creator + + # get the reviewer + reviewer = IceUserProfile.objects.get(uuid=engagement.reviewer.uuid) + if not reviewer: + reviewer = newUserList[1] + + # get the peer reviewer + peer_reviewer = IceUserProfile.objects.get( + uuid=engagement.peer_reviewer.uuid) + if not peer_reviewer: + peer_reviewer = newUserList[2] + + # send Slack messages when a new engagement is created + slack_client = SlackClient() + slack_client.send_slack_notifications_for_new_engagement( + engagement_manual_id, vf_name, reviewer, peer_reviewer, creator) + + +def getVfByEngUuid(engUuid): + vfList = VF.objects.filter(engagement__uuid=engUuid) + if vfList: + logger.debug("Found VF name=" + vfList[0].name) + if len(vfList) > 1: + logger.warning( + "!! There seems to be more than one VF attached to the engagement with uuid=" + logEncoding(engUuid)) + # Assumption: the list only has one item because the relation + # Engagement-VF is 1:1 business wise + return vfList[0] + else: + logger.error( + "There are no VFs in the engagement identified by eng_uuid=" + logEncoding(engUuid)) + return None + + +def generateActivationLink(activationToken, user): + return str(settings.DOMAIN) + Constants.activation_prefix + str(user.uuid) + "/" + activationToken + + +def getFirstEngByUser(user): + engList = Engagement.objects.filter(engagement_team__uuid=user.uuid) + if engList.exists(): + logger.debug("user was found in a an ENG:" + str(engList[0])) + return engList[0] + else: + logger.debug("user wasn't found in an ENG") + return None + + +def createUserTemplate(company, full_name, role, phone, is_service_provider_contact, ssh_key=None, regular_email_updates=False, user=None): + data = { + 'company': company, + 'phone_number': phone, + 'full_name': full_name, + 'role': role, + 'create_time': timezone.now(), + 'is_service_provider_contact': is_service_provider_contact, + 'regular_email_updates': regular_email_updates, + 'ssh_public_key': ssh_key, + } + if user: + data['user'] = user + return data |