diff --git a/lib/ansible/modules/hostname.py b/lib/ansible/modules/hostname.py index 94f9dc35913..76636351263 100644 --- a/lib/ansible/modules/hostname.py +++ b/lib/ansible/modules/hostname.py @@ -105,90 +105,6 @@ STRATS = { } -class UnimplementedStrategy(object): - def __init__(self, module): - self.module = module - - def update_current_and_permanent_hostname(self): - self.unimplemented_error() - - def update_current_hostname(self): - self.unimplemented_error() - - def update_permanent_hostname(self): - self.unimplemented_error() - - def get_current_hostname(self): - self.unimplemented_error() - - def set_current_hostname(self, name): - self.unimplemented_error() - - def get_permanent_hostname(self): - self.unimplemented_error() - - def set_permanent_hostname(self, name): - self.unimplemented_error() - - def unimplemented_error(self): - system = platform.system() - distribution = get_distribution() - if distribution is not None: - msg_platform = '%s (%s)' % (system, distribution) - else: - msg_platform = system - self.module.fail_json( - msg='hostname module cannot be used on platform %s' % msg_platform) - - -class Hostname(object): - """ - This is a generic Hostname manipulation class that is subclassed - based on platform. - - A subclass may wish to set different strategy instance to self.strategy. - - All subclasses MUST define platform and distribution (which may be None). - """ - - platform = 'Generic' - distribution = None # type: str | None - strategy_class = UnimplementedStrategy # type: t.Type[BaseStrategy] - - def __new__(cls, *args, **kwargs): - new_cls = get_platform_subclass(Hostname) - return super(cls, new_cls).__new__(new_cls) - - def __init__(self, module): - self.module = module - self.name = module.params['name'] - self.use = module.params['use'] - - if self.use is not None: - strat = globals()['%sStrategy' % STRATS[self.use]] - self.strategy = strat(module) - elif platform.system() == 'Linux' and ServiceMgrFactCollector.is_systemd_managed(module): - # This is Linux and systemd is active - self.strategy = SystemdStrategy(module) - else: - self.strategy = self.strategy_class(module) - - def update_current_and_permanent_hostname(self): - return self.strategy.update_current_and_permanent_hostname() - - def get_current_hostname(self): - return self.strategy.get_current_hostname() - - def set_current_hostname(self, name): - self.strategy.set_current_hostname(name) - - def get_permanent_hostname(self): - return self.strategy.get_permanent_hostname() - - def set_permanent_hostname(self, name): - self.strategy.set_permanent_hostname(name) - - class BaseStrategy(object): def __init__(self, module): self.module = module @@ -228,6 +144,39 @@ class BaseStrategy(object): raise NotImplementedError +class UnimplementedStrategy(BaseStrategy): + def update_current_and_permanent_hostname(self): + self.unimplemented_error() + + def update_current_hostname(self): + self.unimplemented_error() + + def update_permanent_hostname(self): + self.unimplemented_error() + + def get_current_hostname(self): + self.unimplemented_error() + + def set_current_hostname(self, name): + self.unimplemented_error() + + def get_permanent_hostname(self): + self.unimplemented_error() + + def set_permanent_hostname(self, name): + self.unimplemented_error() + + def unimplemented_error(self): + system = platform.system() + distribution = get_distribution() + if distribution is not None: + msg_platform = '%s (%s)' % (system, distribution) + else: + msg_platform = system + self.module.fail_json( + msg='hostname module cannot be used on platform %s' % msg_platform) + + class CommandStrategy(BaseStrategy): COMMAND = 'hostname' @@ -651,6 +600,54 @@ class DarwinStrategy(BaseStrategy): self.changed = True +class Hostname(object): + """ + This is a generic Hostname manipulation class that is subclassed + based on platform. + + A subclass may wish to set different strategy instance to self.strategy. + + All subclasses MUST define platform and distribution (which may be None). + """ + + platform = 'Generic' + distribution = None # type: str | None + strategy_class = UnimplementedStrategy # type: t.Type[BaseStrategy] + + def __new__(cls, *args, **kwargs): + new_cls = get_platform_subclass(Hostname) + return super(cls, new_cls).__new__(new_cls) + + def __init__(self, module): + self.module = module + self.name = module.params['name'] + self.use = module.params['use'] + + if self.use is not None: + strat = globals()['%sStrategy' % STRATS[self.use]] + self.strategy = strat(module) + elif platform.system() == 'Linux' and ServiceMgrFactCollector.is_systemd_managed(module): + # This is Linux and systemd is active + self.strategy = SystemdStrategy(module) + else: + self.strategy = self.strategy_class(module) + + def update_current_and_permanent_hostname(self): + return self.strategy.update_current_and_permanent_hostname() + + def get_current_hostname(self): + return self.strategy.get_current_hostname() + + def set_current_hostname(self, name): + self.strategy.set_current_hostname(name) + + def get_permanent_hostname(self): + return self.strategy.get_permanent_hostname() + + def set_permanent_hostname(self, name): + self.strategy.set_permanent_hostname(name) + + class SLESHostname(Hostname): platform = 'Linux' distribution = 'Sles'