10 CBA practice questions with full explanations on every option. Original questions written against the current CNCF curriculum.
Customizing Backstage
Q1. A production Backstage deployment has different auth, integration, database, and plugin settings per environment. What does app-config.yaml control?
Reveal answer and explanations
AReact component auth flow compiled into the frontend bundle
Incorrect. Component rendering logic lives in application and plugin code.
BTypeScript compiler settings for each workspace package
Incorrect. TypeScript compiler settings are defined in tsconfig files.
CRuntime feature, auth, database, and integration config
Correct. Backstage configuration files supply runtime settings for installed features, auth providers, integrations, and services.
DDatabase schema definitions generated by plugin migrations
Incorrect. Plugin database schemas are managed by backend code and migrations, not by app-config.yaml.
Customizing Backstage
Q2. What is the relationship between entity pages, entity layout components, and the Backstage routing system?
Reveal answer and explanations
AEntity pages are routes that use entity layout components to organize content; routing is handled by the core framework
Correct. Custom entity pages use layout components to structure the UI; the framework handles routing based on entity type.
BThe routing system dynamically generates entity pages from entity layout components defined in each plugin
Incorrect. While plugins can contribute layout components, the framework generates the routes.
CEntity layout components are independent routes that manage their own navigation
Incorrect. Layout components are not independent routes; they're nested within entity pages.
DEntity pages are static HTML files generated at build time; components are loaded dynamically
Incorrect. Entity pages are dynamically rendered, not static.
Customizing Backstage
Q3. When creating a custom plugin API to share functionality between plugins, which pattern does Backstage recommend?
Reveal answer and explanations
AUsing React Context to expose API implementations
Incorrect. React Context can be used but doesn't follow Backstage's API registration pattern.
BStoring shared functions in the backend database
Incorrect. Storing functions in the database is inefficient and not part of plugin architecture.
CCreating shared utility functions in a common package
Incorrect. While utility functions are useful, they don't provide the plugin isolation and dependency management of the API registry.
DDefining an API interface and registering it with the API registry
Correct. Backstage's API registry pattern allows you to define typed APIs and inject them into plugins, providing proper dependency management and isolation.
Customizing Backstage
Q4. In a proxy backend plugin, what is the primary security concern when proxying requests to external services?
Reveal answer and explanations
AThe proxy must rate-limit requests to prevent DDoS attacks on the external service
Incorrect. Rate limiting is a concern, but the primary security issue is credential management.
BThe proxy must ensure credentials for the external service are not leaked through request headers or logs
Correct. Proxy plugins must carefully manage backend credentials, ensuring they are not exposed through client-side headers or logging.
CThe proxy must compress all responses to prevent network sniffing
Incorrect. Compression is a transport optimization, not a security measure against credential leakage.
DThe proxy must validate that the external service's SSL certificate is valid
Incorrect. While certificate validation is important, it's standard HTTPS behavior.
Customizing Backstage
Q5. A team wants to replace one default Backstage page but still upgrade the upstream plugin later. Why use a component override instead of editing plugin source?
Reveal answer and explanations
ATo replace npm dependency versions across the monorepo
Incorrect. Dependency versions are managed by package manifests and the workspace tooling.
BTo change deployment-time environment
Incorrect. Deployment-time values belong in Backstage configuration or environment variables.
CTo make the production bundle smaller automatically
Incorrect. Overrides are about behavior and presentation, not automatic bundle optimization.
DTo replace default UI with app-owned behavior
Correct. Overrides let the app replace or decorate default UI behavior without patching the plugin package itself.
Customizing Backstage
Q6. When implementing a custom plugin extension point, what is the primary mechanism that allows third-party plugins to discover and interact with your extension without tight coupling?
Reveal answer and explanations
AExtension inputs declared with `createExtensionInput` (parent id + input name)
Correct. Extension inputs and attachment points are the frontend system's loose-coupling primitive; attaching plugins need only the parent extension's id and the input name.
BDefining the extension in a YAML file in the app-config and dynamically loading it
Incorrect. YAML-based dynamic loading isn't how Backstage handles extension point discovery.
CRegistering the extension in the plugin's index.ts file with hardcoded import paths
Incorrect. Hardcoded imports defeat the purpose of plugin extensibility and create tight coupling.
DUsing a shared npm package that exports the extension
Incorrect. While shared packages can work, they create tight coupling and don't enable true plugin discovery.
Customizing Backstage
Q7. A team is packaging a custom page as a Backstage frontend plugin for the new frontend system. Which API creates the plugin instance?
Reveal answer and explanations
AcreateFrontendPlugin
Correct. The new frontend system uses this factory to create a plugin instance with a plugin ID and extension definitions, avoiding a custom class hierarchy.
BCustomPluginInterface
Incorrect. Backstage documentation describes a factory function for plugin instances; this name is just a distractor and would not give the app an installable plugin feature.
CBackstagePluginClass
Incorrect. A made-up class name would not integrate with the documented frontend feature installation flow or the extension tree used by Backstage apps.
DcreateBackendPlugin
Incorrect. That factory belongs to server-side extension points and does not create an installable browser feature for the frontend system.
Customizing Backstage
Q8. When creating a custom sidebar navigation item using createComponentExtension, which of the following scenarios would require additional configuration beyond the basic plugin setup?
Reveal answer and explanations
AAdding a static navigation item that always appears at the bottom of the sidebar
Incorrect. Static items with positioning are straightforward configurations of createComponentExtension.
BAdding a navigation item with a custom color
Incorrect. Colors are handled through standard theming, not special configuration.
CNav item with icon shown only to permitted users
Correct. Permission-based visibility requires integration with Backstage's permission framework and custom logic beyond the basic extension.
DAdding a navigation item that links to an external URL
Incorrect. External URL links are directly supported by navigation extensions.
Customizing Backstage
Q9. A company needs branded colors and typography without patching CSS or node_modules. Which supported Backstage API should create the app theme?
Reveal answer and explanations
AReplace Material UI entirely with a different component library
Incorrect. Backstage theming is designed to work through the Backstage and Material UI theme APIs.
BOverride global CSS with !important rules in index.css
Incorrect. Global CSS overrides are brittle and bypass the supported theme model.
CModify files in node_modules directly
Incorrect. Editing node_modules is not maintainable and will be overwritten by dependency updates.
DUse createUnifiedTheme with createApp
Correct. Backstage marks createTheme() as obsolete and documents createUnifiedTheme() as the supported theme creation API.
Customizing Backstage
Q10. You're creating a plugin that needs to execute custom logic whenever a new entity is added to the catalog. What is the most appropriate pattern?
Reveal answer and explanations
AImplement a custom Express middleware in the backend app that intercepts every catalog mutation request before it reaches the catalog plugin
Incorrect. Custom Express middleware bypasses Backstage's plugin architecture and the catalog processing loop, so it cannot reliably act on every entity ingested or refreshed.
BCreate a custom search index extension that polls the catalog API
Incorrect. The search index is for indexing existing data, not for processing new entities as they arrive.
CImplement a CatalogProcessor in a backend plugin to process entities as they are ingested into the catalog
Correct. A CatalogProcessor is the designed extension point that runs inside the catalog processing loop (preProcessEntity/postProcessEntity/validateEntityKind) on every entity as it is ingested and refreshed; event/webhook-driven ingestion is instead the job of an EntityProvider or the events backend.
DHook into the EntityListComponent lifecycle and call your API on componentDidMount
Incorrect. Frontend component lifecycle hooks are not suitable for reliable, system-wide catalog operations.