blob: e848ab527b843b8a541444b4b2bfba375f6e5e6a [file] [log] [blame]
Scott Bakerf92533a2015-08-05 08:20:12 -07001import pdb
2
Scott Bakerdcd865b2015-08-03 14:20:31 -07003class XOSResource(object):
4 xos_base_class = "XOSResource"
Scott Bakere4f9c2c2015-08-04 16:44:18 -07005 xos_model = None
Scott Baker874960b2015-08-10 17:08:02 -07006 name_field = "name"
7 copyin_props = []
Scott Bakerdcd865b2015-08-03 14:20:31 -07008 provides = None
9
Scott Bakerb31659b2015-08-07 17:06:47 -070010 def __init__(self, user, nodetemplate, engine):
Scott Baker3fb49312015-08-03 15:43:54 -070011 self.dirty = False
Scott Bakerdcd865b2015-08-03 14:20:31 -070012 self.user = user
13 self.nodetemplate = nodetemplate
Scott Bakerb31659b2015-08-07 17:06:47 -070014 self.engine = engine
Scott Bakerdcd865b2015-08-03 14:20:31 -070015
Scott Bakera7058922015-08-04 23:53:07 -070016 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 Baker1a609522015-08-04 10:59:29 -070023 def get_requirements(self, relationship_name, throw_exception=False):
Scott Baker3fb49312015-08-03 15:43:54 -070024 """ helper to search the list of requirements for a particular relationship
25 type.
26 """
Scott Baker1a609522015-08-04 10:59:29 -070027
28 results = []
Scott Baker3fb49312015-08-03 15:43:54 -070029 for reqs in self.nodetemplate.requirements:
30 for (k,v) in reqs.items():
31 if (v["relationship"] == relationship_name):
Scott Baker1a609522015-08-04 10:59:29 -070032 results.append(v["node"])
Scott Baker3fb49312015-08-03 15:43:54 -070033
Scott Baker1a609522015-08-04 10:59:29 -070034 if (not results) and throw_exception:
Scott Baker3fb49312015-08-03 15:43:54 -070035 raise Exception("Failed to find requirement in %s using relationship %s" % (self.nodetemplate.name, relationship_name))
36
Scott Baker1a609522015-08-04 10:59:29 -070037 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 Baker3fb49312015-08-03 15:43:54 -070044
Scott Bakerf92533a2015-08-05 08:20:12 -070045 def get_scalable(self):
Scott Bakerb9fec932015-08-05 10:41:51 -070046 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 Bakerf92533a2015-08-05 08:20:12 -070051 else:
52 return {}
53
Scott Baker6382db22015-08-05 18:34:23 -070054 def get_property(self, name):
55 return self.nodetemplate.get_property_value(name)
56
Scott Baker3fb49312015-08-03 15:43:54 -070057 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 Bakere4f9c2c2015-08-04 16:44:18 -070063 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 Baker874960b2015-08-10 17:08:02 -070077 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 Bakere4f9c2c2015-08-04 16:44:18 -070097 def create(self):
Scott Baker874960b2015-08-10 17:08:02 -070098 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 Bakere4f9c2c2015-08-04 16:44:18 -0700106
107 def update(self, obj):
Scott Bakerdcd865b2015-08-03 14:20:31 -0700108 pass
109
Scott Baker4ee562b2015-08-05 16:35:09 -0700110 def delete(self, obj):
Scott Bakera9022e32015-08-11 17:23:52 -0700111 self.info("destroying object %s" % str(obj))
Scott Baker874960b2015-08-10 17:08:02 -0700112 self.pre_delete(obj)
Scott Baker4ee562b2015-08-05 16:35:09 -0700113 obj.delete(purge=True) # XXX TODO: turn off purge before production
114
Scott Baker3fb49312015-08-03 15:43:54 -0700115 def info(self, s):
Scott Bakera9022e32015-08-11 17:23:52 -0700116 self.engine.log(s)
Scott Baker3fb49312015-08-03 15:43:54 -0700117