Skip to content

Make dry-run also generate cluster-resources#1394

Open
javipolo wants to merge 2 commits into
openshift:mainfrom
javipolo:dry-run-cluster-resources
Open

Make dry-run also generate cluster-resources#1394
javipolo wants to merge 2 commits into
openshift:mainfrom
javipolo:dry-run-cluster-resources

Conversation

@javipolo
Copy link
Copy Markdown
Member

@javipolo javipolo commented Apr 24, 2026

Description

Create cluster-resource manifests while running with --dry-run flag

Github / Jira issue:

https://redhat.atlassian.net/browse/RFE-4107

Type of change

Please delete options that are not relevant.

  • New feature (non-breaking change which adds functionality)

How Has This Been Tested?

Run oc-mirror with --dry-run and manifests should apear in working-dir/cluster-resources
It was tested manually

Expected Outcome

Manifests should be present in cluster-resources directory

Summary by CodeRabbit

  • New Features

    • Dry-run now writes image mapping output immediately, always logs its path, and produces a missing-image report when applicable.
    • Generates cluster resources (IDMS/ITMS, catalog manifests, signature ConfigMap) during dry-run when appropriate.
    • Generates an UpdateService automatically when the platform graph/release images are present; graph image references are resolved.
  • Tests

    • Added/reshaped dry-run tests validating mapping output, missing-image handling, cluster-resources, catalog manifests, and UpdateService content.

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented Apr 24, 2026

Warning

Rate limit exceeded

@javipolo has exceeded the limit for the number of commits that can be reviewed per hour. Please wait 16 minutes and 25 seconds before requesting another review.

You’ve run out of usage credits. Purchase more in the billing tab.

⌛ How to resolve this issue?

After the wait time has elapsed, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

We recommend that you space out your commits to avoid hitting the rate limit.

🚦 How do rate limits work?

CodeRabbit enforces hourly rate limits for each developer per organization.

Our paid plans have higher rate limits than the trial, open-source and free plans. In all cases, we re-allow further reviews after a brief timeout.

Please see our FAQ for further information.

ℹ️ Review info
⚙️ Run configuration

Configuration used: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: efc8daa8-9d52-4c74-a894-59c4674de305

📥 Commits

Reviewing files that changed from the base of the PR and between c4097c5 and ed32fdf.

📒 Files selected for processing (2)
  • internal/pkg/cli/dryrun.go
  • internal/pkg/cli/dryrun_test.go

Walkthrough

DryRun now writes mapping output immediately, emits missing-image files via a helper, and conditionally performs best-effort cluster resource generation (IDMS/ITMS, CatalogSource, ClusterCatalog, signature ConfigMap, and UpdateService for OCP releases); tests are refactored with shared setup and a new cluster-resources test.

Changes

Cluster Resource Generation & DryRun flow

Layer / File(s) Summary
DryRun entry and mapping write
internal/pkg/cli/dryrun.go
Processes images up front, writes mapping.txt with wrapped errors, delegates missing-image output to writeMissingImagesFile, and conditionally triggers cluster resource generation when not mirroring to disk.
Cluster resource helpers
internal/pkg/cli/dryrun.go
Adds generateClusterResources to best-effort generate IDMS/ITMS, CatalogSource, ClusterCatalog, and signature ConfigMap; logs warnings on generator failures without failing dry-run.
UpdateService generation
internal/pkg/cli/dryrun.go
Adds generateUpdateService to resolve graph and release images and call ClusterResources.UpdateServiceGenerator; resolution/generation errors are logged as warnings.
Missing images / processImages
internal/pkg/cli/dryrun.go
Adds writeMissingImagesFile to emit missing.txt when images are missing and logs counts; processImages now returns nbMissingImgs.
Tests: shared helpers & cluster-resources test
internal/pkg/cli/dryrun_test.go
Introduces shared setup helpers (setupTestEnvironment, createTestExecutor, getTestImages), refactors M2D tests into exported tests, and adds TestDryRunShouldGenerateClusterResources that asserts mapping, cluster-resources dir, core manifests, catalogs, and UpdateService YAML content constraints.
sequenceDiagram
  participant User
  participant DryRun
  participant ProcessImages
  participant ClusterResources
  participant Generators
  participant FS as FileSystem

  User->>DryRun: invoke DryRun()
  DryRun->>ProcessImages: process images
  ProcessImages-->>DryRun: images list, nbMissingImgs
  DryRun->>FS: write mapping.txt
  DryRun->>DryRun: writeMissingImagesFile(nbMissingImgs)
  DryRun->>ClusterResources: generateClusterResources(allImages) (if not to-disk)
  ClusterResources->>Generators: run IDMS/ITMS, Catalog, SigConfigMap generators
  Generators->>FS: write manifests/catalogs
  alt OCP release present
    ClusterResources->>Generators: resolve graph/release, generate UpdateService
    Generators->>FS: write UpdateService manifest
  end
  DryRun-->>User: dry-run complete
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

