Skip to content
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

Make network API replace IP/WiFi settings #5283

Merged
merged 9 commits into from
Sep 5, 2024

Conversation

agners
Copy link
Member

@agners agners commented Aug 30, 2024

Proposed change

This changes the network API behavior to replace IP configuration and WiFi settings instead of updating them.

It also adds support to set DNS (via nameservers property) when method auto is used. This allows to set a DNS server in case DHCP does not provide one, or overrides the

Update by replacing the whole IP configuration has advantages:

This also works out quite well with how the frontend behaves, it essentially keeps the behavior as it is today:

  • Setting to "auto" only provides the method property. So this clears lingering nameservers.
  • Setting to "static" always sets all fields (method, addresses, gateway and nameservers), so no change in behavior.

However, this does change the CLI behavior: Missing options now really lead to clearing that particular field. However, this seems the more expected behavior, e.g. the following sequence:

ha network update enp1s0 --ipv4-method static --ipv4-address 192.168.87.123/24 --ipv4-nameserver 192.168.87.2
ha network update enp1s0 --ipv4-method static --ipv4-address 192.168.87.123/24

With the patch style API, this would not have cleared the DNS. Clearing was only possible by switching to method auto and then back to static.

Type of change

  • Dependency upgrade
  • Bugfix (non-breaking change which fixes an issue)
  • New feature (which adds functionality to the supervisor)
  • Breaking change (fix/feature causing existing functionality to break)
  • Code quality improvements to existing code or addition of tests

Additional information

  • This PR fixes or closes issue: fixes #
  • This PR is related to issue:
  • Link to documentation pull request:
  • Link to cli pull request:
  • Link to client library pull request:

Checklist

  • The code change is tested and works locally.
  • Local tests pass. Your PR cannot be merged unless tests pass
  • There is no commented out code in this PR.
  • I have followed the development checklist
  • The code has been formatted using Ruff (ruff format supervisor tests)
  • Tests have been added to verify that the new code works.

If API endpoints or add-on configuration are added/changed:

Summary by CodeRabbit

  • New Features

    • Enhanced network configuration management with default values for IPv4, IPv6, and Wi-Fi settings.
    • Improved flexibility in DNS attribute handling, allowing for a wider range of data types.
  • Bug Fixes

    • Improved error handling for invalid interface methods in connection settings.
    • Enhanced handling of gateway values to prevent potential errors.
  • Tests

    • Updated tests to reflect new behavior in network settings, ensuring accurate validation of DNS configurations and other attributes.
  • Documentation

    • Clarified comments in tests to better describe the expected behavior of network configuration updates.

@agners
Copy link
Member Author

agners commented Aug 30, 2024

An alternative to this would be to allow null for gateway (and potentially also nameservers as an alternative to an empty list) to clear these settings. This essentially would keep the patch style API.

However, the support for nameservers in auto mode would be problematic with the current frontend: The frontend code only sets the method property. Hence when switching from static the nameservers would get inherited. This might not what the user intended.

Also the CLI would need a way to set no nameserver (currently that is not possible since the --ipvX-nameserver argument is additive only). The CLI I don't see that critical, we can implement the replace type behavior for the CLI client side (which probably would make sense).

