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

Cleanup Part 1 - First refactors #990

Merged
merged 18 commits into from
Oct 27, 2024
Merged

Commits on Oct 17, 2024

  1. Cleanup rebooter interface

    Without this, the interface and the code to reboot is
    a bit more complex than it should be.
    
    We do not need setters and getters, as we are just
    instanciating a single instance of a rebooter interface.
    
    We create it based on user input, then pass the object
    around. This should cleanup the code.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    f348647 View commit details
    Browse the repository at this point in the history
  2. Extract privileged command wrapper into util

    Without this, it makes the code a bit harder to read.
    
    This fixes it by extracting the method.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    3bfdd76 View commit details
    Browse the repository at this point in the history
  3. Add checker interface

    This will be useful to refactor the checkers loop.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    574065f View commit details
    Browse the repository at this point in the history
  4. Extract blockers

    This will make it easier to manipulate main in the future.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    eeedf20 View commit details
    Browse the repository at this point in the history
  5. Move command line validations in pre function

    Without this, validations are all over the place.
    This moves some validations directly into the function, to
    make the code simpler to read.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    00d8a52 View commit details
    Browse the repository at this point in the history
  6. Rename variable

    Without this, the variable name is hard to follow.
    
    This fixes it by cleaning up the var name.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 17, 2024
    Configuration menu
    Copy the full SHA
    36e6c8b View commit details
    Browse the repository at this point in the history

Commits on Oct 19, 2024

  1. Cleanup checkers

    Without this, the checkers are only shell calls: test -f
    sentinelFile, or sentinelCommand.
    
    This changes the behaviour of existing code to test file for
    sentinelFile checker, and to keep the sentinel command as
    a command.
    
    However, to avoid having validation in the root loop, it moves
    to use a constructor to cleanup the code.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    f43ed14 View commit details
    Browse the repository at this point in the history
  2. Remove nodeID from rebooter interface

    Without this patch, the rebooter interface has data which is
    not related to the rebooter interface. This should get removed
    to make it easier to maintain.
    
    The loss comes from the logging, which mentioned the node.
    
    In order to not have a regression compared to [1], this ensures
    that at least the node to be rebooted appears in the main.
    
    [1]:  kubereboot#134
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    3895a2f View commit details
    Browse the repository at this point in the history
  3. Revert to use a constructor again

    Without this, we have no validation of the data in command/signal
    reboot.
    
    This was not a problem in the first refactor, as the constructor
    was a dummy one, without validation.
    
    However, as we refactoed, we now have code in the root method
    that is validation for the reboot command. This can now be
    encompassed in the constructor.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    42c4b8b View commit details
    Browse the repository at this point in the history
  4. Remove viper/cobra deps

    Without this, the main loop is in need of 3 functions to simply
    parse flags and env variables (excluding input validation).
    
    This is a bit more complex than it should, especially since
    we only need to parse command line flags and env vars.
    
    This fixes it by simply using pflags (which we were already
    using) instead of pflags + viper + cobra (for which we
    do not have any benefit), and removing all the methods
    outside the mapping of env var with cli flag.
    
    The main code is now far simpler: It handles the reading,
    parsing, and returning in case of error.
    
    As we do not bubble up errors from rebootasRequired yet,
    this is good enough at this moment.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    a8132a2 View commit details
    Browse the repository at this point in the history
  5. Raise the error levels for wrong flag

    If the notification url configuration is known to be not working,
    this should be raised as an error, not a warning.
    
    Without this, it would be easy to miss a misconfiguration.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    aae5bb6 View commit details
    Browse the repository at this point in the history
  6. Make locks more generic

    Implementation details of lock should not leak into the calling
    methods.
    
    Without this path, calls are a bit more complex
    and error handling is harder to find.
    
    This is a problem for long term maintenance, as it
    is tougher to refactor the locks without impacting the main.
    
    Decoupling the two (main usage of the lock, and the lock
    themselves) will allow us to introduce other kinds of locks
    easily.
    
    I solve this by inlining into the daemonsetlock package:
    - including all the methods for managing locks from the main.go
      functions. Those were mostly doing error handling
      where code became no-op by introducing multiple
      daemonsetlock types
    - adding the lock release delay part of lock info
    
    I also did not like the pattern include in Test method,
    which added a reference to nodeMeta: It was not very clear
    that Test was storing the current metadata of the node,
    or was returning the current state. (Metadata here only means unschedulable).
    
    The problem I saw was that the metadata was silently
    mutated from a lock Test method, which was very not obvious.
    
    Instead, I picked to explicitly return the lock data instead.
    
    I also made it explicit that the Acquire lock method
    is passing the node metadata as structured information,
    rather than an interface{}. This is a bit more fragile
    at runtime, but I prefer having very explicit errors if
    the locks are incorrect, rather than having to deal with
    unvalidated data.
    
    For the lock release delay, it was part of the rebootasrequired
    loop, where I believe it makes more sense to be part of the
    Release method itself, for readability. Yet, it hides the
    delay into the implementation detail, but it keeps the
    reboot as required goroutine more readable.
    
    Instead of passing the argument rebootDelay as parameter of the
    rebootasrequired method, this refactor took creation of the lock
    object in the main loop, close to all the variables, and then
    pass the lock object to the rebootasrequired. This makes the
    call for rebootasrequired more clear, and lock is now
    encompassing everything needed to acquire, release, or get
    info about the lock.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    104a745 View commit details
    Browse the repository at this point in the history
  7. Refactor constructors

    Without this, a bit of the validation is done in main, while
    the rest is done in each constructor.
    
    This fixes it by create a new global constructor in checkers/reboot to
    solve all the cases and bubble up the errors.
    
    I prefered keeping the old constructors, and calling them, this
    way someone wanting to have a fork of the code could still create
    directly the good checker/rebooter, without the arbitrary decisions
    taken by the generic constructor.
    
    However, kured is not a library, and was never intended to be
    usable in forks, so we might want to reconsider is part 2 of the
    refactor.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    d8b9e31 View commit details
    Browse the repository at this point in the history
  8. Use RegexpValue in plags

    This will remove double pointers, and be explicit about the
    type we are using.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    231888e View commit details
    Browse the repository at this point in the history
  9. Remove deprecated PollWithContext

    Replaced with PollUntilContextTimeout.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    67df0e9 View commit details
    Browse the repository at this point in the history
  10. Add error to reboot interface

    Without this, impossible to bubble up errors to main
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    626db87 View commit details
    Browse the repository at this point in the history
  11. Make all the internal validations ... internal

    The main is doing flag validation through pflags, then
    did further validation by involving the constructors.
    
    With the recent refactor on the commit "Refactor constructors"
    in this branch, we moved away from that pattern.
    
    However, it means we reintroduced a log dependency into our
    external API, and the external API now had extra validations
    regardless of the type.
    
    This is unnecessary, so I moved away from that pattern, and
    moved back all the validation into a central place, internal,
    which is only doing what kured would desire, without exposing
    it to users. The users could still theoretically use the proper
    constructors for each type, as they would validate just fine.
    
    The only thing they would lose is the kured internal decision
    of validation/precedence.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    73f00ce View commit details
    Browse the repository at this point in the history
  12. Make the internal blockers implementation internal

    This at the same time, removes the alert public package.
    Alert was only used inside prometheus blocker, so it allows
    to simplify the code.
    
    Signed-off-by: Jean-Philippe Evrard <[email protected]>
    evrardjp committed Oct 19, 2024
    Configuration menu
    Copy the full SHA
    f559a95 View commit details
    Browse the repository at this point in the history