mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 16:57:51 +08:00
NET-1932: Merge egress and internet gateways (#3436)
* feat: api access tokens
* revoke all user tokens
* redefine access token api routes, add auto egress option to enrollment keys
* add server settings apis, add db table for settigs
* handle server settings updates
* switch to using settings from DB
* fix sever settings migration
* revet force migration for settings
* fix server settings database write
* egress model
* fix revoked tokens to be unauthorized
* update egress model
* remove unused functions
* convert access token to sql schema
* switch access token to sql schema
* fix merge conflicts
* fix server settings types
* bypass basic auth setting for super admin
* add TODO comment
* setup api handlers for egress revamp
* use single DB, fix update nat boolean field
* extend validaiton checks for egress ranges
* add migration to convert to new egress model
* fix panic interface conversion
* publish peer update on settings update
* revoke token generated by an user
* add user token creation restriction by user role
* add forbidden check for access token creation
* revoke user token when group or role is changed
* add default group to admin users on update
* chore(go): import style changes from migration branch;
1. Singular file names for table schema.
2. No table name method.
3. Use .Model instead of .Table.
4. No unnecessary tagging.
* remove nat check on egress gateway request
* Revert "remove nat check on egress gateway request"
This reverts commit 0aff12a189
.
* remove nat check on egress gateway request
* feat(go): add db middleware;
* feat(go): restore method;
* feat(go): add user access token schema;
* add inet gw status to egress model
* fetch node ids in the tag, add inet gw info clients
* add inet gw info to node from egress list
* add migration logic internet gws
* create default acl policies
* add egress info
* add egress TODO
* add egress TODO
* fix user auth api:
* add reference id to acl policy
* add egress response from DB
* publish peer update on egress changes
* re initalise oauth and email config
* set verbosity
* normalise cidr on egress req
* add egress id to acl group
* change acls to use egress id
* resolve merge conflicts
* fix egress reference errors
* move egress model to schema
* add api context to DB
* sync auto update settings with hosts
* sync auto update settings with hosts
* check acl for egress node
* check for egress policy in the acl dst groups
* fix acl rules for egress policies with new models
* add status to egress model
* fix inet node func
* mask secret and convert jwt duration to minutes
* enable egress policies on creation
* convert jwt duration to minutes
* add relevant ranges to inet egress
* skip non active egress routes
* resolve merge conflicts
* fix static check
* update gorm tag for primary key on egress model
* create user policies for egress resources
* resolve merge conflicts
* get egress info on failover apis, add egress src validation for inet gws
* add additional validation checks on egress req
* add additional validation checks on egress req
* skip all resources for inet policy
* delete associated egress acl policies
* fix failover of inetclient
* avoid setting inet client asd inet gw
* fix all resource egress policy
* fix inet gw egress rule
* check for node egress on relay req
* fix egress acl rules comms
* add new field for egress info on node
* check acl policy in failover ctx
* avoid default host to be set as inet client
* fix relayed egress node
* add valid error messaging for egress validate func
* return if inet default host
* jump port detection to 51821
* check host ports on pull
* check user access gws via acls
* add validation check for default host and failover for inet clients
* add error messaging for acl policy check
* fix inet gw status
* ignore failover req for peer using inet gw
* check for allowed egress ranges for a peer
* add egress routes to static nodes by access
* avoid setting failvoer as inet client
* fix egress error messaging
* fix extclients egress comms
* fix inet gw acting as inet client
* return formatted error on update acl validation
* add default route for static nodes on inetclient
* check relay node acting as inetclient
* move inet node info to separate field, fix all resouces policy
* remove debug logs
---------
Co-authored-by: Vishal Dalwadi <dalwadivishal26@gmail.com>
This commit is contained in:
@@ -164,7 +164,7 @@ func UpdateNodeCheckin(node *models.Node) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
node.EgressDetails = models.EgressDetails{}
|
||||
err = database.Insert(node.ID.String(), string(data), database.NODES_TABLE_NAME)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -183,6 +183,7 @@ func UpsertNode(newNode *models.Node) error {
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
newNode.EgressDetails = models.EgressDetails{}
|
||||
err = database.Insert(newNode.ID.String(), string(data), database.NODES_TABLE_NAME)
|
||||
if err != nil {
|
||||
return err
|
||||
@@ -218,7 +219,7 @@ func UpdateNode(currentNode *models.Node, newNode *models.Node) error {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
newNode.EgressDetails = models.EgressDetails{}
|
||||
newNode.SetLastModified()
|
||||
if data, err := json.Marshal(newNode); err != nil {
|
||||
return err
|
||||
@@ -280,21 +281,21 @@ func DeleteNode(node *models.Node, purge bool) error {
|
||||
// unset all the relayed nodes
|
||||
SetRelayedNodes(false, node.ID.String(), node.RelayedNodes)
|
||||
}
|
||||
if node.InternetGwID != "" {
|
||||
inetNode, err := GetNodeByID(node.InternetGwID)
|
||||
if node.EgressDetails.InternetGwID != "" {
|
||||
inetNode, err := GetNodeByID(node.EgressDetails.InternetGwID)
|
||||
if err == nil {
|
||||
clientNodeIDs := []string{}
|
||||
for _, inetNodeClientID := range inetNode.InetNodeReq.InetNodeClientIDs {
|
||||
for _, inetNodeClientID := range inetNode.EgressDetails.InetNodeReq.InetNodeClientIDs {
|
||||
if inetNodeClientID == node.ID.String() {
|
||||
continue
|
||||
}
|
||||
clientNodeIDs = append(clientNodeIDs, inetNodeClientID)
|
||||
}
|
||||
inetNode.InetNodeReq.InetNodeClientIDs = clientNodeIDs
|
||||
inetNode.EgressDetails.InetNodeReq.InetNodeClientIDs = clientNodeIDs
|
||||
UpsertNode(&inetNode)
|
||||
}
|
||||
}
|
||||
if node.IsInternetGateway {
|
||||
if node.EgressDetails.IsInternetGateway {
|
||||
UnsetInternetGw(node)
|
||||
}
|
||||
if !purge && !alreadyDeleted {
|
||||
@@ -320,8 +321,9 @@ func DeleteNode(node *models.Node, purge bool) error {
|
||||
if err := DissasociateNodeFromHost(node, host); err != nil {
|
||||
return err
|
||||
}
|
||||
go RemoveNodeFromAclPolicy(*node)
|
||||
|
||||
go RemoveNodeFromAclPolicy(*node)
|
||||
go RemoveNodeFromEgress(*node)
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -783,16 +785,16 @@ func ValidateNodeIp(currentNode *models.Node, newNode *models.ApiNode) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func ValidateEgressRange(gateway models.EgressGatewayRequest) error {
|
||||
network, err := GetNetworkSettings(gateway.NetID)
|
||||
func ValidateEgressRange(netID string, ranges []string) error {
|
||||
network, err := GetNetworkSettings(netID)
|
||||
if err != nil {
|
||||
slog.Error("error getting network with netid", "error", gateway.NetID, err.Error)
|
||||
return errors.New("error getting network with netid: " + gateway.NetID + " " + err.Error())
|
||||
slog.Error("error getting network with netid", "error", netID, err.Error)
|
||||
return errors.New("error getting network with netid: " + netID + " " + err.Error())
|
||||
}
|
||||
ipv4Net := network.AddressRange
|
||||
ipv6Net := network.AddressRange6
|
||||
|
||||
for _, v := range gateway.Ranges {
|
||||
for _, v := range ranges {
|
||||
if ipv4Net != "" {
|
||||
if ContainsCIDR(ipv4Net, v) {
|
||||
slog.Error("egress range should not be the same as or contained in the netmaker network address", "error", v, ipv4Net)
|
||||
@@ -949,6 +951,30 @@ func AddTagMapWithStaticNodesWithUsers(netID models.NetworkID,
|
||||
return tagNodesMap
|
||||
}
|
||||
|
||||
func GetNodeIDsWithTag(tagID models.TagID) (ids []string) {
|
||||
|
||||
tag, err := GetTag(tagID)
|
||||
if err != nil {
|
||||
return
|
||||
}
|
||||
nodes, _ := GetNetworkNodes(tag.Network.String())
|
||||
for _, nodeI := range nodes {
|
||||
if nodeI.Tags == nil {
|
||||
continue
|
||||
}
|
||||
if nodeI.Mutex != nil {
|
||||
nodeI.Mutex.Lock()
|
||||
}
|
||||
if _, ok := nodeI.Tags[tagID]; ok {
|
||||
ids = append(ids, nodeI.ID.String())
|
||||
}
|
||||
if nodeI.Mutex != nil {
|
||||
nodeI.Mutex.Unlock()
|
||||
}
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func GetNodesWithTag(tagID models.TagID) map[string]models.Node {
|
||||
nMap := make(map[string]models.Node)
|
||||
tag, err := GetTag(tagID)
|
||||
|
Reference in New Issue
Block a user