Skip to content

Add MirrorFileValidator SPI and xDS mirroring UI - #1330

Merged
minwoox merged 6 commits into
line:mainfrom
minwoox:xds_mirroring
Jul 14, 2026
Merged

Add MirrorFileValidator SPI and xDS mirroring UI#1330
minwoox merged 6 commits into
line:mainfrom
minwoox:xds_mirroring

Conversation

@minwoox

@minwoox minwoox commented Jul 10, 2026

Copy link
Copy Markdown
Contributor

Motivation:

When a Git repository is mirrored into an @xds repository, there was no mechanism to reject invalid xDS resource files before they were committed. A typo or structurally-wrong protobuf file would silently land in the repository and break the control plane at push time rather than at the source. Additionally, the xDS UI had no way to manage the mirrors and credentials that back an xDS group.

Modifications:

  • Add MirrorFileValidator, a @FunctionalInterface SPI loaded via ServiceLoader. Implementations are invoked in AbstractMirror inside a new validateChanges() method called by both AbstractGitMirror and CentralDogmaMirror before each push. All validation errors are collected and surfaced as a single MirrorException; mirror state files are excluded from validation.
  • Add XdsMirrorFileValidator, the xDS-specific implementation. It rejects changes to the @xds project that target paths reserved for the Kubernetes controller (/k8s/endpoints/), paths outside the recognised xDS resource directories, or content that cannot be parsed as the expected protobuf message type (Cluster, Listener, RouteConfiguration, ClusterLoadAssignment, KubernetesEndpointAggregator).
  • Enforce in DefaultMetaRepository that xDS mirrors must use localPath: /.
  • Add XdsMirroringTab and xDS-scoped pages for creating, viewing, and editing mirrors (/app/xds/mirrors/*) and credentials (/app/xds/credentials/*), reusing the existing MirrorForm, MirrorList, MirrorView, CredentialForm, and CredentialList components with xDS-specific URL routing.

Result:

  • Mirroring an invalid or structurally-wrong file into an @xds repository now fails fast.
  • Users can create, view, and edit xDS mirrors and credentials directly from the xDS group UI.

Motivation:

When a Git repository is mirrored into an @xds repository, there was
no mechanism to reject invalid xDS resource files before they were
committed. A typo or structurally-wrong protobuf file would silently
land in the repository and break the control plane at push time rather
than at the source. Additionally, the xDS UI had no way to manage the
mirrors and credentials that back an xDS group.

Modifications:

- Add `MirrorFileValidator`, a `@FunctionalInterface` SPI loaded via
  `ServiceLoader`. Implementations are invoked in `AbstractMirror`
  inside a new `validateChanges()` method called by both
  `AbstractGitMirror` and `CentralDogmaMirror` before each push.
  All validation errors are collected and surfaced as a single
  `MirrorException`; mirror state files are excluded from validation.
- Add `XdsMirrorFileValidator`, the xDS-specific implementation.
  It rejects changes to the `@xds` project that target paths reserved
  for the Kubernetes controller (`/k8s/endpoints/`), paths outside the
  recognised xDS resource directories, or content that cannot be parsed
  as the expected protobuf message type (Cluster, Listener,
  RouteConfiguration, ClusterLoadAssignment,
  KubernetesEndpointAggregator).
- Enforce in `DefaultMetaRepository` that xDS mirrors must use
  `localPath: /`.
- Add `XdsMirroringTab` and xDS-scoped pages for creating, viewing, and
  editing mirrors (`/app/xds/mirrors/*`) and credentials
  (`/app/xds/credentials/*`), reusing the existing `MirrorForm`,
  `MirrorList`, `MirrorView`, `CredentialForm`, and `CredentialList`
  components with xDS-specific URL routing.

Result:

- Mirroring an invalid or structurally-wrong file into an @xds
  repository now fails fast.
- Users can create, view, and edit xDS mirrors and credentials directly
  from the xDS group UI.
@minwoox minwoox added this to the 0.85.0 milestone Jul 10, 2026
@coderabbitai

coderabbitai Bot commented Jul 10, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • 🔍 Trigger review
📝 Walkthrough

Walkthrough

Adds pluggable validation before mirror pushes, xDS resource validation and project-constant centralization, root-path enforcement for xDS mirrors, and an admin UI for managing xDS mirrors and credentials.

Changes

XDS mirroring

Layer / File(s) Summary
Mirror validation pipeline
server/.../mirror/*, server-mirror-*/.../mirror/*
Adds pluggable validators, aggregated validation errors, and pre-push validation.
xDS validation and project integration
xds/..., server/.../storage/*, it/xds-*/...
Validates xDS files, centralizes the internal xDS project identifier, updates integrations and tests, and enforces root local paths.
Reusable admin components
webapp/src/dogma/features/project/settings/credentials/*, webapp/src/dogma/features/repo/settings/mirrors/*, webapp/src/dogma/features/xds/CredentialsTab.tsx
Adds configurable scope, path, column, and link behavior and reuses repository credential APIs.
xDS mirroring navigation and pages
webapp/src/dogma/features/xds/*, webapp/src/pages/app/xds/*
Adds admin-only mirroring navigation and create, view, and edit pages for mirrors and credentials.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant Admin
  participant XdsMirroringTab
  participant MirrorList
  participant MirrorAPI
  Admin->>XdsMirroringTab: open mirroring section
  XdsMirroringTab->>MirrorList: load group mirrors
  MirrorList->>MirrorAPI: request mirror data
  Admin->>MirrorAPI: create or update mirror
  MirrorAPI-->>Admin: return result
Loading

Possibly related PRs

Suggested labels: new feature

Suggested reviewers: ikhoon, sh-cho

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 4.92% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title matches the main changes: a new MirrorFileValidator SPI and xDS mirroring UI additions.
Description check ✅ Passed The description accurately summarizes the validator SPI, xDS validator, localPath enforcement, and xDS UI pages.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 2

🧹 Nitpick comments (4)
server/src/main/java/com/linecorp/centraldogma/server/mirror/MirrorFileValidator.java (1)

21-34: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Javadoc overstates validation scope; missing @throws doc.

The javadoc says validators are Implementations are loaded via {@link java.util.ServiceLoader} and invoked in {@link com.linecorp.centraldogma.server.internal.mirror.AbstractMirror} before each push. But validateChanges is only called from mirrorRemoteToLocal in both CentralDogmaMirror and AbstractGitMirror — never from mirrorLocalToRemote. A validator author reading this doc could reasonably assume LOCAL_TO_REMOTE changes are also checked, which is not the case. Also worth documenting that validate() signals failure via MirrorException.

✏️ Suggested doc fix
 /**
  * Validates file changes before they are committed to a repository during mirroring.
  *
- * <p>Implementations are loaded via {`@link` java.util.ServiceLoader} and invoked in
- * {`@link` com.linecorp.centraldogma.server.internal.mirror.AbstractMirror} before each push.</p>
+ * <p>Implementations are loaded via {`@link` java.util.ServiceLoader} and invoked in
+ * {`@link` com.linecorp.centraldogma.server.internal.mirror.AbstractMirror} before a
+ * remote-to-local push commits changes to the local repository.</p>
  */
 `@FunctionalInterface`
 public interface MirrorFileValidator {

     /**
      * Validates a file change before it is committed to a repository during mirroring.
+     *
+     * `@throws` com.linecorp.centraldogma.common.MirrorException if the change is invalid
      */
     void validate(String projectName, String repoName, Change<?> change);
 }
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@server/src/main/java/com/linecorp/centraldogma/server/mirror/MirrorFileValidator.java`
around lines 21 - 34, Update the Javadoc for MirrorFileValidator to state that
validation applies only to changes mirrored from remote to local, not before
every push or during local-to-remote mirroring. Document that validate(String
projectName, String repoName, Change<?> change) signals validation failure by
throwing MirrorException.
xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidatorTest.java (1)

57-64: 📐 Maintainability & Code Quality | 🔵 Trivial | ⚡ Quick win

Consider adding a test for the text-content path with a valid file path.

All tests with valid paths use yamlChangeOf (which produces JsonNode content), exercising the if (content instanceof JsonNode) branch. The only test using Change.ofTextUpsert (unexpectedPath_rejected) fails at path validation before reaching content parsing. The else branch at line 88 of XdsMirrorFileValidator (text content with a valid path) is not covered.

♻️ Suggested additional test
`@Test`
void jsonTextContent_validPath_passes() {
    final String json = JSON_MESSAGE_MARSHALLER.writeValueAsString(sampleCluster());
    assertThatCode(() -> VALIDATOR.validate(
            XDS_CENTRAL_DOGMA_PROJECT, REPO_NAME,
            Change.ofJsonUpsert("/clusters/my-cluster.json", json)))
            .doesNotThrowAnyException();
}

Also applies to: 206-214

🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidatorTest.java`
around lines 57 - 64, Add a test in XdsMirrorFileValidatorTest covering text
content with a valid path, such as a JSON string created from sampleCluster()
and passed to Change.ofJsonUpsert("/clusters/my-cluster.json", ...), asserting
that VALIDATOR.validate does not throw. This should exercise the non-JsonNode
content branch in XdsMirrorFileValidator, unlike unexpectedPath_rejected.
webapp/src/pages/app/xds/credentials/[id]/edit/index.tsx (1)

46-64: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Redundant error check after .unwrap().

RTK Query's .unwrap() (line 54) already throws on mutation error, so the manual .error check on lines 55-57 is dead code — the catch block on line 61 handles all failures. This appears to be an existing pattern in the codebase, so it's not a regression, but consider simplifying in a follow-up.

♻️ Simplified onSubmit
 const onSubmit = async (credential: CredentialDto, onSuccess: () => void) => {
   try {
     credential.name = `projects/@xds/repos/${group}/credentials/${credential.id}`;
-    const response = await updateCredential({
+    await updateCredential({
       projectName: '`@xds`',
       id,
       credential,
       repoName: group,
     }).unwrap();
-    if ((response as { error: FetchBaseQueryError | SerializedError }).error) {
-      throw (response as { error: FetchBaseQueryError | SerializedError }).error;
-    }
     dispatch(newNotification(`Credential '${credential.id}' is updated`, 'Successfully updated', 'success'));
     onSuccess();
     Router.push(`/app/xds/credentials/${encodeURIComponent(id)}?group=${encodeURIComponent(group)}`);
   } catch (error) {
     dispatch(newNotification('Failed to update the credential', ErrorMessageParser.parse(error), 'error'));
   }
 };
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webapp/src/pages/app/xds/credentials/`[id]/edit/index.tsx around lines 46 -
64, Remove the redundant response.error check and cast after
updateCredential(...).unwrap() in onSubmit; rely on unwrap() to throw mutation
failures and let the existing catch block handle them, while retaining the
success notification, callback, and redirect behavior.
webapp/src/pages/app/xds/mirrors/new.tsx (1)

67-70: 📐 Maintainability & Code Quality | 🔵 Trivial | 💤 Low value

Dead error-check after .unwrap() — consider simplifying.

addNewMirror(formData).unwrap() rejects on error, so by line 68 response is the success data. Checking response.error is unreachable in practice. Not harmful, but adds noise.

♻️ Suggested simplification
-      const response = await addNewMirror(formData).unwrap();
-      if ((response as { error: FetchBaseQueryError | SerializedError }).error) {
-        throw (response as { error: FetchBaseQueryError | SerializedError }).error;
-      }
+      await addNewMirror(formData).unwrap();
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In `@webapp/src/pages/app/xds/mirrors/new.tsx` around lines 67 - 70, Remove the
redundant response.error check and cast after addNewMirror(formData).unwrap() in
the relevant submit handler; rely on unwrap() to reject failures and treat
response directly as successful data.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In
`@server/src/main/java/com/linecorp/centraldogma/server/internal/storage/repository/DefaultMetaRepository.java`:
- Around line 421-425: Update the xDS validation in DefaultMetaRepository to
account for AbstractMirror normalizing an empty localPath to the root path. In
the XDS_PROJECT_NAME branch, compare the normalized path or accept both "/" and
"" before throwing the argument error, while preserving the existing rejection
of other paths.

In `@webapp/src/pages/app/xds/credentials/`[id]/index.tsx:
- Around line 28-31: Add non-null assertions to both route parameters in the
useGetRepoCredentialQuery call: pass group! and id! while retaining the existing
skip condition. This aligns the credentials page with the mirror pages and
satisfies the query hook’s required string types.

---

Nitpick comments:
In
`@server/src/main/java/com/linecorp/centraldogma/server/mirror/MirrorFileValidator.java`:
- Around line 21-34: Update the Javadoc for MirrorFileValidator to state that
validation applies only to changes mirrored from remote to local, not before
every push or during local-to-remote mirroring. Document that validate(String
projectName, String repoName, Change<?> change) signals validation failure by
throwing MirrorException.

In `@webapp/src/pages/app/xds/credentials/`[id]/edit/index.tsx:
- Around line 46-64: Remove the redundant response.error check and cast after
updateCredential(...).unwrap() in onSubmit; rely on unwrap() to throw mutation
failures and let the existing catch block handle them, while retaining the
success notification, callback, and redirect behavior.

In `@webapp/src/pages/app/xds/mirrors/new.tsx`:
- Around line 67-70: Remove the redundant response.error check and cast after
addNewMirror(formData).unwrap() in the relevant submit handler; rely on unwrap()
to reject failures and treat response directly as successful data.

In
`@xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidatorTest.java`:
- Around line 57-64: Add a test in XdsMirrorFileValidatorTest covering text
content with a valid path, such as a JSON string created from sampleCluster()
and passed to Change.ofJsonUpsert("/clusters/my-cluster.json", ...), asserting
that VALIDATOR.validate does not throw. This should exercise the non-JsonNode
content branch in XdsMirrorFileValidator, unlike unexpectedPath_rejected.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 610295f1-5460-4a4c-9e07-fb5ddee6eb68

📥 Commits

Reviewing files that changed from the base of the PR and between 99db9ec and 9b4cfa1.

📒 Files selected for processing (28)
  • server-mirror-dogma/src/main/java/com/linecorp/centraldogma/server/internal/mirror/CentralDogmaMirror.java
  • server-mirror-git/src/main/java/com/linecorp/centraldogma/server/internal/mirror/AbstractGitMirror.java
  • server-mirror-git/src/test/java/com/linecorp/centraldogma/server/internal/mirror/DefaultMetaRepositoryWithMirrorTest.java
  • server/src/main/java/com/linecorp/centraldogma/server/internal/mirror/AbstractMirror.java
  • server/src/main/java/com/linecorp/centraldogma/server/internal/storage/repository/DefaultMetaRepository.java
  • server/src/main/java/com/linecorp/centraldogma/server/mirror/MirrorFileValidator.java
  • webapp/src/dogma/features/project/settings/credentials/CredentialForm.tsx
  • webapp/src/dogma/features/project/settings/credentials/CredentialList.tsx
  • webapp/src/dogma/features/project/settings/credentials/CredentialView.tsx
  • webapp/src/dogma/features/repo/settings/mirrors/MirrorForm.tsx
  • webapp/src/dogma/features/repo/settings/mirrors/MirrorList.tsx
  • webapp/src/dogma/features/repo/settings/mirrors/MirrorView.tsx
  • webapp/src/dogma/features/xds/CredentialsTab.tsx
  • webapp/src/dogma/features/xds/Sidebar.tsx
  • webapp/src/dogma/features/xds/XdsMirroringTab.tsx
  • webapp/src/dogma/features/xds/useXdsRoute.ts
  • webapp/src/pages/app/xds/credentials/[id]/edit/index.tsx
  • webapp/src/pages/app/xds/credentials/[id]/index.tsx
  • webapp/src/pages/app/xds/credentials/new.tsx
  • webapp/src/pages/app/xds/group.tsx
  • webapp/src/pages/app/xds/mirrors/[id]/edit/index.tsx
  • webapp/src/pages/app/xds/mirrors/[id]/index.tsx
  • webapp/src/pages/app/xds/mirrors/new.tsx
  • xds/build.gradle
  • xds/src/main/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidator.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesService.java
  • xds/src/main/resources/META-INF/services/com.linecorp.centraldogma.server.mirror.MirrorFileValidator
  • xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidatorTest.java

Comment thread webapp/src/pages/app/xds/credentials/[id]/index.tsx
@minwoox
minwoox marked this pull request as ready for review July 10, 2026 07:48
@minwoox
minwoox requested review from ikhoon and jrhee17 as code owners July 10, 2026 07:48

@ikhoon ikhoon left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 👍

try {
validator.validate(projectName, repoName, change);
} catch (MirrorException e) {
errors.add(e.getMessage());

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we add the MirrorException as a suppressed exception so that we could see the original exception in the centraldogma.log?

}
}

private static Message.@Nullable Builder builderForPath(String filePath) {

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

@jrhee17 jrhee17 left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍 👍

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick comments (1)
xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesEndpointFetchingService.java (1)

198-199: 🩺 Stability & Availability | 🔵 Trivial | ⚡ Quick win

Safeguard against unsupported file extensions.

path.substring(0, path.length() - 5) strictly assumes that the removed file has a 5-character extension (.yaml or .json). Because the watcher observes all files matching **, removing a file with a different extension (e.g., .yml or .txt) will either compute a corrupted endpoint path or throw a StringIndexOutOfBoundsException, which could disrupt the watcher thread.

Consider adding an early return at the beginning of the onFileRemoved method to safely ignore unsupported file formats.

🛡️ Proposed safeguard
     `@Override`
     protected void onFileRemoved(String groupName, String path) {
+        if (!path.endsWith(".yaml") && !path.endsWith(".json")) {
+            return;
+        }
         final Map<String, KubernetesEndpointsUpdater> updaters = kubernetesEndpointsUpdaters.get(groupName);
🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

In
`@xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesEndpointFetchingService.java`
around lines 198 - 199, Add an early guard at the start of onFileRemoved to
return for paths that do not end with the supported .yaml or .json extensions,
before the path.substring operation. Preserve existing endpoint removal behavior
for supported files.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Nitpick comments:
In
`@xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesEndpointFetchingService.java`:
- Around line 198-199: Add an early guard at the start of onFileRemoved to
return for paths that do not end with the supported .yaml or .json extensions,
before the path.substring operation. Preserve existing endpoint removal behavior
for supported files.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: CHILL

Plan: Pro

Run ID: 0ac8e94b-f737-48ec-b5a5-466cb30d430f

📥 Commits

Reviewing files that changed from the base of the PR and between 400ce74 and 2e123f1.

📒 Files selected for processing (11)
  • it/xds-k8s-node-ip-extractor/src/test/java/com/linecorp/centraldogma/it/xds/k8s/XdsKubernetesNodeIpExtractorTest.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/endpoint/v1/XdsEndpointUpdateScheduler.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/internal/XdsResourceManager.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesEndpointFetchingService.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesService.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/endpoint/v1/XdsRegisterEndpointTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsEndpointReadServiceTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsLegacyJsonCompatibilityTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsMirrorFileValidatorTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/k8s/v1/AggregatingMultipleKubernetesTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesServiceTest.java
🚧 Files skipped from review as they are similar to previous changes (8)
  • xds/src/test/java/com/linecorp/centraldogma/xds/k8s/v1/AggregatingMultipleKubernetesTest.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/internal/XdsResourceManager.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/endpoint/v1/XdsEndpointUpdateScheduler.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/endpoint/v1/XdsRegisterEndpointTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/internal/XdsEndpointReadServiceTest.java
  • xds/src/test/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesServiceTest.java
  • xds/src/main/java/com/linecorp/centraldogma/xds/k8s/v1/XdsKubernetesService.java
  • it/xds-k8s-node-ip-extractor/src/test/java/com/linecorp/centraldogma/it/xds/k8s/XdsKubernetesNodeIpExtractorTest.java

@codecov

codecov Bot commented Jul 14, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 68.91892% with 23 lines in your changes missing coverage. Please review.
✅ Project coverage is 68.98%. Comparing base (9a65925) to head (2e123f1).

Files with missing lines Patch % Lines
...aldogma/server/internal/mirror/AbstractMirror.java 18.18% 17 Missing and 1 partial ⚠️
...traldogma/xds/internal/XdsMirrorFileValidator.java 87.87% 2 Missing and 2 partials ⚠️
...rnal/storage/repository/DefaultMetaRepository.java 66.66% 0 Missing and 1 partial ⚠️
Additional details and impacted files
@@             Coverage Diff              @@
##               main    #1330      +/-   ##
============================================
- Coverage     69.46%   68.98%   -0.49%     
+ Complexity     5709     5679      -30     
============================================
  Files           540      541       +1     
  Lines         24207    24267      +60     
  Branches       2771     2786      +15     
============================================
- Hits          16816    16740      -76     
- Misses         5880     6003     +123     
- Partials       1511     1524      +13     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@minwoox
minwoox merged commit 2ecdca7 into line:main Jul 14, 2026
13 of 16 checks passed
@minwoox
minwoox deleted the xds_mirroring branch July 14, 2026 02:16
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants