mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-05 16:57:51 +08:00
netclient working for ingress controller
This commit is contained in:
@@ -8,7 +8,7 @@ import (
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"log"
|
||||
"github.com/gorilla/mux"
|
||||
"github.com/gravitl/netmaker/functions"
|
||||
"github.com/gravitl/netmaker/models"
|
||||
@@ -244,7 +244,7 @@ func getNetworkNodes(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
|
||||
var nodes []models.ReturnNode
|
||||
var nodes []models.Node
|
||||
var params = mux.Vars(r)
|
||||
nodes, err := GetNetworkNodes(params["network"])
|
||||
if err != nil {
|
||||
@@ -257,34 +257,34 @@ func getNetworkNodes(w http.ResponseWriter, r *http.Request) {
|
||||
json.NewEncoder(w).Encode(nodes)
|
||||
}
|
||||
|
||||
func GetNetworkNodes(network string) ([]models.ReturnNode, error) {
|
||||
var nodes []models.ReturnNode
|
||||
func GetNetworkNodes(network string) ([]models.Node, error) {
|
||||
var nodes []models.Node
|
||||
collection := mongoconn.Client.Database("netmaker").Collection("nodes")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
filter := bson.M{"network": network}
|
||||
//Filtering out the ID field cuz Dillon doesn't like it. May want to filter out other fields in the future
|
||||
cur, err := collection.Find(ctx, filter, options.Find().SetProjection(bson.M{"_id": 0}))
|
||||
if err != nil {
|
||||
return []models.ReturnNode{}, err
|
||||
return []models.Node{}, err
|
||||
}
|
||||
defer cancel()
|
||||
for cur.Next(context.TODO()) {
|
||||
//Using a different model for the ReturnNode (other than regular node).
|
||||
//Using a different model for the Node (other than regular node).
|
||||
//Either we should do this for ALL structs (so Networks and Keys)
|
||||
//OR we should just use the original struct
|
||||
//My preference is to make some new return structs
|
||||
//TODO: Think about this. Not an immediate concern. Just need to get some consistency eventually
|
||||
var node models.ReturnNode
|
||||
var node models.Node
|
||||
err := cur.Decode(&node)
|
||||
if err != nil {
|
||||
return []models.ReturnNode{}, err
|
||||
return []models.Node{}, err
|
||||
}
|
||||
// add item our array of nodes
|
||||
nodes = append(nodes, node)
|
||||
}
|
||||
//TODO: Another fatal error we should take care of.
|
||||
if err := cur.Err(); err != nil {
|
||||
return []models.ReturnNode{}, err
|
||||
return []models.Node{}, err
|
||||
}
|
||||
return nodes, nil
|
||||
}
|
||||
@@ -581,7 +581,7 @@ func CreateEgressGateway(gateway models.EgressGatewayRequest) (models.Node, erro
|
||||
{"postup", nodechange.PostUp},
|
||||
{"postdown", nodechange.PostDown},
|
||||
{"isegressgateway", nodechange.IsEgressGateway},
|
||||
{"gatewayrange", nodechange.EgressGatewayRange},
|
||||
{"egressgatewayrange", nodechange.EgressGatewayRange},
|
||||
{"lastmodified", nodechange.LastModified},
|
||||
}},
|
||||
}
|
||||
@@ -687,35 +687,60 @@ func createIngressGateway(w http.ResponseWriter, r *http.Request) {
|
||||
json.NewEncoder(w).Encode(node)
|
||||
}
|
||||
|
||||
func CreateIngressGateway(network string, macaddress string) (models.Node, error) {
|
||||
node, err := functions.GetNodeByMacAddress(network, macaddress)
|
||||
if err != nil {
|
||||
return models.Node{}, err
|
||||
func CreateIngressGateway(netid string, macaddress string) (models.Node, error) {
|
||||
|
||||
node, err := functions.GetNodeByMacAddress(netid, macaddress)
|
||||
if err != nil {
|
||||
return models.Node{}, err
|
||||
}
|
||||
|
||||
network, err := functions.GetParentNetwork(netid)
|
||||
if err != nil {
|
||||
log.Println("Could not find network.")
|
||||
return models.Node{}, err
|
||||
}
|
||||
|
||||
if node.IsEgressGateway {
|
||||
errors.New("Node cannot be both Ingress and Egress Gateway in same network.")
|
||||
return models.Node{}, err
|
||||
}
|
||||
|
||||
collection := mongoconn.Client.Database("netmaker").Collection("nodes")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
// Create filter
|
||||
filter := bson.M{"macaddress": macaddress, "network": network}
|
||||
// prepare update model.
|
||||
update := bson.D{
|
||||
{"$set", bson.D{
|
||||
{"isingressgateway", true},
|
||||
{"lastmodified", time.Now().Unix()},
|
||||
}},
|
||||
}
|
||||
var nodeupdate models.Node
|
||||
err = collection.FindOneAndUpdate(ctx, filter, update).Decode(&nodeupdate)
|
||||
defer cancel()
|
||||
if err != nil {
|
||||
return models.Node{}, err
|
||||
}
|
||||
//Get updated values to return
|
||||
node, err = functions.GetNodeByMacAddress(network, macaddress)
|
||||
if err != nil {
|
||||
return models.Node{}, err
|
||||
}
|
||||
return node, nil
|
||||
node.IngressGatewayRange = network.AddressRange
|
||||
node.PostUp = "iptables -A FORWARD -i " + node.Interface + " -j ACCEPT; iptables -t nat -A POSTROUTING -o " + node.Interface + " -j MASQUERADE"
|
||||
node.PostDown = "iptables -D FORWARD -i " + node.Interface + " -j ACCEPT; iptables -t nat -D POSTROUTING -o " + node.Interface + " -j MASQUERADE"
|
||||
collection := mongoconn.Client.Database("netmaker").Collection("nodes")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
// Create filter
|
||||
filter := bson.M{"macaddress": macaddress, "network": netid}
|
||||
node.SetLastModified()
|
||||
// prepare update model.
|
||||
update := bson.D{
|
||||
{"$set", bson.D{
|
||||
{"postup", node.PostUp},
|
||||
{"postdown", node.PostDown},
|
||||
{"isingressgateway", true},
|
||||
{"ingressgatewayrange", node.IngressGatewayRange},
|
||||
{"lastmodified", node.LastModified},
|
||||
}},
|
||||
}
|
||||
var nodeupdate models.Node
|
||||
err = collection.FindOneAndUpdate(ctx, filter, update).Decode(&nodeupdate)
|
||||
defer cancel()
|
||||
if err != nil {
|
||||
log.Println("error updating node to gateway")
|
||||
return models.Node{}, err
|
||||
}
|
||||
err = SetNetworkNodesLastModified(netid)
|
||||
if err != nil {
|
||||
return node, err
|
||||
}
|
||||
//Get updated values to return
|
||||
node, err = functions.GetNodeByMacAddress(netid, macaddress)
|
||||
if err != nil {
|
||||
log.Println("error finding node after update")
|
||||
return node, err
|
||||
}
|
||||
return node, nil
|
||||
}
|
||||
|
||||
func deleteIngressGateway(w http.ResponseWriter, r *http.Request) {
|
||||
|
Reference in New Issue
Block a user