Working on workflow refactoring 60/69860/4
authorsms1097 <ssmith@iol.unh.edu>
Tue, 31 Mar 2020 19:13:06 +0000 (15:13 -0400)
committersms1097 <ssmith@iol.unh.edu>
Fri, 10 Apr 2020 17:49:52 +0000 (13:49 -0400)
Change-Id: I4141b6aca98aff7bff9cb78a7d5594e25eb45e98
Signed-off-by: Sean Smith <ssmith@iol.unh.edu>
src/booking/quick_deployer.py
src/resource_inventory/models.py
src/resource_inventory/resource_manager.py
src/workflow/booking_workflow.py
src/workflow/models.py
src/workflow/resource_bundle_workflow.py
src/workflow/sw_bundle_workflow.py
src/workflow/tests/test_steps.py
src/workflow/workflow_factory.py
src/workflow/workflow_manager.py

index 3cb48b7..258ac6d 100644 (file)
@@ -167,7 +167,6 @@ def check_invariants(request, **kwargs):
     image = kwargs['image']
     scenario = kwargs['scenario']
     lab = kwargs['lab']
-    resource_template = kwargs['resource_template']
     length = kwargs['length']
     # check that image os is compatible with installer
     if installer in image.os.sup_installers.all():
@@ -178,8 +177,8 @@ def check_invariants(request, **kwargs):
             raise ValidationError("The chosen installer does not support the chosen scenario")
     if image.from_lab != lab:
         raise ValidationError("The chosen image is not available at the chosen hosting lab")
-    #TODO
-    #if image.host_type != host_profile:
+    # TODO
+    # if image.host_type != host_profile:
     #    raise ValidationError("The chosen image is not available for the chosen host type")
     if not image.public and image.owner != request.user:
         raise ValidationError("You are not the owner of the chosen private image")
index 2c2dd5c..1a4b75c 100644 (file)
@@ -165,7 +165,7 @@ class ResourceTemplate(models.Model):
 
     def getConfigs(self):
         configs = self.resourceConfigurations.all()
-        return list(self.resourceConfigurations.all())
+        return list(configs)
 
     def __str__(self):
         return self.name
@@ -201,7 +201,7 @@ class ResourceConfiguration(models.Model):
     image = models.ForeignKey("Image", on_delete=models.PROTECT)
     template = models.ForeignKey(ResourceTemplate, related_name="resourceConfigurations", null=True, on_delete=models.CASCADE)
     is_head_node = models.BooleanField(default=False)
-    # name?
+    # name = models.CharField(max_length=300)
 
     def __str__(self):
         return "config with " + str(self.template) + " and image " + str(self.image)
index fa8acfb..87423ad 100644 (file)
@@ -19,6 +19,7 @@ from resource_inventory.models import (
     PhysicalNetwork,
 )
 
+
 class ResourceManager:
 
     instance = None
index 00fa0f9..128f179 100644 (file)
@@ -36,20 +36,20 @@ class Abstract_Resource_Select(AbstractSelectOrCreate):
 
     def __init__(self, *args, **kwargs):
         super().__init__(*args, **kwargs)
-        self.select_repo_key = self.repo.SELECTED_GRESOURCE_BUNDLE
+        self.select_repo_key = self.repo.SELECTED_RESOURCE_TEMPLATE
         self.confirm_key = self.workflow_type
 
     def alert_bundle_missing(self):
-        self.set_invalid("Please select a valid resource bundle")
+        self.set_invalid("Please select a valid resource template")
 
     def get_form_queryset(self):
         user = self.repo_get(self.repo.SESSION_USER)
-        return ResourceTemplate.objects.filter(Q(hidden=False) & (Q(owner=user) | Q(public=True)))
+        return ResourceTemplate.objects.filter((Q(owner=user) | Q(public=True)))
 
     def get_page_context(self):
         return {
             'select_type': 'resource',
-            'select_type_title': 'Resource Bundle',
+            'select_type_title': 'Resource template',
             'addable_type_num': 1
         }
 
