Lab as a Service 2.0
[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 *
12 from workflow.resource_bundle_workflow import *
13 from workflow.sw_bundle_workflow import *
14 from workflow.snapshot_workflow import *
15 from workflow.models import Workflow, Repository
16
17 import uuid
18
19 import logging
20 logger = logging.getLogger(__name__)
21
22 class BookingMetaWorkflow(object):
23     workflow_type = 0
24     color = "#0099ff"
25     is_child = False
26
27 class ResourceMetaWorkflow(object):
28     workflow_type = 1
29     color = "#ff6600"
30
31 class ConfigMetaWorkflow(object):
32     workflow_type = 2
33     color = "#00ffcc"
34
35 class MetaRelation(object):
36     def __init__(self, *args, **kwargs):
37         self.color = "#cccccc"
38         self.parent = 0
39         self.children = []
40         self.depth = -1
41
42     def to_json(self):
43         return {
44             'color': self.color,
45             'parent': self.parent,
46             'children': self.children,
47             'depth': self.depth,
48         }
49
50 class MetaStep(object):
51     #valid = 0 #0 is not checked, 1 is invalid, 2 is valid
52
53     UNTOUCHED = 0
54     INVALID = 100
55     VALID = 200
56
57     def set_invalid(self, message, code=100):
58         self.valid = code
59         self.message = message
60
61     def set_valid(self, message, code=200):
62         self.valid = code
63         self.message = message
64
65     def __init__(self, *args, **kwargs):
66         self.short_title = "error"
67         self.skip_step = 0
68         self.valid = 0
69         self.message = ""
70         self.id = uuid.uuid4()
71
72     def to_json(self):
73         return {
74             'title': self.short_title,
75             'skip': self.skip_step,
76             'valid': self.valid,
77             'message': self.message,
78         }
79
80     def __str__(self):
81         return "metastep: " + str(self.short_title)
82
83     def __hash__(self):
84         return hash(self.id)
85
86     def __eq__(self, other):
87         return self.id.int == other.id.int
88
89     def __ne__(self, other):
90         return self.id.int != other.id.int
91
92 class WorkflowFactory():
93     #def __init__(self, *args, **kwargs):
94     booking_steps = [
95             Booking_Resource_Select,
96             SWConfig_Select,
97             Booking_Meta
98         ]
99
100     resource_steps = [
101             Define_Hardware,
102             Define_Nets,
103             Resource_Meta_Info,
104         ]
105
106     config_steps = [
107             SWConf_Resource_Select,
108             Define_Software,
109             Config_Software,
110         ]
111
112     snapshot_steps = [
113             Select_Host_Step,
114             Image_Meta_Step
115         ]
116
117     def conjure(self, workflow_type=None, repo=None):
118         workflow_types = [
119                 self.booking_steps,
120                 self.resource_steps,
121                 self.config_steps,
122                 self.snapshot_steps,
123         ]
124
125         steps = self.make_steps(workflow_types[workflow_type], repository=repo)
126         meta_steps = self.metaize(steps=steps, wf_type=workflow_type)
127         return steps, meta_steps
128
129     def make_steps(self, step_types, repository):
130         repository.el['steps'] += len(step_types)
131         steps = []
132         for step_type in step_types:
133             steps.append(self.make_step(step_type, repository))
134
135         return steps
136
137     def make_step(self, step_type, repository):
138         iden = step_type.description + step_type.title + step_type.template
139         return step_type(iden, repository)
140
141     def metaize(self, steps, wf_type):
142         meta_dict = []
143         for step in steps:
144             meta_step = MetaStep()
145             meta_step.short_title = step.short_title
146             meta_dict.append(meta_step)
147             step.metastep = meta_step
148
149         return meta_dict