27 from topologylistener
import exc
29 logger = logging.getLogger(__name__)
33 if not isinstance(raw, (int, long)):
41 if limit
is not None and value > limit:
43 raw,
'integer value too big {}'.
format(raw))
50 for x, y
in fields_mapping.items()
if x
in data}
53 LifeCycleFields = collections.namedtuple(
'LifeCycleFields', (
'ctime',
'mtime'))
57 FORMAT =
'%Y-%m-%dT%H:%M:%S.%fZ' 58 UNIX_EPOCH = datetime.datetime(1970, 1, 1, 0, 0, 0, 0, pytz.utc)
64 return cls(datetime.datetime.utcfromtimestamp(value))
68 value = datetime.datetime.strptime(value, cls.
FORMAT)
72 def now(cls, milliseconds_precission=False):
73 value = datetime.datetime.utcnow()
74 if milliseconds_precission:
75 microseconds = value.microsecond
76 microseconds -= microseconds % 1000
77 value = value.replace(microsecond=microseconds)
81 if value.tzinfo
is None:
82 value = value.replace(tzinfo=pytz.utc)
90 seconds = int(from_epoch.total_seconds())
91 return seconds * 1000 + from_epoch.microseconds // 1000
98 class Default(object):
99 def __init__(self, value, produce=False, override_none=True):
118 data = vars(instance)
121 def _resolve_name(self, owner):
127 for name
in dir(owner):
129 attr = getattr(owner, name)
130 except AttributeError:
137 '{!r} Unable to resolve bounded name (UNREACHABLE)'.
format(
145 pack_exclude = frozenset()
153 attr = getattr(cls, name)
154 except AttributeError:
156 if not isinstance(attr, Default):
161 if attr.override_none
and fields[name]
is None:
163 setattr(self, name, fields[name])
166 raise TypeError(
'{!r} got unknown arguments: "{}"'.
format(
167 self,
'", "'.join(sorted(extra))))
174 json.dumps(self.
pack(), sort_keys=
True, cls=JSONEncoder))
177 if not isinstance(other, Abstract):
178 raise NotImplementedError
179 return self.
_sort_key() == other._sort_key()
182 return not self.
__eq__(other)
185 fields = vars(self).copy()
188 for name
in dir(cls):
189 if name.startswith(
'_'):
194 attr = getattr(cls, name)
195 if not isinstance(attr, Default):
197 fields[name] = getattr(self, name)
199 for name
in tuple(fields):
200 if not name.startswith(
'_')
and name
not in self.
pack_exclude:
206 def _verify_fields(self):
210 raise NotImplementedError
213 def _extract_fields(cls, data):
216 for name
in dir(cls):
217 if name.startswith(
'_'):
219 attr = getattr(cls, name)
220 if not isinstance(attr, Default):
224 fields[name] = data.pop(name)
244 timestamp = TimeProperty.now()
245 for name
in (
'time_create',
'time_modify'):
246 fields.setdefault(name, timestamp)
247 super(TimestampMixin, self).
__init__(**fields)
252 for name
in (
'time_create',
'time_modify'):
254 if data[name]
is None:
258 decoded[name] = TimeProperty.new_from_java_timestamp(data[name])
263 decoded.setdefault(
'time_modify', decoded[
'time_create'])
272 for name
in (
'time_create',
'time_modify'):
274 decoded[name] = TimeProperty.new_from_db(data[name])
280 fields = super(TimestampMixin, self).
pack()
281 for name
in 'time_create',
'time_modify':
283 fields[name] = fields[name].as_java_timestamp()
291 super(AbstractNetworkEndpoint, self).
__init__(**fields)
293 if isinstance(dpid, basestring):
311 return cls(data[
'switch-id'], data[
'port-id'])
314 fields = super(NetworkEndpoint, self).
pack()
316 (
'dpid',
'switch-id'),
317 (
'port',
'port-id')]:
318 fields[dst] = fields.pop(src)
325 return cls(data[
'switch_id'], data[
'port_no'])
328 fields = super(IslPathNode, self).
pack()
330 (
'dpid',
'switch_id'),
331 (
'port',
'port_no')]:
332 fields[dst] = fields.pop(src)
341 super(AbstractLink, self).
__init__(**fields)
343 def _verify_fields(self):
344 super(AbstractLink, self)._verify_fields()
348 'can\'t instantiate {} without defining both ' 349 'source=={!r} and dest=={!r} fields').
format(
357 isl_protected_fields = frozenset((
358 'time_create',
'time_modify',
359 'latency',
'speed',
'available_bandwidth',
'actual',
'status'))
361 'cost': convert_integer}
369 source = NetworkEndpoint.new_from_java(data.pop(
'source'))
370 dest = NetworkEndpoint.new_from_java(data.pop(
'dest'))
371 props = data.pop(
'props', dict()).copy()
373 return cls(source, dest, props=props, **data)
380 for prefix
in (
'src_',
'dst_'):
381 dpid = data.pop(prefix +
'switch')
382 port = data.pop(prefix +
'port')
384 source, dest = endpoints
389 return cls(source, dest, props=props, **data)
393 return cls(isl.source, isl.dest)
396 super(LinkProps, self).
__init__(source=source, dest=dest, **fields)
406 filtered[field] = self.
props.pop(field)
412 def _decode_props(cls, props):
418 props[field] = converter(value)
422 fields = super(LinkProps, self).
pack()
423 fields.pop(
'filtered')
435 IslPathNode.new_from_java(x)
437 except KeyError
as e:
439 'Invalid record format "path": is not contain key ' 442 if 2 == len(endpoints):
444 elif 1 == len(endpoints):
445 endpoints.append(
None)
448 'Invalid record format "path": expect list with 1 or 2 nodes')
450 source, dest = endpoints
451 return cls(source, dest, data[
'state'])
455 source =
IslPathNode(link[
'src_switch'], link[
'src_port'])
456 dest =
IslPathNode(link[
'dst_switch'], link[
'dst_port'])
457 return cls(source, dest, link[
'status'])
463 for x
in link_props.source, link_props.dest]
464 return cls(*endpoints)
466 def __init__(self, source, dest, state=None, **fields):
467 super(InterSwitchLink, self).
__init__(
468 source=source, dest=dest, state=state, **fields)
471 ends_count = len(filter(
None, (self.
source, self.
dest)))
474 'ISL path not define %s/2 ends'.
format(ends_count))
486 if isinstance(o, TimeProperty):
488 elif isinstance(o, uuid.UUID):
490 elif isinstance(o, JsonSerializable):
492 elif isinstance(o, Abstract):
495 value = super(JSONEncoder, self).
default(o)
def __init__(self, dpid, port, fields)
def decode_db_fields(cls, data)
def convert_integer(raw, limit=sys.maxint)
def extract_protected_props(self)
def is_filled(self, instance)
dictionary props_converters
def ensure_path_complete(self)
def __init__(self, fields)
def __init__(self, value, produce=False, override_none=True)
def new_from_db(cls, value)
def __init__(self, value)
def __init__(self, source, dest, fields)
def __init__(self, fields)
def new_from_db(cls, link)
def new_from_isl(cls, isl)
def new_from_link_props(cls, link_props)
def new_from_db(cls, data)
def new_from_java(cls, data)
def decode_java_fields(cls, data)
def decode_java_fields(cls, data)
def new_from_java(cls, data)
def new_from_java(cls, data)
def decode_db_fields(cls, data)
def grab_fields(data, fields_mapping)
def as_java_timestamp(self)
def __init__(self, fields)
def _extract_fields(cls, data)
def __init__(self, source, dest, state=None, fields)
def new_from_java(cls, data)
def now(cls, milliseconds_precission=False)
def new_from_java_timestamp(cls, value)
def _resolve_name(self, owner)
def __get__(self, instance, owner)
def _decode_props(cls, props)