@@ -81,7 +81,7 @@ class SWConfig_Select(AbstractSelectOrCreate):
 
     def get_form_queryset(self):
         user = self.repo_get(self.repo.SESSION_USER)
-        grb = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE)
+        grb = self.repo_get(self.repo.SELECTED_RESOURCE_TEMPLATE)
         qs = ResourceTemplate.objects.filter(Q(hidden=False) & (Q(owner=user) | Q(public=True))).filter(bundle=grb)
         return qs
 
index df00d21..c8b09f2 100644 (file)
@@ -366,14 +366,14 @@ class Repository():
     MODELS = "models"
     RESOURCE_SELECT = "resource_select"
     CONFIRMATION = "confirmation"
-    SELECTED_GRESOURCE_BUNDLE = "selected generic bundle pk"
+    SELECTED_RESOURCE_TEMPLATE = "selected resource template pk"
     SELECTED_CONFIG_BUNDLE = "selected config bundle pk"
     SELECTED_OPNFV_CONFIG = "selected opnfv deployment config"
-    GRESOURCE_BUNDLE_MODELS = "generic_resource_bundle_models"
-    GRESOURCE_BUNDLE_INFO = "generic_resource_bundle_info"
+    RESOURCE_TEMPLATE_MODELS = "generic_resource_template_models"
+    RESOURCE_TEMPLATE_INFO = "generic_resource_template_info"
     BOOKING = "booking"
     LAB = "lab"
-    GRB_LAST_HOSTLIST = "grb_network_previous_hostlist"
+    RCONFIG_LAST_HOSTLIST = "resource_configuration_network_previous_hostlist"
     BOOKING_FORMS = "booking_forms"
     SWCONF_HOSTS = "swconf_hosts"
     BOOKING_MODELS = "booking models"
@@ -399,7 +399,7 @@ class Repository():
 
     def get_child_defaults(self):
         return_tuples = []
-        for key in [self.SELECTED_GRESOURCE_BUNDLE, self.SESSION_USER]:
+        for key in [self.SELECTED_RESOURCE_TEMPLATE, self.SESSION_USER]:
             return_tuples.append((key, self.el.get(key)))
         return return_tuples
 
@@ -435,13 +435,13 @@ class Repository():
                 return errors
 
         # if GRB WF, create it
-        if self.GRESOURCE_BUNDLE_MODELS in self.el:
+        if self.RESOURCE_TEMPLATE_MODELS in self.el:
             errors = self.make_generic_resource_bundle()
             if errors:
                 return errors
             else:
                 self.el[self.HAS_RESULT] = True
-                self.el[self.RESULT_KEY] = self.SELECTED_GRESOURCE_BUNDLE
+                self.el[self.RESULT_KEY] = self.SELECTED_RESOURCE_TEMPLATE
                 return
 
         if self.CONFIG_MODELS in self.el:
@@ -507,8 +507,8 @@ class Repository():
 
     def make_generic_resource_bundle(self):
         owner = self.el[self.SESSION_USER]
-        if self.GRESOURCE_BUNDLE_MODELS in self.el:
-            models = self.el[self.GRESOURCE_BUNDLE_MODELS]
+        if self.RESOURCE_TEMPLATE_MODELS in self.el:
+            models = self.el[self.RESOURCE_TEMPLATE_MODELS]
             if 'hosts' in models:
                 hosts = models['hosts']
             else:
@@ -578,7 +578,7 @@ class Repository():
         models = self.el[self.CONFIG_MODELS]
         if 'bundle' in models:
             bundle = models['bundle']
-            bundle.bundle = self.el[self.SELECTED_GRESOURCE_BUNDLE]
+            bundle.bundle = self.el[self.SELECTED_RESOURCE_TEMPLATE]
             try:
                 bundle.save()
             except Exception as e:
@@ -589,8 +589,8 @@ class Repository():
         if 'host_configs' in models:
             host_configs = models['host_configs']
             for host_config in host_configs:
