myasnikovdaniil 215bd430a9 test(e2e): diff-driven install selector select-install.sh (#3279)
## What this PR does

Adds `hack/select-install.sh` — the install-side companion to
`hack/select-e2e.sh`. Where `select-e2e.sh` picks *which* Chainsaw
suites run for a diff (a reverse dependency walk), `select-install.sh`
picks *what must be installed* for those suites: the forward `dependsOn`
closure over the `PackageSource` graph.

Given the suite names `select-e2e.sh` emits, it maps each back to its
`*-application` `PackageSource` and walks `spec.variants[].dependsOn`
forward to the transitive closure — the minimal set of packages to
enable instead of provisioning the full `isp-full` platform. A
`postgres` chart change, for example, resolves to 9 of 97 sources.

Design notes:

- Reuses the real `PackageSource` graph in
`packages/core/platform/sources/` — no parallel dependency-declaration
files to keep in sync.
- Unlike `select-e2e.sh`'s reverse walk, the forward walk **keeps** the
`cozystack.cozystack-engine` edge: for test *selection* it is noise (it
would fan every app out to every other), but for *install* it is a
genuine prerequisite (the app's `*-rd` HelmRelease needs the engine to
register the ApplicationDefinition CRD). Because that edge lives only on
`*-application` sources, a suite backed by a **system** package (e.g.
`securitygroup`, whose `SecurityGroup` in `sdn.cozystack.io` is served
by the aggregated `cozystack-api` — a `cozystack-engine` component)
can't reach the engine via the walk, so the engine is **seeded
explicitly for any non-empty closure** (and a graph missing it is a hard
error).
- `--validate` mode checks the whole graph — every `dependsOn` target
resolves to a real `PackageSource` (reachability) and there are no
dependency cycles — **and** the suite mapping: every
`hack/e2e-chainsaw/*/` suite resolves to a real `PackageSource` or to
`-` (a missing suites dir is itself a failure). The graph lives next to
the packages and can't drift from the suite dirs; the hand-maintained
mapping is the only part that can, so this is the cheap CI guard.
- Suite→source mapping follows the `<suite>-application` convention with
a bare-`<suite>` fallback, plus explicit cases for the irregular names
(`kubernetes`/`vminstance`/`securitygroup`) and for core-platform
features that have no separately-enabled package (`serviceexposure`,
whose `ExposureClass`/`ServiceExposure` CRDs live in
`packages/core/platform`). A suite may reference other app kinds by
selector without standing them up (e.g. `securitygroup`'s
`SecurityGroup` names `Postgres`/`Kubernetes` as selectors only) — only
the primary package is mapped here; the forward closure and the seeded
engine cover its prerequisites, and full multi-package modelling is left
to the `test-minimal` follow-up. A suite with no known mapping is a
**hard error** (fail closed), not a silent skip.

Includes a 17-case unit suite (`hack/select-install_test.bats`) covering
single-app closure, transitivity, multi-suite union, stdin input, the
kubernetes/irregular/core-platform suite mappings, the `securitygroup`
engine-seed regression, empty input, fail-closed unmapped suites (all
reported, no partial output), the missing-engine hard error, and the
`--validate` failure modes (dangling dep, cycle, unmapped suite dir,
missing suites dir). It is auto-discovered by `make unit-tests`
(`BATS_UNIT_FILES` globs `hack/*.bats`).

Verified end-to-end against real git diffs across six path types (app
chart, shared operator, docs-only, per-suite Chainsaw edit, library,
shared e2e helper): a `postgres` chart change scopes the install to 9 of
97 sources; the full-suite fallback to 39 of 97.

This is Track A of #2847 (diff-driven & scenario-based E2E); tracked in
#3278. Consuming the output — a `test-minimal` platform variant/bundle
plus wiring into the `pull-requests.yaml` install step — is a deliberate
follow-up, since it depends on a platform-variant design decision.

### Screenshots

Not applicable — CI/tooling-only change.

### Release note

```release-note
test(e2e): add hack/select-install.sh to compute the minimal package install set for a diff-scoped E2E run (forward PackageSource dependency closure), with a --validate graph-consistency mode
```


<!-- This is an auto-generated comment: release notes by coderabbit.ai
-->

## Summary by CodeRabbit

* **New Features**
* Added a tool to select the minimal package set required for one or
more end-to-end test suites.
* Supports combining multiple suites, resolving transitive dependencies,
and handling unmapped or empty suite selections.
* Added validation for missing dependencies and circular dependency
definitions.

* **Tests**
* Added coverage for package selection, dependency resolution, suite
mappings, empty selections, and validation failures.

<!-- end of auto-generated comment: release notes by coderabbit.ai -->
2026-07-15 18:28:41 +05:00
2025-10-08 09:43:34 +05:00
2025-04-01 18:48:14 +02:00
2024-02-08 12:04:32 +01:00

Cozystack Cozystack

Open Source Apache-2.0 License Support Active GitHub Release GitHub Commit OpenSSF Best Practices OpenSSF Scorecard

Cozystack

Cozystack is a free platform and framework for building clouds.

Cozystack is a CNCF Sandbox Level Project that was originally built and sponsored by Ænix.

With Cozystack, you can transform a bunch of servers into an intelligent system with a simple REST API for spawning Kubernetes clusters, Database-as-a-Service, virtual machines, load balancers, HTTP caching services, and other services with ease.

Use Cozystack to build your own cloud or provide a cost-effective development environment.

Cozystack user interface

Use-Cases

Documentation

The documentation is located on the cozystack.io website.

Read the Getting Started section for a quick start.

If you encounter any difficulties, start with the troubleshooting guide and work your way through the process that we've outlined.

Versioning

Versioning adheres to the Semantic Versioning principles.
A full list of the available releases is available in the GitHub repository's Release section.

Contributions

Contributions are highly appreciated and very welcomed!

In case of bugs, please check if the issue has already been opened by checking the GitHub Issues section. If it isn't, you can open a new one. A detailed report will help us replicate it, assess it, and work on a fix.

You can express your intention to on the fix on your own. Commits are used to generate the changelog, and their author will be referenced in it.

If you have a concrete feature request, open an issue. For a cross-cutting or architectural change, open a design proposal in the community repo. For questions or early ideas, use GitHub Discussions. See CONTRIBUTING.md for the full routing.

Community

You are welcome to join our Telegram group and come to our weekly community meetings. Add them to your Google Calendar or iCal for convenience.

License

Cozystack is licensed under Apache 2.0.
The code is provided as-is with no warranties.

Commercial Support

A list of companies providing commercial support for this project can be found on official site.

Languages
Go 48%
Shell 37%
TypeScript 6.9%
Go Template 5.3%
Makefile 1.4%
Other 1.2%