testmodels.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. from mongoengine import Document, EmbeddedDocument
  2. from mongoengine.fields import IntField, ListField, EmbeddedDocumentField, FloatField, StringField, DateTimeField
  3. from volumes.models import Volume
  4. class Dim(EmbeddedDocument):
  5. x = IntField()
  6. y = IntField()
  7. z = IntField()
  8. class Result(EmbeddedDocument):
  9. originalSize = EmbeddedDocumentField(Dim)
  10. subvolumeSize = EmbeddedDocumentField(Dim)
  11. durationInSec = FloatField()
  12. duration_copy_in_sec = FloatField()
  13. point = EmbeddedDocumentField(Dim)
  14. itemsize = IntField()
  15. volume_id = StringField()
  16. @property
  17. def get_copy_throughput(self):
  18. number_of_items = self.itemsize
  19. number_of_items *= self.subvolumeSize.x
  20. number_of_items *= self.subvolumeSize.y
  21. number_of_items *= self.subvolumeSize.z
  22. return number_of_items / self.duration_copy_in_sec / 1024 / 1024
  23. @property
  24. def volume_name(self):
  25. if self.volumeId is None:
  26. return ''
  27. volumes = Volume.objects(id=self.volumeId)
  28. if volumes is None:
  29. return self.volumeId
  30. else:
  31. return volumes.first().name
  32. class TestRun(Document):
  33. name = StringField()
  34. # for compatibilityreasons, it's left in here
  35. volumeId = StringField()
  36. results = ListField(EmbeddedDocumentField(Result))
  37. created = DateTimeField()
  38. meta = {"db_alias": "test_results"}
  39. def addTestResult(self, originalShape, subvolumeShape, subvolumePoint, durationInSec, duration_copy_in_sec, dtype, volume_id):
  40. result = Result()
  41. inputSize = Dim()
  42. inputSize.z, inputSize.y, inputSize.x = originalShape
  43. result.originalSize = inputSize
  44. subvolumeSize = Dim()
  45. subvolumeSize.z, subvolumeSize.y, subvolumeSize.x = subvolumeShape
  46. result.subvolumeSize = subvolumeSize
  47. point = Dim()
  48. point.x, point.y, point.z = subvolumePoint
  49. result.point = point
  50. result.durationInSec = durationInSec
  51. result.duration_copy_in_sec = duration_copy_in_sec
  52. result.itemsize = dtype.itemsize
  53. result.volume_id = volume_id
  54. TestRun.objects(id=self.id).update_one(push__results=result)
  55. @property
  56. def volume_name(self):
  57. if self.volumeId is None:
  58. return ''
  59. volumes = Volume.objects(id=self.volumeId)
  60. if volumes is None:
  61. return self.volumeId
  62. else:
  63. return volumes.first().name
  64. @property
  65. def get_average(self):
  66. if len(self.results) is 0:
  67. return 0
  68. average = 0
  69. for result in self.results:
  70. average += result.durationInSec
  71. return average / len(self.results)
  72. @property
  73. def get_copy_throughput_average(self):
  74. if len(self.results) is 0:
  75. return 0
  76. average = 0
  77. for result in self.results:
  78. average += result.get_copy_throughput
  79. return average / len(self.results)