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