Skip to content

Conversation

@grolu
Copy link
Contributor

@grolu grolu commented Dec 1, 2025

What this PR does / why we need it:

  • Moved vendor assets from src/assets to public/static/assets to make them replaceable with custom assets
  • GVendorIcon component serves icons from this directory using filenames from vendor information
  • Centralized dictionary for vendors (infra/dns/image) in config store
  • Added defaults for all known vendors (displayname, icon, weight)
  • All values can be extended or overridden via configuration
  • Removed need to provide createTitle and updateTile in GSecretDialog (now kebap-case generated from displayName)
  • Use vendorDisplayName everywhere to ensure we show configured name for vendors instead of technical name

Which issue(s) this PR fixes:
Fixes #1707 Fixes #207 (partly)

Special notes for your reviewer:
Open Questions:

  • Do we want to deprecate vendorHints config and move hints to the new vendor configs?
  • Do we want to move vendor customization under ´frontendConfig.branding` config

TODO:
Adapt helm charts (values.yaml)

Release note:

Vendor Branding
- Define order, name and icon of cloud providers in dashboard configuration
- Define order, name and icon of machine image vendors in dashboard configuration

- Moved vendor assets from src/assets to public/static/assets to make them replaceable with custom assets
- GVendorIcon component serves icons from this directory using filenames from vendor information
- Centralized dictionary for vendors (infra/dns/image) in config store
- Added defaults for all known vendors (displayname, icon, weight)
- All values can be extended or overridden via configuration
- Removed need to provide createTitle and updateTile in GSecretDialog (now kebap-case generated from displayName)
- Use vendorDisplayName everywhere to ensure we show configured name for vendors instead of technical name
@gardener-robot gardener-robot added needs/review Needs review size/XL Denotes a PR that changes 500-999 lines, ignoring generated files. needs/second-opinion Needs second review by someone else labels Dec 1, 2025
@grolu grolu added the area/ipcei IPCEI (Important Project of Common European Interest) label Dec 1, 2025
@grolu grolu mentioned this pull request Dec 1, 2025
Copy link
Member

@klocke-io klocke-io left a comment

Choose a reason for hiding this comment

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

Looks a lot cleaner and simpler now 🎉

| `displayName` | Name displayed in the dashboard |
| `weight` | Sorting weight. Lower values appear first. See default weights in `frontend/src/store/config.js` |
| `icon` | ile name of the icon located in the `public/static/assets` folder. See [Logos and Icons](#logos-and-icons) for instructions on replacing assets |

Copy link
Member

Choose a reason for hiding this comment

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

showing an example config file would be nice

@gardener-robot
Copy link

@holgerkoser You have pull request review open invite, please check

@grolu grolu mentioned this pull request Dec 4, 2025
7 tasks
...knownImageVendors,
]

const vendorDetails = function (kind) {
Copy link
Member

Choose a reason for hiding this comment

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

do you think it makes sense to have a vendorDetailsMap computed prop? In order to compute it once? Something like the following

  const vendorDetailsMap = computed(() => {
    const map = new Map()

    // Build map from all known and configured vendors
    const allVendors = new Set([
      ...knownVendors.map(v => v.name),
      ...configVendors.value.map(v => v.name),
    ])

    for (const kind of allVendors) {
      const configuredVendor = find(configVendors.value, ['name', kind])
      const knownVendor = find(knownVendors, ['name', kind])

      map.set(kind, {
        name: kind,
        weight: Number.MAX_SAFE_INTEGER,
        ...knownVendor,
        ...configuredVendor,
      })
    }

    return map
  })

  function vendorDetails (kind) {
    return vendorDetailsMap.value.get(kind) ?? {
      name: kind,
      weight: Number.MAX_SAFE_INTEGER,
    }
  }

Copy link
Contributor Author

Choose a reason for hiding this comment

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

Yes. While working on your feedback i stumbled over that comment that there could be possible name clashes between the different vendor arrays. As they are already separated in config, I changed the code to include a type in the vendorDetails lookup.
As I did not want to adjust every component that uses the function to pass the param, I do this internally only and log a warning in case there are ambiguous or missing vendors. This, however slightly reduces the performance effect we gained by introducing the computed as we now have to loop over the types in the compatibility function. However this will change once we pass type from the components using the function

@gardener-robot gardener-robot added the needs/rebase Needs git rebase label Dec 18, 2025
@gardener-robot
Copy link

@grolu You need rebase this pull request with latest master branch. Please check.

Comment on lines +693 to +694
function vendorDisplayName (name, type) {
return get(vendorDetails(name, type), ['displayName'], name)
Copy link
Member

Choose a reason for hiding this comment

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

vendorDetails only accepts one (name) param

},
]

const knownImageVendors = [
Copy link
Member

Choose a reason for hiding this comment

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

shouldn't we better name it to knownOSImageVendors or knownMachineImageVendors? Or do you think it is clear enough?

@gardener-ci-robot
Copy link
Contributor

The Gardener project currently lacks enough active contributors to adequately respond to all PRs.
This bot triages PRs according to the following rules:

  • After 15d of inactivity, lifecycle/stale is applied
  • After 15d of inactivity since lifecycle/stale was applied, lifecycle/rotten is applied
  • After 7d of inactivity since lifecycle/rotten was applied, the PR is closed

You can:

  • Mark this PR as fresh with /remove-lifecycle stale
  • Mark this PR as rotten with /lifecycle rotten
  • Close this PR with /close

/lifecycle stale

@gardener-robot gardener-robot added the lifecycle/stale Denotes an issue or PR has remained open with no activity and has become stale. label Jan 3, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

area/ipcei IPCEI (Important Project of Common European Interest) lifecycle/stale Denotes an issue or PR has remained open with no activity and has become stale. needs/rebase Needs git rebase needs/review Needs review needs/second-opinion Needs second review by someone else size/XL Denotes a PR that changes 500-999 lines, ignoring generated files.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Add ability to brand infrastructures / cloud profiles Sort Cloud Profiles

5 participants