[ML] Renaming saved object repair to sync (#84311)

* [ML] Remaiming saved object repair to sync

* removing 0 from sync lists

Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com>
This commit is contained in:
James Gowdy 2020-11-30 12:24:03 +00:00 committed by GitHub
parent cb55898c98
commit 090359ca5a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 101 additions and 111 deletions

View file

@ -11,7 +11,7 @@ export interface SavedObjectResult {
[jobId: string]: { success: boolean; error?: any };
}
export interface RepairSavedObjectResponse {
export interface SyncSavedObjectResponse {
savedObjectsCreated: SavedObjectResult;
savedObjectsDeleted: SavedObjectResult;
datafeedsAdded: SavedObjectResult;

View file

@ -4,4 +4,4 @@
* you may not use this file except in compliance with the Elastic License.
*/
export { JobSpacesRepairFlyout } from './job_spaces_repair_flyout';
export { JobSpacesSyncFlyout } from './job_spaces_sync_flyout';

View file

@ -23,34 +23,31 @@ import {
} from '@elastic/eui';
import { ml } from '../../services/ml_api_service';
import {
RepairSavedObjectResponse,
SavedObjectResult,
} from '../../../../common/types/saved_objects';
import { RepairList } from './repair_list';
import { SyncSavedObjectResponse, SavedObjectResult } from '../../../../common/types/saved_objects';
import { SyncList } from './sync_list';
import { useToastNotificationService } from '../../services/toast_notification_service';
interface Props {
onClose: () => void;
}
export const JobSpacesRepairFlyout: FC<Props> = ({ onClose }) => {
export const JobSpacesSyncFlyout: FC<Props> = ({ onClose }) => {
const { displayErrorToast, displaySuccessToast } = useToastNotificationService();
const [loading, setLoading] = useState(false);
const [repairable, setRepairable] = useState(false);
const [repairResp, setRepairResp] = useState<RepairSavedObjectResponse | null>(null);
const [canSync, setCanSync] = useState(false);
const [syncResp, setSyncResp] = useState<SyncSavedObjectResponse | null>(null);
async function loadRepairList(simulate: boolean = true) {
async function loadSyncList(simulate: boolean = true) {
setLoading(true);
try {
const resp = await ml.savedObjects.repairSavedObjects(simulate);
setRepairResp(resp);
const resp = await ml.savedObjects.syncSavedObjects(simulate);
setSyncResp(resp);
const count = Object.values(resp).reduce((acc, cur) => acc + Object.keys(cur).length, 0);
setRepairable(count > 0);
setCanSync(count > 0);
setLoading(false);
return resp;
} catch (error) {
// this shouldn't be hit as errors are returned per-repair task
// this shouldn't be hit as errors are returned per-sync task
// as part of the response
displayErrorToast(error);
setLoading(false);
@ -59,32 +56,33 @@ export const JobSpacesRepairFlyout: FC<Props> = ({ onClose }) => {
}
useEffect(() => {
loadRepairList();
loadSyncList();
}, []);
async function repair() {
if (repairable) {
// perform the repair
const resp = await loadRepairList(false);
// check simulate the repair again to check that all
// items have been repaired.
await loadRepairList(true);
async function sync() {
if (canSync) {
// perform the sync
const resp = await loadSyncList(false);
// check simulate the sync again to check that all
// items have been synchronized.
await loadSyncList(true);
if (resp === null) {
return;
}
const { successCount, errorCount } = getResponseCounts(resp);
if (errorCount > 0) {
const title = i18n.translate('xpack.ml.management.repairSavedObjectsFlyout.repair.error', {
defaultMessage: 'Some jobs cannot be repaired.',
const title = i18n.translate('xpack.ml.management.syncSavedObjectsFlyout.sync.error', {
defaultMessage: 'Some jobs cannot be synchronized.',
});
displayErrorToast(resp as any, title);
return;
}
displaySuccessToast(
i18n.translate('xpack.ml.management.repairSavedObjectsFlyout.repair.success', {
defaultMessage: '{successCount} {successCount, plural, one {job} other {jobs}} repaired',
i18n.translate('xpack.ml.management.syncSavedObjectsFlyout.sync.success', {
defaultMessage:
'{successCount} {successCount, plural, one {job} other {jobs}} synchronized',
values: { successCount },
})
);
@ -98,8 +96,8 @@ export const JobSpacesRepairFlyout: FC<Props> = ({ onClose }) => {
<EuiTitle size="m">
<h2>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.headerLabel"
defaultMessage="Repair saved objects"
id="xpack.ml.management.syncSavedObjectsFlyout.headerLabel"
defaultMessage="Synchronize saved objects"
/>
</h2>
</EuiTitle>
@ -108,33 +106,29 @@ export const JobSpacesRepairFlyout: FC<Props> = ({ onClose }) => {
<EuiCallOut color="primary">
<EuiText size="s">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.description"
defaultMessage="Repair the saved objects if they are out of sync with the machine learning jobs in Elasticsearch."
id="xpack.ml.management.syncSavedObjectsFlyout.description"
defaultMessage="Synchronize the saved objects if they are out of sync with the machine learning jobs in Elasticsearch."
/>
</EuiText>
</EuiCallOut>
<EuiSpacer />
<RepairList repairItems={repairResp} />
<SyncList syncItems={syncResp} />
</EuiFlyoutBody>
<EuiFlyoutFooter>
<EuiFlexGroup justifyContent="spaceBetween">
<EuiFlexItem grow={false}>
<EuiButtonEmpty iconType="cross" onClick={onClose} flush="left">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.closeButton"
id="xpack.ml.management.syncSavedObjectsFlyout.closeButton"
defaultMessage="Close"
/>
</EuiButtonEmpty>
</EuiFlexItem>
<EuiFlexItem grow={false}>
<EuiButton
onClick={repair}
fill
isDisabled={repairable === false || loading === true}
>
<EuiButton onClick={sync} fill isDisabled={canSync === false || loading === true}>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.repairButton"
defaultMessage="Repair"
id="xpack.ml.management.syncSavedObjectsFlyout.syncButton"
defaultMessage="Synchronize"
/>
</EuiButton>
</EuiFlexItem>
@ -145,7 +139,7 @@ export const JobSpacesRepairFlyout: FC<Props> = ({ onClose }) => {
);
};
function getResponseCounts(resp: RepairSavedObjectResponse) {
function getResponseCounts(resp: SyncSavedObjectResponse) {
let successCount = 0;
let errorCount = 0;
Object.values(resp).forEach((result: SavedObjectResult) => {

View file

@ -9,38 +9,36 @@ import { FormattedMessage } from '@kbn/i18n/react';
import { EuiText, EuiTitle, EuiAccordion, EuiTextColor, EuiHorizontalRule } from '@elastic/eui';
import { RepairSavedObjectResponse } from '../../../../common/types/saved_objects';
import { SyncSavedObjectResponse } from '../../../../common/types/saved_objects';
export const RepairList: FC<{ repairItems: RepairSavedObjectResponse | null }> = ({
repairItems,
}) => {
if (repairItems === null) {
export const SyncList: FC<{ syncItems: SyncSavedObjectResponse | null }> = ({ syncItems }) => {
if (syncItems === null) {
return null;
}
return (
<>
<SavedObjectsCreated repairItems={repairItems} />
<SavedObjectsCreated syncItems={syncItems} />
<EuiHorizontalRule margin="l" />
<SavedObjectsDeleted repairItems={repairItems} />
<SavedObjectsDeleted syncItems={syncItems} />
<EuiHorizontalRule margin="l" />
<DatafeedsAdded repairItems={repairItems} />
<DatafeedsAdded syncItems={syncItems} />
<EuiHorizontalRule margin="l" />
<DatafeedsRemoved repairItems={repairItems} />
<DatafeedsRemoved syncItems={syncItems} />
<EuiHorizontalRule margin="l" />
</>
);
};
const SavedObjectsCreated: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repairItems }) => {
const items = Object.keys(repairItems.savedObjectsCreated);
const SavedObjectsCreated: FC<{ syncItems: SyncSavedObjectResponse }> = ({ syncItems }) => {
const items = Object.keys(syncItems.savedObjectsCreated);
const title = (
<>
@ -48,7 +46,7 @@ const SavedObjectsCreated: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
<h3>
<EuiTextColor color={items.length ? 'default' : 'subdued'}>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.savedObjectsCreated.title"
id="xpack.ml.management.syncSavedObjectsFlyout.savedObjectsCreated.title"
defaultMessage="Missing saved objects ({count})"
values={{ count: items.length }}
/>
@ -59,7 +57,7 @@ const SavedObjectsCreated: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
<p>
<EuiTextColor color="subdued">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.savedObjectsCreated.description"
id="xpack.ml.management.syncSavedObjectsFlyout.savedObjectsCreated.description"
defaultMessage="If there are jobs that do not have accompanying saved objects, they will be created in the current space."
/>
</EuiTextColor>
@ -67,11 +65,11 @@ const SavedObjectsCreated: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
</EuiText>
</>
);
return <RepairItem id="savedObjectsCreated" title={title} items={items} />;
return <SyncItem id="savedObjectsCreated" title={title} items={items} />;
};
const SavedObjectsDeleted: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repairItems }) => {
const items = Object.keys(repairItems.savedObjectsDeleted);
const SavedObjectsDeleted: FC<{ syncItems: SyncSavedObjectResponse }> = ({ syncItems }) => {
const items = Object.keys(syncItems.savedObjectsDeleted);
const title = (
<>
@ -79,7 +77,7 @@ const SavedObjectsDeleted: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
<h3>
<EuiTextColor color={items.length ? 'default' : 'subdued'}>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.savedObjectsDeleted.title"
id="xpack.ml.management.syncSavedObjectsFlyout.savedObjectsDeleted.title"
defaultMessage="Unmatched saved objects ({count})"
values={{ count: items.length }}
/>
@ -90,7 +88,7 @@ const SavedObjectsDeleted: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
<p>
<EuiTextColor color="subdued">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.savedObjectsDeleted.description"
id="xpack.ml.management.syncSavedObjectsFlyout.savedObjectsDeleted.description"
defaultMessage="If there are saved objects that do not have an accompanying job, they will be deleted."
/>
</EuiTextColor>
@ -98,11 +96,11 @@ const SavedObjectsDeleted: FC<{ repairItems: RepairSavedObjectResponse }> = ({ r
</EuiText>
</>
);
return <RepairItem id="savedObjectsDeleted" title={title} items={items} />;
return <SyncItem id="savedObjectsDeleted" title={title} items={items} />;
};
const DatafeedsAdded: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repairItems }) => {
const items = Object.keys(repairItems.datafeedsAdded);
const DatafeedsAdded: FC<{ syncItems: SyncSavedObjectResponse }> = ({ syncItems }) => {
const items = Object.keys(syncItems.datafeedsAdded);
const title = (
<>
@ -110,7 +108,7 @@ const DatafeedsAdded: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repair
<h3>
<EuiTextColor color={items.length ? 'default' : 'subdued'}>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.datafeedsAdded.title"
id="xpack.ml.management.syncSavedObjectsFlyout.datafeedsAdded.title"
defaultMessage="Saved objects with missing datafeeds ({count})"
values={{ count: items.length }}
/>
@ -121,7 +119,7 @@ const DatafeedsAdded: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repair
<p>
<EuiTextColor color="subdued">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.datafeedsAdded.description"
id="xpack.ml.management.syncSavedObjectsFlyout.datafeedsAdded.description"
defaultMessage="If there are saved objects that are missing the datafeed ID for anomaly detection jobs, the ID will be added."
/>
</EuiTextColor>
@ -129,11 +127,11 @@ const DatafeedsAdded: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repair
</EuiText>
</>
);
return <RepairItem id="datafeedsAdded" title={title} items={items} />;
return <SyncItem id="datafeedsAdded" title={title} items={items} />;
};
const DatafeedsRemoved: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repairItems }) => {
const items = Object.keys(repairItems.datafeedsRemoved);
const DatafeedsRemoved: FC<{ syncItems: SyncSavedObjectResponse }> = ({ syncItems }) => {
const items = Object.keys(syncItems.datafeedsRemoved);
const title = (
<>
@ -141,7 +139,7 @@ const DatafeedsRemoved: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repa
<h3>
<EuiTextColor color={items.length ? 'default' : 'subdued'}>
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.datafeedsRemoved.title"
id="xpack.ml.management.syncSavedObjectsFlyout.datafeedsRemoved.title"
defaultMessage="Saved objects with unmatched datafeed IDs ({count})"
values={{ count: items.length }}
/>
@ -152,7 +150,7 @@ const DatafeedsRemoved: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repa
<p>
<EuiTextColor color="subdued">
<FormattedMessage
id="xpack.ml.management.repairSavedObjectsFlyout.datafeedsRemoved.description"
id="xpack.ml.management.syncSavedObjectsFlyout.datafeedsRemoved.description"
defaultMessage="If there are saved objects that use a datafeed that does not exist, they will be deleted."
/>
</EuiTextColor>
@ -160,23 +158,21 @@ const DatafeedsRemoved: FC<{ repairItems: RepairSavedObjectResponse }> = ({ repa
</EuiText>
</>
);
return <RepairItem id="datafeedsRemoved" title={title} items={items} />;
return <SyncItem id="datafeedsRemoved" title={title} items={items} />;
};
const RepairItem: FC<{ id: string; title: JSX.Element; items: string[] }> = ({
const SyncItem: FC<{ id: string; title: JSX.Element; items: string[] }> = ({
id,
title,
items,
}) => (
<EuiAccordion id={id} buttonContent={title} paddingSize="l">
<EuiText size="s">
{items.length && (
<ul>
{items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
)}
<ul>
{items.map((item) => (
<li key={item}>{item}</li>
))}
</ul>
</EuiText>
</EuiAccordion>
);

View file

@ -39,7 +39,7 @@ import { DataFrameAnalyticsList } from '../../../../data_frame_analytics/pages/a
import { AccessDeniedPage } from '../access_denied_page';
import { SharePluginStart } from '../../../../../../../../../src/plugins/share/public';
import { SpacesPluginStart } from '../../../../../../../spaces/public';
import { JobSpacesRepairFlyout } from '../../../../components/job_spaces_repair';
import { JobSpacesSyncFlyout } from '../../../../components/job_spaces_sync';
import { getDefaultAnomalyDetectionJobsListState } from '../../../../jobs/jobs_list/jobs';
import { getMlGlobalServices } from '../../../../app';
import { ListingPageUrlState } from '../../../../../../common/types/common';
@ -125,7 +125,7 @@ export const JobsListPage: FC<{
const spacesEnabled = spaces !== undefined;
const [initialized, setInitialized] = useState(false);
const [accessDenied, setAccessDenied] = useState(false);
const [showRepairFlyout, setShowRepairFlyout] = useState(false);
const [showSyncFlyout, setShowSyncFlyout] = useState(false);
const [isMlEnabledInSpace, setIsMlEnabledInSpace] = useState(false);
const tabs = useTabs(isMlEnabledInSpace, spacesEnabled);
const [currentTabId, setCurrentTabId] = useState(tabs[0].id);
@ -184,8 +184,8 @@ export const JobsListPage: FC<{
);
}
function onCloseRepairFlyout() {
setShowRepairFlyout(false);
function onCloseSyncFlyout() {
setShowSyncFlyout(false);
}
if (accessDenied) {
@ -244,12 +244,12 @@ export const JobsListPage: FC<{
<EuiPageContentBody>
{spacesEnabled && (
<>
<EuiButtonEmpty onClick={() => setShowRepairFlyout(true)}>
{i18n.translate('xpack.ml.management.jobsList.repairFlyoutButton', {
defaultMessage: 'Repair saved objects',
<EuiButtonEmpty onClick={() => setShowSyncFlyout(true)}>
{i18n.translate('xpack.ml.management.jobsList.syncFlyoutButton', {
defaultMessage: 'Synchronize saved objects',
})}
</EuiButtonEmpty>
{showRepairFlyout && <JobSpacesRepairFlyout onClose={onCloseRepairFlyout} />}
{showSyncFlyout && <JobSpacesSyncFlyout onClose={onCloseSyncFlyout} />}
<EuiSpacer size="s" />
</>
)}

View file

@ -11,7 +11,7 @@ import { HttpService } from '../http_service';
import { basePath } from './index';
import {
JobType,
RepairSavedObjectResponse,
SyncSavedObjectResponse,
SavedObjectResult,
JobsSpacesResponse,
} from '../../../../common/types/saved_objects';
@ -40,9 +40,9 @@ export const savedObjectsApiProvider = (httpService: HttpService) => ({
});
},
repairSavedObjects(simulate: boolean = false) {
return httpService.http<RepairSavedObjectResponse>({
path: `${basePath()}/saved_objects/repair`,
syncSavedObjects(simulate: boolean = false) {
return httpService.http<SyncSavedObjectResponse>({
path: `${basePath()}/saved_objects/sync`,
method: 'GET',
query: { simulate },
});

View file

@ -145,7 +145,7 @@
"JobSavedObjects",
"SavedObjectsStatus",
"RepairJobSavedObjects",
"SyncJobSavedObjects",
"InitializeJobSavedObjects",
"AssignJobsToSpaces",
"RemoveJobsFromSpaces",

View file

@ -6,8 +6,8 @@
import { wrapError } from '../client/error_wrapper';
import { RouteInitialization, SavedObjectsRouteDeps } from '../types';
import { checksFactory, repairFactory } from '../saved_objects';
import { jobsAndSpaces, repairJobObjects, jobTypeSchema } from './schemas/saved_objects';
import { checksFactory, syncSavedObjectsFactory } from '../saved_objects';
import { jobsAndSpaces, syncJobObjects, jobTypeSchema } from './schemas/saved_objects';
import { jobIdsSchema } from './schemas/job_service_schema';
/**
@ -50,8 +50,8 @@ export function savedObjectsRoutes(
/**
* @apiGroup JobSavedObjects
*
* @api {get} /api/ml/saved_objects/repair Repair job saved objects
* @apiName RepairJobSavedObjects
* @api {get} /api/ml/saved_objects/sync Sync job saved objects
* @apiName SyncJobSavedObjects
* @apiDescription Create saved objects for jobs which are missing them.
* Delete saved objects for jobs which no longer exist.
* Update missing datafeed ids in saved objects for datafeeds which exist.
@ -60,9 +60,9 @@ export function savedObjectsRoutes(
*/
router.get(
{
path: '/api/ml/saved_objects/repair',
path: '/api/ml/saved_objects/sync',
validate: {
query: repairJobObjects,
query: syncJobObjects,
},
options: {
tags: ['access:ml:canCreateJob', 'access:ml:canCreateDataFrameAnalytics'],
@ -71,8 +71,8 @@ export function savedObjectsRoutes(
routeGuard.fullLicenseAPIGuard(async ({ client, request, response, jobSavedObjectService }) => {
try {
const { simulate } = request.query;
const { repairJobs } = repairFactory(client, jobSavedObjectService);
const savedObjects = await repairJobs(simulate);
const { syncSavedObjects } = syncSavedObjectsFactory(client, jobSavedObjectService);
const savedObjects = await syncSavedObjects(simulate);
return response.ok({
body: savedObjects,
@ -95,7 +95,7 @@ export function savedObjectsRoutes(
{
path: '/api/ml/saved_objects/initialize',
validate: {
query: repairJobObjects,
query: syncJobObjects,
},
options: {
tags: ['access:ml:canCreateJob', 'access:ml:canCreateDataFrameAnalytics'],
@ -104,7 +104,7 @@ export function savedObjectsRoutes(
routeGuard.fullLicenseAPIGuard(async ({ client, request, response, jobSavedObjectService }) => {
try {
const { simulate } = request.query;
const { initSavedObjects } = repairFactory(client, jobSavedObjectService);
const { initSavedObjects } = syncSavedObjectsFactory(client, jobSavedObjectService);
const savedObjects = await initSavedObjects(simulate);
return response.ok({

View file

@ -12,7 +12,7 @@ export const jobsAndSpaces = schema.object({
spaces: schema.arrayOf(schema.string()),
});
export const repairJobObjects = schema.object({ simulate: schema.maybe(schema.boolean()) });
export const syncJobObjects = schema.object({ simulate: schema.maybe(schema.boolean()) });
export const jobTypeSchema = schema.object({
jobType: schema.string(),

View file

@ -7,6 +7,6 @@
export { setupSavedObjects } from './saved_objects';
export { JobObject, JobSavedObjectService, jobSavedObjectServiceFactory } from './service';
export { checksFactory } from './checks';
export { repairFactory } from './repair';
export { syncSavedObjectsFactory } from './sync';
export { jobSavedObjectsInitializationFactory } from './initialization';
export { savedObjectClientsFactory } from './util';

View file

@ -6,7 +6,7 @@
import { IScopedClusterClient, CoreStart, SavedObjectsClientContract } from 'kibana/server';
import { savedObjectClientsFactory } from '../util';
import { repairFactory } from '../repair';
import { syncSavedObjectsFactory } from '../sync';
import { jobSavedObjectServiceFactory, JobObject } from '../service';
import { mlLog } from '../../lib/log';
import { ML_SAVED_OBJECT_TYPE } from '../../../common/types/saved_objects';
@ -58,7 +58,7 @@ export function jobSavedObjectsInitializationFactory(
// create space overrides for specific jobs
const jobSpaceOverrides = await createJobSpaceOverrides(client);
// initialize jobs
const { initSavedObjects } = repairFactory(client, jobSavedObjectService);
const { initSavedObjects } = syncSavedObjectsFactory(client, jobSavedObjectService);
const { jobs } = await initSavedObjects(false, jobSpaceOverrides);
mlLog.info(`${jobs.length} job saved objects initialized`);
} catch (error) {

View file

@ -5,7 +5,7 @@
*/
import { IScopedClusterClient } from 'kibana/server';
import type { JobSpaceOverrides } from '../../repair';
import type { JobSpaceOverrides } from '../../sync';
import { logJobsSpaces } from './logs';
import { metricsJobsSpaces } from './metrics';

View file

@ -9,7 +9,7 @@ import { IScopedClusterClient } from 'kibana/server';
import type { JobObject, JobSavedObjectService } from './service';
import {
JobType,
RepairSavedObjectResponse,
SyncSavedObjectResponse,
InitializeSavedObjectResponse,
} from '../../common/types/saved_objects';
import { checksFactory } from './checks';
@ -23,14 +23,14 @@ export interface JobSpaceOverrides {
};
}
export function repairFactory(
export function syncSavedObjectsFactory(
client: IScopedClusterClient,
jobSavedObjectService: JobSavedObjectService
) {
const { checkStatus } = checksFactory(client, jobSavedObjectService);
async function repairJobs(simulate: boolean = false) {
const results: RepairSavedObjectResponse = {
async function syncSavedObjects(simulate: boolean = false) {
const results: SyncSavedObjectResponse = {
savedObjectsCreated: {},
savedObjectsDeleted: {},
datafeedsAdded: {},
@ -232,5 +232,5 @@ export function repairFactory(
return results;
}
return { checkStatus, repairJobs, initSavedObjects };
return { checkStatus, syncSavedObjects, initSavedObjects };
}