Scott Baker | f92533a | 2015-08-05 08:20:12 -0700 | [diff] [blame] | 1 | import pdb |
| 2 | |
Scott Baker | dcd865b | 2015-08-03 14:20:31 -0700 | [diff] [blame] | 3 | class XOSResource(object): |
| 4 | xos_base_class = "XOSResource" |
Scott Baker | e4f9c2c | 2015-08-04 16:44:18 -0700 | [diff] [blame] | 5 | xos_model = None |
Scott Baker | 874960b | 2015-08-10 17:08:02 -0700 | [diff] [blame] | 6 | name_field = "name" |
| 7 | copyin_props = [] |
Scott Baker | dcd865b | 2015-08-03 14:20:31 -0700 | [diff] [blame] | 8 | provides = None |
| 9 | |
Scott Baker | b31659b | 2015-08-07 17:06:47 -0700 | [diff] [blame] | 10 | def __init__(self, user, nodetemplate, engine): |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 11 | self.dirty = False |
Scott Baker | dcd865b | 2015-08-03 14:20:31 -0700 | [diff] [blame] | 12 | self.user = user |
| 13 | self.nodetemplate = nodetemplate |
Scott Baker | b31659b | 2015-08-07 17:06:47 -0700 | [diff] [blame] | 14 | self.engine = engine |
Scott Baker | dcd865b | 2015-08-03 14:20:31 -0700 | [diff] [blame] | 15 | |
Scott Baker | a705892 | 2015-08-04 23:53:07 -0700 | [diff] [blame] | 16 | def get_all_required_node_names(self): |
| 17 | results = [] |
| 18 | for reqs in self.nodetemplate.requirements: |
| 19 | for (k,v) in reqs.items(): |
| 20 | results.append(v["node"]) |
| 21 | return results |
| 22 | |
Scott Baker | 1a60952 | 2015-08-04 10:59:29 -0700 | [diff] [blame] | 23 | def get_requirements(self, relationship_name, throw_exception=False): |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 24 | """ helper to search the list of requirements for a particular relationship |
| 25 | type. |
| 26 | """ |
Scott Baker | 1a60952 | 2015-08-04 10:59:29 -0700 | [diff] [blame] | 27 | |
| 28 | results = [] |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 29 | for reqs in self.nodetemplate.requirements: |
| 30 | for (k,v) in reqs.items(): |
| 31 | if (v["relationship"] == relationship_name): |
Scott Baker | 1a60952 | 2015-08-04 10:59:29 -0700 | [diff] [blame] | 32 | results.append(v["node"]) |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 33 | |
Scott Baker | 1a60952 | 2015-08-04 10:59:29 -0700 | [diff] [blame] | 34 | if (not results) and throw_exception: |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 35 | raise Exception("Failed to find requirement in %s using relationship %s" % (self.nodetemplate.name, relationship_name)) |
| 36 | |
Scott Baker | 1a60952 | 2015-08-04 10:59:29 -0700 | [diff] [blame] | 37 | return results |
| 38 | |
| 39 | def get_requirement(self, relationship_name, throw_exception=False): |
| 40 | reqs = self.get_requirements(relationship_name, throw_exception) |
| 41 | if not reqs: |
| 42 | return None |
| 43 | return reqs[0] |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 44 | |
Scott Baker | f92533a | 2015-08-05 08:20:12 -0700 | [diff] [blame] | 45 | def get_scalable(self): |
Scott Baker | b9fec93 | 2015-08-05 10:41:51 -0700 | [diff] [blame] | 46 | scalable = self.nodetemplate.get_capabilities().get("scalable", None) |
| 47 | if scalable: |
| 48 | return {"min_instances": scalable.get_property_value("min_instances"), |
| 49 | "max_instances": scalable.get_property_value("max_instances"), |
| 50 | "default_instances": scalable.get_property_value("default_instances")} |
Scott Baker | f92533a | 2015-08-05 08:20:12 -0700 | [diff] [blame] | 51 | else: |
| 52 | return {} |
| 53 | |
Scott Baker | 6382db2 | 2015-08-05 18:34:23 -0700 | [diff] [blame] | 54 | def get_property(self, name): |
| 55 | return self.nodetemplate.get_property_value(name) |
| 56 | |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 57 | def get_xos_object(self, cls, **kwargs): |
| 58 | objs = cls.objects.filter(**kwargs) |
| 59 | if not objs: |
| 60 | raise Exception("Failed to find %s filtered by %s" % (cls.__name__, str(kwargs))) |
| 61 | return objs[0] |
| 62 | |
Scott Baker | e4f9c2c | 2015-08-04 16:44:18 -0700 | [diff] [blame] | 63 | def get_existing_objs(self): |
| 64 | return self.xos_model.objects.filter(name = self.nodetemplate.name) |
| 65 | |
| 66 | def get_xos_args(self): |
| 67 | return {} |
| 68 | |
| 69 | def create_or_update(self): |
| 70 | existing_objs = self.get_existing_objs() |
| 71 | if existing_objs: |
| 72 | self.info("%s %s already exists" % (self.xos_model.__name__, self.nodetemplate.name)) |
| 73 | self.update(existing_objs[0]) |
| 74 | else: |
| 75 | self.create() |
| 76 | |
Scott Baker | 874960b | 2015-08-10 17:08:02 -0700 | [diff] [blame] | 77 | def pre_delete(self, obj): |
| 78 | pass |
| 79 | |
| 80 | def postprocess(self, obj): |
| 81 | pass |
| 82 | |
| 83 | def get_xos_args(self): |
| 84 | args = {} |
| 85 | |
| 86 | if self.name_field: |
| 87 | args[self.name_field] = self.nodetemplate.name |
| 88 | |
| 89 | # copy simple string properties from the template into the arguments |
| 90 | for prop in self.copyin_props: |
| 91 | v = self.get_property(prop) |
| 92 | if v: |
| 93 | args[prop] = v |
| 94 | |
| 95 | return args |
| 96 | |
Scott Baker | e4f9c2c | 2015-08-04 16:44:18 -0700 | [diff] [blame] | 97 | def create(self): |
Scott Baker | 874960b | 2015-08-10 17:08:02 -0700 | [diff] [blame] | 98 | xos_args = self.get_xos_args() |
| 99 | xos_obj = self.xos_model(**xos_args) |
| 100 | xos_obj.caller = self.user |
| 101 | xos_obj.save() |
| 102 | |
| 103 | self.postprocess(xos_obj) |
| 104 | |
| 105 | self.info("Created %s '%s'" % (self.xos_model.__name__,str(xos_obj))) |
Scott Baker | e4f9c2c | 2015-08-04 16:44:18 -0700 | [diff] [blame] | 106 | |
| 107 | def update(self, obj): |
Scott Baker | dcd865b | 2015-08-03 14:20:31 -0700 | [diff] [blame] | 108 | pass |
| 109 | |
Scott Baker | 4ee562b | 2015-08-05 16:35:09 -0700 | [diff] [blame] | 110 | def delete(self, obj): |
Scott Baker | a9022e3 | 2015-08-11 17:23:52 -0700 | [diff] [blame^] | 111 | self.info("destroying object %s" % str(obj)) |
Scott Baker | 874960b | 2015-08-10 17:08:02 -0700 | [diff] [blame] | 112 | self.pre_delete(obj) |
Scott Baker | 4ee562b | 2015-08-05 16:35:09 -0700 | [diff] [blame] | 113 | obj.delete(purge=True) # XXX TODO: turn off purge before production |
| 114 | |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 115 | def info(self, s): |
Scott Baker | a9022e3 | 2015-08-11 17:23:52 -0700 | [diff] [blame^] | 116 | self.engine.log(s) |
Scott Baker | 3fb4931 | 2015-08-03 15:43:54 -0700 | [diff] [blame] | 117 | |