re-enabled tests

This commit is contained in:
0xdcarns
2023-01-20 17:38:32 -05:00
parent 22b3e2d8e8
commit f66ba5277e
7 changed files with 232 additions and 139 deletions

View File

@@ -160,7 +160,7 @@ func createDNS(w http.ResponseWriter, r *http.Request) {
return return
} }
entry, err = CreateDNS(entry) entry, err = logic.CreateDNS(entry)
if err != nil { if err != nil {
logger.Log(0, r.Header.Get("user"), logger.Log(0, r.Header.Get("user"),
fmt.Sprintf("Failed to create DNS entry %+v: %v", entry, err)) fmt.Sprintf("Failed to create DNS entry %+v: %v", entry, err))
@@ -223,22 +223,6 @@ func deleteDNS(w http.ResponseWriter, r *http.Request) {
json.NewEncoder(w).Encode(entrytext + " deleted.") json.NewEncoder(w).Encode(entrytext + " deleted.")
} }
// CreateDNS - creates a DNS entry
func CreateDNS(entry models.DNSEntry) (models.DNSEntry, error) {
data, err := json.Marshal(&entry)
if err != nil {
return models.DNSEntry{}, err
}
key, err := logic.GetRecordKey(entry.Name, entry.Network)
if err != nil {
return models.DNSEntry{}, err
}
err = database.Insert(key, string(data), database.DNS_TABLE_NAME)
return entry, err
}
// GetDNSEntry - gets a DNS entry // GetDNSEntry - gets a DNS entry
func GetDNSEntry(domain string, network string) (models.DNSEntry, error) { func GetDNSEntry(domain string, network string) (models.DNSEntry, error) {
var entry models.DNSEntry var entry models.DNSEntry

View File

@@ -1,35 +1,45 @@
package controller package controller
import ( import (
"net"
"os" "os"
"testing" "testing"
"github.com/google/uuid"
"github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/logic"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
) )
var dnsHost models.Host
func TestGetAllDNS(t *testing.T) { func TestGetAllDNS(t *testing.T) {
database.InitializeDatabase() database.InitializeDatabase()
deleteAllDNS(t) deleteAllDNS(t)
deleteAllNetworks() deleteAllNetworks()
createNet() createNet()
createHost()
t.Run("NoEntries", func(t *testing.T) { t.Run("NoEntries", func(t *testing.T) {
entries, err := logic.GetAllDNS() entries, err := logic.GetAllDNS()
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, []models.DNSEntry(nil), entries) assert.Equal(t, []models.DNSEntry(nil), entries)
}) })
t.Run("OneEntry", func(t *testing.T) { t.Run("OneEntry", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.3", "", "newhost", "skynet"} entry := models.DNSEntry{
CreateDNS(entry) "10.0.0.3", "", "newhost", "skynet",
}
_, err := logic.CreateDNS(entry)
assert.Nil(t, err)
entries, err := logic.GetAllDNS() entries, err := logic.GetAllDNS()
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 1, len(entries)) assert.Equal(t, 1, len(entries))
}) })
t.Run("MultipleEntry", func(t *testing.T) { t.Run("MultipleEntry", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.7", "", "anotherhost", "skynet"} entry := models.DNSEntry{"10.0.0.7", "", "anotherhost", "skynet"}
CreateDNS(entry) _, err := logic.CreateDNS(entry)
assert.Nil(t, err)
entries, err := logic.GetAllDNS() entries, err := logic.GetAllDNS()
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 2, len(entries)) assert.Equal(t, 2, len(entries))
@@ -41,22 +51,42 @@ func TestGetNodeDNS(t *testing.T) {
deleteAllDNS(t) deleteAllDNS(t)
deleteAllNetworks() deleteAllNetworks()
createNet() createNet()
createHost()
t.Run("NoNodes", func(t *testing.T) { t.Run("NoNodes", func(t *testing.T) {
dns, err := logic.GetNodeDNS("skynet") dns, err := logic.GetNodeDNS("skynet")
assert.EqualError(t, err, "could not find any records") assert.EqualError(t, err, "could not find any records")
assert.Equal(t, []models.DNSEntry(nil), dns) assert.Equal(t, []models.DNSEntry(nil), dns)
}) })
t.Run("NodeExists", func(t *testing.T) { t.Run("NodeExists", func(t *testing.T) {
createnode := models.Node{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.1", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "linux", DNSOn: "yes"} createHost()
err := logic.CreateNode(&createnode) _, ipnet, _ := net.ParseCIDR("10.0.0.1/32")
tmpCNode := models.CommonNode{
ID: uuid.New(),
Network: "skynet",
Address: *ipnet,
DNSOn: true,
}
createnode := models.Node{
CommonNode: tmpCNode,
}
err := logic.AssociateNodeToHost(&createnode, &dnsHost)
assert.Nil(t, err) assert.Nil(t, err)
dns, err := logic.GetNodeDNS("skynet") dns, err := logic.GetNodeDNS("skynet")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "10.0.0.1", dns[0].Address) assert.Equal(t, "10.0.0.1", dns[0].Address)
}) })
t.Run("MultipleNodes", func(t *testing.T) { t.Run("MultipleNodes", func(t *testing.T) {
createnode := &models.LegacyNode{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Endpoint: "10.100.100.3", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet"} _, ipnet, _ := net.ParseCIDR("10.100.100.3/32")
err := logic.CreateNode(createnode) tmpCNode := models.CommonNode{
ID: uuid.New(),
Network: "skynet",
Address: *ipnet,
DNSOn: true,
}
createnode := models.Node{
CommonNode: tmpCNode,
}
err := logic.AssociateNodeToHost(&createnode, &dnsHost)
assert.Nil(t, err) assert.Nil(t, err)
dns, err := logic.GetNodeDNS("skynet") dns, err := logic.GetNodeDNS("skynet")
assert.Nil(t, err) assert.Nil(t, err)
@@ -85,15 +115,16 @@ func TestGetCustomDNS(t *testing.T) {
assert.Equal(t, 0, len(dns)) assert.Equal(t, 0, len(dns))
}) })
t.Run("EntryExist", func(t *testing.T) { t.Run("EntryExist", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.3", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.3", "", "custom1", "skynet"}
CreateDNS(entry) _, err := logic.CreateDNS(entry)
dns, err := logic.GetCustomDNS("skynet") dns, err := logic.GetCustomDNS("skynet")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 1, len(dns)) assert.Equal(t, 1, len(dns))
}) })
t.Run("MultipleEntries", func(t *testing.T) { t.Run("MultipleEntries", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.4", "", "host4", "skynet"} entry := models.DNSEntry{"10.0.0.4", "", "host4", "skynet"}
CreateDNS(entry) _, err := logic.CreateDNS(entry)
assert.Nil(t, err)
dns, err := logic.GetCustomDNS("skynet") dns, err := logic.GetCustomDNS("skynet")
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, 2, len(dns)) assert.Equal(t, 2, len(dns))
@@ -112,7 +143,7 @@ func TestGetDNSEntryNum(t *testing.T) {
}) })
t.Run("NodeExists", func(t *testing.T) { t.Run("NodeExists", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
_, err := CreateDNS(entry) _, err := logic.CreateDNS(entry)
assert.Nil(t, err) assert.Nil(t, err)
num, err := logic.GetDNSEntryNum("newhost", "skynet") num, err := logic.GetDNSEntryNum("newhost", "skynet")
assert.Nil(t, err) assert.Nil(t, err)
@@ -131,7 +162,7 @@ func TestGetDNS(t *testing.T) {
}) })
t.Run("CustomDNSExists", func(t *testing.T) { t.Run("CustomDNSExists", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
_, err := CreateDNS(entry) _, err := logic.CreateDNS(entry)
assert.Nil(t, err) assert.Nil(t, err)
dns, err := logic.GetDNS("skynet") dns, err := logic.GetDNS("skynet")
t.Log(dns) t.Log(dns)
@@ -151,7 +182,7 @@ func TestGetDNS(t *testing.T) {
}) })
t.Run("NodeAndCustomDNS", func(t *testing.T) { t.Run("NodeAndCustomDNS", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
_, err := CreateDNS(entry) _, err := logic.CreateDNS(entry)
assert.Nil(t, err) assert.Nil(t, err)
dns, err := logic.GetDNS("skynet") dns, err := logic.GetDNS("skynet")
t.Log(dns) t.Log(dns)
@@ -169,7 +200,7 @@ func TestCreateDNS(t *testing.T) {
deleteAllNetworks() deleteAllNetworks()
createNet() createNet()
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
dns, err := CreateDNS(entry) dns, err := logic.CreateDNS(entry)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "newhost", dns.Name) assert.Equal(t, "newhost", dns.Name)
} }
@@ -204,12 +235,13 @@ func TestSetDNS(t *testing.T) {
assert.False(t, info.IsDir()) assert.False(t, info.IsDir())
content, err := os.ReadFile("./config/dnsconfig/netmaker.hosts") content, err := os.ReadFile("./config/dnsconfig/netmaker.hosts")
assert.Nil(t, err) assert.Nil(t, err)
assert.Contains(t, string(content), "testnode.skynet") assert.Contains(t, string(content), "linuxhost.skynet")
}) })
t.Run("EntryExists", func(t *testing.T) { t.Run("EntryExists", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.3", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.3", "", "newhost", "skynet"}
CreateDNS(entry) _, err := logic.CreateDNS(entry)
err := logic.SetDNS() assert.Nil(t, err)
err = logic.SetDNS()
assert.Nil(t, err) assert.Nil(t, err)
info, err := os.Stat("./config/dnsconfig/netmaker.hosts") info, err := os.Stat("./config/dnsconfig/netmaker.hosts")
assert.Nil(t, err) assert.Nil(t, err)
@@ -228,7 +260,7 @@ func TestGetDNSEntry(t *testing.T) {
createNet() createNet()
createTestNode() createTestNode()
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
CreateDNS(entry) _, _ = logic.CreateDNS(entry)
t.Run("wrong net", func(t *testing.T) { t.Run("wrong net", func(t *testing.T) {
entry, err := GetDNSEntry("newhost", "w286 Toronto Street South, Uxbridge, ONirecat") entry, err := GetDNSEntry("newhost", "w286 Toronto Street South, Uxbridge, ONirecat")
assert.EqualError(t, err, "no result found") assert.EqualError(t, err, "no result found")
@@ -251,40 +283,13 @@ func TestGetDNSEntry(t *testing.T) {
}) })
} }
// func TestUpdateDNS(t *testing.T) {
// var newentry models.DNSEntry
// database.InitializeDatabase()
// deleteAllDNS(t)
// deleteAllNetworks()
// createNet()
// entry := models.DNSEntry{"10.0.0.2", "newhost", "skynet"}
// CreateDNS(entry)
// t.Run("change address", func(t *testing.T) {
// newentry.Address = "10.0.0.75"
// updated, err := UpdateDNS(newentry, entry)
// assert.Nil(t, err)
// assert.Equal(t, newentry.Address, updated.Address)
// })
// t.Run("change name", func(t *testing.T) {
// newentry.Name = "newname"
// updated, err := UpdateDNS(newentry, entry)
// assert.Nil(t, err)
// assert.Equal(t, newentry.Name, updated.Name)
// })
// t.Run("change network", func(t *testing.T) {
// newentry.Network = "wirecat"
// updated, err := UpdateDNS(newentry, entry)
// assert.Nil(t, err)
// assert.NotEqual(t, newentry.Network, updated.Network)
// })
// }
func TestDeleteDNS(t *testing.T) { func TestDeleteDNS(t *testing.T) {
database.InitializeDatabase() database.InitializeDatabase()
deleteAllDNS(t) deleteAllDNS(t)
deleteAllNetworks() deleteAllNetworks()
createNet() createNet()
entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "newhost", "skynet"}
CreateDNS(entry) _, _ = logic.CreateDNS(entry)
t.Run("EntryExists", func(t *testing.T) { t.Run("EntryExists", func(t *testing.T) {
err := logic.DeleteDNS("newhost", "skynet") err := logic.DeleteDNS("newhost", "skynet")
assert.Nil(t, err) assert.Nil(t, err)
@@ -351,8 +356,8 @@ func TestValidateDNSUpdate(t *testing.T) {
}) })
t.Run("NameUnique", func(t *testing.T) { t.Run("NameUnique", func(t *testing.T) {
change := models.DNSEntry{"10.0.0.2", "", "myhost", "wirecat"} change := models.DNSEntry{"10.0.0.2", "", "myhost", "wirecat"}
CreateDNS(entry) _, _ = logic.CreateDNS(entry)
CreateDNS(change) _, _ = logic.CreateDNS(change)
err := logic.ValidateDNSUpdate(change, entry) err := logic.ValidateDNSUpdate(change, entry)
assert.NotNil(t, err) assert.NotNil(t, err)
assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag") assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag")
@@ -401,13 +406,25 @@ func TestValidateDNSCreate(t *testing.T) {
}) })
t.Run("NameUnique", func(t *testing.T) { t.Run("NameUnique", func(t *testing.T) {
entry := models.DNSEntry{"10.0.0.2", "", "myhost", "skynet"} entry := models.DNSEntry{"10.0.0.2", "", "myhost", "skynet"}
_, _ = CreateDNS(entry) _, _ = logic.CreateDNS(entry)
err := logic.ValidateDNSCreate(entry) err := logic.ValidateDNSCreate(entry)
assert.NotNil(t, err) assert.NotNil(t, err)
assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag") assert.Contains(t, err.Error(), "Field validation for 'Name' failed on the 'name_unique' tag")
}) })
} }
func createHost() {
k, _ := wgtypes.ParseKey("DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=")
dnsHost = models.Host{
ID: uuid.New(),
PublicKey: k.PublicKey(),
HostPass: "password",
OS: "linux",
Name: "dnshost",
}
_ = logic.CreateHost(&dnsHost)
}
func deleteAllDNS(t *testing.T) { func deleteAllDNS(t *testing.T) {
dns, err := logic.GetAllDNS() dns, err := logic.GetAllDNS()
assert.Nil(t, err) assert.Nil(t, err)

View File

@@ -4,10 +4,12 @@ import (
"os" "os"
"testing" "testing"
"github.com/google/uuid"
"github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/logic"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
) )
type NetworkValidationTestCase struct { type NetworkValidationTestCase struct {
@@ -16,6 +18,8 @@ type NetworkValidationTestCase struct {
errMessage string errMessage string
} }
var netHost models.Host
func TestCreateNetwork(t *testing.T) { func TestCreateNetwork(t *testing.T) {
initialize() initialize()
deleteAllNetworks() deleteAllNetworks()
@@ -305,11 +309,12 @@ func TestIpv6Network(t *testing.T) {
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64") assert.Equal(t, network.AddressRange6, "fde6:be04:fa5e:d076::/64")
}) })
node1 := models.LegacyNode{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.50", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet6", OS: "linux"} node1 := createNodeWithParams("skynet6", "")
nodeErr := logic.CreateNode(&node1) createNetHost()
nodeErr := logic.AssociateNodeToHost(node1, &netHost)
t.Run("Test node on network IPv6", func(t *testing.T) { t.Run("Test node on network IPv6", func(t *testing.T) {
assert.Nil(t, nodeErr) assert.Nil(t, nodeErr)
assert.Equal(t, "fde6:be04:fa5e:d076::1", node1.Address6) assert.Equal(t, "fde6:be04:fa5e:d076::1", node1.Address6.IP.String())
}) })
} }
@@ -358,3 +363,15 @@ func createNetDualStack() {
logic.CreateNetwork(network) logic.CreateNetwork(network)
} }
} }
func createNetHost() {
k, _ := wgtypes.ParseKey("DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=")
netHost = models.Host{
ID: uuid.New(),
PublicKey: k.PublicKey(),
HostPass: "password",
OS: "linux",
Name: "nethost",
}
_ = logic.CreateHost(&netHost)
}

