Fix classes that select a subclass based on platform (#17034)

When unittesting this we found that the platform selecting class
hierarchies weren't working in all cases.  If the subclass was directly
created (ie: LinuxHardware()), then it would use its inherited __new__()
to try to create itself.  The inherited __new__ would look for
subclasses and end up calling its own __new__() again.  This would
recurse endlessly.  The new code detects when we want to find a subclass
to create (when the base class is used, ie: Hardware()) vs when to
create the class itself (when the subclass is used, ie:
LinuxHardware()).
This commit is contained in:
Toshio Kuratomi 2016-08-11 10:26:17 -07:00 committed by Adrian Likins
parent b82d150c42
commit 854d47826c

View file

@ -961,6 +961,12 @@ class Hardware(Facts):
platform = 'Generic'
def __new__(cls, *arguments, **keyword):
# When Hardware is created, it chooses a subclass to create instead.
# This check prevents the subclass from then trying to find a subclass
# and create that.
if cls is not Hardware:
return super(Hardware, cls).__new__(cls)
subclass = cls
for sc in get_all_subclasses(Hardware):
if sc.platform == platform.system():
@ -2052,6 +2058,12 @@ class Network(Facts):
'80' : 'organization' }
def __new__(cls, *arguments, **keyword):
# When Network is created, it chooses a subclass to create instead.
# This check prevents the subclass from then trying to find a subclass
# and create that.
if cls is not Network:
return super(Network, cls).__new__(cls)
subclass = cls
for sc in get_all_subclasses(Network):
if sc.platform == platform.system():
@ -2836,6 +2848,12 @@ class Virtual(Facts):
"""
def __new__(cls, *arguments, **keyword):
# When Virtual is created, it chooses a subclass to create instead.
# This check prevents the subclass from then trying to find a subclass
# and create that.
if cls is not Virtual:
return super(Virtual, cls).__new__(cls)
subclass = cls
for sc in get_all_subclasses(Virtual):
if sc.platform == platform.system():