mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-07 09:41:37 +08:00
Merge branch 'develop' into bugfix_v0.2_misc
This commit is contained in:
96
.github/workflows/buildandrelease.yml
vendored
Normal file
96
.github/workflows/buildandrelease.yml
vendored
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
name: Build and Release
|
||||||
|
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Netmaker version'
|
||||||
|
required: false
|
||||||
|
release:
|
||||||
|
types: [created]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
|
||||||
|
- name: Get Version Number
|
||||||
|
run: |
|
||||||
|
if [[ -n "${{ github.event.inputs.version }}" ]]; then
|
||||||
|
NETMAKER_VERSION=${{ github.event.inputs.version }}
|
||||||
|
else
|
||||||
|
NETMAKER_VERSION=$(curl -fsSL https://api.github.com/repos/gravitl/netmaker/tags | grep 'name' | head -1 | cut -d'"' -f4)
|
||||||
|
fi
|
||||||
|
echo "NETMAKER_VERSION=${NETMAKER_VERSION}" >> $GITHUB_ENV
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
- name: Setup go
|
||||||
|
uses: actions/setup-go@v2
|
||||||
|
with:
|
||||||
|
go-version: 1.16
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: |
|
||||||
|
cd netclient
|
||||||
|
env GOOS=linux GOARCH=amd64 go build -o build/netclient main.go
|
||||||
|
env GOOS=linux GOARCH=arm GOARM=5 go build -o build/netclient-arm5/ main.go
|
||||||
|
env GOOS=linux GOARCH=arm GOARM=6 go build -o build/netclient-arm6/ main.go
|
||||||
|
env GOOS=linux GOARCH=arm GOARM=7 go build -o build/netclient-arm7/ main.go
|
||||||
|
env GOOS=linux GOARCH=arm64 go build -o build/netclient-arm64 main.go
|
||||||
|
|
||||||
|
- name: Upload arm5 to Release
|
||||||
|
if: github.event.inputs.version == ''
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: netclient/build/netclient-arm5
|
||||||
|
tag: ${{ env.NETMAKER_VERSION }}
|
||||||
|
overwrite: true
|
||||||
|
prerelease: true
|
||||||
|
asset_name: netclient-arm5
|
||||||
|
|
||||||
|
- name: Upload arm6 to Release
|
||||||
|
if: github.event.inputs.version == ''
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: netclient/build/netclient-arm6
|
||||||
|
tag: ${{ env.NETMAKER_VERSION }}
|
||||||
|
overwrite: true
|
||||||
|
prerelease: true
|
||||||
|
asset_name: netclient-arm6
|
||||||
|
|
||||||
|
- name: Upload arm7 to Release
|
||||||
|
if: github.event.inputs.version == ''
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: netclient/build/netclient-arm7
|
||||||
|
tag: ${{ env.NETMAKER_VERSION }}
|
||||||
|
overwrite: true
|
||||||
|
prerelease: true
|
||||||
|
asset_name: netclient-arm7
|
||||||
|
|
||||||
|
- name: Upload arm64 to Release
|
||||||
|
if: github.event.inputs.version == ''
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: build/netclient-arm64
|
||||||
|
tag: ${{ env.NETMAKER_VERSION }}
|
||||||
|
overwrite: true
|
||||||
|
prerelease: true
|
||||||
|
asset_name: netclient-arm64
|
||||||
|
|
||||||
|
- name: Upload x86 to Release
|
||||||
|
if: github.event.inputs.version == ''
|
||||||
|
uses: svenstaro/upload-release-action@v2
|
||||||
|
with:
|
||||||
|
repo_token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
file: build/netclient
|
||||||
|
tag: ${{ env.NETMAKER_VERSION }}
|
||||||
|
overwrite: true
|
||||||
|
prerelease: true
|
||||||
|
asset_name: netclient
|
@@ -1,22 +1,23 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/go-playground/validator.v9"
|
|
||||||
"github.com/gravitl/netmaker/models"
|
|
||||||
"errors"
|
|
||||||
"encoding/base64"
|
|
||||||
"github.com/gravitl/netmaker/functions"
|
|
||||||
"github.com/gravitl/netmaker/mongoconn"
|
|
||||||
"time"
|
|
||||||
"strings"
|
|
||||||
"fmt"
|
|
||||||
"context"
|
"context"
|
||||||
|
"encoding/base64"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strings"
|
||||||
|
"time"
|
||||||
|
|
||||||
"github.com/gorilla/mux"
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/gravitl/netmaker/config"
|
||||||
|
"github.com/gravitl/netmaker/functions"
|
||||||
|
"github.com/gravitl/netmaker/models"
|
||||||
|
"github.com/gravitl/netmaker/mongoconn"
|
||||||
"go.mongodb.org/mongo-driver/bson"
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
"github.com/gravitl/netmaker/config"
|
"gopkg.in/go-playground/validator.v9"
|
||||||
)
|
)
|
||||||
|
|
||||||
func networkHandlers(r *mux.Router) {
|
func networkHandlers(r *mux.Router) {
|
||||||
@@ -79,6 +80,7 @@ func securityCheck(next http.Handler) http.HandlerFunc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//Consider a more secure way of setting master key
|
//Consider a more secure way of setting master key
|
||||||
func authenticateMaster(tokenString string) bool {
|
func authenticateMaster(tokenString string) bool {
|
||||||
if tokenString == config.Config.Server.MasterKey {
|
if tokenString == config.Config.Server.MasterKey {
|
||||||
@@ -210,7 +212,6 @@ func keyUpdate(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
network.KeyUpdateTimeStamp = time.Now().Unix()
|
network.KeyUpdateTimeStamp = time.Now().Unix()
|
||||||
|
|
||||||
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
||||||
@@ -257,7 +258,6 @@ func AlertNetwork(netid string) error{
|
|||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
filter := bson.M{"netid": netid}
|
filter := bson.M{"netid": netid}
|
||||||
|
|
||||||
|
|
||||||
var network models.Network
|
var network models.Network
|
||||||
|
|
||||||
network, err := functions.GetParentNetwork(netid)
|
network, err := functions.GetParentNetwork(netid)
|
||||||
@@ -308,7 +308,6 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
networkChange.NetID = network.NetID
|
networkChange.NetID = network.NetID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
err = validateNetworkUpdate(networkChange)
|
err = validateNetworkUpdate(networkChange)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
returnErrorResponse(w, r, formatError(err, "badrequest"))
|
returnErrorResponse(w, r, formatError(err, "badrequest"))
|
||||||
@@ -317,7 +316,11 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
//NOTE: Network.NetID is intentionally NOT editable. It acts as a static ID for the network.
|
//NOTE: Network.NetID is intentionally NOT editable. It acts as a static ID for the network.
|
||||||
//DisplayName can be changed instead, which is what shows on the front end
|
//DisplayName can be changed instead, which is what shows on the front end
|
||||||
|
if networkChange.NetID != network.NetID {
|
||||||
|
returnErrorResponse(w, r, formatError(errors.New("NetID is not editable"), "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
//MRK: I think this code block is redundant. valdiateNetworkUpdate(networkChange) covers this
|
||||||
if networkChange.AddressRange != "" {
|
if networkChange.AddressRange != "" {
|
||||||
|
|
||||||
network.AddressRange = networkChange.AddressRange
|
network.AddressRange = networkChange.AddressRange
|
||||||
@@ -387,7 +390,6 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
if haschange {
|
if haschange {
|
||||||
network.SetNetworkLastModified()
|
network.SetNetworkLastModified()
|
||||||
}
|
}
|
||||||
|
|
||||||
// prepare update model.
|
// prepare update model.
|
||||||
update := bson.D{
|
update := bson.D{
|
||||||
{"$set", bson.D{
|
{"$set", bson.D{
|
||||||
@@ -498,6 +500,7 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
//TODO: Not really doing good validation here. Same as createNode, updateNode, and updateNetwork
|
//TODO: Not really doing good validation here. Same as createNode, updateNode, and updateNetwork
|
||||||
//Need to implement some better validation across the board
|
//Need to implement some better validation across the board
|
||||||
|
|
||||||
if network.IsLocal == nil {
|
if network.IsLocal == nil {
|
||||||
falsevar := false
|
falsevar := false
|
||||||
network.IsLocal = &falsevar
|
network.IsLocal = &falsevar
|
||||||
@@ -516,7 +519,6 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
||||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
|
||||||
|
|
||||||
// insert our network into the network table
|
// insert our network into the network table
|
||||||
result, err := collection.InsertOne(ctx, network)
|
result, err := collection.InsertOne(ctx, network)
|
||||||
|
|
||||||
@@ -532,7 +534,6 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
// BEGIN KEY MANAGEMENT SECTION
|
// BEGIN KEY MANAGEMENT SECTION
|
||||||
|
|
||||||
|
|
||||||
//TODO: Very little error handling
|
//TODO: Very little error handling
|
||||||
//accesskey is created as a json string inside the Network collection item in mongo
|
//accesskey is created as a json string inside the Network collection item in mongo
|
||||||
func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
||||||
@@ -563,6 +564,7 @@ func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
|||||||
if accesskey.Value == "" {
|
if accesskey.Value == "" {
|
||||||
accesskey.Value = functions.GenKey()
|
accesskey.Value = functions.GenKey()
|
||||||
}
|
}
|
||||||
|
|
||||||
if accesskey.Uses == 0 {
|
if accesskey.Uses == 0 {
|
||||||
accesskey.Uses = 1
|
accesskey.Uses = 1
|
||||||
}
|
}
|
||||||
@@ -577,7 +579,6 @@ func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
|||||||
privAddr = network.LocalRange
|
privAddr = network.LocalRange
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
netID := params["networkname"]
|
netID := params["networkname"]
|
||||||
address := gconf.ServerGRPC + gconf.PortGRPC
|
address := gconf.ServerGRPC + gconf.PortGRPC
|
||||||
|
|
||||||
@@ -653,7 +654,6 @@ func getAccessKeys(w http.ResponseWriter, r *http.Request) {
|
|||||||
json.NewEncoder(w).Encode(keys)
|
json.NewEncoder(w).Encode(keys)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//delete key. Has to do a little funky logic since it's not a collection item
|
//delete key. Has to do a little funky logic since it's not a collection item
|
||||||
func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
|
func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
@@ -672,14 +672,21 @@ func deleteAccessKey(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
//basically, turn the list of access keys into the list of access keys before and after the item
|
//basically, turn the list of access keys into the list of access keys before and after the item
|
||||||
//have not done any error handling for if there's like...1 item. I think it works? need to test.
|
//have not done any error handling for if there's like...1 item. I think it works? need to test.
|
||||||
|
found := false
|
||||||
for i := len(network.AccessKeys) - 1; i >= 0; i-- {
|
for i := len(network.AccessKeys) - 1; i >= 0; i-- {
|
||||||
|
|
||||||
currentkey := network.AccessKeys[i]
|
currentkey := network.AccessKeys[i]
|
||||||
if currentkey.Name == keyname {
|
if currentkey.Name == keyname {
|
||||||
network.AccessKeys = append(network.AccessKeys[:i],
|
network.AccessKeys = append(network.AccessKeys[:i],
|
||||||
network.AccessKeys[i+1:]...)
|
network.AccessKeys[i+1:]...)
|
||||||
|
found = true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if !found {
|
||||||
|
err = errors.New("key " + keyname + " does not exist")
|
||||||
|
returnErrorResponse(w, r, formatError(err, "badrequest"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
||||||
|
|
||||||
|
@@ -1,24 +1,24 @@
|
|||||||
package controller
|
package controller
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"gopkg.in/go-playground/validator.v9"
|
|
||||||
"github.com/gravitl/netmaker/models"
|
|
||||||
"github.com/gravitl/netmaker/functions"
|
|
||||||
"github.com/gravitl/netmaker/mongoconn"
|
|
||||||
"golang.org/x/crypto/bcrypt"
|
|
||||||
"time"
|
|
||||||
"errors"
|
|
||||||
"strings"
|
|
||||||
"fmt"
|
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
|
"errors"
|
||||||
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
"github.com/gorilla/mux"
|
"strings"
|
||||||
"go.mongodb.org/mongo-driver/bson"
|
"time"
|
||||||
"go.mongodb.org/mongo-driver/mongo/options"
|
|
||||||
"go.mongodb.org/mongo-driver/mongo"
|
|
||||||
)
|
|
||||||
|
|
||||||
|
"github.com/gorilla/mux"
|
||||||
|
"github.com/gravitl/netmaker/functions"
|
||||||
|
"github.com/gravitl/netmaker/models"
|
||||||
|
"github.com/gravitl/netmaker/mongoconn"
|
||||||
|
"go.mongodb.org/mongo-driver/bson"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo"
|
||||||
|
"go.mongodb.org/mongo-driver/mongo/options"
|
||||||
|
"golang.org/x/crypto/bcrypt"
|
||||||
|
"gopkg.in/go-playground/validator.v9"
|
||||||
|
)
|
||||||
|
|
||||||
func userHandlers(r *mux.Router) {
|
func userHandlers(r *mux.Router) {
|
||||||
|
|
||||||
@@ -346,7 +346,6 @@ func UpdateUser(userchange models.User, user models.User) (models.User, error) {
|
|||||||
|
|
||||||
fmt.Println("Updating User " + user.UserName)
|
fmt.Println("Updating User " + user.UserName)
|
||||||
|
|
||||||
|
|
||||||
// prepare update model.
|
// prepare update model.
|
||||||
update := bson.D{
|
update := bson.D{
|
||||||
{"$set", bson.D{
|
{"$set", bson.D{
|
||||||
@@ -384,7 +383,6 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
var userchange models.User
|
var userchange models.User
|
||||||
|
|
||||||
// we decode our body request params
|
// we decode our body request params
|
||||||
@@ -447,15 +445,12 @@ func deleteUser(w http.ResponseWriter, r *http.Request) {
|
|||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
returnErrorResponse(w, r, formatError(err, "internal"))
|
returnErrorResponse(w, r, formatError(err, "internal"))
|
||||||
json.NewEncoder(w).Encode("Could not delete user " + params["username"])
|
|
||||||
return
|
return
|
||||||
} else if !success {
|
} else if !success {
|
||||||
returnErrorResponse(w, r, formatError(errors.New("Delete unsuccessful."), "internal"))
|
returnErrorResponse(w, r, formatError(errors.New("Delete unsuccessful."), "badrequest"))
|
||||||
json.NewEncoder(w).Encode("Could not delete user " + params["username"])
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
json.NewEncoder(w).Encode(params["username"] + " deleted.")
|
json.NewEncoder(w).Encode(params["username"] + " deleted.")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -3,7 +3,7 @@ set -e
|
|||||||
|
|
||||||
[ -z "$KEY" ] && KEY=nokey;
|
[ -z "$KEY" ] && KEY=nokey;
|
||||||
|
|
||||||
wget -O --backups=1 https://github.com/gravitl/netmaker/releases/download/latest/netclient
|
wget -O netclient https://github.com/gravitl/netmaker/releases/download/latest/netclient
|
||||||
chmod +x netclient
|
chmod +x netclient
|
||||||
sudo ./netclient -c install -t $KEY
|
sudo ./netclient -c install -t $KEY
|
||||||
rm -f netclient
|
rm -f netclient
|
||||||
|
@@ -2,6 +2,7 @@ package main
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"bytes"
|
"bytes"
|
||||||
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"net/http"
|
"net/http"
|
||||||
@@ -50,6 +51,19 @@ func TestMain(m *testing.M) {
|
|||||||
var waitgroup sync.WaitGroup
|
var waitgroup sync.WaitGroup
|
||||||
waitgroup.Add(1)
|
waitgroup.Add(1)
|
||||||
go controller.HandleRESTRequests(&waitgroup)
|
go controller.HandleRESTRequests(&waitgroup)
|
||||||
|
var gconf models.GlobalConfig
|
||||||
|
gconf.ServerGRPC = "localhost:8081"
|
||||||
|
gconf.PortGRPC = "50051"
|
||||||
|
//err := SetGlobalConfig(gconf)
|
||||||
|
collection := mongoconn.Client.Database("netmaker").Collection("config")
|
||||||
|
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||||
|
defer cancel()
|
||||||
|
//create, _, err := functions.GetGlobalConfig()
|
||||||
|
_, err := collection.InsertOne(ctx, gconf)
|
||||||
|
if err != nil {
|
||||||
|
panic("could not create config store")
|
||||||
|
}
|
||||||
|
|
||||||
//wait for http server to start
|
//wait for http server to start
|
||||||
time.Sleep(time.Second * 1)
|
time.Sleep(time.Second * 1)
|
||||||
os.Exit(m.Run())
|
os.Exit(m.Run())
|
||||||
@@ -178,12 +192,16 @@ func networkExists(t *testing.T) bool {
|
|||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||||
err = json.NewDecoder(response.Body).Decode(&Networks)
|
err = json.NewDecoder(response.Body).Decode(&Networks)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
if Networks == nil {
|
for i, network := range Networks {
|
||||||
|
t.Log(i, network)
|
||||||
|
if network.NetID == "" {
|
||||||
return false
|
return false
|
||||||
} else {
|
} else {
|
||||||
return true
|
return true
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
func deleteNetworks(t *testing.T) {
|
func deleteNetworks(t *testing.T) {
|
||||||
|
|
||||||
@@ -194,7 +212,7 @@ func deleteNetworks(t *testing.T) {
|
|||||||
err = json.NewDecoder(response.Body).Decode(&Networks)
|
err = json.NewDecoder(response.Body).Decode(&Networks)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
for _, network := range Networks {
|
for _, network := range Networks {
|
||||||
name := network.DisplayName
|
name := network.NetID
|
||||||
_, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
|
_, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
}
|
}
|
||||||
|
@@ -12,15 +12,13 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func TestCreateNetwork(t *testing.T) {
|
func TestCreateNetwork(t *testing.T) {
|
||||||
|
|
||||||
network := models.Network{}
|
network := models.Network{}
|
||||||
network.NetID = "skynet"
|
network.NetID = "skynet"
|
||||||
network.AddressRange = "10.71.0.0/16"
|
network.AddressRange = "10.71.0.0/16"
|
||||||
|
if networkExists(t) {
|
||||||
deleteNetworks(t)
|
deleteNetworks(t)
|
||||||
t.Run("CreateNetwork", func(t *testing.T) {
|
}
|
||||||
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
|
||||||
})
|
|
||||||
t.Run("InvalidToken", func(t *testing.T) {
|
t.Run("InvalidToken", func(t *testing.T) {
|
||||||
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "badkey")
|
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "badkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
@@ -32,21 +30,34 @@ func TestCreateNetwork(t *testing.T) {
|
|||||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||||
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
||||||
})
|
})
|
||||||
t.Run("BadName", func(t *testing.T) {
|
t.Run("CreateNetwork", func(t *testing.T) {
|
||||||
//issue #42
|
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
|
||||||
t.Skip()
|
assert.Nil(t, err, err)
|
||||||
})
|
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||||
t.Run("BadAddress", func(t *testing.T) {
|
|
||||||
//issue #42
|
|
||||||
t.Skip()
|
|
||||||
})
|
})
|
||||||
t.Run("DuplicateNetwork", func(t *testing.T) {
|
t.Run("DuplicateNetwork", func(t *testing.T) {
|
||||||
//issue #42
|
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
|
||||||
t.Skip()
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
})
|
})
|
||||||
|
t.Run("BadName", func(t *testing.T) {
|
||||||
|
network.NetID = "thisnameistoolong"
|
||||||
|
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
|
||||||
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
|
})
|
||||||
|
t.Run("BadAddress", func(t *testing.T) {
|
||||||
|
network.NetID = "wirecat"
|
||||||
|
network.AddressRange = "10.300.20.56/36"
|
||||||
|
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "secretkey")
|
||||||
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetNetworks(t *testing.T) {
|
func TestGetNetworks(t *testing.T) {
|
||||||
|
|
||||||
t.Run("ValidToken", func(t *testing.T) {
|
t.Run("ValidToken", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
|
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
@@ -69,6 +80,7 @@ func TestGetNetworks(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetNetwork(t *testing.T) {
|
func TestGetNetwork(t *testing.T) {
|
||||||
|
|
||||||
t.Run("ValidToken", func(t *testing.T) {
|
t.Run("ValidToken", func(t *testing.T) {
|
||||||
var network models.Network
|
var network models.Network
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet", "secretkey")
|
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet", "secretkey")
|
||||||
@@ -103,43 +115,8 @@ func TestGetNetwork(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGetnetworkNodeNumber(t *testing.T) {
|
func TestDeleteMetwork(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
//not part of api anymore
|
|
||||||
t.Run("ValidKey", func(t *testing.T) {
|
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/numnodes", "secretkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
defer response.Body.Close()
|
|
||||||
var message int
|
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
//assert.Equal(t, "W1R3: This network does not exist.", message.Message)
|
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
|
||||||
})
|
|
||||||
t.Run("InvalidKey", func(t *testing.T) {
|
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/numnodes", "badkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
defer response.Body.Close()
|
|
||||||
var message models.ErrorResponse
|
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
|
||||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
|
||||||
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
|
||||||
})
|
|
||||||
t.Run("Badnetwork", func(t *testing.T) {
|
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/numnodes", "secretkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
defer response.Body.Close()
|
|
||||||
var message models.ErrorResponse
|
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
assert.Equal(t, "W1R3: This network does not exist.", message.Message)
|
|
||||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestDeletenetwork(t *testing.T) {
|
|
||||||
t.Run("InvalidKey", func(t *testing.T) {
|
t.Run("InvalidKey", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet", "badkey")
|
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet", "badkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
@@ -173,14 +150,14 @@ func TestDeletenetwork(t *testing.T) {
|
|||||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("NodesExist", func(t *testing.T) {
|
t.Run("NodesExist", func(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestCreateAccessKey(t *testing.T) {
|
func TestCreateKey(t *testing.T) {
|
||||||
if !networkExists(t) {
|
//ensure we are working with known networks
|
||||||
|
deleteNetworks(t)
|
||||||
createNetwork(t)
|
createNetwork(t)
|
||||||
}
|
|
||||||
|
|
||||||
key := models.AccessKey{}
|
key := models.AccessKey{}
|
||||||
key.Name = "skynet"
|
key.Name = "skynet"
|
||||||
@@ -199,7 +176,7 @@ func TestCreateAccessKey(t *testing.T) {
|
|||||||
})
|
})
|
||||||
deleteKey(t, "skynet", "skynet")
|
deleteKey(t, "skynet", "skynet")
|
||||||
t.Run("ZeroUse", func(t *testing.T) {
|
t.Run("ZeroUse", func(t *testing.T) {
|
||||||
//t.Skip()
|
//
|
||||||
key.Uses = 0
|
key.Uses = 0
|
||||||
response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
|
response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
@@ -244,6 +221,11 @@ func TestCreateAccessKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteKey(t *testing.T) {
|
func TestDeleteKey(t *testing.T) {
|
||||||
|
//ensure we are working with known networks
|
||||||
|
deleteNetworks(t)
|
||||||
|
createNetwork(t)
|
||||||
|
//ensure key exists
|
||||||
|
createKey(t)
|
||||||
t.Run("KeyValid", func(t *testing.T) {
|
t.Run("KeyValid", func(t *testing.T) {
|
||||||
//fails -- deletecount not returned
|
//fails -- deletecount not returned
|
||||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/skynet", "secretkey")
|
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/skynet", "secretkey")
|
||||||
@@ -259,16 +241,15 @@ func TestDeleteKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
t.Run("InValidKey", func(t *testing.T) {
|
t.Run("InValidKey", func(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
//responds ok, will nil record returned.. should be an error.
|
|
||||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/badkey", "secretkey")
|
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/badkey", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, "W1R3: This key does not exist.", message.Message)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
assert.Equal(t, "key badkey does not exist", message.Message)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("KeyInValidnetwork", func(t *testing.T) {
|
t.Run("KeyInValidnetwork", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/badnetwork/keys/skynet", "secretkey")
|
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/badnetwork/keys/skynet", "secretkey")
|
||||||
@@ -294,6 +275,9 @@ func TestDeleteKey(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestGetKeys(t *testing.T) {
|
func TestGetKeys(t *testing.T) {
|
||||||
|
//ensure we are working with known networks
|
||||||
|
deleteNetworks(t)
|
||||||
|
createNetwork(t)
|
||||||
createKey(t)
|
createKey(t)
|
||||||
t.Run("Valid", func(t *testing.T) {
|
t.Run("Valid", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
|
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/skynet/keys", "secretkey")
|
||||||
@@ -304,7 +288,6 @@ func TestGetKeys(t *testing.T) {
|
|||||||
err = json.NewDecoder(response.Body).Decode(&keys)
|
err = json.NewDecoder(response.Body).Decode(&keys)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
})
|
})
|
||||||
//deletekeys
|
|
||||||
t.Run("Invalidnetwork", func(t *testing.T) {
|
t.Run("Invalidnetwork", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/keys", "secretkey")
|
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/keys", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
@@ -328,7 +311,7 @@ func TestGetKeys(t *testing.T) {
|
|||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestUpdatenetwork(t *testing.T) {
|
func TestUpdateNetwork(t *testing.T) {
|
||||||
//ensure we are working with known networks
|
//ensure we are working with known networks
|
||||||
deleteNetworks(t)
|
deleteNetworks(t)
|
||||||
createNetwork(t)
|
createNetwork(t)
|
||||||
@@ -341,28 +324,13 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
network.NetID = "wirecat"
|
network.NetID = "wirecat"
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
//returns previous value not the updated value
|
|
||||||
// ----- needs fixing -----
|
|
||||||
//assert.Equal(t, network.NetID, returnedNetwork.NetID)
|
|
||||||
})
|
|
||||||
t.Run("NetIDInvalidCredentials", func(t *testing.T) {
|
|
||||||
type Network struct {
|
|
||||||
NetID string
|
|
||||||
}
|
|
||||||
var network Network
|
|
||||||
network.NetID = "wirecat"
|
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "badkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
assert.Equal(t, "NetID is not editable", message.Message)
|
||||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
|
||||||
})
|
})
|
||||||
t.Run("Invalidnetwork", func(t *testing.T) {
|
t.Run("Invalidnetwork", func(t *testing.T) {
|
||||||
type Network struct {
|
type Network struct {
|
||||||
@@ -380,19 +348,6 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
assert.Equal(t, "W1R3: This network does not exist.", message.Message)
|
assert.Equal(t, "W1R3: This network does not exist.", message.Message)
|
||||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("UpdateNetIDTooLong", func(t *testing.T) {
|
|
||||||
// ---- needs fixing -----
|
|
||||||
// succeeds for some reason
|
|
||||||
t.Skip()
|
|
||||||
type Network struct {
|
|
||||||
NetID string
|
|
||||||
}
|
|
||||||
var network Network
|
|
||||||
network.NetID = "wirecat-skynet"
|
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
|
||||||
assert.Nil(t, err, err)
|
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
|
||||||
})
|
|
||||||
t.Run("UpdateAddress", func(t *testing.T) {
|
t.Run("UpdateAddress", func(t *testing.T) {
|
||||||
type Network struct {
|
type Network struct {
|
||||||
AddressRange string
|
AddressRange string
|
||||||
@@ -415,13 +370,13 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
network.AddressRange = "10.0.0.1/36"
|
network.AddressRange = "10.0.0.1/36"
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusInternalServerError, message.Code)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Contains(t, message.Message, "Invalid Range")
|
assert.Contains(t, message.Message, "validation for 'AddressRange' failed")
|
||||||
|
|
||||||
})
|
})
|
||||||
t.Run("UpdateDisplayName", func(t *testing.T) {
|
t.Run("UpdateDisplayName", func(t *testing.T) {
|
||||||
@@ -440,9 +395,6 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
|
|
||||||
})
|
})
|
||||||
t.Run("UpdateDisplayNameInvalidName", func(t *testing.T) {
|
t.Run("UpdateDisplayNameInvalidName", func(t *testing.T) {
|
||||||
// -----needs fixing ----
|
|
||||||
// fails silently
|
|
||||||
t.Skip()
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DisplayName string
|
DisplayName string
|
||||||
}
|
}
|
||||||
@@ -455,12 +407,12 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
network.DisplayName = name
|
network.DisplayName = name
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Equal(t, "W1R3: Field validation for 'DisplayName' failed.", message.Message)
|
assert.Contains(t, message.Message, "Field validation for 'DisplayName' failed")
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
|
||||||
})
|
})
|
||||||
t.Run("UpdateInterface", func(t *testing.T) {
|
t.Run("UpdateInterface", func(t *testing.T) {
|
||||||
type Network struct {
|
type Network struct {
|
||||||
@@ -492,9 +444,6 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
assert.Equal(t, network.DefaultListenPort, returnedNetwork.DefaultListenPort)
|
assert.Equal(t, network.DefaultListenPort, returnedNetwork.DefaultListenPort)
|
||||||
})
|
})
|
||||||
t.Run("UpdateListenPortInvalidPort", func(t *testing.T) {
|
t.Run("UpdateListenPortInvalidPort", func(t *testing.T) {
|
||||||
// ---needs fixing -----
|
|
||||||
// value is updated anyways
|
|
||||||
t.Skip()
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DefaultListenPort int32
|
DefaultListenPort int32
|
||||||
}
|
}
|
||||||
@@ -505,9 +454,9 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Equal(t, "W1R3: Field validation for 'DefaultListenPort' failed.", message.Message)
|
assert.Contains(t, message.Message, "Field validation for 'DefaultListenPort' failed")
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("UpdatePostUP", func(t *testing.T) {
|
t.Run("UpdatePostUP", func(t *testing.T) {
|
||||||
type Network struct {
|
type Network struct {
|
||||||
@@ -527,19 +476,19 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
// -------needs fixing ------
|
// -------needs fixing ------
|
||||||
// mismatch in models.Network between struc name and json/bson name
|
// mismatch in models.Network between struc name and json/bson name
|
||||||
// does not get updated.
|
// does not get updated.
|
||||||
t.Skip()
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DefaultPostDown string
|
DefaultPreUp string
|
||||||
}
|
}
|
||||||
var network Network
|
var network Network
|
||||||
network.DefaultPostDown = "test string"
|
network.DefaultPreUp = "test string"
|
||||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, network.DefaultPostDown, returnedNetwork.DefaultPostDown)
|
assert.Equal(t, network.DefaultPreUp, returnedNetwork.DefaultPostDown)
|
||||||
})
|
})
|
||||||
t.Run("UpdateKeepAlive", func(t *testing.T) {
|
t.Run("UpdateKeepAlive", func(t *testing.T) {
|
||||||
type Network struct {
|
type Network struct {
|
||||||
@@ -556,7 +505,7 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
assert.Equal(t, network.DefaultKeepalive, returnedNetwork.DefaultKeepalive)
|
assert.Equal(t, network.DefaultKeepalive, returnedNetwork.DefaultKeepalive)
|
||||||
})
|
})
|
||||||
t.Run("UpdateKeepAliveTooBig", func(t *testing.T) {
|
t.Run("UpdateKeepAliveTooBig", func(t *testing.T) {
|
||||||
//fails silently
|
//does not fails ----- value gets updated.
|
||||||
// ----- needs fixing -----
|
// ----- needs fixing -----
|
||||||
t.Skip()
|
t.Skip()
|
||||||
type Network struct {
|
type Network struct {
|
||||||
@@ -569,13 +518,13 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
assert.Equal(t, "W1R3: Field validation for 'DefaultKeepAlive' failed.", message.Message)
|
assert.Contains(t, message.Message, "Field validation for 'DefaultKeepAlive' failed")
|
||||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("UpdateSaveConfig", func(t *testing.T) {
|
t.Run("UpdateSaveConfig", func(t *testing.T) {
|
||||||
//causes panic
|
|
||||||
t.Skip()
|
t.Skip()
|
||||||
|
//does not appear to be updatable
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DefaultSaveConfig *bool
|
DefaultSaveConfig *bool
|
||||||
}
|
}
|
||||||
@@ -591,7 +540,6 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
assert.Equal(t, *network.DefaultSaveConfig, *returnedNetwork.DefaultSaveConfig)
|
assert.Equal(t, *network.DefaultSaveConfig, *returnedNetwork.DefaultSaveConfig)
|
||||||
})
|
})
|
||||||
t.Run("UpdateManualSignUP", func(t *testing.T) {
|
t.Run("UpdateManualSignUP", func(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
AllowManualSignUp *bool
|
AllowManualSignUp *bool
|
||||||
}
|
}
|
||||||
@@ -604,10 +552,10 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, *network.AllowManualSignUp, *returnedNetwork.AllowManualSignUp)
|
assert.Equal(t, network.AllowManualSignUp, returnedNetwork.AllowManualSignUp)
|
||||||
})
|
})
|
||||||
t.Run("DefaultCheckInterval", func(t *testing.T) {
|
t.Run("DefaultCheckInterval", func(t *testing.T) {
|
||||||
//value is not returned in struct ---
|
//value is not updated
|
||||||
t.Skip()
|
t.Skip()
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DefaultCheckInInterval int32
|
DefaultCheckInInterval int32
|
||||||
@@ -625,6 +573,7 @@ func TestUpdatenetwork(t *testing.T) {
|
|||||||
t.Run("DefaultCheckIntervalTooBig", func(t *testing.T) {
|
t.Run("DefaultCheckIntervalTooBig", func(t *testing.T) {
|
||||||
//value is not returned in struct ---
|
//value is not returned in struct ---
|
||||||
t.Skip()
|
t.Skip()
|
||||||
|
|
||||||
type Network struct {
|
type Network struct {
|
||||||
DefaultCheckInInterval int32
|
DefaultCheckInInterval int32
|
||||||
}
|
}
|
||||||
|
@@ -40,13 +40,10 @@ func TestAdminCreation(t *testing.T) {
|
|||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
t.Log(message)
|
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||||
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
|
assert.Equal(t, "W1R3: Admin already exists! ", message.Message)
|
||||||
data, _ := ioutil.ReadAll(response.Body)
|
|
||||||
t.Log(string(data))
|
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -58,13 +55,10 @@ func TestGetUser(t *testing.T) {
|
|||||||
} else {
|
} else {
|
||||||
t.Log("admin exists")
|
t.Log("admin exists")
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Run("GetUserWithValidToken", func(t *testing.T) {
|
t.Run("GetUserWithValidToken", func(t *testing.T) {
|
||||||
t.Skip()
|
|
||||||
token, err := authenticate(t)
|
token, err := authenticate(t)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", token)
|
response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", token)
|
||||||
t.Log(response)
|
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
var user models.User
|
var user models.User
|
||||||
@@ -74,10 +68,16 @@ func TestGetUser(t *testing.T) {
|
|||||||
assert.Equal(t, true, user.IsAdmin)
|
assert.Equal(t, true, user.IsAdmin)
|
||||||
})
|
})
|
||||||
t.Run("GetUserWithInvalidToken", func(t *testing.T) {
|
t.Run("GetUserWithInvalidToken", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", "secretkey")
|
response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", "badkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
t.Log(response.Body)
|
var message models.ErrorResponse
|
||||||
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||||
|
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||||
|
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
|
||||||
|
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -93,7 +93,7 @@ func TestUpdateUser(t *testing.T) {
|
|||||||
t.Run("UpdateWrongToken", func(t *testing.T) {
|
t.Run("UpdateWrongToken", func(t *testing.T) {
|
||||||
admin.UserName = "admin"
|
admin.UserName = "admin"
|
||||||
admin.Password = "admin"
|
admin.Password = "admin"
|
||||||
response, err := api(t, admin, http.MethodPut, "http://localhost:8081/api/users/admin", "secretkey")
|
response, err := api(t, admin, http.MethodPut, "http://localhost:8081/api/users/admin", "badkey")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
defer response.Body.Close()
|
defer response.Body.Close()
|
||||||
err = json.NewDecoder(response.Body).Decode(&message)
|
err = json.NewDecoder(response.Body).Decode(&message)
|
||||||
@@ -113,26 +113,20 @@ func TestUpdateUser(t *testing.T) {
|
|||||||
assert.Equal(t, true, user.IsAdmin)
|
assert.Equal(t, true, user.IsAdmin)
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||||
})
|
})
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestDeleteUser(t *testing.T) {
|
func TestDeleteUser(t *testing.T) {
|
||||||
|
|
||||||
if !adminExists(t) {
|
if !adminExists(t) {
|
||||||
|
t.Log("Creating Admin")
|
||||||
addAdmin(t)
|
addAdmin(t)
|
||||||
}
|
}
|
||||||
token, err := authenticate(t)
|
token, err := authenticate(t)
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
t.Run("DeleteUser-WongAdmin", func(t *testing.T) {
|
|
||||||
//skip for now ... shouldn't panic
|
|
||||||
t.Skip()
|
|
||||||
function := func() {
|
|
||||||
_, _ = api(t, "", http.MethodDelete, "http://localhost:8081/api/users/xxxx", token)
|
|
||||||
}
|
|
||||||
assert.Panics(t, function, "")
|
|
||||||
})
|
|
||||||
t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
|
t.Run("DeleteUser-InvalidCredentials", func(t *testing.T) {
|
||||||
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", "secretkey")
|
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", "badcredentials")
|
||||||
assert.Nil(t, err, err)
|
assert.Nil(t, err, err)
|
||||||
|
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||||
var message models.ErrorResponse
|
var message models.ErrorResponse
|
||||||
json.NewDecoder(response.Body).Decode(&message)
|
json.NewDecoder(response.Body).Decode(&message)
|
||||||
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
|
assert.Equal(t, "W1R3: Error Verifying Auth Token.", message.Message)
|
||||||
@@ -146,17 +140,20 @@ func TestDeleteUser(t *testing.T) {
|
|||||||
assert.Equal(t, "admin deleted.", body)
|
assert.Equal(t, "admin deleted.", body)
|
||||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||||
})
|
})
|
||||||
t.Run("DeleteUser-NoAdmin", func(t *testing.T) {
|
t.Run("DeleteUser-NonExistantAdmin", func(t *testing.T) {
|
||||||
//skip for now ... shouldn't panic
|
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
|
||||||
t.Skip()
|
assert.Nil(t, err, err)
|
||||||
function := func() {
|
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||||
_, _ = api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
|
var message models.ErrorResponse
|
||||||
}
|
defer response.Body.Close()
|
||||||
assert.Panics(t, function, "")
|
json.NewDecoder(response.Body).Decode(&message)
|
||||||
|
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||||
|
assert.Equal(t, "Delete unsuccessful.", message.Message)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestAuthenticateUser(t *testing.T) {
|
func TestAuthenticateUser(t *testing.T) {
|
||||||
|
|
||||||
cases := []AuthorizeTestCase{
|
cases := []AuthorizeTestCase{
|
||||||
AuthorizeTestCase{
|
AuthorizeTestCase{
|
||||||
testname: "Invalid User",
|
testname: "Invalid User",
|
||||||
@@ -199,7 +196,6 @@ func TestAuthenticateUser(t *testing.T) {
|
|||||||
errMessage: "W1R3: Device Admin Authorized",
|
errMessage: "W1R3: Device Admin Authorized",
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
if !adminExists(t) {
|
if !adminExists(t) {
|
||||||
addAdmin(t)
|
addAdmin(t)
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user