def _attach_with_token(cfg: config.UAConfig, token: str, allow_enable: bool) -> int: """Common functionality to take a token and attach via contract backend""" try: contract.request_updated_contract(cfg, token, allow_enable=allow_enable) except util.UrlError as exc: with util.disable_log_to_console(): logging.exception(exc) print(ua_status.MESSAGE_ATTACH_FAILURE) cfg.status() # Persist updated status in the event of partial attach return 1 except exceptions.UserFacingError as exc: logging.warning(exc.msg) cfg.status() # Persist updated status in the event of partial attach return 1 contract_name = cfg.machine_token["machineTokenInfo"]["contractInfo"][ "name"] print( ua_status.MESSAGE_ATTACH_SUCCESS_TMPL.format( contract_name=contract_name)) action_status(args=None, cfg=cfg) return 0
def _perform_enable(entitlement_name: str, cfg: config.UAConfig, *, assume_yes: bool = False, silent_if_inapplicable: bool = False) -> bool: """Perform the enable action on a named entitlement. (This helper excludes any messaging, so that different enablement code paths can message themselves.) :param entitlement_name: the name of the entitlement to enable :param cfg: the UAConfig to pass to the entitlement :param assume_yes: Assume a yes response for any prompts during service enable :param silent_if_inapplicable: don't output messages when determining if an entitlement can be enabled on this system @return: True on success, False otherwise """ ent_cls = entitlements.ENTITLEMENT_CLASS_BY_NAME[entitlement_name] entitlement = ent_cls(cfg, assume_yes=assume_yes) ret = entitlement.enable(silent_if_inapplicable=silent_if_inapplicable) cfg.status() # Update the status cache return ret
def _perform_enable(entitlement_name: str, cfg: config.UAConfig, *, assume_yes: bool = False, silent_if_inapplicable: bool = False, allow_beta: bool = False) -> bool: """Perform the enable action on a named entitlement. (This helper excludes any messaging, so that different enablement code paths can message themselves.) :param entitlement_name: the name of the entitlement to enable :param cfg: the UAConfig to pass to the entitlement :param assume_yes: Assume a yes response for any prompts during service enable :param silent_if_inapplicable: don't output messages when determining if an entitlement can be enabled on this system :param allow_beta: Allow enabling beta services @return: True on success, False otherwise """ ent_cls = entitlements.ENTITLEMENT_CLASS_BY_NAME[entitlement_name] if not allow_beta and ent_cls.is_beta: tmpl = ua_status.MESSAGE_INVALID_SERVICE_OP_FAILURE_TMPL raise exceptions.UserFacingError( tmpl.format(operation="enable", name=entitlement_name)) entitlement = ent_cls(cfg, assume_yes=assume_yes) ret = entitlement.enable(silent_if_inapplicable=silent_if_inapplicable) cfg.status() # Update the status cache return ret
def test_cache_file_is_written_world_readable(self, _m_getuid, _m_get_available_resources, tmpdir): cfg = UAConfig({"data_dir": tmpdir.strpath}) cfg.status() assert 0o644 == stat.S_IMODE( os.lstat(cfg.data_path("status-cache")).st_mode)
def test_nonroot_user_uses_cache_if_available(self, m_getuid, tmpdir): m_getuid.return_value = 1000 status = {"pass": True} cfg = UAConfig({"data_dir": tmpdir.strpath}) cfg.write_cache("status-cache", status) assert status == cfg.status()
def test_root_followed_by_nonroot(self, m_getuid, tmpdir): """Ensure that non-root run after root returns data""" cfg = UAConfig({"data_dir": tmpdir.strpath}) # Run as root m_getuid.return_value = 0 before = copy.deepcopy(cfg.status()) # Replicate an attach by modifying the underlying config and confirm # that we see different status other_cfg = FakeConfig.for_attached_machine() cfg.write_cache("accounts", {"accounts": other_cfg.accounts}) cfg.write_cache("machine-token", other_cfg.machine_token) assert cfg._status() != before # Run as regular user and confirm that we see the result from # last time we called .status() m_getuid.return_value = 1000 after = cfg.status() assert before == after
def test_nonroot_user_uses_cache_and_updates_if_available( self, _m_should_reboot, m_getuid, tmpdir): m_getuid.return_value = 1000 status = {"pass": True} cfg = UAConfig({"data_dir": tmpdir.strpath}) cfg.write_cache("status-cache", status) # Even non-root users can update configStatus details details = MESSAGE_ENABLE_REBOOT_REQUIRED_TMPL.format( operation="configuration changes") status.update({ "configStatus": UserFacingConfigStatus.REBOOTREQUIRED.value, "configStatusDetails": details, }) assert status == cfg.status()