View File

@@ -1,16 +1,22 @@
package controller package controller
import ( import (
"net"
"testing" "testing"
"github.com/google/uuid"
"github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/logic" "github.com/gravitl/netmaker/logic"
"github.com/gravitl/netmaker/logic/acls" "github.com/gravitl/netmaker/logic/acls"
"github.com/gravitl/netmaker/logic/acls/nodeacls" "github.com/gravitl/netmaker/logic/acls/nodeacls"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"golang.zx2c4.com/wireguard/wgctrl/wgtypes"
) )
var nonLinuxHost models.Host
var linuxHost models.Host
func TestCreateEgressGateway(t *testing.T) { func TestCreateEgressGateway(t *testing.T) {
var gateway models.EgressGatewayRequest var gateway models.EgressGatewayRequest
gateway.Interface = "eth0" gateway.Interface = "eth0"
@@ -21,22 +27,24 @@ func TestCreateEgressGateway(t *testing.T) {
createNet() createNet()
t.Run("NoNodes", func(t *testing.T) { t.Run("NoNodes", func(t *testing.T) {
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
assert.Equal(t, models.LegacyNode{}, node) assert.Equal(t, models.Node{}, node)
assert.EqualError(t, err, "could not find any records") assert.EqualError(t, err, "could not find any records")
}) })
t.Run("Non-linux node", func(t *testing.T) { t.Run("Non-linux node", func(t *testing.T) {
createnode := models.LegacyNode{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.1", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "windows"} createnode := createNodeWithParams("", "")
err := logic.CreateNode(&createnode) createNodeHosts()
createnode.HostID = nonLinuxHost.ID
err := logic.AssociateNodeToHost(createnode, &nonLinuxHost)
assert.Nil(t, err) assert.Nil(t, err)
gateway.NodeID = createnode.ID gateway.NodeID = createnode.ID.String()
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
assert.Equal(t, models.LegacyNode{}, node) assert.Equal(t, models.Node{}, node)
assert.EqualError(t, err, "windows is unsupported for egress gateways") assert.EqualError(t, err, "windows is unsupported for egress gateways")
}) })
t.Run("Success-Nat-Enabled", func(t *testing.T) { t.Run("Success-Nat-Enabled", func(t *testing.T) {
deleteAllNodes() deleteAllNodes()
testnode := createTestNode() testnode := createTestNode()
gateway.NodeID = testnode.ID gateway.NodeID = testnode.ID.String()
gateway.NatEnabled = "yes" gateway.NatEnabled = "yes"
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
@@ -50,7 +58,7 @@ func TestCreateEgressGateway(t *testing.T) {
t.Run("Success-Nat-Disabled", func(t *testing.T) { t.Run("Success-Nat-Disabled", func(t *testing.T) {
deleteAllNodes() deleteAllNodes()
testnode := createTestNode() testnode := createTestNode()
gateway.NodeID = testnode.ID gateway.NodeID = testnode.ID.String()
gateway.NatEnabled = "no" gateway.NatEnabled = "no"
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
@@ -68,14 +76,14 @@ func TestCreateEgressGateway(t *testing.T) {
gateway.NetID = "skynet" gateway.NetID = "skynet"
deleteAllNodes() deleteAllNodes()
testnode := createTestNode() testnode := createTestNode()
gateway.NodeID = testnode.ID gateway.NodeID = testnode.ID.String()
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
t.Log(node) t.Log(node)
assert.Nil(t, err) assert.Nil(t, err)
assert.Contains(t, node.PostUp, "-j MASQUERADE") assert.Contains(t, node.PostUp, "-j MASQUERADE")
assert.Contains(t, node.PostDown, "-j MASQUERADE") assert.Contains(t, node.PostDown, "-j MASQUERADE")
assert.Equal(t, "yes", node.IsEgressGateway) assert.Equal(t, true, node.IsEgressGateway)
assert.Equal(t, gateway.Ranges, node.EgressGatewayRanges) assert.Equal(t, gateway.Ranges, node.EgressGatewayRanges)
}) })
@@ -89,15 +97,15 @@ func TestDeleteEgressGateway(t *testing.T) {
gateway.Interface = "eth0" gateway.Interface = "eth0"
gateway.Ranges = []string{"10.100.100.0/24"} gateway.Ranges = []string{"10.100.100.0/24"}
gateway.NetID = "skynet" gateway.NetID = "skynet"
gateway.NodeID = testnode.ID gateway.NodeID = testnode.ID.String()
t.Run("Success", func(t *testing.T) { t.Run("Success", func(t *testing.T) {
node, err := logic.CreateEgressGateway(gateway) node, err := logic.CreateEgressGateway(gateway)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "yes", node.IsEgressGateway) assert.Equal(t, true, node.IsEgressGateway)
assert.Equal(t, []string{"10.100.100.0/24"}, node.EgressGatewayRanges) assert.Equal(t, []string{"10.100.100.0/24"}, node.EgressGatewayRanges)
node, err = logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID) node, err = logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "no", node.IsEgressGateway) assert.Equal(t, false, node.IsEgressGateway)
assert.Equal(t, []string([]string{}), node.EgressGatewayRanges) assert.Equal(t, []string([]string{}), node.EgressGatewayRanges)
assert.Equal(t, "", node.PostUp) assert.Equal(t, "", node.PostUp)
assert.Equal(t, "", node.PostDown) assert.Equal(t, "", node.PostDown)
@@ -105,7 +113,7 @@ func TestDeleteEgressGateway(t *testing.T) {
t.Run("NotGateway", func(t *testing.T) { t.Run("NotGateway", func(t *testing.T) {
node, err := logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID) node, err := logic.DeleteEgressGateway(gateway.NetID, gateway.NodeID)
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, "no", node.IsEgressGateway) assert.Equal(t, false, node.IsEgressGateway)
assert.Equal(t, []string([]string{}), node.EgressGatewayRanges) assert.Equal(t, []string([]string{}), node.EgressGatewayRanges)
assert.Equal(t, "", node.PostUp) assert.Equal(t, "", node.PostUp)
assert.Equal(t, "", node.PostDown) assert.Equal(t, "", node.PostDown)
@@ -113,7 +121,7 @@ func TestDeleteEgressGateway(t *testing.T) {
t.Run("BadNode", func(t *testing.T) { t.Run("BadNode", func(t *testing.T) {
node, err := logic.DeleteEgressGateway(gateway.NetID, "01:02:03") node, err := logic.DeleteEgressGateway(gateway.NetID, "01:02:03")
assert.EqualError(t, err, "no result found") assert.EqualError(t, err, "no result found")
assert.Equal(t, models.LegacyNode{}, node) assert.Equal(t, models.Node{}, node)
deleteAllNodes() deleteAllNodes()
}) })
} }
@@ -140,23 +148,7 @@ func TestGetNetworkNodes(t *testing.T) {
}) })
} }
func TestUncordonNode(t *testing.T) {
database.InitializeDatabase()
deleteAllNetworks()
createNet()
node := createTestNode()
t.Run("BadID", func(t *testing.T) {
resp, err := logic.UncordonNode("blahblah")
assert.Equal(t, models.LegacyNode{}, resp)
assert.EqualError(t, err, "no result found")
})
t.Run("Success", func(t *testing.T) {
resp, err := logic.UncordonNode(node.ID)
assert.Nil(t, err)
assert.Equal(t, "no", resp.IsPending)
})
}
func TestValidateEgressGateway(t *testing.T) { func TestValidateEgressGateway(t *testing.T) {
var gateway models.EgressGatewayRequest var gateway models.EgressGatewayRequest
t.Run("EmptyRange", func(t *testing.T) { t.Run("EmptyRange", func(t *testing.T) {
@@ -181,66 +173,73 @@ func TestValidateEgressGateway(t *testing.T) {
func TestNodeACLs(t *testing.T) { func TestNodeACLs(t *testing.T) {
deleteAllNodes() deleteAllNodes()
node1 := models.LegacyNode{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.50", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "linux"} node1 := createNodeWithParams("", "10.0.0.50/32")
node2 := models.LegacyNode{PublicKey: "DM5qhLAE20FG7BbfBCger+Ac9D2NDOwCtY1rbYDXf14=", Name: "testnode", Endpoint: "10.0.0.100", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet", OS: "linux"} node2 := createNodeWithParams("", "10.0.0.100/32")
logic.CreateNode(&node1) logic.AssociateNodeToHost(node1, &linuxHost)
logic.CreateNode(&node2) logic.AssociateNodeToHost(node2, &linuxHost)
t.Run("acls not present", func(t *testing.T) { t.Run("acls not present", func(t *testing.T) {
currentACL, err := nodeacls.FetchAllACLs(nodeacls.NetworkID(node1.Network)) currentACL, err := nodeacls.FetchAllACLs(nodeacls.NetworkID(node1.Network))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, currentACL) assert.NotNil(t, currentACL)
node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID)) node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, node1ACL) assert.NotNil(t, node1ACL)
assert.Equal(t, acls.Allowed, node1ACL[acls.AclID(node2.ID)]) assert.Equal(t, acls.Allowed, node1ACL[acls.AclID(node2.ID.String())])
}) })
t.Run("node acls exists after creates", func(t *testing.T) { t.Run("node acls exists after creates", func(t *testing.T) {
node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID)) node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, node1ACL) assert.NotNil(t, node1ACL)
node2ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node2.Network), nodeacls.NodeID(node2.ID)) node2ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node2.Network), nodeacls.NodeID(node2.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, node2ACL) assert.NotNil(t, node2ACL)
assert.Equal(t, acls.Allowed, node2ACL[acls.AclID(node1.ID)]) assert.Equal(t, acls.Allowed, node2ACL[acls.AclID(node1.ID.String())])
}) })
t.Run("node acls correct after fetch", func(t *testing.T) { t.Run("node acls correct after fetch", func(t *testing.T) {
node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID)) node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, acls.Allowed, node1ACL[acls.AclID(node2.ID)]) assert.Equal(t, acls.Allowed, node1ACL[acls.AclID(node2.ID.String())])
}) })
t.Run("node acls correct after modify", func(t *testing.T) { t.Run("node acls correct after modify", func(t *testing.T) {
node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID)) node1ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, node1ACL) assert.NotNil(t, node1ACL)
node2ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node2.Network), nodeacls.NodeID(node2.ID)) node2ACL, err := nodeacls.FetchNodeACL(nodeacls.NetworkID(node2.Network), nodeacls.NodeID(node2.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, node2ACL) assert.NotNil(t, node2ACL)
currentACL, err := nodeacls.DisallowNodes(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID), nodeacls.NodeID(node2.ID)) currentACL, err := nodeacls.DisallowNodes(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()), nodeacls.NodeID(node2.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node1.ID)][acls.AclID(node2.ID)]) assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node1.ID.String())][acls.AclID(node2.ID.String())])
assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node2.ID)][acls.AclID(node1.ID)]) assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node2.ID.String())][acls.AclID(node1.ID.String())])
currentACL.Save(acls.ContainerID(node1.Network)) currentACL.Save(acls.ContainerID(node1.Network))
}) })
t.Run("node acls correct after add new node not allowed", func(t *testing.T) { t.Run("node acls correct after add new node not allowed", func(t *testing.T) {
node3 := models.LegacyNode{PublicKey: "this-is-not-valid", Name: "testnode3", Endpoint: "10.0.0.100", MacAddress: "01:02:03:04:05:07", Password: "password", Network: "skynet", OS: "linux"} node3 := createNodeWithParams("", "10.0.0.100/32")
logic.CreateNode(&node3) createNodeHosts()
var currentACL, err = nodeacls.FetchAllACLs(nodeacls.NetworkID(node3.Network)) n, e := logic.GetNetwork(node3.Network)
assert.Nil(t, e)
n.DefaultACL = "no"
e = logic.SaveNetwork(&n)
assert.Nil(t, e)
err := logic.AssociateNodeToHost(node3, &linuxHost)
assert.Nil(t, err)
currentACL, err := nodeacls.FetchAllACLs(nodeacls.NetworkID(node3.Network))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, currentACL) assert.NotNil(t, currentACL)
assert.Equal(t, acls.NotPresent, currentACL[acls.AclID(node1.ID)][acls.AclID(node3.ID)]) assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node1.ID.String())][acls.AclID(node3.ID.String())])
nodeACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node3.Network), nodeacls.NodeID(node3.ID), acls.NotAllowed) nodeACL, err := nodeacls.CreateNodeACL(nodeacls.NetworkID(node3.Network), nodeacls.NodeID(node3.ID.String()), acls.NotAllowed)
assert.Nil(t, err) assert.Nil(t, err)
nodeACL.Save(acls.ContainerID(node3.Network), acls.AclID(node3.ID)) nodeACL.Save(acls.ContainerID(node3.Network), acls.AclID(node3.ID.String()))
currentACL, err = nodeacls.FetchAllACLs(nodeacls.NetworkID(node3.Network)) currentACL, err = nodeacls.FetchAllACLs(nodeacls.NetworkID(node3.Network))
assert.Nil(t, err) assert.Nil(t, err)
assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node1.ID)][acls.AclID(node3.ID)]) assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node1.ID.String())][acls.AclID(node3.ID.String())])
assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node2.ID)][acls.AclID(node3.ID)]) assert.Equal(t, acls.NotAllowed, currentACL[acls.AclID(node2.ID.String())][acls.AclID(node3.ID.String())])
}) })
t.Run("node acls removed", func(t *testing.T) { t.Run("node acls removed", func(t *testing.T) {
retNetworkACL, err := nodeacls.RemoveNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID)) retNetworkACL, err := nodeacls.RemoveNodeACL(nodeacls.NetworkID(node1.Network), nodeacls.NodeID(node1.ID.String()))
assert.Nil(t, err) assert.Nil(t, err)
assert.NotNil(t, retNetworkACL) assert.NotNil(t, retNetworkACL)
assert.Equal(t, acls.NotPresent, retNetworkACL[acls.AclID(node2.ID)][acls.AclID(node1.ID)]) assert.Equal(t, acls.NotPresent, retNetworkACL[acls.AclID(node2.ID.String())][acls.AclID(node1.ID.String())])
}) })
deleteAllNodes() deleteAllNodes()
} }
@@ -249,8 +248,51 @@ func deleteAllNodes() {
database.DeleteAllRecords(database.NODES_TABLE_NAME) database.DeleteAllRecords(database.NODES_TABLE_NAME)
} }
func createTestNode() *models.LegacyNode { func createTestNode() *models.Node {
createnode := models.LegacyNode{PublicKey: "DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=", Name: "testnode", Endpoint: "10.0.0.1", MacAddress: "01:02:03:04:05:06", Password: "password", Network: "skynet", OS: "linux"} createNodeHosts()
logic.CreateNode(&createnode) n := createNodeWithParams("skynet", "")
_ = logic.AssociateNodeToHost(n, &linuxHost)
return n
}
func createNodeWithParams(network, address string) *models.Node {
_, ipnet, _ := net.ParseCIDR("10.0.0.1/32")
tmpCNode := models.CommonNode{
ID: uuid.New(),
Network: "skynet",
Address: *ipnet,
DNSOn: true,
}
if len(network) > 0 {
tmpCNode.Network = network
}
if len(address) > 0 {
_, ipnet2, _ := net.ParseCIDR(address)
tmpCNode.Address = *ipnet2
}
createnode := models.Node{
CommonNode: tmpCNode,
}
return &createnode return &createnode
} }
func createNodeHosts() {
k, _ := wgtypes.ParseKey("DM5qhLAE20PG9BbfBCger+Ac9D2NDOwCtY1rbYDLf34=")
linuxHost = models.Host{
ID: uuid.New(),
PublicKey: k.PublicKey(),
HostPass: "password",
OS: "linux",
Name: "linuxhost",
}
_ = logic.CreateHost(&linuxHost)
nonLinuxHost = models.Host{
ID: uuid.New(),
OS: "windows",
PublicKey: k.PublicKey(),
Name: "windowshost",
HostPass: "password",
}
_ = logic.CreateHost(&nonLinuxHost)
}