🚥 Pre-merge checks | ✅ 10 | ❌ 2

❌ Failed checks (1 warning, 1 inconclusive)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 33.33% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
Test Structure And Quality ❓ Inconclusive Custom check targets Ginkgo test code (It blocks, BeforeEach, Eventually), but PR contains only standard Go tests with *testing.T. Check instructions not applicable. Verify if check should apply to standard Go tests or Ginkgo tests only.
✅ Passed checks (10 passed)
Check name Status Explanation
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed The title clearly and concisely summarizes the main functionality added: generating cluster-resources during dry-run execution, which aligns with the primary changes in the codebase.
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.
Stable And Deterministic Test Names ✅ Passed All test names use only static, descriptive text without dynamic values like timestamps, UUIDs, or identifiers. The three new tests follow stable naming conventions.
Microshift Test Compatibility ✅ Passed No Ginkgo e2e tests were added. The new tests are standard Go unit tests using testing.T, not Ginkgo DSL (Describe/Context/When/It). The custom check only applies to Ginkgo e2e tests.
Single Node Openshift (Sno) Test Compatibility ✅ Passed New tests are standard Go unit tests, not Ginkgo e2e tests. SNO compatibility check applies only to Ginkgo e2e tests, so it is not applicable to this PR.
Topology-Aware Scheduling Compatibility ✅ Passed PR generates cluster resources (IDMS, ITMS, CatalogSource, ConfigMap, UpdateService CRD) but no Pod/Deployment manifests with scheduling constraints directly.
Ote Binary Stdout Contract ✅ Passed PR contains no process-level code (init, main, TestMain, suite setup) that writes to stdout. Changes are exclusively to method and test function bodies using standard logger that outputs to stderr.
Ipv6 And Disconnected Network Test Compatibility ✅ Passed No Ginkgo e2e tests were added. Modified tests in internal/pkg/cli/dryrun_test.go are standard Go unit tests using testing.T, not Ginkgo framework tests. Custom check applies only to Ginkgo e2e tests.

✏️ Tip: You can configure your own custom pre-merge checks in the settings.

✨ 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 and usage tips.

@openshift-ci openshift-ci Bot requested review from adolfo-ab and aguidirh April 24, 2026 09:35
@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented Apr 24, 2026

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: javipolo
Once this PR has been reviewed and has the lgtm label, please assign r4f4 for approval. For more information see the Code Review Process.

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 3

🧹 Nitpick comments (2)
internal/pkg/cli/dryrun.go (1)

77-91: Consider downgrading cluster-resource failures to warnings, and drop the ClusterResources == nil guard in favor of test mocks.

Two small points:

  • DryRun previously always succeeded when the mapping and (optionally) missing files were produced. Now any failure from IDMS_ITMSGenerator, CatalogSourceGenerator, ClusterCatalogGenerator, or UpdateServiceGenerator fails the whole dry-run. GenerateSignatureConfigMap is already correctly downgraded to a warning — consider the same treatment for the others so cluster-resource generation issues don't mask the main dry-run output.
  • The if o.ClusterResources == nil check (with the comment "e.g., in tests") is production code working around test setup. The existing executor_test.go has a MockClusterResources no-op implementation — updating the older TestDryRun sub-tests to inject that mock (like the new sub-test does with clusterresources.New) removes the need for the nil guard.
🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/pkg/cli/dryrun.go` around lines 77 - 91, Adjust
generateClusterResourcesForDryRun so cluster-resource generator failures are
logged as warnings instead of returning errors: for IDMS_ITMSGenerator,
CatalogSourceGenerator, ClusterCatalogGenerator, and UpdateServiceGenerator
catch errors from their calls, call o.Log.Warnf with a descriptive message and
continue (mirroring the existing treatment of GenerateSignatureConfigMap), and
return nil at the end unless a non-cluster-resource fatal condition occurs; also
remove the if o.ClusterResources == nil guard and update tests to inject
MockClusterResources (e.g., in TestDryRun) so production code no longer
compensates for test setup.
internal/pkg/cli/dryrun_test.go (1)

199-203: Shared global is mutated across sub-tests.

global is declared once at the top of TestDryRun and each sub-test does global.WorkingDir = testFolder. That's fine while t.Run sub-tests execute serially, but it's a foot-gun if anyone later adds t.Parallel(). Consider constructing a fresh *mirror.GlobalOptions per sub-test.

🤖 Prompt for AI Agents
Verify each finding against the current code and only fix it if needed.

In `@internal/pkg/cli/dryrun_test.go` around lines 199 - 203, The test mutates the
package-level variable global across sub-tests (global.WorkingDir = testFolder),
which is unsafe for parallel runs; instead, create a fresh *mirror.GlobalOptions
per sub-test (e.g., local := &mirror.GlobalOptions{WorkingDir: testFolder, ...})
inside the t.Run closure and use that local instance in calls that currently
rely on the package-global, or assign the package-global once from that local
before invoking the code under test. Update uses of global in TestDryRun
sub-tests to reference the new local variable (or set global = local at the
start of the subtest) so each sub-test has its own independent GlobalOptions.
🤖 Prompt for all review comments with AI agents
Verify each finding against the current code and only fix it if needed.

Inline comments:
In `@internal/pkg/cli/dryrun_test.go`:
- Around line 282-289: The test's assertions are too weak — they only check that
cluster-resources/ exists but not that the new manifests are created or correct;
update the test in dryrun_test.go to assert specific files exist under
clusterResourcesDir (e.g., idms-oc-mirror.yaml, itms-oc-mirror.yaml, the catalog
source and cluster catalog manifests, the signature ConfigMap, and the
UpdateService manifest for the OCPRelease image) and then read the UpdateService
manifest file to assert its graph image reference matches the value produced by
constructGraphImageRef (or at least contains the expected repository/name like
"graph-data" and not the hardcoded "localhost:5000"), so the test fails if the
OCP-release path or graph image generation regresses.

In `@internal/pkg/cli/dryrun.go`:
- Around line 142-169: Replace the custom, hardcoded logic in
constructGraphImageRef with a call to the real implementation: invoke
o.Release.GraphImage() and return its result (propagate any error), removing the
unused releaseImageParts split and the bogus localhost:5000 fallback and the
incorrect "openshift/graph-data:latest" name; this ensures the dry-run uses the
same registry and image name (openshift/graph-image) as the real flow and stops
relying on ImageSetConfigurationSpec.Mirror.AdditionalImages parsing.
- Around line 116-137: The test data includes release image Origins with the
"docker://" transport prefix which must be stripped before calling
UpdateServiceGenerator; in the loop that finds v2alpha1.TypeOCPRelease (using
allImages and releaseImage), call strings.TrimPrefix(img.Origin,
consts.DockerProtocol) (or trim releaseImage right after assignment) and pass
that trimmed value to o.ClusterResources.UpdateServiceGenerator(graphImageRef,
releaseImage) (ensure constructGraphImageRef still receives the correct input),
so UpdateServiceGenerator gets the unprefixed release image string matching
production ReleaseImage() behavior.

---

Nitpick comments:
In `@internal/pkg/cli/dryrun_test.go`:
- Around line 199-203: The test mutates the package-level variable global across
sub-tests (global.WorkingDir = testFolder), which is unsafe for parallel runs;
instead, create a fresh *mirror.GlobalOptions per sub-test (e.g., local :=
&mirror.GlobalOptions{WorkingDir: testFolder, ...}) inside the t.Run closure and
use that local instance in calls that currently rely on the package-global, or
assign the package-global once from that local before invoking the code under
test. Update uses of global in TestDryRun sub-tests to reference the new local
variable (or set global = local at the start of the subtest) so each sub-test
has its own independent GlobalOptions.

In `@internal/pkg/cli/dryrun.go`:
- Around line 77-91: Adjust generateClusterResourcesForDryRun so
cluster-resource generator failures are logged as warnings instead of returning
errors: for IDMS_ITMSGenerator, CatalogSourceGenerator, ClusterCatalogGenerator,
and UpdateServiceGenerator catch errors from their calls, call o.Log.Warnf with
a descriptive message and continue (mirroring the existing treatment of
GenerateSignatureConfigMap), and return nil at the end unless a
non-cluster-resource fatal condition occurs; also remove the if
o.ClusterResources == nil guard and update tests to inject MockClusterResources
(e.g., in TestDryRun) so production code no longer compensates for test setup.
🪄 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: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: e0215fdc-bd4e-4be5-9a4a-e764c5506b54

📥 Commits

Reviewing files that changed from the base of the PR and between ca5eebd and 73fa5c4.

📒 Files selected for processing (2)
  • internal/pkg/cli/dryrun.go
  • internal/pkg/cli/dryrun_test.go

Comment thread internal/pkg/cli/dryrun_test.go Outdated
Comment thread internal/pkg/cli/dryrun.go Outdated
Comment thread internal/pkg/cli/dryrun.go Outdated
@aguidirh
Copy link
Copy Markdown
Contributor

aguidirh commented May 8, 2026

@javipolo could you please have a look on the codeRabbit suggestions and also the linter job that is failing?

@javipolo javipolo force-pushed the dry-run-cluster-resources branch from 73fa5c4 to 550eb67 Compare May 11, 2026 14:49
Signed-off-by: Javi Polo <jpolo@redhat.com>
@javipolo javipolo force-pushed the dry-run-cluster-resources branch from 550eb67 to 629bba3 Compare May 11, 2026 15:24
@javipolo
Copy link
Copy Markdown
Member Author

@coderabbitai review

@coderabbitai
Copy link
Copy Markdown

coderabbitai Bot commented May 11, 2026

✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@javipolo
Copy link
Copy Markdown
Member Author

@javipolo could you please have a look on the codeRabbit suggestions and also the linter job that is failing?

@aguidirh done :)

Comment thread internal/pkg/cli/dryrun.go
Comment thread internal/pkg/cli/dryrun.go Outdated
Comment thread internal/pkg/cli/dryrun.go Outdated
Comment thread internal/pkg/cli/dryrun.go Outdated
Comment thread internal/pkg/cli/dryrun.go Outdated
Copy link
Copy Markdown

@coderabbitai coderabbitai Bot left a comment

Choose a reason for hiding this comment

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

Actionable comments posted: 1

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
internal/pkg/cli/dryrun.go (1)

63-69: ⚠️ Potential issue | 🟠 Major | ⚡ Quick win

Guard o.ClusterResources before generator calls.

generateClusterResources dereferences o.ClusterResources unconditionally. In non-M2D dry-run, an uninitialized generator will panic instead of returning a controlled error.

Proposed fix
 func (o *ExecutorSchema) generateClusterResources(ctx context.Context, allImages []v2alpha1.CopyImageSchema) error {
+	if o.ClusterResources == nil {
+		return fmt.Errorf("cluster resources generator is not initialized")
+	}
 	o.Log.Info(emoji.PageFacingUp + " Generating cluster resources...")
🤖 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 `@internal/pkg/cli/dryrun.go` around lines 63 - 69, generateClusterResources
currently dereferences o.ClusterResources without checking for nil which can
panic; add a guard at the start of generateClusterResources that checks if
o.ClusterResources is nil and return a controlled error (or wrap with context)
before calling any generator methods such as IDMS_ITMSGenerator (and any other
generator methods on ClusterResources) so the function fails gracefully when the
generator is uninitialized.
🤖 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 `@internal/pkg/cli/dryrun_test.go`:
- Around line 147-153: The test uses t.Errorf for unrecoverable setup failures
(the storage cache init and the registry.NewRegistry call), which allows the
test to continue with invalid state; replace those t.Errorf calls with t.Fatalf
so the test aborts immediately on these setup errors—specifically update the
error checks around the storage cache initialization and the
registry.NewRegistry(...) invocation to call t.Fatalf with the error message
instead of t.Errorf.

---

Outside diff comments:
In `@internal/pkg/cli/dryrun.go`:
- Around line 63-69: generateClusterResources currently dereferences
o.ClusterResources without checking for nil which can panic; add a guard at the
start of generateClusterResources that checks if o.ClusterResources is nil and
return a controlled error (or wrap with context) before calling any generator
methods such as IDMS_ITMSGenerator (and any other generator methods on
ClusterResources) so the function fails gracefully when the generator is
uninitialized.
🪄 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: Repository: openshift/coderabbit/.coderabbit.yaml

Review profile: CHILL

Plan: Enterprise

Run ID: b8cbcf9c-1db0-4e55-8c3f-3de6b7951298

📥 Commits

Reviewing files that changed from the base of the PR and between 629bba3 and c4097c5.

📒 Files selected for processing (2)
  • internal/pkg/cli/dryrun.go
  • internal/pkg/cli/dryrun_test.go

Comment thread internal/pkg/cli/dryrun_test.go
@javipolo javipolo force-pushed the dry-run-cluster-resources branch 2 times, most recently from 87694e9 to c64b6bf Compare May 20, 2026 18:26
Signed-off-by: Javi Polo <jpolo@redhat.com>
@javipolo javipolo force-pushed the dry-run-cluster-resources branch from c64b6bf to ed32fdf Compare May 20, 2026 18:26
@openshift-ci
Copy link
Copy Markdown

openshift-ci Bot commented May 20, 2026

@javipolo: all tests passed!

Full PR test history. Your PR dashboard.

Details

Instructions for interacting with me using PR comments are available here. If you have questions or suggestions related to my behavior, please file an issue against the kubernetes-sigs/prow repository. I understand the commands that are listed here.

Copy link
Copy Markdown
Contributor

@aguidirh aguidirh left a comment

Choose a reason for hiding this comment

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

Thanks for the changes, it is in a much better shape now!

I've added few comments.

Comment on lines +47 to +49
if len(imagesAvailable) > 0 {
o.Log.Info("all %d images required for mirroring are available in local cache. You may proceed with mirroring from disk to disconnected registry", len(imagesAvailable))
}
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.

This is never going to be true, so we can safely remove it. I know it does not come from this PR, but since we are changing the code we can remove it.

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.

I think the imagesAvailable variable is initialized but never updated, so maybe we can remove it altogether

Comment on lines 34 to +37
nbMissingImgs := 0
var buff bytes.Buffer
var missingImgsBuff bytes.Buffer
nbMissingImgs = o.processImages(ctx, allImages, &buff, &missingImgsBuff)
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.

nit suggestion:

Suggested change
nbMissingImgs := 0
var buff bytes.Buffer
var missingImgsBuff bytes.Buffer
nbMissingImgs = o.processImages(ctx, allImages, &buff, &missingImgsBuff)
var buff bytes.Buffer
var missingImgsBuff bytes.Buffer
nbMissingImgs := o.processImages(ctx, allImages, &buff, &missingImgsBuff)

DestImage: destOpts,
RetryOpts: retryOpts,
IsDryRun: true,
Mode: mirror.MirrorToMirror,
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.

Can we add a scenario to check if m2d is not going to generate cluster resources? It could be using a table driven test.

for _, img := range imgs {
assert.Contains(t, mapping, img.Source+"="+img.Destination)
// Verify UpdateService manifest exists for OCP release images
updateServiceFiles, err := filepath.Glob(filepath.Join(clusterResourcesPath, "*updateservice*.yaml"))
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.

Suggested change
updateServiceFiles, err := filepath.Glob(filepath.Join(clusterResourcesPath, "*updateservice*.yaml"))
updateServiceFiles, err := filepath.Glob(filepath.Join(clusterResourcesPath, "*updateservice*.yaml"))
require.NotEmpty(t, updateServiceFiles, "UpdateService manifest should be generated when platform.graph=true")

Copy link
Copy Markdown
Contributor

@adolfo-ab adolfo-ab left a comment

Choose a reason for hiding this comment

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

Thanks for the PR @javipolo !

The only thing that concerns me is that now we have some code duplication for the creation of cluster resources, which is also done in executor.go for m2m and d2m. Maybe we can encapsulate the code to generate the cluster resources into a function (your PR is already doing this part) and reuse them in the three places.

Maybe we can do this in a follow-up PR, for the sake of not blocking this PR much longer. Wdyt @aguidirh @r4f4 @dorzel ?

Comment on lines +47 to +49
if len(imagesAvailable) > 0 {
o.Log.Info("all %d images required for mirroring are available in local cache. You may proceed with mirroring from disk to disconnected registry", len(imagesAvailable))
}
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.

I think the imagesAvailable variable is initialized but never updated, so maybe we can remove it altogether

}

missingImgsPath := filepath.Join(testFolder, dryRunOutDir, missingImgsFile)
assert.FileExists(t, mappingPath)
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.

Suggested change
assert.FileExists(t, mappingPath)
assert.FileExists(t, missingImgsPath)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants