Change Event.error/incidence for Event.severity

This commit is contained in:
Xavier Bustamante Talavera 2018-11-08 17:37:14 +01:00
parent b5e3d0c6ec
commit e009bf4bc1
28 changed files with 319 additions and 302 deletions

View file

@ -9,7 +9,7 @@
"elapsed": 2
},
{
"error": false,
"severity": "Info",
"type": "StressTest",
"elapsed": 60
},
@ -91,14 +91,14 @@
{
"steps": [
{
"error": false,
"severity": "Info",
"type": "StepRandom",
"startTime": "2018-07-11T11:20:01.005336",
"endTime": "2018-07-11T11:42:12.971177"
}
],
"zeros": false,
"error": false,
"severity": "Info",
"type": "EraseBasic",
"endTime": "2018-07-11T11:42:12.975358",
"startTime": "2018-07-11T11:20:01.004892"
@ -111,7 +111,7 @@
},
{
"length": "Short",
"error": true,
"severity": "Error",
"type": "TestDataStorage",
"status": "Unspecified Error. Self-test not started.",
"elapsed": 0

View file

@ -74,13 +74,13 @@
"type": "EraseBasic",
"zeros": false,
"endTime": "2018-07-11T11:56:52.390306",
"error": false,
"severity": "Info",
"startTime": "2018-07-11T10:49:31.998217",
"steps": [
{
"type": "StepRandom",
"endTime": "2018-07-11T11:56:52.386505",
"error": false,
"severity": "Info",
"startTime": "2018-07-11T10:49:31.998609"
}
]
@ -89,7 +89,7 @@
"length": "Short",
"type": "TestDataStorage",
"status": "Unspecified Error. Self-test not started.",
"error": true,
"severity": "Error",
"elapsed": 0
},
{
@ -130,7 +130,7 @@
},
{
"type": "StressTest",
"error": false,
"severity": "Info",
"elapsed": 60
}
],

View file

@ -69,7 +69,7 @@
{
"elapsed": 1,
"type": "TestDataStorage",
"error": true,
"severity": "Error",
"status": "Unspecified Error. Self-test not started.",
"length": "Short"
},
@ -83,13 +83,13 @@
"startTime": "2018-07-11T10:32:14.445306",
"zeros": false,
"type": "EraseBasic",
"error": false,
"severity": "Info",
"endTime": "2018-07-11T10:53:46.442123",
"steps": [
{
"startTime": "2018-07-11T10:32:14.445496",
"type": "StepRandom",
"error": false,
"severity": "Info",
"endTime": "2018-07-11T10:53:46.438901"
}
]
@ -107,7 +107,7 @@
{
"elapsed": 0,
"type": "TestDataStorage",
"error": true,
"severity": "Error",
"status": "Unspecified Error. Self-test not started.",
"length": "Short"
},
@ -115,13 +115,13 @@
"startTime": "2018-07-11T10:53:46.442187",
"zeros": false,
"type": "EraseBasic",
"error": false,
"severity": "Info",
"endTime": "2018-07-11T11:16:28.469899",
"steps": [
{
"startTime": "2018-07-11T10:53:46.442343",
"type": "StepRandom",
"error": false,
"severity": "Info",
"endTime": "2018-07-11T11:16:28.463789"
}
]
@ -157,7 +157,7 @@
"chassis": "Tower",
"events": [
{
"error": false,
"severity": "Info",
"elapsed": 60,
"type": "StressTest"
},

View file

@ -10,7 +10,7 @@
{
"elapsed": 60,
"type": "StressTest",
"error": false
"severity": "Info"
},
{
"elapsed": 1,
@ -92,7 +92,7 @@
"elapsed": 15
},
{
"error": true,
"severity": "Error",
"type": "TestDataStorage",
"elapsed": 0,
"length": "Short",
@ -102,13 +102,13 @@
"startTime": "2018-07-11T13:28:07.319948",
"type": "EraseBasic",
"endTime": "2018-07-11T14:04:04.864425",
"error": false,
"severity": "Info",
"steps": [
{
"startTime": "2018-07-11T13:28:07.320244",
"type": "StepRandom",
"endTime": "2018-07-11T14:04:04.861590",
"error": false
"severity": "Info"
}
],
"zeros": false

View file

@ -6,7 +6,7 @@
"manufacturer": "NEC Computers SAS",
"events": [
{
"error": false,
"severity": "Info",
"elapsed": 60,
"type": "StressTest"
},
@ -101,7 +101,7 @@
"size": 305245,
"events": [
{
"error": false,
"severity": "Info",
"endTime": "2018-07-11T11:33:41.531918",
"startTime": "2018-07-11T10:30:35.643855",
"zeros": false,
@ -111,7 +111,7 @@
"type": "StepRandom",
"endTime": "2018-07-11T11:33:41.529224",
"startTime": "2018-07-11T10:30:35.644043",
"error": false
"severity": "Info"
}
]
},
@ -125,7 +125,7 @@
"type": "TestDataStorage",
"length": "Short",
"elapsed": 1,
"error": true,
"severity": "Error",
"status": "Unspecified Error. Self-test not started."
}
],

View file

@ -2,137 +2,137 @@
"uuid": "de4f495e-c58b-40e1-a33e-46ab5e84767e",
"endTime": "2018-10-24T11:03:36.113006+00:00",
"components": [
{
"speed": 1000,
"manufacturer": "Realtek Semiconductor Co., Ltd.",
"wireless": false,
"model": "RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller",
"serialNumber": "00:26:18:96:dc:af",
"type": "NetworkAdapter",
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"manufacturer": "Intel Corporation",
"model": "5 Series/3400 Series Chipset High Definition Audio",
"serialNumber": null,
"type": "SoundCard",
"events": []
},
{
"speed": 2.5330000000000004,
"manufacturer": "Intel Corp.",
"cores": 4,
"address": 64,
"model": "Intel Core i7 CPU 860 @ 2.80GHz",
"serialNumber": null,
"type": "Processor",
"threads": 8,
"events": [
{
"speed": 1000,
"manufacturer": "Realtek Semiconductor Co., Ltd.",
"wireless": false,
"model": "RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller",
"serialNumber": "00:26:18:96:dc:af",
"type": "NetworkAdapter",
"events": []
"elapsed": 9,
"type": "BenchmarkProcessorSysbench",
"rate": 8.7418
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"speed": 1333.0,
"manufacturer": null,
"interface": "DDR",
"model": null,
"serialNumber": null,
"type": "RamModule",
"format": "DIMM",
"size": 2048,
"events": []
},
{
"manufacturer": "Intel Corporation",
"model": "5 Series/3400 Series Chipset High Definition Audio",
"serialNumber": null,
"type": "SoundCard",
"events": []
},
{
"speed": 2.5330000000000004,
"manufacturer": "Intel Corp.",
"cores": 4,
"address": 64,
"model": "Intel Core i7 CPU 860 @ 2.80GHz",
"serialNumber": null,
"type": "Processor",
"threads": 8,
"events": [
{
"elapsed": 9,
"type": "BenchmarkProcessorSysbench",
"rate": 8.7418
},
{
"elapsed": 0,
"type": "BenchmarkProcessor",
"rate": 44937.520000000004
}
]
},
{
"manufacturer": null,
"interface": "ATA",
"model": "SAMSUNG HD103SJ",
"serialNumber": "S246J90Z406422",
"type": "HardDrive",
"size": 953869,
"events": [
{
"elapsed": 120,
"lifetime": 14298,
"currentPendingSectorCount": 0,
"type": "TestDataStorage",
"status": "Completed without error",
"powerCycleCount": 693,
"assessment": true,
"offlineUncorrectable": 0,
"error": false,
"length": "Short",
"reallocatedSectorCount": 0
},
{
"readSpeed": 136.0,
"elapsed": 9,
"type": "BenchmarkDataStorage",
"writeSpeed": 35.0
}
]
},
{
"manufacturer": "NVIDIA Corporation",
"model": "G84 GeForce 8600 GT",
"serialNumber": null,
"type": "GraphicCard",
"memory": 256.0,
"events": []
},
{
"firewire": 1,
"manufacturer": "ASUSTeK Computer INC.",
"usb": 2,
"model": "P7P55D",
"serialNumber": "101005570001137",
"type": "Motherboard",
"pcmcia": 0,
"slots": 4,
"serial": 1,
"events": []
"elapsed": 0,
"type": "BenchmarkProcessor",
"rate": 44937.520000000004
}
]
},
{
"manufacturer": null,
"interface": "ATA",
"model": "SAMSUNG HD103SJ",
"serialNumber": "S246J90Z406422",
"type": "HardDrive",
"size": 953869,
"events": [
{
"elapsed": 120,
"lifetime": 14298,
"currentPendingSectorCount": 0,
"type": "TestDataStorage",
"status": "Completed without error",
"powerCycleCount": 693,
"assessment": true,
"offlineUncorrectable": 0,
"severity": "Info",
"length": "Short",
"reallocatedSectorCount": 0
},
{
"readSpeed": 136.0,
"elapsed": 9,
"type": "BenchmarkDataStorage",
"writeSpeed": 35.0
}
]
},
{
"manufacturer": "NVIDIA Corporation",
"model": "G84 GeForce 8600 GT",
"serialNumber": null,
"type": "GraphicCard",
"memory": 256.0,
"events": []
},
{
"firewire": 1,
"manufacturer": "ASUSTeK Computer INC.",
"usb": 2,
"model": "P7P55D",
"serialNumber": "101005570001137",
"type": "Motherboard",
"pcmcia": 0,
"slots": 4,
"serial": 1,
"events": []
}
],
"elapsed": 203,
"device": {
@ -142,19 +142,19 @@
"type": "Desktop",
"serialNumber": null,
"events": [
{
"elapsed": 60,
"type": "StressTest",
"error": false
},
{
"elapsed": 1,
"type": "BenchmarkRamSysbench",
"rate": 0.8315
}
{
"elapsed": 60,
"type": "StressTest",
"severity": "Info"
},
{
"elapsed": 1,
"type": "BenchmarkRamSysbench",
"rate": 0.8315
}
],
"tags": [
{"id": "A0000000000003", "type": "Tag"}
{"id": "A0000000000003", "type": "Tag"}
]
},
"version": "11.0a6",

View file

@ -62,7 +62,7 @@
"assessment": true,
"currentPendingSectorCount": 0,
"elapsed": 134,
"error": false,
"severity": "Info",
"length": "Short",
"lifetime": 19549,
"offlineUncorrectable": 0,
@ -106,7 +106,7 @@
"events": [
{
"elapsed": 60,
"error": false,
"severity": "Info",
"type": "StressTest"
},
{

View file

@ -90,7 +90,7 @@
"type": "TestDataStorage",
"length": "Short",
"elapsed": 2,
"error": true,
"severity": "Error",
"status": "Unspecified Error. Self-test not started."
},
{
@ -99,12 +99,12 @@
{
"type": "StepRandom",
"startTime": "2018-07-03T09:15:22.257059",
"error": false,
"severity": "Info",
"endTime": "2018-07-03T10:32:11.843190"
}
],
"startTime": "2018-07-03T09:15:22.256074",
"error": false,
"severity": "Info",
"zeros": false,
"endTime": "2018-07-03T10:32:11.848455"
}
@ -143,7 +143,7 @@
},
{
"type": "StressTest",
"error": false,
"severity": "Info",
"elapsed": 60
},
{

View file

@ -83,7 +83,7 @@
"elapsed": 0,
"type": "TestDataStorage",
"status": "Unspecified Error. Self-test not started.",
"error": true,
"severity": "Error",
"length": "Short"
}
]

