blob: 82934e535bbc6ea6cdeca621a0199cb93524cfbf [file] [log] [blame]
Matteo Scandolo485b7132017-06-30 11:46:47 -07001from resources import RESOURCES
2
3class GRPCModelsAccessor:
4 """
5 This class provide the glue between the models managed by TOSCA and the ones living in xos-core
6 """
7
8 @staticmethod
Matteo Scandolo21dde412017-07-11 18:54:12 -07009 def get_model_from_classname(class_name, data, username, password):
Matteo Scandolo485b7132017-06-30 11:46:47 -070010 """
11 Give a Model Class Name and some data, check if that exits or instantiate a new one
12 """
13
Matteo Scandolo485b7132017-06-30 11:46:47 -070014 if data.get('name'):
15 used_key = 'name'
16 else:
17 used_key = data.keys()[0]
18
Matteo Scandolo21dde412017-07-11 18:54:12 -070019 key = "%s~%s" % (username, password)
20 if not key in RESOURCES:
21 raise Exception("[XOS-TOSCA] User '%s' does not have ready resources" % username)
22 if class_name not in RESOURCES[key]:
Matteo Scandolod12be212017-07-07 10:44:34 -070023 raise Exception('[XOS-TOSCA] The model you are trying to create (%s: %s, class: %s) is not know by xos-core' % (used_key, data[used_key], class_name))
Matteo Scandolo485b7132017-06-30 11:46:47 -070024
Matteo Scandolo21dde412017-07-11 18:54:12 -070025 cls = RESOURCES[key][class_name]
Matteo Scandolo485b7132017-06-30 11:46:47 -070026 models = cls.objects.filter(**{used_key: data[used_key]})
27
28 if len(models) == 1:
29 print "[XOS-Tosca] Model %s already exist, retrieving instance..." % data[used_key]
30 model = models[0]
31 elif len(models) == 0:
Matteo Scandolod12be212017-07-07 10:44:34 -070032
33 if 'must-exist' in data and data['must-exist']:
34 raise Exception("[XOS-TOSCA] Model %s:%s has property 'must-exist' but cannot be found" % (class_name, data[used_key]))
35
Matteo Scandolo485b7132017-06-30 11:46:47 -070036 model = cls.objects.new()
37 print "[XOS-Tosca] Model %s is new, creating new instance..." % data[used_key]
38 else:
39 raise Exception("[XOS-Tosca] Model %s has multiple instances, I can't handle it" % data[used_key])
40 return model