代码拉取完成,页面将自动刷新
同步操作将从 anolis/leapp 强制同步,此操作会覆盖自 Fork 仓库以来所做的任何修改,且无法恢复!!!
确定后同步将在后台操作,完成时将刷新页面,请耐心等待。
From 689703e8853347e8644532b6e4d728197ed1930c Mon Sep 17 00:00:00 2001
From: Chunmei Xu <xuchunmei@openanolis.org>
Date: Wed, 16 Jun 2021 16:30:44 +0800
Subject: [PATCH 1/3] remove rhsm related settings after upgrade
Signed-off-by: Chunmei Xu <xuchunmei@openanolis.org>
---
.../el7toel8/actors/checkrhsmsku/actor.py | 22 ---
.../checkrhsmsku/libraries/checkrhsmsku.py | 30 -----
.../tests/test_rhsmsku_checkrhsmsku.py | 40 ------
.../actors/enablerhsmreposonrhel8/actor.py | 29 ----
.../libraries/enablerhsmreposonrhel8.py | 59 --------
.../tests/test_enablerhsmreposonrhel8.py | 127 ------------------
.../actors/reportsettargetrelease/actor.py | 23 ----
.../libraries/reportsettargetrelease.py | 53 --------
...getreleasereport_reportsettargetrelease.py | 28 ----
9 files changed, 411 deletions(-)
delete mode 100644 repos/system_upgrade/el7toel8/actors/checkrhsmsku/actor.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/checkrhsmsku/libraries/checkrhsmsku.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/checkrhsmsku/tests/test_rhsmsku_checkrhsmsku.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/actor.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/libraries/enablerhsmreposonrhel8.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/tests/test_enablerhsmreposonrhel8.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/reportsettargetrelease/actor.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/reportsettargetrelease/libraries/reportsettargetrelease.py
delete mode 100644 repos/system_upgrade/el7toel8/actors/reportsettargetrelease/tests/test_targetreleasereport_reportsettargetrelease.py
diff --git a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/actor.py b/repos/system_upgrade/el7toel8/actors/checkrhsmsku/actor.py
deleted file mode 100644
index de571c1..0000000
--- a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/actor.py
+++ /dev/null
@@ -1,22 +0,0 @@
-from leapp.actors import Actor
-from leapp.libraries.actor import checkrhsmsku
-from leapp.models import Report, RHSMInfo
-from leapp.tags import IPUWorkflowTag, ChecksPhaseTag
-
-
-class CheckRedHatSubscriptionManagerSKU(Actor):
- """
- Ensure the system is subscribed to the subscription manager
-
- This actor verifies that the system is correctly subscribed to via the Red Hat Subscription Manager and
- has attached SKUs. The actor will inhibit the upgrade if there are none and RHSM is not supposed
- to be skipped.
- """
-
- name = 'check_rhsmsku'
- consumes = (RHSMInfo,)
- produces = (Report,)
- tags = (IPUWorkflowTag, ChecksPhaseTag)
-
- def process(self):
- checkrhsmsku.process()
diff --git a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/libraries/checkrhsmsku.py b/repos/system_upgrade/el7toel8/actors/checkrhsmsku/libraries/checkrhsmsku.py
deleted file mode 100644
index a41bbe9..0000000
--- a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/libraries/checkrhsmsku.py
+++ /dev/null
@@ -1,30 +0,0 @@
-from leapp import reporting
-from leapp.libraries.common import rhsm
-from leapp.libraries.stdlib import api
-from leapp.models import RHSMInfo
-from leapp.reporting import create_report
-
-
-SCA_TEXT = "Content Access Mode is set to Simple Content Access"
-
-
-def process():
- if not rhsm.skip_rhsm():
- for info in api.consume(RHSMInfo):
- if not info.attached_skus and not info.sca_detected:
- create_report([
- reporting.Title('The system is not registered or subscribed.'),
- reporting.Summary(
- 'The system has to be registered and subscribed to be able to proceed'
- ' with the upgrade, unless the --no-rhsm option is specified when'
- ' executing leapp.'
- ),
- reporting.Severity(reporting.Severity.HIGH),
- reporting.Tags([reporting.Tags.SANITY]),
- reporting.Flags([reporting.Flags.INHIBITOR]),
- reporting.Remediation(
- hint='Register your system with the subscription-manager tool and attach'
- ' proper SKUs to be able to proceed the upgrade or use the --no-rhsm'
- ' leapp option if you want to provide target repositories by yourself.'),
- reporting.RelatedResource('package', 'subscription-manager')
- ])
diff --git a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/tests/test_rhsmsku_checkrhsmsku.py b/repos/system_upgrade/el7toel8/actors/checkrhsmsku/tests/test_rhsmsku_checkrhsmsku.py
deleted file mode 100644
index 7cdf330..0000000
--- a/repos/system_upgrade/el7toel8/actors/checkrhsmsku/tests/test_rhsmsku_checkrhsmsku.py
+++ /dev/null
@@ -1,40 +0,0 @@
-from leapp.libraries.actor import checkrhsmsku
-from leapp.libraries.common import rhsm
-from leapp.libraries.common.testutils import create_report_mocked
-from leapp.libraries.stdlib import api
-from leapp.models import RHSMInfo
-
-
-def test_sku_report_skipped(monkeypatch):
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: True)
- monkeypatch.setattr(api, 'consume', lambda x: (RHSMInfo(attached_skus=[]),))
- monkeypatch.setattr(checkrhsmsku, 'create_report', create_report_mocked())
- checkrhsmsku.process()
- assert not checkrhsmsku.create_report.called
-
-
-def test_sku_report_has_skus(monkeypatch):
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: False)
- monkeypatch.setattr(api, 'consume', lambda x: (RHSMInfo(attached_skus=['testing-sku']),))
- monkeypatch.setattr(checkrhsmsku, 'create_report', create_report_mocked())
- checkrhsmsku.process()
- assert not checkrhsmsku.create_report.called
-
-
-def test_sku_report_has_no_skus(monkeypatch):
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: False)
- monkeypatch.setattr(api, 'consume', lambda x: (RHSMInfo(attached_skus=[]),))
- monkeypatch.setattr(checkrhsmsku, 'create_report', create_report_mocked())
- checkrhsmsku.process()
- assert checkrhsmsku.create_report.called == 1
- assert checkrhsmsku.create_report.report_fields['title'] == 'The system is not registered or subscribed.'
- assert checkrhsmsku.create_report.report_fields['severity'] == 'high'
- assert 'inhibitor' in checkrhsmsku.create_report.report_fields['flags']
-
-
-def test_sku_report_has_sca(monkeypatch):
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: False)
- monkeypatch.setattr(api, 'consume', lambda x: (RHSMInfo(attached_skus=[], sca_detected=True),))
- monkeypatch.setattr(checkrhsmsku, 'create_report', create_report_mocked())
- checkrhsmsku.process()
- assert not checkrhsmsku.create_report.called
diff --git a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/actor.py b/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/actor.py
deleted file mode 100644
index 06d6e67..0000000
--- a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/actor.py
+++ /dev/null
@@ -1,29 +0,0 @@
-from leapp.actors import Actor
-from leapp.libraries.actor import enablerhsmreposonrhel8
-from leapp.models import UsedTargetRepositories
-from leapp.tags import FirstBootPhaseTag, IPUWorkflowTag
-
-
-class EnableRHSMReposOnRHEL8(Actor):
- """
- On the upgraded Anolis 8, set release and enable repositories that were used during the upgrade transaction.
-
- We are enabling those Anolis 8 repos that are equivalent to the enabled Anolis 7 ones available. The BaseOS and
- AppStream repos are enabled on Anolis 8 by default. Any other repository needs to be enabled specifically using
- the subscription-manager (RHSM) utility. In case some custom repo was used during the upgrade transaction,
- this won't be enabled by this actors as it is unknown to the subscription-manager.
-
- We need to overwrite any RHSM release that may have been set before the upgrade, e.g. 7.6. Reasons:
- - If we leave the old RHEL 7 release set, dnf calls on the upgraded Anolis 8 would fail.
- - If we merely unset the release, users might end up updating the system to a newer version than the upgrade
- was supposed to be upgrading to.
- """
-
- name = 'enable_rhsm_repos_on_rhel8'
- consumes = (UsedTargetRepositories,)
- produces = ()
- tags = (IPUWorkflowTag, FirstBootPhaseTag)
-
- def process(self):
- enablerhsmreposonrhel8.set_rhsm_release()
- enablerhsmreposonrhel8.enable_rhsm_repos()
diff --git a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/libraries/enablerhsmreposonrhel8.py b/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/libraries/enablerhsmreposonrhel8.py
deleted file mode 100644
index fc71ae9..0000000
--- a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/libraries/enablerhsmreposonrhel8.py
+++ /dev/null
@@ -1,59 +0,0 @@
-from leapp.libraries.common import config, mounting, rhsm
-from leapp.libraries.stdlib import CalledProcessError, api, run
-from leapp.models import UsedTargetRepositories
-
-
-def set_rhsm_release():
- """Set the RHSM release to the target Anolis 8 minor version."""
- if rhsm.skip_rhsm():
- api.current_logger().debug('Skipping setting the RHSM release due to --no-rhsm or environment variables.')
- return
-
- if config.get_product_type('target') != 'ga':
- api.current_logger().debug('Skipping setting the RHSM release as target product is set to beta/htb')
- return
- target_version = api.current_actor().configuration.version.target
- try:
- rhsm.set_release(mounting.NotIsolatedActions(base_dir='/'), target_version)
- except CalledProcessError as err:
- api.current_logger().warning('Unable to set the {0} release through subscription-manager. When using dnf,'
- ' content of the latest Anolis 8 minor version will be downloaded.\n{1}'
- .format(target_version, str(err)))
-
-
-def enable_rhsm_repos():
- """
- Try enabling all the Anolis 8 repositories that have been used for the upgrade transaction.
-
- In case of custom repositories, the subscription-manager reports an error that it doesn't know them, but it enables
- the known repositories.
- """
- if rhsm.skip_rhsm():
- api.current_logger().debug('Skipping enabling repositories through subscription-manager due to --no-rhsm'
- ' or environment variables.')
- return
- try:
- run(get_submgr_cmd(get_repos_to_enable()))
- except CalledProcessError as err:
- api.current_logger().warning('The subscription-manager could not enable some repositories.\n'
- 'It is expected behavior in case of custom repositories unknown to'
- ' the subscription-manager - these need to be enabled manually.\n{0}'
- .format(str(err)))
-
-
-def get_submgr_cmd(repos_to_enable):
- submgr_cmd = ['subscription-manager', 'repos']
- for repoid in repos_to_enable:
- submgr_cmd += ['--enable', repoid]
- return submgr_cmd
-
-
-def get_repos_to_enable():
- """
- Return set of repositories used during the upgrade transaction.
-
- This set may include repos unknown to subscription-manager - notable those added as custom using
- CustomTargetRepository model.
- """
- used_repos_msg = next(api.consume(UsedTargetRepositories), None)
- return {repo.repoid for repo in used_repos_msg.repos}
diff --git a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/tests/test_enablerhsmreposonrhel8.py b/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/tests/test_enablerhsmreposonrhel8.py
deleted file mode 100644
index fcc0719..0000000
--- a/repos/system_upgrade/el7toel8/actors/enablerhsmreposonrhel8/tests/test_enablerhsmreposonrhel8.py
+++ /dev/null
@@ -1,127 +0,0 @@
-import sys
-
-import pytest
-
-from leapp.exceptions import StopActorExecutionError
-from leapp.libraries.actor import enablerhsmreposonrhel8
-from leapp.libraries.common import config, mounting, rhsm
-from leapp.libraries.common.testutils import CurrentActorMocked, logger_mocked
-from leapp.libraries.stdlib import CalledProcessError, api
-from leapp.models import EnvVar, UsedTargetRepositories, UsedTargetRepository
-
-
-def not_isolated_actions(raise_err=False):
- commands_called = []
-
- class MockNotIsolatedActions(object):
- def __init__(self, base_dir=None):
- pass
-
- def call(self, cmd, **kwargs):
- commands_called.append((cmd, kwargs))
- if raise_err:
- raise_call_error()
-
- return (commands_called, MockNotIsolatedActions)
-
-
-def raise_call_error(args=None):
- raise CalledProcessError(
- message='A Leapp Command Error occured.',
- command=args,
- result={'signal': None, 'exit_code': 1, 'pid': 0, 'stdout': 'fake', 'stderr': 'fake'}
- )
-
-
-class run_mocked(object):
- def __init__(self, raise_err=False):
- self.called = 0
- self.args = []
- self.raise_err = raise_err
-
- def __call__(self, *args):
- self.called += 1
- self.args.append(args)
- if self.raise_err:
- raise_call_error(args)
-
-
-def test_setrelease(monkeypatch):
- commands_called, klass = not_isolated_actions()
- monkeypatch.setattr(mounting, 'NotIsolatedActions', klass)
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.0'))
- monkeypatch.setattr(config, 'get_product_type', lambda dummy: 'ga')
- enablerhsmreposonrhel8.set_rhsm_release()
- assert commands_called and len(commands_called) == 1
- assert commands_called[0][0][-1] == '8.0'
-
-
-def test_setrelease_submgr_throwing_error(monkeypatch):
- _, klass = not_isolated_actions(raise_err=True)
- monkeypatch.setattr(mounting, 'NotIsolatedActions', klass)
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.0', envars={'LEAPP_NO_RHSM': '0'}))
- monkeypatch.setattr(config, 'get_product_type', lambda dummy: 'ga')
- # free the set_release funtion from the @_rhsm_retry decorator which would otherwise cause 25 sec delay of the test
- if sys.version_info.major < 3:
- monkeypatch.setattr(rhsm, 'set_release',
- rhsm.set_release.func_closure[0].cell_contents.func_closure[0].cell_contents)
- else:
- monkeypatch.setattr(rhsm, 'set_release', rhsm.set_release.__wrapped__.__wrapped__)
- with pytest.raises(StopActorExecutionError):
- enablerhsmreposonrhel8.set_rhsm_release()
-
-
-@pytest.mark.parametrize('product', ['beta', 'htb'])
-def test_setrelease_skip_rhsm(monkeypatch, product):
- commands_called, _ = not_isolated_actions()
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(envars={'LEAPP_NO_RHSM': '1'}))
- monkeypatch.setattr(api, 'current_logger', logger_mocked())
- monkeypatch.setattr(config, 'get_product_type', lambda dummy: product)
- # To make this work we need to re-apply the decorator, so it respects the environment variable
- monkeypatch.setattr(rhsm, 'set_release', rhsm.with_rhsm(rhsm.set_release))
- enablerhsmreposonrhel8.set_rhsm_release()
- assert not commands_called
-
-
-def construct_UTRepo_consume(repoids):
- repos = [UsedTargetRepository(repoid=repoid) for repoid in repoids]
- return lambda *x: (x for x in (UsedTargetRepositories(repos=repos),))
-
-
-def test_get_unique_repoids(monkeypatch):
- repoids = (['some-repo', 'some-repo', 'another-repo'])
- monkeypatch.setattr(api, 'consume', construct_UTRepo_consume(repoids))
- assert enablerhsmreposonrhel8.get_repos_to_enable() == {'some-repo', 'another-repo'}
-
-
-def test_get_submgr_cmd():
- assert enablerhsmreposonrhel8.get_submgr_cmd({'some-repo'}) == ['subscription-manager', 'repos', '--enable',
- 'some-repo']
-
-
-def test_running_submgr_ok(monkeypatch):
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.0', envars={'LEAPP_NO_RHSM': '0'}), )
- monkeypatch.setattr(enablerhsmreposonrhel8, 'get_repos_to_enable', lambda: {'some-repo'})
- monkeypatch.setattr(enablerhsmreposonrhel8, 'run', run_mocked())
- enablerhsmreposonrhel8.enable_rhsm_repos()
- assert enablerhsmreposonrhel8.run.called
- assert 'subscription-manager' in enablerhsmreposonrhel8.run.args[0][0]
-
-
-def test_running_submgr_fail(monkeypatch):
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.0', envars={'LEAPP_NO_RHSM': '0'}), )
- monkeypatch.setattr(enablerhsmreposonrhel8, 'get_repos_to_enable', lambda: {'some-repo'})
- monkeypatch.setattr(enablerhsmreposonrhel8, 'run', run_mocked(raise_err=True))
- monkeypatch.setattr(api, 'current_logger', logger_mocked())
- enablerhsmreposonrhel8.enable_rhsm_repos()
- assert enablerhsmreposonrhel8.run.called
- assert api.current_logger.warnmsg
-
-
-def test_enable_repos_skip_rhsm(monkeypatch):
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(envars={'LEAPP_NO_RHSM': '1'}))
- monkeypatch.setattr(enablerhsmreposonrhel8, 'run', run_mocked())
- monkeypatch.setattr(api, 'current_logger', logger_mocked())
- enablerhsmreposonrhel8.enable_rhsm_repos()
- assert not enablerhsmreposonrhel8.run.called
- assert api.current_logger.dbgmsg
diff --git a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/actor.py b/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/actor.py
deleted file mode 100644
index c1aa681..0000000
--- a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/actor.py
+++ /dev/null
@@ -1,23 +0,0 @@
-from leapp.actors import Actor
-from leapp.libraries.actor import reportsettargetrelease
-from leapp.models import Report
-from leapp.tags import IPUWorkflowTag, TargetTransactionChecksPhaseTag
-
-
-class ReportSetTargetRelease(Actor):
- """
- Reports information related to the release set in the subscription-manager after the upgrade.
-
- When using Red Hat subscription-manager (RHSM), the release is set by default
- to the target version release. In case of skip of the RHSM (--no-rhsm), the
- release stay as it is on the RHEL 7 and user has to handle it manually after
- the upgrade.
- """
-
- name = 'report_set_target_release'
- consumes = ()
- produces = (Report,)
- tags = (IPUWorkflowTag, TargetTransactionChecksPhaseTag)
-
- def process(self):
- reportsettargetrelease.process()
diff --git a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/libraries/reportsettargetrelease.py b/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/libraries/reportsettargetrelease.py
deleted file mode 100644
index faed27d..0000000
--- a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/libraries/reportsettargetrelease.py
+++ /dev/null
@@ -1,53 +0,0 @@
-from leapp import reporting
-from leapp.libraries.stdlib import api
-from leapp.libraries.common import rhsm
-
-
-def _report_set_release():
- target_version = api.current_actor().configuration.version.target
- reporting.create_report([
- reporting.Title(
- 'The subscription-manager release is going to be set after the upgrade'),
- reporting.Summary(
- 'After the upgrade has completed the release of the subscription-manager will be set to {release}.'
- ' This will ensure that you will receive and keep the version you choose to upgrade to.'
- .format(release=target_version)
- ),
- reporting.Severity(reporting.Severity.LOW),
- reporting.Remediation(
- hint='If you wish to receive updates for the latest released version of Anolis 8, run `subscription-manager'
- ' release --unset` after the upgrade.'),
- reporting.Tags([reporting.Tags.UPGRADE_PROCESS]),
- reporting.RelatedResource('package', 'subscription-manager')
- ])
-
-
-def _report_unhandled_release():
- # TODO: set the POST group after it's created.
- target_version = api.current_actor().configuration.version.target
- hint_command = 'subscription-manager release --set {}'.format(target_version)
- # FIXME: This should use Dialogs and Answers to offer post-upgrade remediation
- # so that users can choose whether to --set or --unset the release number
- hint = 'Set the new release (or unset it) after the upgrade using subscription-manager: ' + hint_command
- reporting.create_report([
- reporting.Title(
- 'The subscription-manager release is going to be kept as it is during the upgrade'),
- reporting.Summary(
- 'The upgrade is executed with the --no-rhsm option (or with'
- ' the LEAPP_NO_RHSM environment variable). In this case, the subscription-manager'
- ' will not be configured during the upgrade. If the system is subscribed and release'
- ' is set already, you could encounter issues to get Anolis 8 content using DNF/YUM'
- ' after the upgrade.'
- ),
- reporting.Severity(reporting.Severity.LOW),
- reporting.Remediation(hint=hint),
- reporting.Tags([reporting.Tags.UPGRADE_PROCESS]),
- reporting.RelatedResource('package', 'subscription-manager')
- ])
-
-
-def process():
- if rhsm.skip_rhsm():
- _report_unhandled_release()
- else:
- _report_set_release()
diff --git a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/tests/test_targetreleasereport_reportsettargetrelease.py b/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/tests/test_targetreleasereport_reportsettargetrelease.py
deleted file mode 100644
index d866564..0000000
--- a/repos/system_upgrade/el7toel8/actors/reportsettargetrelease/tests/test_targetreleasereport_reportsettargetrelease.py
+++ /dev/null
@@ -1,28 +0,0 @@
-import pytest
-
-from leapp import reporting
-from leapp.libraries.actor import reportsettargetrelease
-from leapp.libraries.common import rhsm
-from leapp.libraries.common.testutils import create_report_mocked, CurrentActorMocked
-from leapp.libraries.stdlib import api
-
-
-@pytest.mark.parametrize('version', ['8.{}'.format(i) for i in range(4)])
-def test_report_target_version(monkeypatch, version):
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver=version))
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: False)
- monkeypatch.setattr(reporting, 'create_report', create_report_mocked())
- SUMMARY_FMT = 'will be set to {}.'
- reportsettargetrelease.process()
- assert reporting.create_report.called == 1
- assert SUMMARY_FMT.format(version) in reporting.create_report.report_fields['summary']
- assert 'is going to be set' in reporting.create_report.report_fields['title']
-
-
-def test_report_unhandled_release(monkeypatch):
- monkeypatch.setattr(api, 'current_actor', CurrentActorMocked(dst_ver='8.1'))
- monkeypatch.setattr(rhsm, 'skip_rhsm', lambda: True)
- monkeypatch.setattr(reporting, 'create_report', create_report_mocked())
- reportsettargetrelease.process()
- assert reporting.create_report.called == 1
- assert 'is going to be kept' in reporting.create_report.report_fields['title']
--
2.29.2
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。