Merge "Fix quick booking redirect"
[pharos-tools.git] / dashboard / src / workflow / workflow_factory.py
1 ##############################################################################
2 # Copyright (c) 2018 Sawyer Bergeron, Parker Berberian, and others.
3 #
4 # All rights reserved. This program and the accompanying materials
5 # are made available under the terms of the Apache License, Version 2.0
6 # which accompanies this distribution, and is available at
7 # http://www.apache.org/licenses/LICENSE-2.0
8 ##############################################################################
9
10
11 from workflow.booking_workflow import Booking_Resource_Select, SWConfig_Select, Booking_Meta, OPNFV_Select
12 from workflow.resource_bundle_workflow import Define_Hardware, Define_Nets, Resource_Meta_Info
13 from workflow.sw_bundle_workflow import Config_Software, Define_Software, SWConf_Resource_Select
14 from workflow.snapshot_workflow import Select_Host_Step, Image_Meta_Step
15 from workflow.opnfv_workflow import Pick_Installer, Assign_Network_Roles, Assign_Host_Roles, OPNFV_Resource_Select, MetaInfo
16 from workflow.models import Confirmation_Step
17
18 import uuid
19
20 import logging
21 logger = logging.getLogger(__name__)
22
23
24 class MetaStep(object):
25
26     UNTOUCHED = 0
27     INVALID = 100
28     VALID = 200
29
30     def set_invalid(self, message, code=100):
31         self.valid = code
32         self.message = message
33
34     def set_valid(self, message, code=200):
35         self.valid = code
36         self.message = message
37
38     def __init__(self, *args, **kwargs):
39         self.short_title = "error"
40         self.skip_step = 0
41         self.valid = 0
42         self.hidden = False
43         self.message = ""
44         self.id = uuid.uuid4()
45
46     def to_json(self):
47         return {
48             'title': self.short_title,
49             'skip': self.skip_step,
50             'valid': self.valid,
51             'message': self.message,
52         }
53
54     def __str__(self):
55         return "metastep: " + str(self.short_title)
56
57     def __hash__(self):
58         return hash(self.id)
59
60     def __eq__(self, other):
61         return self.id.int == other.id.int
62
63     def __ne__(self, other):
64         return self.id.int != other.id.int
65
66
67 class Workflow(object):
68     def __init__(self, steps, repository):
69         self.repository = repository
70         self.steps = steps
71         self.active_index = 0
72
73
74 class WorkflowFactory():
75     booking_steps = [
76         Booking_Resource_Select,
77         SWConfig_Select,
78         Booking_Meta,
79         OPNFV_Select,
80     ]
81
82     resource_steps = [
83         Define_Hardware,
84         Define_Nets,
85         Resource_Meta_Info,
86     ]
87
88     config_steps = [
89         SWConf_Resource_Select,
90         Define_Software,
91         Config_Software,
92     ]
93
94     snapshot_steps = [
95         Select_Host_Step,
96         Image_Meta_Step,
97     ]
98
99     opnfv_steps = [
100         OPNFV_Resource_Select,
101         Pick_Installer,
102         Assign_Network_Roles,
103         Assign_Host_Roles,
104         MetaInfo
105     ]
106
107     def conjure(self, workflow_type=None, repo=None):
108         workflow_types = [
109             self.booking_steps,
110             self.resource_steps,
111             self.config_steps,
112             self.snapshot_steps,
113             self.opnfv_steps,
114         ]
115
116         steps = self.make_steps(workflow_types[workflow_type], repository=repo)
117         return steps
118
119     def create_workflow(self, workflow_type=None, repo=None):
120         steps = self.conjure(workflow_type, repo)
121         c_step = self.make_step(Confirmation_Step, repo)
122         steps.append(c_step)
123         return Workflow(steps, repo)
124
125     def make_steps(self, step_types, repository):
126         steps = []
127         for step_type in step_types:
128             steps.append(self.make_step(step_type, repository))
129
130         return steps
131
132     def make_step(self, step_type, repository):
133         iden = step_type.description + step_type.title + step_type.template
134         return step_type(iden, repository)