View file

@ -88,7 +88,7 @@
},
{
"status": "Unspecified Error. Self-test not started.",
"error": true,
"severity": "Error",
"type": "TestDataStorage",
"elapsed": 1,
"length": Short
@ -142,7 +142,7 @@
{
"type": "StressTest",
"elapsed": 60,
"error": false
"severity": "Info"
},
{
"rate": 0.9759,

View file

@ -96,7 +96,7 @@
"status": "Unspecified Error. Self-test not started.",
"type": "TestDataStorage",
"length": Short,
"error": true
"severity": "Error"
}
],
"type": "HardDrive",
@ -122,7 +122,7 @@
"events": [
{
"type": "StressTest",
"error": false,
"severity": "Info",
"elapsed": 120
},
{

View file

@ -15,7 +15,7 @@
{
"type": "StressTest",
"elapsed": 300,
"error": false
"severity": "Info"
}
],
"serialNumber": "CZC0408YJG",
@ -125,7 +125,7 @@
"offlineUncorrectable": 1,
"powerCycleCount": 1838,
"assessment": true,
"error": false,
"severity": "Info",
"type": "TestDataStorage",
"lifetime": 10546,
"reallocatedSectorCount": 0,

View file

@ -64,7 +64,7 @@ components:
elapsed: 21
- type: TestDataStorage
elapsed: 233
error: False
severity: Info
status: Completed without error
length: Short
lifetime: 99

View file

@ -273,9 +273,10 @@ class DataStoragePrivacyCompliance(Enum):
"""Returns the correct enum depending of the passed-in erasure."""
from ereuse_devicehub.resources.event.models import EraseSectors
if isinstance(erasure, EraseSectors):
return cls.EraseSectors if not erasure.error else cls.EraseSectorsError
c = cls.EraseSectors if erasure.severity != Severity.Error else cls.EraseSectorsError
else:
return cls.EraseBasic if not erasure.error else cls.EraseBasicError
c = cls.EraseBasic if erasure.severity == Severity.Error else cls.EraseBasicError
return c
class PrinterTechnology(Enum):
@ -285,3 +286,38 @@ class PrinterTechnology(Enum):
SolidInk = 'Solid ink'
Dye = 'Dye-sublimation'
Thermal = 'Thermal'
class Severity(IntEnum):
"""A flag evaluating the event execution. Ex. failed events
have the value `Severity.Error`.
Devicehub uses 4 severity levels:
- Info: default neutral severity. The event succeeded.
- Notice: The event succeeded but it is raising awareness.
Notices are not usually that important but something
(good or bad) worth checking.
- Warning: The event succeeded but there is something important
to check negatively affecting the event.
- Error: the event failed.
Devicehub specially raises user awareness when an event
has a Severity of ``Warning`` or greater.
"""
Info = 0
Notice = 1
Warning = 2
Error = 3
def __str__(self):
if self == self.Info:
m = ''
elif self == self.Notice:
m = ''
elif self == self.Warning:
m = ''
else:
m = ''
return m

View file

@ -6,11 +6,12 @@ from typing import Set, Union
from uuid import uuid4
import inflection
import teal.db
from boltons import urlutils
from citext import CIText
from flask import current_app as app, g
from sqlalchemy import BigInteger, Boolean, CheckConstraint, Column, DateTime, Enum as DBEnum, \
Float, ForeignKey, Interval, JSON, Numeric, SmallInteger, Unicode, event, orm, Integer
Float, ForeignKey, Integer, Interval, JSON, Numeric, SmallInteger, Unicode, event, orm
from sqlalchemy.dialects.postgresql import UUID
from sqlalchemy.ext.declarative import declared_attr
from sqlalchemy.ext.orderinglist import ordering_list
@ -27,9 +28,9 @@ from ereuse_devicehub.db import db
from ereuse_devicehub.resources.agent.models import Agent
from ereuse_devicehub.resources.device.models import Component, Computer, DataStorage, Desktop, \
Device, Laptop, Server
from ereuse_devicehub.resources.enums import AppearanceRange, Bios, \
FunctionalityRange, PriceSoftware, RATE_NEGATIVE, RATE_POSITIVE, RatingRange, RatingSoftware, \
ReceiverRole, SnapshotExpectedEvents, SnapshotSoftware, TestDataStorageLength
from ereuse_devicehub.resources.enums import AppearanceRange, Bios, FunctionalityRange, \
PriceSoftware, RATE_NEGATIVE, RATE_POSITIVE, RatingRange, RatingSoftware, ReceiverRole, \
Severity, SnapshotExpectedEvents, SnapshotSoftware, TestDataStorageLength
from ereuse_devicehub.resources.models import STR_SM_SIZE, Thing
from ereuse_devicehub.resources.user.models import User
@ -48,22 +49,14 @@ class Event(Thing):
name.comment = """
A name or title for the event. Used when searching for events.
"""
incidence = Column(Boolean, default=False, nullable=False)
incidence.comment = """
Should this event be reviewed due some anomaly?
"""
severity = Column(teal.db.IntEnum(Severity), default=Severity.Info, nullable=False)
severity.comment = Severity.__doc__
closed = Column(Boolean, default=True, nullable=False)
closed.comment = """
Whether the author has finished the event.
After this is set to True, no modifications are allowed.
By default events are closed when performed.
"""
error = Column(Boolean, default=False, nullable=False)
error.comment = """
Did the event fail?
For example, a failure in ``Erase`` means that the data storage
unit did not erase correctly.
"""
description = Column(Unicode, default='', nullable=False)
description.comment = """
A comment about the event.
@ -181,6 +174,7 @@ class Event(Thing):
args = {POLYMORPHIC_ID: cls.t}
if cls.t == 'Event':
args[POLYMORPHIC_ON] = cls.type
# noinspection PyUnresolvedReferences
if JoinedTableMixin in cls.mro():
args[INHERIT_COND] = cls.id == Event.id
return args
@ -197,16 +191,15 @@ class Event(Thing):
raise ValidationError('The event cannot start after it finished.')
return start_time
@property
def _err_str(self):
return '❌ Error.' if self.error else ''
@property
def _date_str(self):
return '{:%c}'.format(self.end_time or self.created)
def __str__(self) -> str:
return '{}'.format(self._err_str)
return '{}'.format(self.severity)
def __repr__(self):
return '<{0.t} {0.id} {0.severity}>'.format(self)
class EventComponent(db.Model):
@ -232,7 +225,7 @@ class EventWithOneDevice(JoinedTableMixin, Event):
primaryjoin=Device.id == device_id)
def __repr__(self) -> str:
return '<{0.t} {0.id!r} device={0.device!r}>'.format(self)
return '<{0.t} {0.id} {0.severity} device={0.device!r}>'.format(self)
@declared_attr
def __mapper_args__(cls):
@ -260,7 +253,7 @@ class EventWithMultipleDevices(Event):
collection_class=OrderedSet)
def __repr__(self) -> str:
return '<{0.t} {0.id!r} devices={0.devices!r}>'.format(self)
return '<{0.t} {0.id} {0.severity} devices={0.devices!r}>'.format(self)
class EventDevice(db.Model):
@ -299,7 +292,7 @@ class EraseBasic(JoinedWithOneDeviceMixin, EventWithOneDevice):
# todo return erasure properties like num steps, if it is british...
def __str__(self) -> str:
return '{} on {}.'.format(self._err_str, self.end_time)
return '{} on {}.'.format(self.severity, self.end_time)
class EraseSectors(EraseBasic):
@ -310,7 +303,7 @@ class Step(db.Model):
erasure_id = Column(UUID(as_uuid=True), ForeignKey(EraseBasic.id), primary_key=True)
type = Column(Unicode(STR_SM_SIZE), nullable=False)
num = Column(SmallInteger, primary_key=True)
error = Column(Boolean, default=False, nullable=False)
severity = Column(teal.db.IntEnum(Severity), default=Severity.Info, nullable=False)
start_time = Column(DateTime, nullable=False)
start_time.comment = Event.start_time.comment
end_time = Column(DateTime, CheckConstraint('end_time > start_time'), nullable=False)
@ -358,7 +351,7 @@ class Snapshot(JoinedWithOneDeviceMixin, EventWithOneDevice):
expected_events = Column(ArrayOfEnum(DBEnum(SnapshotExpectedEvents)))
def __str__(self) -> str:
return '{}. {} version {}.'.format(self._err_str, self.software, self.version)
return '{}. {} version {}.'.format(self.severity, self.software, self.version)
class Install(JoinedWithOneDeviceMixin, EventWithOneDevice):
@ -747,20 +740,18 @@ class TestDataStorage(Test):
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
# Define severity
# As of https://www.backblaze.com/blog/hard-drive-smart-stats/ and
# https://www.backblaze.com/blog-smart-stats-2014-8.html
# We can guess some future disk failures by analyzing some
# SMART data
if (self.reallocated_sector_count or 0) > 10:
self.incidence = True
self.description = 'Warning: Chance of disk failure within a year.'
if (self.current_pending_sector_count or 0) > 40 \
and (self.reported_uncorrectable_errors or 0) > 10:
self.incidence = True
self.description = 'Warning: Chance of disk failure within a year.'
if not self.assessment:
self.incidence = True
self.description = 'Warning: Drive failure expected soon.'
# We can guess some future disk failures by analyzing some SMART data.
if self.severity is None:
# Test finished successfully
if not self.assessment:
self.severity = Severity.Error
elif self.current_pending_sector_count and self.current_pending_sector_count > 40 \
or self.reallocated_sector_count and self.reallocated_sector_count > 10:
self.severity = Severity.Warning
def __str__(self) -> str:
t = inflection.humanize(self.status)
@ -780,7 +771,7 @@ class StressTest(Test):
return value
def __str__(self) -> str:
return '{}. Computing for {}'.format(self._err_str, self.elapsed)
return '{}. Computing for {}'.format(self.severity, self.elapsed)
class Benchmark(JoinedWithOneDeviceMixin, EventWithOneDevice):

View file

@ -17,8 +17,8 @@ from teal.enums import Country
from ereuse_devicehub.resources.agent.models import Agent
from ereuse_devicehub.resources.device.models import Component, Computer, Device
from ereuse_devicehub.resources.enums import AppearanceRange, Bios, FunctionalityRange, \
PriceSoftware, RatingSoftware, ReceiverRole, SnapshotExpectedEvents, SnapshotSoftware, \
TestDataStorageLength
PriceSoftware, RatingSoftware, ReceiverRole, Severity, SnapshotExpectedEvents, \
SnapshotSoftware, TestDataStorageLength
from ereuse_devicehub.resources.models import Thing
from ereuse_devicehub.resources.user.models import User
@ -27,8 +27,6 @@ class Event(Thing):
id = ... # type: Column
name = ... # type: Column
type = ... # type: Column
error = ... # type: Column
incidence = ... # type: Column
description = ... # type: Column
snapshot_id = ... # type: Column
snapshot = ... # type: relationship
@ -41,17 +39,14 @@ class Event(Thing):
start_time = ... # type: Column
end_time = ... # type: Column
agent_id = ... # type: Column
severity = ... # type: Column
def __init__(self, id=None, name=None, incidence=None, closed=None, error=None,
description=None, start_time=None, end_time=None, snapshot=None, agent=None,
parent=None, created=None, updated=None, author=None) -> None:
def __init__(self, **kwargs) -> None:
super().__init__(created, updated)
self.id = ... # type: UUID
self.name = ... # type: str
self.type = ... # type: str
self.incidence = ... # type: bool
self.closed = ... # type: bool
self.error = ... # type: bool
self.description = ... # type: str
self.start_time = ... # type: datetime
self.end_time = ... # type: datetime
@ -60,34 +55,25 @@ class Event(Thing):
self.parent = ... # type: Computer
self.agent = ... # type: Agent
self.author = ... # type: User
self.severity = ... # type: Severity
@property
def url(self) -> urlutils.URL:
pass
@property
def _err_str(self):
pass
class EventWithOneDevice(Event):
def __init__(self, id=None, name=None, incidence=None, closed=None, error=None,
description=None, start_time=None, end_time=None, snapshot=None, agent=None,
parent=None, created=None, updated=None, author=None, device=None) -> None:
super().__init__(id, name, incidence, closed, error, description, start_time, end_time,
snapshot, agent, parent, created, updated, author)
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
self.device = ... # type: Device
class EventWithMultipleDevices(Event):
devices = ... # type: relationship
def __init__(self, id=None, name=None, incidence=None, closed=None, error=None,
description=None, start_time=None, end_time=None, snapshot=None, agent=None,
parent=None, created=None, updated=None, author=None, devices=None) -> None:
super().__init__(id, name, incidence, closed, error, description, start_time, end_time,
snapshot, agent, parent, created, updated, author)
def __init__(self, **kwargs) -> None:
super().__init__(**kwargs)
self.devices = ... # type: Set[Device]
@ -100,15 +86,21 @@ class Remove(EventWithOneDevice):
class Step(Model):
type = ... # type: Column
num = ... # type: Column
start_time = ... # type: Column
end_time = ... # type: Column
erasure = ... # type: relationship
severity = ... # type: Column
def __init__(self, num=None, success=None, start_time=None, end_time=None,
erasure=None, error=None) -> None:
erasure=None, severity=None) -> None:
self.type = ... # type: str
self.num = ... # type: int
self.success = ... # type: bool
self.start_time = ... # type: datetime
self.end_time = ... # type: datetime
self.erasure = ... # type: EraseBasic
self.error = ... # type: bool
self.severity = ... # type: Severity
class StepZero(Step):

View file

@ -12,7 +12,7 @@ from ereuse_devicehub.marshmallow import NestedOn
from ereuse_devicehub.resources.agent.schemas import Agent
from ereuse_devicehub.resources.device.schemas import Component, Computer, Device
from ereuse_devicehub.resources.enums import AppearanceRange, Bios, FunctionalityRange, \
PriceSoftware, RATE_POSITIVE, RatingRange, RatingSoftware, ReceiverRole, \
PriceSoftware, RATE_POSITIVE, RatingRange, RatingSoftware, ReceiverRole, Severity, \
SnapshotExpectedEvents, SnapshotSoftware, TestDataStorageLength
from ereuse_devicehub.resources.event import models as m
from ereuse_devicehub.resources.models import STR_BIG_SIZE, STR_SIZE
@ -25,9 +25,8 @@ class Event(Thing):
name = SanitizedStr(default='',
validate=Length(max=STR_BIG_SIZE),
description=m.Event.name.comment)
incidence = Boolean(default=False, description=m.Event.incidence.comment)
closed = Boolean(missing=True, description=m.Event.closed.comment)
error = Boolean(default=False, description=m.Event.error.comment)
severity = EnumField(Severity, description=m.Event.severity.comment)
description = SanitizedStr(default='', description=m.Event.description.comment)
start_time = DateTime(data_key='startTime', description=m.Event.start_time.comment)
end_time = DateTime(data_key='endTime', description=m.Event.end_time.comment)
@ -85,7 +84,7 @@ class Step(Schema):
type = String(description='Only required when it is nested.')
start_time = DateTime(required=True, data_key='startTime')
end_time = DateTime(required=True, data_key='endTime')
error = Boolean(default=False, description='Did the event fail?')
severity = EnumField(Severity, description=m.Event.severity.comment)
class StepZero(Step):

View file

@ -69,12 +69,12 @@
{
"endTime": "2018-07-13T11:54:55.096491",
"type": "StepRandom",
"error": false,
"severity": "Info",
"startTime": "2018-07-13T10:52:45.092981"
}
],
"type": "EraseBasic",
"error": false,
"severity": "Info",
"zeros": false,
"startTime": "2018-07-13T10:52:45.092612"
},
@ -84,7 +84,7 @@
"elapsed": 131,
"length": "Short",
"offlineUncorrectable": 1,
"error": true,
"severity": "Error",
"currentPendingSectorCount": 1,
"powerCycleCount": 1253,
"reallocatedSectorCount": 15,
@ -107,12 +107,12 @@
{
"endTime": "2018-07-13T12:55:47.326835",
"type": "StepRandom",
"error": false,
"severity": "Info",
"startTime": "2018-07-13T11:54:55.100925"
}
],
"type": "EraseBasic",
"error": false,
"severity": "Info",
"zeros": false,
"startTime": "2018-07-13T11:54:55.100667"
},
@ -122,7 +122,7 @@
"elapsed": 115,
"length": "Short",
"offlineUncorrectable": 0,
"error": false,
"severity": "Info",
"currentPendingSectorCount": 0,
"powerCycleCount": 1956,
"reallocatedSectorCount": 0,

View file

@ -21,11 +21,11 @@ components:
endTime: 2018-06-01T09:12:06
steps:
- type: StepZero
error: False
severity: Info
startTime: 2018-06-01T08:15:00
endTime: 2018-06-01T09:16:00
- type: StepZero
error: False
severity: Info
startTime: 2018-06-01T08:16:00
endTime: 2018-06-01T09:17:00
- type: Processor

View file

@ -77,7 +77,7 @@
"status": "Self-test routine in progress",
"powerCycleCount": 648,
"length": "Short",
"error": false,
"severity": "Error",
"lifetime": 202
}
],
@ -110,7 +110,7 @@
"type": "BenchmarkRamSysbench"
},
{
"error": false,
"severity": "Info",
"elapsed": 60,
"type": "StressTest"
}

View file

@ -28,12 +28,12 @@ components:
serialNumber: 6VMB1A52
size: 238475
test: {'@type': TestHardDrive, CommandTimeout: 1786733725708, CurrentPendingSectorCount: 0,
OfflineUncorrectable: 0, assessment: true, error: false, firstError: null, lifetime: 16947,
OfflineUncorrectable: 0, assessment: true, severity: Info, firstError: null, lifetime: 16947,
passedLifetime: 16947, powerCycleCount: 1694, reallocatedSectorCount: 0, reportedUncorrectableErrors: 0,
status: Completed without error, type: Short offline}
type: HDD
- { '@type': GraphicCard, manufacturer: Intel Corporation, memory: 256.0, model: 4
Series Chipset Integrated Graphics Controller, serialNumber: null}
- { '@type': GraphicCard, manufacturer: Intel Corporation, memory: 256.0, model: 4
Series Chipset Integrated Graphics Controller, serialNumber: null}
- '@type': Motherboard
connectors: {firewire: 0, pcmcia: 0, serial: 1, usb: 8}
manufacturer: LENOVO
@ -41,22 +41,22 @@ components:
serialNumber: null
totalSlots: 0
usedSlots: 2
- { '@type': NetworkAdapter, manufacturer: Intel Corporation, model: 82567LM-3 Gigabit
Network Connection, serialNumber: '00:21:86:2c:5e:d6', speed: 1000}
- { '@type': SoundCard, manufacturer: Intel Corporation, model: 82801JD/DO HD Audio
Controller, serialNumber: null}
- { '@type': NetworkAdapter, manufacturer: Intel Corporation, model: 82567LM-3 Gigabit
Network Connection, serialNumber: '00:21:86:2c:5e:d6', speed: 1000}
- { '@type': SoundCard, manufacturer: Intel Corporation, model: 82801JD/DO HD Audio
Controller, serialNumber: null}
condition:
appearance: {general: B}
functionality: {general: A}
date: '2018-05-09T10:32:15'
debug:
capabilities: { dmi-2.5: DMI version 2.5, smbios-2.5: SMBIOS version 2.5, smp: Symmetric
Multi-Processing, smp-1.4: SMP specification v1.4}
capabilities: { dmi-2.5: DMI version 2.5, smbios-2.5: SMBIOS version 2.5, smp: Symmetric
Multi-Processing, smp-1.4: SMP specification v1.4}
children:
- children:
- capabilities: { acpi: ACPI, biosbootspecification: BIOS boot specification, cdboot: Booting
from CD-ROM/DVD, edd: Enhanced Disk Drive extensions, escd: ESCD, ls120boot: Booting
from LS-120, pci: PCI bus, pnp: Plug-and-Play, shadowing: BIOS shadowing,
- capabilities: { acpi: ACPI, biosbootspecification: BIOS boot specification, cdboot: Booting
from CD-ROM/DVD, edd: Enhanced Disk Drive extensions, escd: ESCD, ls120boot: Booting
from LS-120, pci: PCI bus, pnp: Plug-and-Play, shadowing: BIOS shadowing,
smartbattery: Smart battery, upgrade: BIOS EEPROM can be upgraded, usb: USB
legacy emulation}
capacity: 4128768
@ -71,9 +71,9 @@ debug:
vendor: LENOVO
version: 5CKT48AUS
- businfo: cpu@0
capabilities: { acpi: thermal control (ACPI), aperfmperf: true, apic: on-chip
advanced programmable interrupt controller (APIC), arch_perfmon: true, boot: boot
processor, bts: true, clflush: true, cmov: conditional move instruction,
capabilities: { acpi: thermal control (ACPI), aperfmperf: true, apic: on-chip
advanced programmable interrupt controller (APIC), arch_perfmon: true, boot: boot
processor, bts: true, clflush: true, cmov: conditional move instruction,
constant_tsc: true, cpufreq: CPU Frequency scaling, cx16: true, cx8: compare
and exchange 8-byte, de: debugging extensions, ds_cpl: true, dtes64: true,
dtherm: true, dts: debug trace and EMON store MSRs, eagerfpu: true, est: true,
@ -149,16 +149,16 @@ debug:
version: 6.7.10
width: 64
- children:
- { claimed: true, class: memory, clock: 1067000000, description: DIMM DDR2 Synchronous
1067 MHz (0.9 ns), handle: 'DMI:001F', id: 'bank:0', physid: '0', product: '000000000000000000000000000000000000',
- { claimed: true, class: memory, clock: 1067000000, description: DIMM DDR2 Synchronous
1067 MHz (0.9 ns), handle: 'DMI:001F', id: 'bank:0', physid: '0', product: '000000000000000000000000000000000000',
serial: '00000000', size: 2147483648, slot: J6G1, units: bytes, vendor: Unknown,
width: 40960}
- {claimed: true, class: memory, clock: 1067000000, description: 'DIMM DDR2
Synchronous 1067 MHz (0.9 ns) [empty]', handle: 'DMI:0020', id: 'bank:1',
physid: '1', product: 012345678901234567890123456789012345, serial: '01234567',
slot: J6G2, vendor: 48spaces}
- { claimed: true, class: memory, clock: 1067000000, description: DIMM DDR2 Synchronous
1067 MHz (0.9 ns), handle: 'DMI:0021', id: 'bank:2', physid: '2', product: '000000000000000000000000000000000000',
- { claimed: true, class: memory, clock: 1067000000, description: DIMM DDR2 Synchronous
1067 MHz (0.9 ns), handle: 'DMI:0021', id: 'bank:2', physid: '2', product: '000000000000000000000000000000000000',
serial: '00000000', size: 2147483648, slot: J6H1, units: bytes, vendor: Unknown,
width: 41984}
- {claimed: true, class: memory, clock: 1067000000, description: 'DIMM DDR2
@ -205,7 +205,7 @@ debug:
- businfo: pci@0000:00:00.0
children:
- businfo: pci@0000:00:02.0
capabilities: { bus_master: bus mastering, cap_list: PCI capabilities listing,
capabilities: { bus_master: bus mastering, cap_list: PCI capabilities listing,
msi: Message Signalled Interrupts, pm: Power Management, rom: extension
ROM, vga_controller: true}
claimed: true
@ -265,8 +265,8 @@ debug:
version: '03'
width: 32
- businfo: pci@0000:00:03.3
capabilities: { '16550': true, bus_master: bus mastering, cap_list: PCI capabilities
listing, msi: Message Signalled Interrupts, pm: Power Management}
capabilities: { '16550': true, bus_master: bus mastering, cap_list: PCI capabilities
listing, msi: Message Signalled Interrupts, pm: Power Management}
claimed: true
class: communication
clock: 66000000
@ -280,8 +280,8 @@ debug:
version: '03'
width: 32
- businfo: pci@0000:00:19.0
capabilities: { 1000bt-fd: 1Gbit/s (full duplex), 100bt: 100Mbit/s, 100bt-fd: 100Mbit/s
(full duplex), 10bt: 10Mbit/s, 10bt-fd: 10Mbit/s (full duplex), autonegotiation: Auto-negotiation,
capabilities: { 1000bt-fd: 1Gbit/s (full duplex), 100bt: 100Mbit/s, 100bt-fd: 100Mbit/s
(full duplex), 10bt: 10Mbit/s, 10bt-fd: 10Mbit/s (full duplex), autonegotiation: Auto-negotiation,
bus_master: bus mastering, cap_list: PCI capabilities listing, ethernet: true,
msi: Message Signalled Interrupts, physical: Physical interface, pm: Power
Management, tp: twisted pair}
@ -575,8 +575,8 @@ debug:
version: '02'
width: 32
- businfo: pci@0000:00:1f.2
capabilities: { ahci_1.0: true, bus_master: bus mastering, cap_list: PCI capabilities
listing, msi: Message Signalled Interrupts, pm: Power Management, storage: true}
capabilities: { ahci_1.0: true, bus_master: bus mastering, cap_list: PCI capabilities
listing, msi: Message Signalled Interrupts, pm: Power Management, storage: true}
claimed: true
class: storage
clock: 66000000
@ -620,7 +620,7 @@ debug:
table}
children:
- businfo: scsi@0:0.0.0,1
capabilities: { dir_nlink: directories with 65000+ subdirs, ext2: EXT2/EXT3,
capabilities: { dir_nlink: directories with 65000+ subdirs, ext2: EXT2/EXT3,
ext4: true, extended_attributes: Extended Attributes, extents: extent-based
allocation, huge_files: 16TB+ files, initialized: initialized volume,
journaled: true, large_files: 4GB+ files, primary: Primary partition}
@ -672,8 +672,8 @@ debug:
- capabilities: {emulated: Emulated device}
children:
- businfo: scsi@1:0.0.0
capabilities: { audio: Audio CD playback, cd-r: CD-R burning, cd-rw: CD-RW
burning, dvd: DVD playback, dvd-r: DVD-R burning, dvd-ram: DVD-RAM burning,
capabilities: { audio: Audio CD playback, cd-r: CD-R burning, cd-rw: CD-RW
burning, dvd: DVD playback, dvd-r: DVD-R burning, dvd-ram: DVD-RAM burning,
removable: support is removable}
claimed: true
class: disk

View file

@ -8,5 +8,5 @@
type: 'StressTest'
elapsed: 300
error: False
# snapshot: None fulfill!
severity: Info
# snapshot: None fulfill!

View file

@ -7,7 +7,7 @@
# All numbers are invented
type: 'EraseSectors'
error: False
severity: Info
# snapshot: None fulfill!
# device: None fulfill!
zeros: False
@ -17,4 +17,4 @@ steps:
- type: 'StepRandom'
startTime: '2018-01-01T10:10:10'
endTime: '2018-01-01T12:10:10'
error: False
severity: Info

View file

@ -8,7 +8,7 @@
type: 'Install'
elapsed: 420
error: False
severity: Info
# snapshot: None fulfill!
# device: None fulfill!
name: 'LinuxMint 18.01 32b'
name: 'LinuxMint 18.01 32b'

View file

@ -20,7 +20,7 @@ from ereuse_devicehub.resources.device.exceptions import NeedsId
from ereuse_devicehub.resources.device.schemas import Device as DeviceS
from ereuse_devicehub.resources.device.sync import MismatchBetweenTags, MismatchBetweenTagsAndHid, \
Sync
from ereuse_devicehub.resources.enums import ComputerChassis, DisplayTech
from ereuse_devicehub.resources.enums import ComputerChassis, DisplayTech, Severity
from ereuse_devicehub.resources.event import models as m
from ereuse_devicehub.resources.event.models import Remove, Test
from ereuse_devicehub.resources.tag.model import Tag
@ -393,7 +393,7 @@ def test_get_device(app: Devicehub, user: UserClient):
db.session.add(pc)
db.session.add(Test(device=pc,
elapsed=timedelta(seconds=4),
error=False,
severity=Severity.Info,
agent=Person(name='Timmy'),
author=User(email='bar@bar.com')))
db.session.commit()
@ -402,7 +402,7 @@ def test_get_device(app: Devicehub, user: UserClient):
assert pc['events'][0]['type'] == 'Test'
assert pc['events'][0]['device'] == 1
assert pc['events'][0]['elapsed'] == 4
assert not pc['events'][0]['error']
assert pc['events'][0]['severity'] == 'Info'
assert UUID(pc['events'][0]['author'])
assert 'events_components' not in pc, 'events_components are internal use only'
assert 'events_one' not in pc, 'they are internal use only'

View file

@ -13,7 +13,7 @@ from ereuse_devicehub.db import db
from ereuse_devicehub.resources.device import states
from ereuse_devicehub.resources.device.models import Desktop, Device, GraphicCard, HardDrive, \
RamModule, SolidStateDrive
from ereuse_devicehub.resources.enums import ComputerChassis, TestDataStorageLength
from ereuse_devicehub.resources.enums import ComputerChassis, Severity, TestDataStorageLength
from ereuse_devicehub.resources.event import models
from tests import conftest
from tests.conftest import create_user, file
@ -89,7 +89,7 @@ def test_erase_sectors_steps():
def test_test_data_storage():
test = models.TestDataStorage(
device=HardDrive(serial_number='foo', manufacturer='bar', model='foo-bar'),
error=False,
severity=Severity.Info,
elapsed=timedelta(minutes=25),
length=TestDataStorageLength.Short,
status='ok!',

View file

@ -310,13 +310,13 @@ def test_erase(user: UserClient):
assert erasure['device']['id'] == storage['id']
for step in erasure['steps']:
assert step['type'] == 'StepZero'
assert step['error'] is False
assert step['severity'] == 'Info'
assert 'num' not in step
assert storage['privacy'] == erasure['device']['privacy'] == 'EraseSectors'
# Let's try a second erasure with an error
s['uuid'] = uuid4()
s['components'][0]['events'][0]['error'] = True
s['components'][0]['events'][0]['severity'] = 'Error'
snapshot, _ = user.post(s, res=Snapshot)
assert snapshot['components'][0]['hid'] == 'c1mr-c1s-c1ml'
assert snapshot['components'][0]['privacy'] == 'EraseSectorsError'
@ -330,8 +330,7 @@ def test_test_data_storage(user: UserClient):
ev for ev in snapshot['events']
if ev.get('reallocatedSectorCount', None) == 15
)
assert incidence_test['incidence']
assert incidence_test['description'] == 'Warning: Drive failure expected soon.'
incidence_test['severity'] == 'Error'
def test_snapshot_computer_monitor(user: UserClient):

View file

@ -49,7 +49,7 @@ def test_workbench_server_condensed(user: UserClient):
('TestDataStorage', 6)
}
assert snapshot['closed']
assert not snapshot['error']
assert snapshot['severity'] == 'Info'
device, _ = user.get(res=Device, item=snapshot['device']['id'])
assert device['dataStorageSize'] == 1100
assert device['chassis'] == 'Tower'
@ -59,7 +59,7 @@ def test_workbench_server_condensed(user: UserClient):
assert device['processorModel'] == device['components'][3]['model'] == 'p1-1ml'
assert device['ramSize'] == 2048, 'There are 3 RAM: 2 x 1024 and 1 None sizes'
assert device['rate']['closed']
assert not device['rate']['error']
assert device['rate']['severity'] == 'Info'
assert device['rate']['rating'] == 0
assert device['rate']['workbench']
assert device['rate']['appearanceRange'] == 'A'
@ -129,7 +129,7 @@ def test_workbench_server_phases(user: UserClient):
assert events[8]['type'] == 'Install'
assert events[8]['device'] == 6
assert snapshot['closed']
assert not snapshot['error']
assert snapshot['severity'] == 'Info'
pc, _ = user.get(res=Device, item=snapshot['id'])
assert len(pc['events']) == 10 # todo shall I add child events?
@ -264,7 +264,7 @@ def test_snapshot_real_eee_1001pxd(user: UserClient):
assert erase['endTime']
assert erase['startTime']
assert erase['zeros'] is False
assert erase['error'] is False
assert erase['severity'] == 'Info'
assert hdd['privacy'] == 'EraseBasic'
mother = components[8]
assert mother['hid'] == 'asustek_computer_inc-eee0123456789-1001pxd'