-                host_config.bundle = host_config.bundle
-                host_config.host = host_config.host
+                host_config.template = host_config.template
+                host_config.profile = host_config.profile
                 try:
                     host_config.save()
                 except Exception as e:
@@ -623,8 +623,8 @@ class Repository():
 
         selected_grb = None
 
-        if self.SELECTED_GRESOURCE_BUNDLE in self.el:
-            selected_grb = self.el[self.SELECTED_GRESOURCE_BUNDLE]
+        if self.SELECTED_RESOURCE_TEMPLATE in self.el:
+            selected_grb = self.el[self.SELECTED_RESOURCE_TEMPLATE]
         else:
             return "BOOK, no selected resource. CODE:0x000e"
 
index 89baae7..2cf5459 100644 (file)
@@ -59,7 +59,7 @@ class Define_Hardware(WorkflowStep):
 
     def update_models(self, data):
         data = data['filter_field']
-        models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+        models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
         models['hosts'] = []  # This will always clear existing data when this step changes
         models['interfaces'] = {}
         if "bundle" not in models:
@@ -91,14 +91,14 @@ class Define_Hardware(WorkflowStep):
                 break  # if somehow we get two 'true' labs, we only use one
 
         # return to repo
-        self.repo_put(self.repo.GRESOURCE_BUNDLE_MODELS, models)
+        self.repo_put(self.repo.RESOURCE_TEMPLATE_MODELS, models)
 
     def update_confirmation(self):
         confirm = self.repo_get(self.repo.CONFIRMATION, {})
         if "resource" not in confirm:
             confirm['resource'] = {}
         confirm['resource']['hosts'] = []
-        models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {"hosts": []})
+        models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {"hosts": []})
         for host in models['hosts']:
             host_dict = {"name": host.resource.name, "profile": host.profile.name}
             confirm['resource']['hosts'].append(host_dict)
@@ -131,7 +131,7 @@ class Define_Nets(WorkflowStep):
         if vlans:
             return vlans
         # try to grab some vlans from lab
-        models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+        models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
         if "bundle" not in models:
             return None
         lab = models['bundle'].lab
@@ -146,10 +146,10 @@ class Define_Nets(WorkflowStep):
 
     def make_mx_host_dict(self, generic_host):
         host = {
-            'id': generic_host.resource.name,
+            'id': generic_host.profile.name,
             'interfaces': [],
             'value': {
-                "name": generic_host.resource.name,
+                "name": generic_host.profile.name,
                 "description": generic_host.profile.description
             }
         }
@@ -173,11 +173,11 @@ class Define_Nets(WorkflowStep):
         if vlans:
             context['vlans'] = vlans
         try:
-            models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+            models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
             hosts = models.get("hosts", [])
             # calculate if the selected hosts have changed
             added_hosts = set()
-            host_set = set(self.repo_get(self.repo.GRB_LAST_HOSTLIST, []))
+            host_set = set(self.repo_get(self.repo.RCONFIG_LAST_HOSTLIST, []))
             if len(host_set):
                 new_host_set = set([h.resource.name + "*" + h.profile.name for h in models['hosts']])
                 context['removed_hosts'] = [h.split("*")[0] for h in (host_set - new_host_set)]
@@ -200,10 +200,10 @@ class Define_Nets(WorkflowStep):
         return context
 
     def post(self, post_data, user):
-        models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+        models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
         if 'hosts' in models:
             host_set = set([h.resource.name + "*" + h.profile.name for h in models['hosts']])
-            self.repo_put(self.repo.GRB_LAST_HOSTLIST, host_set)
+            self.repo_put(self.repo.RCONFIG_LAST_HOSTLIST, host_set)
         try:
             xmlData = post_data.get("xml")
             self.updateModels(xmlData)
@@ -215,7 +215,7 @@ class Define_Nets(WorkflowStep):
             self.set_invalid("An error occurred when applying networks: " + str(e))
 
     def updateModels(self, xmlData):
