db2bba1e7b76883f7ed18fdd0524300e6457ea61
[laas.git] / 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
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 BookingMetaWorkflow(object):
25     workflow_type = 0
26     color = "#0099ff"
27     is_child = False
28
29
30 class ResourceMetaWorkflow(object):
31     workflow_type = 1
32     color = "#ff6600"
33
34
35 class ConfigMetaWorkflow(object):
36     workflow_type = 2
37     color = "#00ffcc"
38
39
40 class OPNFVMetaWorkflow(object):
41     workflow_type = 3
42     color = "000000"
43
44
45 class MetaStep(object):
46
47     UNTOUCHED = 0
48     INVALID = 100
49     VALID = 200
50
51     def set_invalid(self, message, code=100):
52         self.valid = code
53         self.message = message
54
55     def set_valid(self, message, code=200):
56         self.valid = code
57         self.message = message
58
59     def __init__(self, *args, **kwargs):
60         self.short_title = "error"
61         self.skip_step = 0
62         self.valid = 0
63         self.message = ""
64         self.id = uuid.uuid4()
65
66     def to_json(self):
67         return {
68             'title': self.short_title,
69             'skip': self.skip_step,
70             'valid': self.valid,
71             'message': self.message,
72         }
73
74     def __str__(self):
75         return "metastep: " + str(self.short_title)
76
77     def __hash__(self):
78         return hash(self.id)
79
80     def __eq__(self, other):
81         return self.id.int == other.id.int
82
83     def __ne__(self, other):
84         return self.id.int != other.id.int
85
86
87 class Workflow(object):
88     def __init__(self, steps, metasteps, repository):
89         self.repository = repository
90         self.steps = steps
91         self.metasteps = metasteps
92         self.active_index = 0
93
94
95 class WorkflowFactory():
96     booking_steps = [
97         Booking_Resource_Select,
98         SWConfig_Select,
99         Booking_Meta,
100     ]
101
102     resource_steps = [
103         Define_Hardware,
104         Define_Nets,
105         Resource_Meta_Info,
106     ]
107
108     config_steps = [
109         SWConf_Resource_Select,
110         Define_Software,
111         Config_Software,
112     ]
113
114     snapshot_steps = [
115         Select_Host_Step,
116         Image_Meta_Step,
117     ]
118
119     opnfv_steps = [
120         OPNFV_Resource_Select,
121         Pick_Installer,
122         Assign_Network_Roles,
123         Assign_Host_Roles,
124         MetaInfo
125     ]
126
127     def conjure(self, workflow_type=None, repo=None):
128         workflow_types = [
129             self.booking_steps,
130             self.resource_steps,
131             self.config_steps,
132             self.snapshot_steps,
133             self.opnfv_steps,
134         ]
135
136         steps = self.make_steps(workflow_types[workflow_type], repository=repo)
137         meta_steps = self.metaize(steps=steps, wf_type=workflow_type)
138         return steps, meta_steps
139
140     def create_workflow(self, workflow_type=None, repo=None):
141         steps, meta_steps = self.conjure(workflow_type, repo)
142         c_step = self.make_step(Confirmation_Step, repo)
143         metaconfirm = MetaStep()
144         metaconfirm.short_title = "confirm"
145         metaconfirm.index = len(steps)
146         steps.append(c_step)
147         meta_steps.append(metaconfirm)
148         return Workflow(steps, meta_steps, repo)
149
150     def make_steps(self, step_types, repository):
151         steps = []
152         for step_type in step_types:
153             steps.append(self.make_step(step_type, repository))
154
155         return steps
156
157     def make_step(self, step_type, repository):
158         iden = step_type.description + step_type.title + step_type.template
159         return step_type(iden, repository)
160
161     def metaize(self, steps, wf_type):
162         meta_dict = []
163         for step in steps:
164             meta_step = MetaStep()
165             meta_step.short_title = step.short_title
166             meta_dict.append(meta_step)
167             step.metastep = meta_step
168
169         return meta_dict