From: sms1097 Date: Tue, 31 Mar 2020 19:13:06 +0000 (-0400) Subject: Working on workflow refactoring X-Git-Url: https://gerrit.opnfv.org/gerrit/gitweb?a=commitdiff_plain;h=refs%2Fchanges%2F60%2F69860%2F4;p=laas.git Working on workflow refactoring Change-Id: I4141b6aca98aff7bff9cb78a7d5594e25eb45e98 Signed-off-by: Sean Smith --- diff --git a/src/booking/quick_deployer.py b/src/booking/quick_deployer.py index 3cb48b7..258ac6d 100644 --- a/src/booking/quick_deployer.py +++ b/src/booking/quick_deployer.py @@ -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") diff --git a/src/resource_inventory/models.py b/src/resource_inventory/models.py index 2c2dd5c..1a4b75c 100644 --- a/src/resource_inventory/models.py +++ b/src/resource_inventory/models.py @@ -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) diff --git a/src/resource_inventory/resource_manager.py b/src/resource_inventory/resource_manager.py index fa8acfb..87423ad 100644 --- a/src/resource_inventory/resource_manager.py +++ b/src/resource_inventory/resource_manager.py @@ -19,6 +19,7 @@ from resource_inventory.models import ( PhysicalNetwork, ) + class ResourceManager: instance = None diff --git a/src/workflow/booking_workflow.py b/src/workflow/booking_workflow.py index 00fa0f9..128f179 100644 --- a/src/workflow/booking_workflow.py +++ b/src/workflow/booking_workflow.py @@ -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 diff --git a/src/workflow/models.py b/src/workflow/models.py index df00d21..c8b09f2 100644 --- a/src/workflow/models.py +++ b/src/workflow/models.py @@ -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" diff --git a/src/workflow/resource_bundle_workflow.py b/src/workflow/resource_bundle_workflow.py index 89baae7..2cf5459 100644 --- a/src/workflow/resource_bundle_workflow.py +++ b/src/workflow/resource_bundle_workflow.py @@ -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'] = {} diff --git a/src/workflow/sw_bundle_workflow.py b/src/workflow/sw_bundle_workflow.py index 686f46f..4f872c0 100644 --- a/src/workflow/sw_bundle_workflow.py +++ b/src/workflow/sw_bundle_workflow.py @@ -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: diff --git a/src/workflow/tests/test_steps.py b/src/workflow/tests/test_steps.py index 6101d4f..57bf6a3 100644 --- a/src/workflow/tests/test_steps.py +++ b/src/workflow/tests/test_steps.py @@ -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): diff --git a/src/workflow/workflow_factory.py b/src/workflow/workflow_factory.py index 03c8126..7d498e8 100644 --- a/src/workflow/workflow_factory.py +++ b/src/workflow/workflow_factory.py @@ -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, diff --git a/src/workflow/workflow_manager.py b/src/workflow/workflow_manager.py index e31e14c..b5cb815 100644 --- a/src/workflow/workflow_manager.py +++ b/src/workflow/workflow_manager.py @@ -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'] = {}