def stop_services_async(self): """stop_services_async""" log.debug1("%s.stop_services_async()", self._log_prefix) with SystemdJobHandler() as job_handler: target_unit = get_target_unit_name(self.get_type(), self.get_name()) log.debug9("Stopping %s" % target_unit) job_path = job_handler.manager.StopUnit(target_unit, "replace") job_handler.register_job(job_path) job_results = yield job_handler.all_jobs_done_future() if any([x for x in job_results.values() if x not in ("skipped", "done")]): details = ", ".join(["%s: %s" % item for item in job_results.items()]) raise RolekitError(COMMAND_FAILED, "Stopping services failed: %s" % details) log.debug9("Disabling %s" % target_unit) disable_units([target_unit])
def stop_services_async(self): """stop_services_async""" log.debug1("%s.stop_services_async()", self._log_prefix) with SystemdJobHandler() as job_handler: target_unit = get_target_unit_name(self.get_type(), self.get_name()) log.debug9("Disabling %s" % target_unit) disable_units([target_unit]) log.debug9("Stopping %s" % target_unit) job_path = job_handler.manager.StopUnit(target_unit, "replace") job_handler.register_job(job_path) job_results = yield job_handler.all_jobs_done_future() if any( [x for x in job_results.values() if x not in ("skipped", "done")]): details = ", ".join( ["%s: %s" % item for item in job_results.items()]) raise RolekitError(COMMAND_FAILED, "Stopping services failed: %s" % details)
def deploy_async(self, values, sender=None): """deploy role""" remove_instance = False values = dbus_to_python(values) # Make sure we are in the proper state self.assert_state(NASCENT) # Log log.debug1("%s.deploy(%s)", self._log_prefix, values) # Check values try: self.check_values(values) except Exception as e: # Check values failed, remove the instance again if verification # failed, set state to error, save it (will be visible in the # .old backup file). self.change_state(ERROR, error=str(e), write=True) # cleanup self.__remove_instance() raise try: # Change to deploying state self.change_state(DEPLOYING) # Copy _DEFAULTS to self._settings self.copy_defaults() # Install package groups and packages log.debug9("TRACE: Installing packages") yield async.call_future(self.installPackages()) # Install firewall self.installFirewall() # Call do_deploy log.debug9("TRACE: Performing role-specific deployment") try: target = yield async.call_future(self.do_deploy_async(values, sender)) except RolekitError as e: if e.code == INVALID_VALUE: # If we failed because the input values were incorrect, # also remove the instance. remove_instance = True raise # Continue only after successful deployment: # Apply values to self._settings log.debug9("TRACE: role-specific deployment complete, applying values") self.apply_values(values) # Set up systemd target files log.debug9("TRACE: Creating systemd target files") self.create_target(target) # Change to ready to start state self.change_state(READY_TO_START, write=True) # In case this was a nextboot deployment, make sure to remove # the deferred role settings and systemd unit try: # Remove settings deferredsettings = "%s/%s/%s.json" % (ETC_ROLEKIT_DEFERREDROLES, self.get_type(), self.get_name()) os.unlink(deferredsettings) # Remove systemd service unit deferredunit = "%s/deferred-role-deployment-%s-%s.service" % ( SYSTEMD_UNITS, self.get_type(), self.get_name()) disable_units([deferredunit]) os.unlink(deferredunit) except FileNotFoundError: # Files didn't exist; ignore that pass except PermissionError: # SELinux bug? log.fatal("ERROR: permission error attempting to delete %s or %s" % ( deferredsettings, deferredunit )) # We'll continue anyway, since the service should be runnable at this point # The ConditionPathExists will prevent the service from trying to deploy # again # Tell systemd to reload the daemon configuration log.debug9("Reloading systemd units\n") with SystemdJobHandler() as job_handler: job_handler.manager.Reload() # Start monitoring the role self.monitor_unit() # Attempt to start the newly-deployed role # We do this because many role-installers will conclude by # starting anyway and we want to ensure that our role mechanism # is in sync with them. log.debug9("TRACE: Starting %s" % self.get_name()) yield async.call_future(self.__start_async(sender)) except Exception as e: # Something failed, set state to error self.change_state(ERROR, error=str(e), write=True) if remove_instance: self.__remove_instance() raise
def deploy_async(self, values, sender=None): """deploy role""" remove_instance = False values = dbus_to_python(values) # Make sure we are in the proper state self.assert_state(NASCENT) # Log log.debug1("%s.deploy(%s)", self._log_prefix, values) # Check values try: self.check_values(values) except Exception as e: # Check values failed, remove the instance again if verification # failed, set state to error, save it (will be visible in the # .old backup file). self.change_state(ERROR, error=str(e), write=True) # cleanup self.__remove_instance() raise try: # Change to deploying state self.change_state(DEPLOYING) # Copy _DEFAULTS to self._settings self.copy_defaults() # Install package groups and packages log.debug9("TRACE: Installing packages") yield async .call_future(self.installPackages()) # Install firewall self.installFirewall() # Call do_deploy log.debug9("TRACE: Performing role-specific deployment") try: target = yield async .call_future( self.do_deploy_async(values, sender)) except RolekitError as e: if e.code == INVALID_VALUE: # If we failed because the input values were incorrect, # also remove the instance. remove_instance = True raise # Continue only after successful deployment: # Apply values to self._settings log.debug9( "TRACE: role-specific deployment complete, applying values") self.apply_values(values) # Set up systemd target files log.debug9("TRACE: Creating systemd target files") self.create_target(target) # Change to ready to start state self.change_state(READY_TO_START, write=True) # In case this was a nextboot deployment, make sure to remove # the deferred role settings and systemd unit try: # Remove settings deferredsettings = "%s/%s/%s.json" % ( ETC_ROLEKIT_DEFERREDROLES, self.get_type(), self.get_name()) os.unlink(deferredsettings) # Remove systemd service unit deferredunit = "%s/deferred-role-deployment-%s-%s.service" % ( SYSTEMD_UNITS, self.get_type(), self.get_name()) disable_units([deferredunit]) os.unlink(deferredunit) except FileNotFoundError: # Files didn't exist; ignore that pass except PermissionError: # SELinux bug? log.fatal( "ERROR: permission error attempting to delete %s or %s" % (deferredsettings, deferredunit)) # We'll continue anyway, since the service should be runnable at this point # The ConditionPathExists will prevent the service from trying to deploy # again # Tell systemd to reload the daemon configuration log.debug9("Reloading systemd units\n") with SystemdJobHandler() as job_handler: job_handler.manager.Reload() # Start monitoring the role self.monitor_unit() # Attempt to start the newly-deployed role # We do this because many role-installers will conclude by # starting anyway and we want to ensure that our role mechanism # is in sync with them. log.debug9("TRACE: Starting %s" % self.get_name()) yield async .call_future(self.__start_async(sender)) except Exception as e: # Something failed, set state to error self.change_state(ERROR, error=str(e), write=True) if remove_instance: self.__remove_instance() raise