diff --git a/cmd/logging.yaml b/cmd/logging.yaml new file mode 100644 index 0000000..76dbc94 --- /dev/null +++ b/cmd/logging.yaml @@ -0,0 +1,6 @@ +log_levels: + default: debug + github.com/netbirdio/management-refactor/internals/shared/activity: error + github.com/netbirdio/management-refactor/internals/shared/db: debug + github.com/netbirdio/management-refactor/internals/shared/permissions: debug + github.com/netbirdio/management-refactor/internals/modules/peers/manager: warn diff --git a/cmd/management.go b/cmd/management.go index a2941e2..5b1315b 100644 --- a/cmd/management.go +++ b/cmd/management.go @@ -17,10 +17,10 @@ var log = logging.LoggerForThisPackage() var mgmtCmd = &cobra.Command{ Use: "management", Short: "start NetBird Management Server", - PreRunE: func(cmd *cobra.Command, args []string) error { + RunE: func(cmd *cobra.Command, args []string) error { err := logging.Init("logging.yaml") if err != nil { - log.Fatalf("Failed to init logging: %v", err) + log.Debugf("Failed to init logging: %v", err) } srv := server.NewServer() diff --git a/go.mod b/go.mod index 0251cd1..0559b83 100644 --- a/go.mod +++ b/go.mod @@ -2,7 +2,7 @@ module github.com/netbirdio/management-refactor go 1.23.0 -toolchain go1.23.8 +toolchain go1.23.1 require ( github.com/c-robinson/iplib v1.0.3 diff --git a/internals/controllers/ephemeral_peers/controller.go b/internals/controllers/ephemeral_peers/controller.go index 47fb7ae..fedfed0 100644 --- a/internals/controllers/ephemeral_peers/controller.go +++ b/internals/controllers/ephemeral_peers/controller.go @@ -10,6 +10,8 @@ import ( "github.com/netbirdio/netbird/management/server/activity" nbpeer "github.com/netbirdio/netbird/management/server/peer" "github.com/netbirdio/netbird/management/server/store" + + "github.com/netbirdio/management-refactor/internals/modules/peers" ) const ( @@ -33,7 +35,7 @@ type ephemeralPeer struct { // Controller keep a list of ephemeral peers. After ephemeralLifeTime inactivity the peer will be deleted // automatically. Inactivity means the peer disconnected from the Management server. type Controller struct { - store store.Store + peersManager peers.Manager headPeer *ephemeralPeer tailPeer *ephemeralPeer @@ -42,9 +44,9 @@ type Controller struct { } // NewEphemeralManager instantiate new Controller -func NewEphemeralManager(peersManager) *Controller { +func NewEphemeralManager(peersManager peers.Manager) *Controller { return &Controller{ - store: store, + peersManager: peersManager, } } @@ -119,7 +121,7 @@ func (e *Controller) OnPeerDisconnected(ctx context.Context, peer *nbpeer.Peer) } func (e *Controller) loadEphemeralPeers(ctx context.Context) { - peers, err := e.store.GetAllEphemeralPeers(ctx, store.LockingStrengthShare) + peers, err := e.peersManager.GetAllEphemeralPeers(ctx, store.LockingStrengthShare) if err != nil { log.WithContext(ctx).Debugf("failed to load ephemeral peers: %s", err) return @@ -163,7 +165,7 @@ func (e *Controller) cleanup(ctx context.Context) { for id, p := range deletePeers { log.WithContext(ctx).Debugf("delete ephemeral peer: %s", id) - err := e.accountManager.DeletePeer(ctx, p.accountID, id, activity.SystemInitiator) + err := e.peersManager.DeletePeer(ctx, p.accountID, id, activity.SystemInitiator) if err != nil { log.WithContext(ctx).Errorf("failed to delete ephemeral peer: %s", err) } diff --git a/internals/controllers/network_map/controller.go b/internals/controllers/network_map/controller.go index e8a7c6d..c2503b9 100644 --- a/internals/controllers/network_map/controller.go +++ b/internals/controllers/network_map/controller.go @@ -26,7 +26,7 @@ func NewController(store *db.Store, metrics *appmetrics.AppMetrics) *Controller } func (c *Controller) UpdatePeers(accountID string) error { - data, err := c.repo.GetNetworkMapData(accountID) + _, err := c.repo.GetNetworkMapData(accountID) if err != nil { return fmt.Errorf("get network map data: %w", err) } diff --git a/internals/controllers/network_map/repository.go b/internals/controllers/network_map/repository.go index eec9852..26d77a9 100644 --- a/internals/controllers/network_map/repository.go +++ b/internals/controllers/network_map/repository.go @@ -55,9 +55,9 @@ func (r *repository) GetNetworkMapData(accountID string) (*NetworkMapData, error return nil, err } - if err := r.store.Load(&networkMapData, "Peers", "Groups", "Policies", "Networks", "NetworkRouters", "NetworkResources"); err != nil { - return nil, err - } + // if err := r.store.Load(&networkMapData, "Peers", "Groups", "Policies", "Networks", "NetworkRouters", "NetworkResources"); err != nil { + // return nil, err + // } r.metrics.RecordDBAccessDuration(time.Since(start)) diff --git a/internals/controllers/network_map/updatechannel.go b/internals/controllers/network_map/updatechannel.go index e804a01..d44baec 100644 --- a/internals/controllers/network_map/updatechannel.go +++ b/internals/controllers/network_map/updatechannel.go @@ -5,11 +5,15 @@ import ( "sync" "time" + "github.com/netbirdio/netbird/management/server/groups" log "github.com/sirupsen/logrus" "github.com/netbirdio/netbird/management/proto" "github.com/netbirdio/netbird/management/server/telemetry" "github.com/netbirdio/netbird/management/server/types" + + "github.com/netbirdio/management-refactor/internals/modules/peers" + "github.com/netbirdio/management-refactor/internals/modules/policies" ) const channelBufferSize = 100 @@ -17,9 +21,9 @@ const channelBufferSize = 100 type UpdateMessage struct { Update *proto.SyncResponse NetworkMap *types.NetworkMap - PeerManager *nbpeer.Manager - PolicyManager *nbpeer.PolicyManager - GroupManager *nbpeer.GroupManager + PeerManager *peers.Manager + PolicyManager *policies.Manager + GroupManager *groups.Manager } type UpdateChannel struct { diff --git a/internals/modules/accounts/interface.go b/internals/modules/accounts/interface.go new file mode 100644 index 0000000..14a006c --- /dev/null +++ b/internals/modules/accounts/interface.go @@ -0,0 +1,18 @@ +package accounts + +import ( + "context" + + "github.com/netbirdio/netbird/management/server/integrations/extra_settings" + "github.com/netbirdio/netbird/management/server/types" + + "github.com/netbirdio/management-refactor/internals/shared/db" +) + +type Manager interface { + GetExtraSettingsManager() extra_settings.Manager + GetSettings(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) (*types.Settings, error) + GetExtraSettings(ctx context.Context, tx db.Transaction, accountID string) (*types.ExtraSettings, error) + UpdateExtraSettings(ctx context.Context, accountID, userID string, extraSettings *types.ExtraSettings) (bool, error) + UpdateSettings(ctx context.Context, tx db.Transaction, settings *types.Settings) (*types.Settings, error) +} diff --git a/internals/modules/accounts/manager.go b/internals/modules/accounts/manager.go deleted file mode 100644 index ec6c5a1..0000000 --- a/internals/modules/accounts/manager.go +++ /dev/null @@ -1 +0,0 @@ -package accounts diff --git a/internals/modules/accounts/settings/manager/manager.go b/internals/modules/accounts/settings/manager/manager.go index 4374055..d35ac1a 100644 --- a/internals/modules/accounts/settings/manager/manager.go +++ b/internals/modules/accounts/settings/manager/manager.go @@ -8,7 +8,6 @@ import ( "github.com/netbirdio/netbird/management/server/integrations/extra_settings" types2 "github.com/netbirdio/netbird/management/server/types" - "github.com/netbirdio/management-refactor/internals/modules/accounts/settings/types" "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/activity" "github.com/netbirdio/management-refactor/internals/shared/db" diff --git a/internals/modules/accounts/settings/manager/repository.go b/internals/modules/accounts/settings/manager/repository.go index c859280..2fc807e 100644 --- a/internals/modules/accounts/settings/manager/repository.go +++ b/internals/modules/accounts/settings/manager/repository.go @@ -1,14 +1,14 @@ package manager import ( - "github.com/netbirdio/management-refactor/internals/modules/accounts/settings/types" + "github.com/netbirdio/management-refactor/internals/modules/accounts/settings" "github.com/netbirdio/management-refactor/internals/shared/db" ) type Repository interface { RunInTx(fn func(tx db.Transaction) error) error - GetAccountSettings(tx db.Transaction, strength db.LockingStrength, accountID string) (*types.Settings, error) - UpdateSettings(tx db.Transaction, settings *types.Settings) (*types.Settings, error) + GetAccountSettings(tx db.Transaction, strength db.LockingStrength, accountID string) (*settings.Settings, error) + UpdateSettings(tx db.Transaction, settings *settings.Settings) (*settings.Settings, error) } type repository struct { @@ -23,13 +23,13 @@ func (r *repository) RunInTx(fn func(tx db.Transaction) error) error { return r.store.RunInTx(fn) } -func (r *repository) GetAccountSettings(tx db.Transaction, strength db.LockingStrength, accountID string) (*types.Settings, error) { - var settings types.Settings +func (r *repository) GetAccountSettings(tx db.Transaction, strength db.LockingStrength, accountID string) (*settings.Settings, error) { + var settings settings.Settings err := r.store.GetOne(tx, strength, &settings, "account_id = ?", accountID) return &settings, err } -func (r *repository) UpdateSettings(tx db.Transaction, settings *types.Settings) (*types.Settings, error) { +func (r *repository) UpdateSettings(tx db.Transaction, settings *settings.Settings) (*settings.Settings, error) { err := r.store.Update(tx, settings) if err != nil { return nil, err diff --git a/internals/modules/peers/api.go b/internals/modules/peers/api.go deleted file mode 100644 index 85e6ae8..0000000 --- a/internals/modules/peers/api.go +++ /dev/null @@ -1,94 +0,0 @@ -package peers - -import ( - "fmt" - "net/http" - - "github.com/gorilla/mux" - nbcontext "github.com/netbirdio/netbird/management/server/context" - "github.com/netbirdio/netbird/management/server/groups" - "github.com/netbirdio/netbird/management/server/http/api" - "github.com/netbirdio/netbird/management/server/http/util" - - "github.com/netbirdio/management-refactor/internals/shared/db" - "github.com/netbirdio/management-refactor/internals/shared/permissions" -) - -type handler struct { - manager *Manager - permissionsManager permissions.Manager -} - -func newHandler(manager *Manager, permissionsManager permissions.Manager) *handler { - return &handler{ - manager: manager, - permissionsManager: permissionsManager, - } -} - -func (h *handler) RegisterEndpoints(router *mux.Router) { - router.HandleFunc("/peers", h.getAllPeers).Methods("GET", "OPTIONS") - router.HandleFunc("/peers/{peerId}", h.getPeer).Methods("GET", "OPTIONS") - router.HandleFunc("/peers/{peerId}", h.updatePeer).Methods("PUT", "OPTIONS") - router.HandleFunc("/peers/{peerId}", h.deletePeer).Methods("DELETE", "OPTIONS") - router.HandleFunc("/peers/{peerId}/accessible-peers", h.getAccessiblePeers).Methods("GET", "OPTIONS") -} - -func (h *handler) getAllPeers(w http.ResponseWriter, r *http.Request) { - userAuth, err := nbcontext.GetUserAuthFromContext(r.Context()) - if err != nil { - util.WriteError(r.Context(), err, w) - return - } - - nameFilter := r.URL.Query().Get("name") - ipFilter := r.URL.Query().Get("ip") - - peers, err := h.manager.GetFilteredPeers(r.Context(), nil, db.LockingStrengthShare, userAuth.AccountId, nameFilter, ipFilter) - if err != nil { - util.WriteError(r.Context(), err, w) - return - } - - dnsDomain := h.accountManager.GetDNSDomain() - - grps, _ := h.accountManager.GetAllGroups(r.Context(), accountID, userID) - - grpsInfoMap := groups.ToGroupsInfoMap(grps, len(peers)) - respBody := make([]*api.PeerBatch, 0, len(peers)) - for _, peer := range peers { - peerToReturn, err := h.checkPeerStatus(peer) - if err != nil { - util.WriteError(r.Context(), err, w) - return - } - - respBody = append(respBody, toPeerListItemResponse(peerToReturn, grpsInfoMap[peer.ID], dnsDomain, 0)) - } - - validPeersMap, err := h.accountManager.GetValidatedPeers(r.Context(), accountID) - if err != nil { - log.WithContext(r.Context()).Errorf("failed to list appreoved peers: %v", err) - util.WriteError(r.Context(), fmt.Errorf("internal error"), w) - return - } - h.setApprovalRequiredFlag(respBody, validPeersMap) - - util.WriteJSONObject(r.Context(), w, respBody) -} - -func (h *handler) getPeer(w http.ResponseWriter, r *http.Request) { - -} - -func (h *handler) updatePeer(w http.ResponseWriter, r *http.Request) { - -} - -func (h *handler) deletePeer(w http.ResponseWriter, r *http.Request) { - -} - -func (h *handler) getAccessiblePeers(w http.ResponseWriter, r *http.Request) { - -} diff --git a/internals/modules/peers/interface.go b/internals/modules/peers/interface.go new file mode 100644 index 0000000..8881ccb --- /dev/null +++ b/internals/modules/peers/interface.go @@ -0,0 +1,14 @@ +package peers + +import ( + "context" + + "github.com/netbirdio/management-refactor/internals/shared/db" +) + +type Manager interface { + GetPeer(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, peerID string) (*Peer, error) + GetPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]*Peer, error) + GetFilteredPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, nameFilter, ipFilter string) ([]*Peer, error) + UpdatePeer(ctx context.Context, tx db.Transaction, peer *Peer) error +} diff --git a/internals/modules/peers/manager/api.go b/internals/modules/peers/manager/api.go new file mode 100644 index 0000000..e4b30ef --- /dev/null +++ b/internals/modules/peers/manager/api.go @@ -0,0 +1,47 @@ +package manager + +import ( + "net/http" + + "github.com/gorilla/mux" + + "github.com/netbirdio/management-refactor/internals/shared/permissions" +) + +type handler struct { + manager *Manager + permissionsManager permissions.Manager +} + +func newHandler(manager *Manager, permissionsManager permissions.Manager) *handler { + return &handler{ + manager: manager, + permissionsManager: permissionsManager, + } +} + +func (h *handler) RegisterEndpoints(router *mux.Router) { + router.HandleFunc("/peers", h.getAllPeers).Methods("GET", "OPTIONS") + router.HandleFunc("/peers/{peerId}", h.getPeer).Methods("GET", "OPTIONS") + router.HandleFunc("/peers/{peerId}", h.updatePeer).Methods("PUT", "OPTIONS") + router.HandleFunc("/peers/{peerId}", h.deletePeer).Methods("DELETE", "OPTIONS") + router.HandleFunc("/peers/{peerId}/accessible-peers", h.getAccessiblePeers).Methods("GET", "OPTIONS") +} + +func (h *handler) getAllPeers(w http.ResponseWriter, r *http.Request) {} + +func (h *handler) getPeer(w http.ResponseWriter, r *http.Request) { + +} + +func (h *handler) updatePeer(w http.ResponseWriter, r *http.Request) { + +} + +func (h *handler) deletePeer(w http.ResponseWriter, r *http.Request) { + +} + +func (h *handler) getAccessiblePeers(w http.ResponseWriter, r *http.Request) { + +} diff --git a/internals/modules/peers/manager.go b/internals/modules/peers/manager/manager.go similarity index 70% rename from internals/modules/peers/manager.go rename to internals/modules/peers/manager/manager.go index caae619..a996d4a 100644 --- a/internals/modules/peers/manager.go +++ b/internals/modules/peers/manager/manager.go @@ -1,11 +1,11 @@ -package peers +package manager import ( "context" "github.com/gorilla/mux" - "github.com/netbirdio/management-refactor/internals/modules/peers/types" + "github.com/netbirdio/management-refactor/internals/modules/peers" "github.com/netbirdio/management-refactor/internals/shared/activity" "github.com/netbirdio/management-refactor/internals/shared/db" "github.com/netbirdio/management-refactor/internals/shared/permissions" @@ -14,6 +14,8 @@ import ( var log = logging.LoggerForThisPackage() +var _ peers.Manager = (*Manager)(nil) + type Manager struct { repo Repository eventManager *activity.Manager @@ -27,33 +29,18 @@ func NewManager(store *db.Store, router *mux.Router, permissionsManager permissi return m } -func (m *Manager) GetPeer(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, peerID string) (*types.Peer, error) { +func (m *Manager) GetPeer(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, peerID string) (*peers.Peer, error) { return m.repo.GetPeerByID(tx, strength, accountID, peerID) } -func (m *Manager) GetPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]*types.Peer, error) { +func (m *Manager) GetPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]*peers.Peer, error) { return m.repo.GetPeers(tx, strength, accountID) } -func (m *Manager) GetFilteredPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, nameFilter, ipFilter string) ([]*types.Peer, error) { +func (m *Manager) GetFilteredPeers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID, nameFilter, ipFilter string) ([]*peers.Peer, error) { return m.repo.GetFilteredPeers(tx, strength, accountID, nameFilter, ipFilter) } -func (m *Manager) UpdatePeer(ctx context.Context, tx db.Transaction, peer *types.Peer) error { - validateInput - validatePermissions - err := m.repo.RunInTx(func(tx db.Transaction) error { - othermanager.UpdatePeers - ourmanager.UpdateGroup - }) - if err != nil { - return err - } - - err := sendPeerUpdateEvent(tx, peer) // -> goes to peerUpdtaeChannel - if err != nil { - log.Errorf("Failed to send peer update event: %v", err) - } - +func (m *Manager) UpdatePeer(ctx context.Context, tx db.Transaction, peer *peers.Peer) error { return m.repo.UpdatePeer(tx, peer) } diff --git a/internals/modules/peers/repository.go b/internals/modules/peers/manager/repository.go similarity index 75% rename from internals/modules/peers/repository.go rename to internals/modules/peers/manager/repository.go index cf68463..73ed575 100644 --- a/internals/modules/peers/repository.go +++ b/internals/modules/peers/manager/repository.go @@ -1,16 +1,16 @@ -package peers +package manager import ( - "github.com/netbirdio/management-refactor/internals/modules/peers/types" + "github.com/netbirdio/management-refactor/internals/modules/peers" "github.com/netbirdio/management-refactor/internals/shared/db" ) type Repository interface { RunInTx(fn func(tx db.Transaction) error) error - GetPeerByID(tx db.Transaction, strength db.LockingStrength, accountID, peerId string) (*types.Peer, error) - GetPeers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]*types.Peer, error) - GetFilteredPeers(tx db.Transaction, strength db.LockingStrength, accountID string, nameFilter, ipFilter string) ([]*types.Peer, error) - UpdatePeer(tx db.Transaction, peer *types.Peer) error + GetPeerByID(tx db.Transaction, strength db.LockingStrength, accountID, peerId string) (*peers.Peer, error) + GetPeers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]*peers.Peer, error) + GetFilteredPeers(tx db.Transaction, strength db.LockingStrength, accountID string, nameFilter, ipFilter string) ([]*peers.Peer, error) + UpdatePeer(tx db.Transaction, peer *peers.Peer) error } type repository struct { @@ -25,8 +25,8 @@ func (r *repository) RunInTx(fn func(tx db.Transaction) error) error { return r.store.RunInTx(fn) } -func (r *repository) GetPeerByID(tx db.Transaction, strength db.LockingStrength, accountID, peerId string) (*types.Peer, error) { - var peer types.Peer +func (r *repository) GetPeerByID(tx db.Transaction, strength db.LockingStrength, accountID, peerId string) (*peers.Peer, error) { + var peer peers.Peer err := r.store.GetOne(tx, strength, &peer, "account_id = ? AND id = ?", accountID, peerId) if err != nil { return nil, err @@ -34,8 +34,8 @@ func (r *repository) GetPeerByID(tx db.Transaction, strength db.LockingStrength, return &peer, nil } -func (r *repository) GetPeers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]*types.Peer, error) { - var peers []*types.Peer +func (r *repository) GetPeers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]*peers.Peer, error) { + var peers []*peers.Peer err := r.store.GetMany(tx, strength, &peers, "account_id = ?", accountID) if err != nil { return nil, err @@ -43,7 +43,7 @@ func (r *repository) GetPeers(tx db.Transaction, strength db.LockingStrength, ac return peers, nil } -func (r *repository) GetFilteredPeers(tx db.Transaction, strength db.LockingStrength, accountID string, nameFilter, ipFilter string) ([]*types.Peer, error) { +func (r *repository) GetFilteredPeers(tx db.Transaction, strength db.LockingStrength, accountID string, nameFilter, ipFilter string) ([]*peers.Peer, error) { query := "account_id = ?" args := []interface{}{accountID} @@ -57,7 +57,7 @@ func (r *repository) GetFilteredPeers(tx db.Transaction, strength db.LockingStre args = append(args, ipFilter) } - var peers []*types.Peer + var peers []*peers.Peer err := r.store.GetMany(tx, strength, &peers, query, args) if err != nil { return nil, err @@ -65,6 +65,6 @@ func (r *repository) GetFilteredPeers(tx db.Transaction, strength db.LockingStre return peers, nil } -func (r *repository) UpdatePeer(tx db.Transaction, peer *types.Peer) error { +func (r *repository) UpdatePeer(tx db.Transaction, peer *peers.Peer) error { return r.store.Update(tx, peer) } diff --git a/internals/modules/peers/types/peer.go b/internals/modules/peers/peer.go similarity index 99% rename from internals/modules/peers/types/peer.go rename to internals/modules/peers/peer.go index d66850e..7bbc279 100644 --- a/internals/modules/peers/types/peer.go +++ b/internals/modules/peers/peer.go @@ -1,4 +1,4 @@ -package types +package peers import ( "net" diff --git a/internals/modules/peers/types/peer_test.go b/internals/modules/peers/peer_test.go similarity index 99% rename from internals/modules/peers/types/peer_test.go rename to internals/modules/peers/peer_test.go index f06c8f0..11f9f71 100644 --- a/internals/modules/peers/types/peer_test.go +++ b/internals/modules/peers/peer_test.go @@ -1,4 +1,4 @@ -package types +package peers import ( "fmt" diff --git a/internals/modules/policies/interface.go b/internals/modules/policies/interface.go new file mode 100644 index 0000000..e421276 --- /dev/null +++ b/internals/modules/policies/interface.go @@ -0,0 +1,4 @@ +package policies + +type Manager interface { +} diff --git a/internals/modules/setup-keys/manager.go b/internals/modules/setup-keys/manager.go deleted file mode 100644 index e57ebbc..0000000 --- a/internals/modules/setup-keys/manager.go +++ /dev/null @@ -1 +0,0 @@ -package setup_keys diff --git a/internals/modules/users/interface.go b/internals/modules/users/interface.go new file mode 100644 index 0000000..7650ff1 --- /dev/null +++ b/internals/modules/users/interface.go @@ -0,0 +1,12 @@ +package users + +import ( + "context" + + "github.com/netbirdio/management-refactor/internals/shared/db" +) + +type Manager interface { + GetAllUsers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]User, error) + GetUserByID(ctx context.Context, tx db.Transaction, strength db.LockingStrength, id string) (*User, error) +} diff --git a/internals/modules/users/api.go b/internals/modules/users/manager/api.go similarity index 99% rename from internals/modules/users/api.go rename to internals/modules/users/manager/api.go index 3a2f972..b051f70 100644 --- a/internals/modules/users/api.go +++ b/internals/modules/users/manager/api.go @@ -1,4 +1,4 @@ -package users +package manager import ( "encoding/json" diff --git a/internals/modules/users/manager.go b/internals/modules/users/manager/manager.go similarity index 85% rename from internals/modules/users/manager.go rename to internals/modules/users/manager/manager.go index c9f2d4b..713e924 100644 --- a/internals/modules/users/manager.go +++ b/internals/modules/users/manager/manager.go @@ -1,11 +1,11 @@ -package users +package manager import ( "context" "github.com/gorilla/mux" - "github.com/netbirdio/management-refactor/internals/modules/users/types" + "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/db" "github.com/netbirdio/management-refactor/internals/shared/permissions" "github.com/netbirdio/management-refactor/pkg/logging" @@ -25,10 +25,10 @@ func NewManager(store *db.Store, router *mux.Router, permissionsManager permissi return m } -func (m *Manager) GetAllUsers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]types.User, error) { +func (m *Manager) GetAllUsers(ctx context.Context, tx db.Transaction, strength db.LockingStrength, accountID string) ([]users.User, error) { return m.repo.GetAllUsers(tx, strength, accountID) } -func (m *Manager) GetUserByID(ctx context.Context, tx db.Transaction, strength db.LockingStrength, id string) (*types.User, error) { +func (m *Manager) GetUserByID(ctx context.Context, tx db.Transaction, strength db.LockingStrength, id string) (*users.User, error) { return m.repo.GetUserByID(tx, strength, id) } diff --git a/internals/modules/users/repository.go b/internals/modules/users/manager/repository.go similarity index 72% rename from internals/modules/users/repository.go rename to internals/modules/users/manager/repository.go index 887f93b..c91491c 100644 --- a/internals/modules/users/repository.go +++ b/internals/modules/users/manager/repository.go @@ -1,15 +1,15 @@ -package users +package manager import ( - "github.com/netbirdio/management-refactor/internals/modules/users/types" + "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/db" ) type Repository interface { RunInTx(fn func(tx db.Transaction) error) error - GetAllUsers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]types.User, error) - GetUserByID(tx db.Transaction, strength db.LockingStrength, id string) (*types.User, error) - CreateUser(tx db.Transaction, u *types.User) error + GetAllUsers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]users.User, error) + GetUserByID(tx db.Transaction, strength db.LockingStrength, id string) (*users.User, error) + CreateUser(tx db.Transaction, u *users.User) error } type repository struct { @@ -17,7 +17,7 @@ type repository struct { } func newRepository(s *db.Store) Repository { - err := s.AutoMigrate(types.User{}) + err := s.AutoMigrate(users.User{}) if err != nil { log.Fatalf("Failed to auto migrate: %v", err) } @@ -28,8 +28,8 @@ func (r *repository) RunInTx(fn func(tx db.Transaction) error) error { return r.store.RunInTx(fn) } -func (r *repository) GetAllUsers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]types.User, error) { - var users []types.User +func (r *repository) GetAllUsers(tx db.Transaction, strength db.LockingStrength, accountID string) ([]users.User, error) { + var users []users.User err := r.store.GetMany(tx, strength, &users, "account_id = ?", accountID) if err != nil { return nil, err @@ -37,8 +37,8 @@ func (r *repository) GetAllUsers(tx db.Transaction, strength db.LockingStrength, return users, nil } -func (r *repository) GetUserByID(tx db.Transaction, strength db.LockingStrength, id string) (*types.User, error) { - var user types.User +func (r *repository) GetUserByID(tx db.Transaction, strength db.LockingStrength, id string) (*users.User, error) { + var user users.User err := r.store.GetOne(tx, strength, &user, "id = ?", id) if err != nil { return nil, err @@ -46,6 +46,6 @@ func (r *repository) GetUserByID(tx db.Transaction, strength db.LockingStrength, return &user, nil } -func (r *repository) CreateUser(tx db.Transaction, u *types.User) error { +func (r *repository) CreateUser(tx db.Transaction, u *users.User) error { return r.store.Create(tx, u) } diff --git a/internals/modules/users/pats/types/personal_access_token.go b/internals/modules/users/pats/personal_access_token.go similarity index 99% rename from internals/modules/users/pats/types/personal_access_token.go rename to internals/modules/users/pats/personal_access_token.go index b39e5dd..37aad33 100644 --- a/internals/modules/users/pats/types/personal_access_token.go +++ b/internals/modules/users/pats/personal_access_token.go @@ -1,4 +1,4 @@ -package types +package pats import ( "crypto/sha256" diff --git a/internals/modules/users/types/user.go b/internals/modules/users/user.go similarity index 95% rename from internals/modules/users/types/user.go rename to internals/modules/users/user.go index f53cbe7..4fefd65 100644 --- a/internals/modules/users/types/user.go +++ b/internals/modules/users/user.go @@ -1,4 +1,4 @@ -package types +package users import ( "fmt" @@ -9,7 +9,7 @@ import ( "github.com/netbirdio/netbird/management/server/integration_reference" "github.com/netbirdio/management-refactor/internals/modules/accounts/settings" - "github.com/netbirdio/management-refactor/internals/modules/users/pats/types" + "github.com/netbirdio/management-refactor/internals/modules/users/pats" ) const ( @@ -81,9 +81,9 @@ type User struct { // ServiceUserName is only set if IsServiceUser is true ServiceUserName string // AutoGroups is a list of Group IDs to auto-assign to peers registered by this user - AutoGroups []string `gorm:"serializer:json"` - PATs map[string]*types.PersonalAccessToken `gorm:"-"` - PATsG []types.PersonalAccessToken `json:"-" gorm:"foreignKey:UserID;references:id;constraint:OnDelete:CASCADE;"` + AutoGroups []string `gorm:"serializer:json"` + PATs map[string]*pats.PersonalAccessToken `gorm:"-"` + PATsG []pats.PersonalAccessToken `json:"-" gorm:"foreignKey:UserID;references:id;constraint:OnDelete:CASCADE;"` // Blocked indicates whether the user is blocked. Blocked users can't use the system. Blocked bool // LastLogin is the last time the user logged in to IdP @@ -191,7 +191,7 @@ func (u *User) ToUserInfo(userData *idp.UserData, settings *settings.Settings) ( func (u *User) Copy() *User { autoGroups := make([]string, len(u.AutoGroups)) copy(autoGroups, u.AutoGroups) - pats := make(map[string]*types.PersonalAccessToken, len(u.PATs)) + pats := make(map[string]*pats.PersonalAccessToken, len(u.PATs)) for k, v := range u.PATs { pats[k] = v.Copy() } diff --git a/internals/server/modules.go b/internals/server/modules.go index 9d05155..7bfea2e 100644 --- a/internals/server/modules.go +++ b/internals/server/modules.go @@ -6,6 +6,7 @@ import ( "github.com/netbirdio/management-refactor/internals/modules/networks/resources" resourcesManager "github.com/netbirdio/management-refactor/internals/modules/networks/resources/manager" "github.com/netbirdio/management-refactor/internals/modules/peers" + peersManager "github.com/netbirdio/management-refactor/internals/modules/peers/manager" "github.com/netbirdio/management-refactor/internals/shared/permissions" ) @@ -27,12 +28,12 @@ func (s *BaseServer) PermissionsManager() permissions.Manager { }) } -func (s *BaseServer) PeersManager() *peers.Manager { - return Create(s, func() *peers.Manager { +func (s *BaseServer) PeersManager() peers.Manager { + return Create(s, func() peers.Manager { store := s.Store() router := s.Router() permissionsManager := s.PermissionsManager() - return peers.NewManager(store, router, permissionsManager) + return peersManager.NewManager(store, router, permissionsManager) }) } diff --git a/internals/shared/auth/manager.go b/internals/shared/auth/manager.go index db6ece6..e9280be 100644 --- a/internals/shared/auth/manager.go +++ b/internals/shared/auth/manager.go @@ -12,11 +12,12 @@ import ( nbjwt "github.com/netbirdio/netbird/management/server/auth/jwt" nbcontext "github.com/netbirdio/netbird/management/server/context" "github.com/netbirdio/netbird/management/server/store" + "github.com/netbirdio/netbird/management/server/types" "github.com/netbirdio/management-refactor/internals/modules/accounts/settings" "github.com/netbirdio/management-refactor/internals/modules/users" - pattypes "github.com/netbirdio/management-refactor/internals/modules/users/pats/types" - "github.com/netbirdio/management-refactor/internals/modules/users/types" + "github.com/netbirdio/management-refactor/internals/modules/users/pats" + "github.com/netbirdio/management-refactor/internals/shared/db" ) @@ -26,7 +27,7 @@ type Manager interface { ValidateAndParseToken(ctx context.Context, value string) (nbcontext.UserAuth, *jwt.Token, error) EnsureUserAccessByJWTGroups(ctx context.Context, userAuth nbcontext.UserAuth, token *jwt.Token) (nbcontext.UserAuth, error) MarkPATUsed(ctx context.Context, tokenID string) error - GetPATInfo(ctx context.Context, token string) (user *types.User, pat *pattypes.PersonalAccessToken, domain string, category string, err error) + GetPATInfo(ctx context.Context, token string) (user *users.User, pat *pats.PersonalAccessToken, domain string, category string, err error) } type manager struct { diff --git a/internals/shared/permissions/manager.go b/internals/shared/permissions/manager.go index 40a6b80..befef34 100644 --- a/internals/shared/permissions/manager.go +++ b/internals/shared/permissions/manager.go @@ -10,7 +10,7 @@ import ( "github.com/netbirdio/netbird/management/server/http/util" "github.com/netbirdio/netbird/management/server/status" - "github.com/netbirdio/management-refactor/internals/modules/users/types" + "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/activity" "github.com/netbirdio/management-refactor/internals/shared/db" "github.com/netbirdio/management-refactor/internals/shared/permissions/modules" @@ -25,12 +25,12 @@ type Manager interface { WithPermission(module modules.Module, operation operations.Operation, handlerFunc func(w http.ResponseWriter, r *http.Request, auth *nbcontext.UserAuth)) http.HandlerFunc ValidateUserPermissions(ctx context.Context, accountID, userID string, module modules.Module, operation operations.Operation) (bool, error) ValidateRoleModuleAccess(ctx context.Context, accountID string, role roles.RolePermissions, module modules.Module, operation operations.Operation) bool - ValidateAccountAccess(ctx context.Context, accountID string, user *types.User, allowOwnerAndAdmin bool) error + ValidateAccountAccess(ctx context.Context, accountID string, user *users.User, allowOwnerAndAdmin bool) error Init(userManager userManager) } type userManager interface { - GetUserByID(ctx context.Context, tx db.Transaction, strength db.LockingStrength, id string) (*types.User, error) + GetUserByID(ctx context.Context, tx db.Transaction, strength db.LockingStrength, id string) (*users.User, error) } type managerImpl struct { @@ -103,7 +103,7 @@ func (m *managerImpl) ValidateRoleModuleAccess( return role.AutoAllowNew[operation] } -func (m *managerImpl) ValidateAccountAccess(ctx context.Context, accountID string, user *types.User, allowOwnerAndAdmin bool) error { +func (m *managerImpl) ValidateAccountAccess(ctx context.Context, accountID string, user *users.User, allowOwnerAndAdmin bool) error { if user.AccountID != accountID { return status.NewUserNotPartOfAccountError() } diff --git a/internals/shared/permissions/roles/admin.go b/internals/shared/permissions/roles/admin.go index a826d18..9cc03e4 100644 --- a/internals/shared/permissions/roles/admin.go +++ b/internals/shared/permissions/roles/admin.go @@ -1,13 +1,13 @@ package roles import ( - "github.com/netbirdio/netbird/management/server/permissions/modules" - "github.com/netbirdio/netbird/management/server/permissions/operations" - "github.com/netbirdio/netbird/management/server/types" + "github.com/netbirdio/management-refactor/internals/modules/users" + "github.com/netbirdio/management-refactor/internals/shared/permissions/modules" + "github.com/netbirdio/management-refactor/internals/shared/permissions/operations" ) var Admin = RolePermissions{ - Role: types.UserRoleAdmin, + Role: users.UserRoleAdmin, AutoAllowNew: map[operations.Operation]bool{ operations.Read: true, operations.Write: true, diff --git a/internals/shared/permissions/roles/owner.go b/internals/shared/permissions/roles/owner.go index f739d18..b3897f9 100644 --- a/internals/shared/permissions/roles/owner.go +++ b/internals/shared/permissions/roles/owner.go @@ -1,12 +1,12 @@ package roles import ( - "github.com/netbirdio/netbird/management/server/permissions/operations" - "github.com/netbirdio/netbird/management/server/types" + "github.com/netbirdio/management-refactor/internals/modules/users" + "github.com/netbirdio/management-refactor/internals/shared/permissions/operations" ) var Owner = RolePermissions{ - Role: types.UserRoleOwner, + Role: users.UserRoleOwner, AutoAllowNew: map[operations.Operation]bool{ operations.Read: true, operations.Write: true, diff --git a/internals/shared/permissions/roles/role_permissions.go b/internals/shared/permissions/roles/role_permissions.go index 85ede1b..ddf2b45 100644 --- a/internals/shared/permissions/roles/role_permissions.go +++ b/internals/shared/permissions/roles/role_permissions.go @@ -1,21 +1,21 @@ package roles import ( - "github.com/netbirdio/management-refactor/internals/modules/users/types" + "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/permissions/modules" "github.com/netbirdio/management-refactor/internals/shared/permissions/operations" ) type RolePermissions struct { - Role types.UserRole + Role users.UserRole Permissions Permissions AutoAllowNew map[operations.Operation]bool } type Permissions map[modules.Module]map[operations.Operation]bool -var RolesMap = map[types.UserRole]RolePermissions{ - types.UserRoleOwner: Owner, - types.UserRoleAdmin: Admin, - types.UserRoleUser: User, +var RolesMap = map[users.UserRole]RolePermissions{ + users.UserRoleOwner: Owner, + users.UserRoleAdmin: Admin, + users.UserRoleUser: User, } diff --git a/internals/shared/permissions/roles/user.go b/internals/shared/permissions/roles/user.go index d93cca1..52ef202 100644 --- a/internals/shared/permissions/roles/user.go +++ b/internals/shared/permissions/roles/user.go @@ -1,13 +1,12 @@ package roles import ( - "github.com/netbirdio/netbird/management/server/types" - + "github.com/netbirdio/management-refactor/internals/modules/users" "github.com/netbirdio/management-refactor/internals/shared/permissions/operations" ) var User = RolePermissions{ - Role: types.UserRoleUser, + Role: users.UserRoleUser, AutoAllowNew: map[operations.Operation]bool{ operations.Read: false, operations.Write: false, diff --git a/main.go b/main.go new file mode 100644 index 0000000..8384875 --- /dev/null +++ b/main.go @@ -0,0 +1,13 @@ +package main + +import ( + "os" + + "github.com/netbirdio/management-refactor/cmd" +) + +func main() { + if err := cmd.Execute(); err != nil { + os.Exit(1) + } +} diff --git a/pkg/logging/init.go b/pkg/logging/init.go index b5aaa21..e64a1fd 100644 --- a/pkg/logging/init.go +++ b/pkg/logging/init.go @@ -102,7 +102,7 @@ func LoggerFor(pkgPath string) *logrus.Logger { return l } - logrus.Printf("No logger configured for %q; using fallback (info-level) logger.\n", pkgPath) + logrus.Tracef("No logger configured for %q; using fallback (info-level) logger", pkgPath) fallback := logrus.New() fallback.SetLevel(logrus.InfoLevel) return fallback