Another option here would be to make the complete API replace style. For the frontend this would work without a problem as all aspects (ipv4, ipv6, wifi and enabled are set always.

Copy link
Contributor

@mdegat01 mdegat01 left a comment

Choose a reason for hiding this comment

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

I think this makes sense. Minor style change to the existing code.

One thing I was thinking about though, what if we mapped the existing code to PATCH /network/interface/{interface}/update? Like update POST /network/interface/{interface}/update exactly as you're showing but if we receive a PATCH request to that endpoint it does what it does today?

Then what we can do is simply update the CLI to make a PATCH call instead of a POST call to keep it working as it does today. And if we want we can add a --replace parameter or something that makes it do the POST call and clear existing values.

That way we don't have to try and collect the existing values and add them to the postbody to maintain existing behavior in the CLI, Supervisor will handle that. The frontend will continue to use POST and behave the way we want it to.

supervisor/api/network.py Outdated Show resolved Hide resolved
supervisor/api/network.py Outdated Show resolved Hide resolved
@agners agners force-pushed the make-network-api-replace-settings branch 2 times, most recently from b5c9474 to 9c99758 Compare September 4, 2024 17:19
Currently it is only possible to set DNS servers when in static mode.
However, there are use cases to set DNS servers when in auto mode as
well, e.g. if no local DNS server is provided by the DHCP, or the provided
DNS turns out to be non-working.
Make sure gateway is correctly converted to the internal IP
representation. Fix type info.
@agners agners force-pushed the make-network-api-replace-settings branch from 9c99758 to c85bc69 Compare September 4, 2024 17:22
@agners agners requested a review from mdegat01 September 4, 2024 17:23
@agners agners marked this pull request as ready for review September 4, 2024 17:23
Copy link

coderabbitai bot commented Sep 4, 2024

Warning

Rate limit exceeded

@agners has exceeded the limit for the number of commits or files that can be reviewed per hour. Please wait 8 minutes and 43 seconds before requesting another review.

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.

Commits

Files that changed from the base of the PR and between 885506f and 71a47b1.

Walkthrough

Walkthrough

The changes involve updates to network configuration handling, specifically for IPv4, IPv6, and Wi-Fi settings. Default values for optional attributes have been added, and the logic for updating interface settings has been streamlined. Additionally, modifications to the DNS attribute type and gateway processing have been implemented to enhance robustness and prevent errors associated with missing values.

Changes

Files Change Summary
supervisor/api/network.py, supervisor/dbus/network/configuration.py, supervisor/dbus/network/setting/generate.py, supervisor/host/configuration.py Added default values for optional attributes in IPv4, IPv6, and Wi-Fi configuration schemas. Simplified interface settings update logic by removing the replace function. Changed the dns attribute in IpProperties to accept bytes or integers. Introduced two new functions for retrieving IPv4 and IPv6 connection settings, and improved gateway processing with null checks and proper IP address formatting.
tests/api/test_network.py, tests/dbus/network/setting/test_init.py, tests/host/test_network.py Revised assertions in tests to align with updated network settings behavior, including DNS and gateway handling. Adjusted tests to validate specific configurations instead of checking for empty values.

Sequence Diagram(s)

sequenceDiagram
    participant User
    participant NetworkManager
    participant Configuration

    User->>NetworkManager: Request to update network settings
    NetworkManager->>Configuration: Validate new settings
    Configuration->>Configuration: Set defaults for optional attributes
    Configuration->>NetworkManager: Return validated settings
    NetworkManager->>User: Confirm settings updated
Loading

Assessment against linked issues

Objective Addressed Explanation
Supervisord should handle cases where a network interface has no gateway (#[4442])
Ensure proper validation and handling of DNS settings (#[4442])
Prevent crashes related to missing gateway values (#[4442])

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

Share
Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai generate interesting stats about this repository and render them as a table.
    • @coderabbitai show all the console.log statements in this repository.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

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)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai or @coderabbitai title anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Instead of using replace() simply set the API defaults in the API
schema.
@agners agners force-pushed the make-network-api-replace-settings branch from c85bc69 to 885506f Compare September 4, 2024 17:36
This avoid the unnecessary replaces from before. It also makes it more
obvious that this part of the API doesn't patch existing settings.
Copy link
Contributor

@mdegat01 mdegat01 left a comment

Choose a reason for hiding this comment

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

Looks good, LGTM 👍

@agners agners merged commit f5b996b into main Sep 5, 2024
19 checks passed
@agners agners deleted the make-network-api-replace-settings branch September 5, 2024 07:19
@github-actions github-actions bot locked and limited conversation to collaborators Sep 7, 2024
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Supervisord crashes when a second network interface has no gateway
2 participants