View File

@@ -74,14 +74,27 @@ func GetNodeDNS(network string) ([]models.DNSEntry, error) {
} }
for _, value := range collection { for _, value := range collection {
var entry models.DNSEntry
var node models.Node var node models.Node
if err = json.Unmarshal([]byte(value), &node); err != nil { if err = json.Unmarshal([]byte(value), &node); err != nil {
continue continue
} }
if err = json.Unmarshal([]byte(value), &entry); node.Network == network && err == nil { if node.Network != network {
dns = append(dns, entry) continue
} }
host, err := GetHost(node.HostID.String())
if err != nil {
continue
}
var entry = models.DNSEntry{}
entry.Name = host.Name
entry.Network = network
if node.Address.IP != nil {
entry.Address = node.Address.IP.String()
}
if node.Address6.IP != nil {
entry.Address6 = node.Address6.IP.String()
}
dns = append(dns, entry)
} }
return dns, nil return dns, nil
@@ -220,9 +233,6 @@ func ValidateDNSUpdate(change models.DNSEntry, entry models.DNSEntry) error {
}) })
_ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool { _ = v.RegisterValidation("network_exists", func(fl validator.FieldLevel) bool {
_, err := GetParentNetwork(change.Network) _, err := GetParentNetwork(change.Network)
if err != nil {
logger.Log(0, err.Error())
}
return err == nil return err == nil
}) })
@@ -245,3 +255,20 @@ func DeleteDNS(domain string, network string) error {
err = database.DeleteRecord(database.DNS_TABLE_NAME, key) err = database.DeleteRecord(database.DNS_TABLE_NAME, key)
return err return err
} }
// CreateDNS - creates a DNS entry
func CreateDNS(entry models.DNSEntry) (models.DNSEntry, error) {
k, err := GetRecordKey(entry.Name, entry.Network)
if err != nil {
return models.DNSEntry{}, err
}
data, err := json.Marshal(&entry)
if err != nil {
return models.DNSEntry{}, err
}
err = database.Insert(k, string(data), database.DNS_TABLE_NAME)
return entry, err
}

