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