-
Notifications
You must be signed in to change notification settings - Fork 119
[cozystack-api] show default values from openapi spec #1241
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
WalkthroughThis change introduces schema-based defaulting for the Application resource's spec during conversion from HelmRelease. It adds a new field to hold the parsed OpenAPI schema within the REST struct, parses the schema in the constructor, and applies default values to Application specs using this schema after conversion. Changes
Sequence Diagram(s)sequenceDiagram
participant User
participant REST
participant OpenAPI Schema
participant Application
User->>REST: ConvertHelmReleaseToApplication()
REST->>OpenAPI Schema: Parse schema (if not already parsed)
REST->>Application: Convert HelmRelease to Application
REST->>REST: applySpecDefaults(Application)
REST->>Application: Apply default values from schema
REST-->>User: Return Application with defaults applied
Estimated code review effort🎯 3 (Moderate) | ⏱️ ~15 minutes Suggested reviewers
Poem
Note ⚡️ Unit Test Generation is now available in beta!Learn more here, or try it out under "Finishing Touches" below. 📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (1)
🚧 Files skipped from review as they are similar to previous changes (1)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
✨ Finishing Touches
🧪 Generate 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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @kvaps, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request enhances the cozystack-api
by implementing automatic application of default values to Application
resource specifications. It achieves this by integrating OpenAPI schema definitions, ensuring that any defaults specified in the schema are automatically populated when an Application
object is created or converted, specifically from a HelmRelease.
Highlights
- OpenAPI Schema Integration: The
REST
storage forApplication
resources now includes aspecSchema
field to store a parsed structural OpenAPI schema. This schema is loaded during the initialization of theREST
service from theconfig.Application.OpenAPISchema
. - Automatic Default Value Application: A new private method,
applySpecDefaults
, has been introduced. This method takes anApplication
object, unmarshals itsSpec.Raw
content, applies default values based on the loaded OpenAPI schema using Kubernetes'schemadefault.Default
utility, and then re-marshals the updated spec back into theApplication
object. - Enhanced HelmRelease Conversion: The
ConvertHelmReleaseToApplication
function now invokesapplySpecDefaults
after converting a HelmRelease to an Application. This ensures that any default values defined in the OpenAPI specification for the Application's spec are automatically populated. - New Dependencies: New imports from
k8s.io/apiextensions-apiserver/pkg/apis/apiextensions
andk8s.io/apiextensions-apiserver/pkg/apiserver/schema/defaulting
have been added to support the parsing and application of structural schema defaults.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command>
or @gemini-code-assist <command>
. Below is a summary of the supported commands.
Feature | Command | Description |
---|---|---|
Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/
folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments or fill out our survey to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request introduces functionality to apply default values to Application resources based on an OpenAPI schema provided in the configuration. The changes involve parsing the schema during initialization and applying defaults when converting a HelmRelease to an Application.
if raw := strings.TrimSpace(config.Application.OpenAPISchema); raw != "" { | ||
var js internalapiext.JSONSchemaProps | ||
if err := json.Unmarshal([]byte(raw), &js); err == nil { | ||
specSchema, _ = structuralschema.NewStructural(&js) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The error handling in this block could be improved. Currently, an error from json.Unmarshal
is silently ignored on failure, and the error from structuralschema.NewStructural
is discarded. This can make it difficult to debug issues with invalid OpenAPI schemas in the configuration. It's better to log these errors to aid in troubleshooting.
if err := json.Unmarshal([]byte(raw), &js); err != nil {
klog.Warningf("failed to unmarshal openapi schema for kind %s: %v", config.Application.Kind, err)
} else {
specSchema, err = structuralschema.NewStructural(&js)
if err != nil {
klog.Warningf("invalid openapi schema for kind %s: %v", config.Application.Kind, err)
specSchema = nil
}
}
func (r *REST) applySpecDefaults(app *appsv1alpha1.Application) error { | ||
var m map[string]any |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 2
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
pkg/registry/apps/application/rest.go
(6 hunks)
🧰 Additional context used
🧠 Learnings (2)
📓 Common learnings
Learnt from: NickVolynkin
PR: cozystack/cozystack#1120
File: packages/apps/ferretdb/README.md:35-37
Timestamp: 2025-07-02T09:58:11.406Z
Learning: In the cozystack repository, the maintainer NickVolynkin prefers to keep realistic-looking example credentials in README documentation rather than using generic placeholders like <ACCESS_KEY>, even though they are just examples and not real secrets.
pkg/registry/apps/application/rest.go (1)
Learnt from: lllamnyp
PR: #1130
File: hack/e2e-apps/kubernetes.bats:101-101
Timestamp: 2025-07-11T06:11:25.438Z
Learning: In cozystack, the plural form for the Kubernetes custom resource is kuberneteses.apps.cozystack.io
, not kubernetes.apps.cozystack.io
. This is defined in the API schema even though it's not grammatically perfect.
🔇 Additional comments (3)
pkg/registry/apps/application/rest.go (3)
45-48
: Appropriate imports for schema handlingThe added imports from the apiextensions-apiserver package are appropriate for implementing the schema-based defaulting functionality.
86-86
: Well-structured field additionThe
specSchema
field is appropriately typed and positioned within the REST struct to support the defaulting functionality.
936-938
: Proper integration of defaulting logicThe defaulting is correctly applied after conversion and error handling follows the established pattern.
Signed-off-by: Andrei Kvapil <kvapss@gmail.com>
Signed-off-by: Andrei Kvapil kvapss@gmail.com
What this PR does
Release note
Summary by CodeRabbit