aboutsummaryrefslogtreecommitdiffstats
path: root/src/workflow/workflow_manager.py
diff options
context:
space:
mode:
Diffstat (limited to 'src/workflow/workflow_manager.py')
-rw-r--r--src/workflow/workflow_manager.py270
1 files changed, 0 insertions, 270 deletions
diff --git a/src/workflow/workflow_manager.py b/src/workflow/workflow_manager.py
deleted file mode 100644
index 40be9d6..0000000
--- a/src/workflow/workflow_manager.py
+++ /dev/null
@@ -1,270 +0,0 @@
-##############################################################################
-# Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, and others.
-#
-# All rights reserved. This program and the accompanying materials
-# are made available under the terms of the Apache License, Version 2.0
-# which accompanies this distribution, and is available at
-# http://www.apache.org/licenses/LICENSE-2.0
-##############################################################################
-
-
-from django.http import JsonResponse
-from django.http.request import QueryDict
-from django.urls import reverse
-
-from booking.models import Booking
-from workflow.workflow_factory import WorkflowFactory
-from workflow.models import Repository
-from resource_inventory.models import (
- ResourceTemplate,
- ResourceConfiguration,
- OPNFVConfig
-)
-from workflow.forms import ManagerForm
-
-import logging
-logger = logging.getLogger(__name__)
-
-
-class SessionManager():
- def active_workflow(self):
- return self.workflows[-1]
-
- def __init__(self, request=None):
- self.workflows = []
- self.owner = request.user
- self.factory = WorkflowFactory()
- self.result = None
-
- def set_step_statuses(self, superclass_type, desired_enabled=True):
- workflow = self.active_workflow()
- steps = workflow.steps
- for step in steps:
- if isinstance(step, superclass_type):
- if desired_enabled:
- step.enable()
- else:
- step.disable()
-
- def add_workflow(self, workflow_type=None, **kwargs):
- repo = Repository()
- if (len(self.workflows) >= 1):
- defaults = self.workflows[-1].repository.get_child_defaults()
- repo.set_defaults(defaults)
- repo.el[repo.HAS_RESULT] = False
- repo.el[repo.SESSION_USER] = self.owner
- repo.el[repo.SESSION_MANAGER] = self
- self.workflows.append(
- self.factory.create_workflow(
- workflow_type=workflow_type,
- repo=repo
- )
- )
-
- def get_redirect(self):
- if isinstance(self.result, Booking):
- return reverse('booking:booking_detail', kwargs={'booking_id': self.result.id})
- return "/"
-
- def pop_workflow(self, discard=False):
- multiple_wfs = len(self.workflows) > 1
- if multiple_wfs:
- if self.workflows[-1].repository.el[Repository.RESULT]: # move result
- key = self.workflows[-1].repository.el[Repository.RESULT_KEY]
- result = self.workflows[-1].repository.el[Repository.RESULT]
- self.workflows[-2].repository.el[key] = result
- prev_workflow = self.workflows.pop()
- if self.workflows:
- current_repo = self.workflows[-1].repository
- else:
- current_repo = prev_workflow.repository
- self.result = current_repo.el[current_repo.RESULT]
- if discard:
- current_repo.cancel()
- return multiple_wfs, self.result
-
- def status(self, request):
- return {
- "steps": [step.to_json() for step in self.active_workflow().steps],
- "active": self.active_workflow().repository.el['active_step'],
- "workflow_count": len(self.workflows)
- }
-
- def handle_post(self, request):
- form = ManagerForm(request.POST)
- if form.is_valid():
- self.get_active_step().post(
- QueryDict(form.cleaned_data['step_form']),
- user=request.user
- )
- # change step
- if form.cleaned_data['step'] == 'prev':
- self.go_prev()
- if form.cleaned_data['step'] == 'next':
- self.go_next()
- else:
- pass # Exception?
-
- def handle_request(self, request):
- if request.method == 'POST':
- self.handle_post(request)
- return self.render(request)
-
- def render(self, request, **kwargs):
- if self.workflows:
- return JsonResponse({
- "meta": self.status(request),
- "content": self.get_active_step().render_to_string(request),
- })
- else:
- return JsonResponse({
- "redirect": self.get_redirect()
- })
-
- def post_render(self, request):
- return self.active_workflow().steps[self.active_workflow().active_index].post_render(request)
-
- def get_active_step(self):
- return self.active_workflow().steps[self.active_workflow().active_index]
-
- def go_next(self, **kwargs):
- # need to verify current step is valid to allow this
- if self.get_active_step().valid < 200:
- return
- next_step = self.active_workflow().active_index + 1
- if next_step >= len(self.active_workflow().steps):
- raise Exception("Out of bounds request for step")
- while not self.active_workflow().steps[next_step].enabled:
- next_step += 1
- self.active_workflow().repository.el['active_step'] = next_step
- self.active_workflow().active_index = next_step
-
- def go_prev(self, **kwargs):
- prev_step = self.active_workflow().active_index - 1
- if prev_step < 0:
- raise Exception("Out of bounds request for step")
- while not self.active_workflow().steps[prev_step].enabled:
- prev_step -= 1
- self.active_workflow().repository.el['active_step'] = prev_step
- self.active_workflow().active_index = prev_step
-
- def prefill_repo(self, target_id, workflow_type):
- self.repository.el[self.repository.EDIT] = True
- edit_object = None
- if workflow_type == 0:
- edit_object = Booking.objects.get(pk=target_id)
- self.prefill_booking(edit_object)
- elif workflow_type == 1:
- edit_object = ResourceTemplate.objects.get(pk=target_id)
- self.prefill_resource(edit_object)
- elif workflow_type == 2:
- edit_object = ResourceTemplate.objects.get(pk=target_id)
- self.prefill_config(edit_object)
-
- def prefill_booking(self, booking):
- models = self.make_booking_models(booking)
- confirmation = self.make_booking_confirm(booking)
- self.active_workflow().repository.el[self.active_workflow().repository.BOOKING_MODELS] = models
- self.active_workflow().repository.el[self.active_workflow().repository.CONFIRMATION] = confirmation
- self.active_workflow().repository.el[self.active_workflow().repository.RESOURCE_TEMPLATE_MODELS] = self.make_grb_models(booking.resource.template)
- self.active_workflow().repository.el[self.active_workflow().repository.SELECTED_RESOURCE_TEMPLATE] = self.make_grb_models(booking.resource.template)['bundle']
- self.active_workflow().repository.el[self.active_workflow().repository.CONFIG_MODELS] = self.make_config_models(booking.config_bundle)
-
- def prefill_resource(self, resource):
- models = self.make_grb_models(resource)
- confirm = self.make_grb_confirm(resource)
- self.active_workflow().repository.el[self.active_workflow().repository.RESOURCE_TEMPLATE_MODELS] = models
- self.active_workflow().repository.el[self.active_workflow().repository.CONFIRMATION] = confirm
-
- def prefill_config(self, config):
- models = self.make_config_models(config)
- confirm = self.make_config_confirm(config)
- self.active_workflow().repository.el[self.active_workflow().repository.CONFIG_MODELS] = models
- self.active_workflow().repository.el[self.active_workflow().repository.CONFIRMATION] = confirm
- grb_models = self.make_grb_models(config.bundle)
- self.active_workflow().repository.el[self.active_workflow().repository.RESOURCE_TEMPLATE_MODELS] = grb_models
-
- def make_grb_models(self, resource):
- models = self.active_workflow().repository.el.get(self.active_workflow().repository.RESOURCE_TEMPLATE_MODELS, {})
- models['hosts'] = []
- models['bundle'] = resource
- models['interfaces'] = {}
- models['vlans'] = {}
- for host in resource.getResources():
- models['hosts'].append(host)
- models['interfaces'][host.resource.name] = []
- models['vlans'][host.resource.name] = {}
- for interface in host.generic_interfaces.all():
- models['interfaces'][host.resource.name].append(interface)
- models['vlans'][host.resource.name][interface.profile.name] = []
- for vlan in interface.vlans.all():
- models['vlans'][host.resource.name][interface.profile.name].append(vlan)
- return models
-
- def make_grb_confirm(self, resource):
- confirm = self.active_workflow().repository.el.get(self.active_workflow().repository.CONFIRMATION, {})
- confirm['resource'] = {}
- confirm['resource']['hosts'] = []
- confirm['resource']['lab'] = resource.lab.lab_user.username
- for host in resource.getResources():
- confirm['resource']['hosts'].append({"name": host.resource.name, "profile": host.profile.name})
- return confirm
-
- def make_config_models(self, config):
- models = self.active_workflow().repository.el.get(self.active_workflow().repository.CONFIG_MODELS, {})
- models['bundle'] = config
- models['host_configs'] = []
- for host_conf in ResourceConfiguration.objects.filter(bundle=config):
- models['host_configs'].append(host_conf)
- models['opnfv'] = OPNFVConfig.objects.filter(bundle=config).last()
- return models
-
- def make_config_confirm(self, config):
- confirm = self.active_workflow().repository.el.get(self.active_workflow().repository.CONFIRMATION, {})
- confirm['configuration'] = {}
- confirm['configuration']['hosts'] = []
- confirm['configuration']['name'] = config.name
- confirm['configuration']['description'] = config.description
- opnfv = OPNFVConfig.objects.filter(bundle=config).last()
- confirm['configuration']['installer'] = opnfv.installer.name
- confirm['configuration']['scenario'] = opnfv.scenario.name
- for host_conf in ResourceConfiguration.objects.filter(bundle=config):
- h = {"name": host_conf.host.resource.name, "image": host_conf.image.name, "role": host_conf.opnfvRole.name}
- confirm['configuration']['hosts'].append(h)
- return confirm
-
- def make_booking_models(self, booking):
- models = self.active_workflow().repository.el.get(self.active_workflow().repository.BOOKING_MODELS, {})
- models['booking'] = booking
- models['collaborators'] = []
- for user in booking.collaborators.all():
- models['collaborators'].append(user)
- return models
-
- def make_booking_confirm(self, booking):
- confirm = self.active_workflow().repository.el.get(self.active_workflow().repository.CONFIRMATION, {})
- confirm['booking'] = {}
- confirm['booking']['length'] = (booking.end - booking.start).days
- confirm['booking']['project'] = booking.project
- confirm['booking']['purpose'] = booking.purpose
- confirm['booking']['resource name'] = booking.resource.template.name
- confirm['booking']['configuration name'] = booking.config_bundle.name
- confirm['booking']['collaborators'] = []
- for user in booking.collaborators.all():
- confirm['booking']['collaborators'].append(user.username)
- return confirm
-
-
-class ManagerTracker():
- instance = None
-
- managers = {}
-
- def __init__(self):
- pass
-
- @staticmethod
- def getInstance():
- if ManagerTracker.instance is None:
- ManagerTracker.instance = ManagerTracker()
- return ManagerTracker.instance