View File

@@ -3,6 +3,7 @@ package pro
import ( import (
"testing" "testing"
"github.com/google/uuid"
"github.com/gravitl/netmaker/database" "github.com/gravitl/netmaker/database"
"github.com/gravitl/netmaker/models" "github.com/gravitl/netmaker/models"
"github.com/gravitl/netmaker/models/promodels" "github.com/gravitl/netmaker/models/promodels"
@@ -18,8 +19,13 @@ func TestNetworkUserLogic(t *testing.T) {
NetID: "skynet", NetID: "skynet",
AddressRange: "192.168.0.0/24", AddressRange: "192.168.0.0/24",
} }
nodes := []models.LegacyNode{ tmpCNode := models.CommonNode{
models.LegacyNode{ID: "coolnode"}, ID: uuid.New(),
}
tempNode := models.Node{}
tempNode.CommonNode = tmpCNode
nodes := []models.Node{
tempNode,
} }
clients := []models.ExtClient{ clients := []models.ExtClient{
@@ -63,10 +69,10 @@ func TestNetworkUserLogic(t *testing.T) {
}) })
t.Run("Successful net user node isallowed", func(t *testing.T) { t.Run("Successful net user node isallowed", func(t *testing.T) {
networkUser.Nodes = append(networkUser.Nodes, "coolnode") networkUser.Nodes = append(networkUser.Nodes, nodes[0].ID.String())
err := UpdateNetworkUser(network.NetID, &networkUser) err := UpdateNetworkUser(network.NetID, &networkUser)
assert.Nil(t, err) assert.Nil(t, err)
isUserNodeAllowed := IsUserNodeAllowed(nodes[:], network.NetID, string(networkUser.ID), "coolnode") isUserNodeAllowed := IsUserNodeAllowed(nodes[:], network.NetID, string(networkUser.ID), nodes[0].ID.String())
assert.True(t, isUserNodeAllowed) assert.True(t, isUserNodeAllowed)
}) })

View File

@@ -1,4 +1,4 @@
//TODO: Either add a returnNetwork and returnKey, or delete this // TODO: Either add a returnNetwork and returnKey, or delete this
package models package models
// DNSEntry - a DNS entry represented as struct // DNSEntry - a DNS entry represented as struct