-        models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+        models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
         models["connections"] = {}
         models['networks'] = {}
         given_hosts, interfaces, networks = self.parseXml(xmlData)
@@ -247,7 +247,7 @@ class Define_Nets(WorkflowStep):
                     connection = NetworkConnection(vlan_is_tagged=connection['tagged'], network=net)
                     models['connections'][existing_host.resource.name][iface['profile_name']].append(connection)
         bundle.xml = xmlData
-        self.repo_put(self.repo.GRESOURCE_BUNDLE_MODELS, models)
+        self.repo_put(self.repo.RESOURCE_TEMPLATE_MODELS, models)
 
     def decomposeXml(self, xmlString):
         """
@@ -366,7 +366,7 @@ class Resource_Meta_Info(WorkflowStep):
         context = super(Resource_Meta_Info, self).get_context()
         name = ""
         desc = ""
-        bundle = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {}).get("bundle", False)
+        bundle = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {}).get("bundle", False)
         if bundle and bundle.name:
             name = bundle.name
             desc = bundle.description
@@ -376,14 +376,14 @@ class Resource_Meta_Info(WorkflowStep):
     def post(self, post_data, user):
         form = ResourceMetaForm(post_data)
         if form.is_valid():
-            models = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {})
+            models = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {})
             name = form.cleaned_data['bundle_name']
             desc = form.cleaned_data['bundle_description']
             bundle = models.get("bundle", ResourceTemplate(owner=self.repo_get(self.repo.SESSION_USER)))
             bundle.name = name
             bundle.description = desc
             models['bundle'] = bundle
-            self.repo_put(self.repo.GRESOURCE_BUNDLE_MODELS, models)
+            self.repo_put(self.repo.RESOURCE_TEMPLATE_MODELS, models)
             confirm = self.repo_get(self.repo.CONFIRMATION)
             if "resource" not in confirm:
                 confirm['resource'] = {}
index 686f46f..4f872c0 100644 (file)
@@ -1,5 +1,5 @@
 ##############################################################################
-# Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, and others.
+# Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, Sean Smith, and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
@@ -34,9 +34,10 @@ class Define_Software(WorkflowStep):
         based on the ordering of the passed
         hosts_data
         """
+
         filter_data = []
         user = self.repo_get(self.repo.SESSION_USER)
-        lab = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE).lab
+        lab = self.repo_get(self.repo.SELECTED_RESOURCE_TEMPLATE).lab
         for i, host_data in enumerate(hosts_data):
             host = ResourceConfiguration.objects.get(pk=host_data['host_id'])
             wrong_owner = Image.objects.exclude(owner=user).exclude(public=True)
@@ -54,8 +55,8 @@ class Define_Software(WorkflowStep):
         if host_configs:
             for config in host_configs:
                 hosts_initial.append({
-                    'host_id': config.host.id,
-                    'host_name': config.host.resource.name,
+                    'host_id': config.id,
+                    'host_name': config.profile.name,
                     'headnode': config.is_head_node,
                     'image': config.image
                 })
@@ -63,7 +64,7 @@ class Define_Software(WorkflowStep):
             for host in hostlist:
                 hosts_initial.append({
                     'host_id': host.id,
-                    'host_name': host.resource.name
+                    'host_name': host.profile.name
                 })
 
         HostFormset = formset_factory(HostSoftwareDefinitionForm, extra=0)
@@ -82,18 +83,18 @@ class Define_Software(WorkflowStep):
 
     def get_host_list(self, grb=None):
         if grb is None:
-            grb = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE, False)
+            grb = self.repo_get(self.repo.SELECTED_RESOURCE_TEMPLATE, False)
             if not grb:
                 return []
         if grb.id:
-            return ResourceConfiguration.objects.filter(resource__bundle=grb)
-        generic_hosts = self.repo_get(self.repo.GRESOURCE_BUNDLE_MODELS, {}).get("hosts", [])
+            return ResourceConfiguration.objects.filter(template=grb)
+        generic_hosts = self.repo_get(self.repo.RESOURCE_TEMPLATE_MODELS, {}).get("hosts", [])
         return generic_hosts
 
     def get_context(self):
         context = super(Define_Software, self).get_context()
 
-        grb = self.repo_get(self.repo.SELECTED_GRESOURCE_BUNDLE, False)
+        grb = self.repo_get(self.repo.SELECTED_RESOURCE_TEMPLATE, False)
 
         if grb:
             context["grb"] = grb
@@ -122,22 +123,13 @@ class Define_Software(WorkflowStep):
             confirm_hosts = []
             for i, form in enumerate(formset):
                 host = hosts[i]
-                image = form.cleaned_data['image']
-                headnode = form.cleaned_data['headnode']
-                if headnode:
+                if host.is_head_node:
                     has_headnode = True
-                bundle = models['bundle']
-                hostConfig = ResourceConfiguration(
-                    host=host,
-                    image=image,
-                    bundle=bundle,
-                    is_head_node=headnode
-                )
-                models['host_configs'].append(hostConfig)
+                models['host_configs'].append(host)
                 confirm_hosts.append({
-                    "name": host.resource.name,
-                    "image": image.name,
-                    "headnode": headnode
+                    "name": host.profile.name,
+                    "image": host.image.name,
+                    "headnode": host.is_head_node
                 })
 
             if not has_headnode:
index 6101d4f..57bf6a3 100644 (file)
@@ -180,7 +180,7 @@ class SoftwareSelectTestCase(SelectStepTestCase):
 
     def add_to_repo(self, repo):
         repo.el[repo.SESSION_USER] = self.user
-        repo.el[repo.SELECTED_GRESOURCE_BUNDLE] = self.conf.grb
+        repo.el[repo.SELECTED_RESOURCE_TEMPLATE] = self.conf.grb
 
     @classmethod
     def setUpTestData(cls):
@@ -253,7 +253,7 @@ class DefineSoftwareTestCase(StepTestCase):
     }
 
     def add_to_repo(self, repo):
-        repo.el[repo.SELECTED_GRESOURCE_BUNDLE] = self.conf.grb
+        repo.el[repo.SELECTED_RESOURCE_TEMPLATE] = self.conf.grb
 
     @classmethod
     def setUpTestData(cls):
index 03c8126..7d498e8 100644 (file)
@@ -1,5 +1,5 @@
 ##############################################################################
-# Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, and others.
+# Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, Sean Smith, and others.
 #
 # All rights reserved. This program and the accompanying materials
 # are made available under the terms of the Apache License, Version 2.0
@@ -91,6 +91,13 @@ class WorkflowFactory():
         Config_Software,
     ]
 
+    # resource_steps = [
+    #     Define_Hardware,
+    #     Define_Nets,
+    #     Define_Software,
+    #     Software,
+    # ]
+
     snapshot_steps = [
         Select_Host_Step,
         Image_Meta_Step,
index e31e14c..b5cb815 100644 (file)
@@ -164,14 +164,14 @@ class SessionManager():
         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.GRESOURCE_BUNDLE_MODELS] = self.make_grb_models(booking.resource.template)
-        self.active_workflow().repository.el[self.active_workflow().repository.SELECTED_GRESOURCE_BUNDLE] = self.make_grb_models(booking.resource.template)['bundle']
+        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.GRESOURCE_BUNDLE_MODELS] = models
+        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):
@@ -180,10 +180,10 @@ class SessionManager():
         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.GRESOURCE_BUNDLE_MODELS] = grb_models
+        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.GRESOURCE_BUNDLE_MODELS, {})
+        models = self.active_workflow().repository.el.get(self.active_workflow().repository.RESOURCE_TEMPLATE_MODELS, {})
         models['hosts'] = []
         models['bundle'] = resource
         models['interfaces'] = {}