mirror of
https://github.com/gravitl/netmaker.git
synced 2025-10-07 01:36:23 +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
|
||||
|
||||
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"
|
||||
"encoding/base64"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"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/mongo/options"
|
||||
"github.com/gravitl/netmaker/config"
|
||||
"gopkg.in/go-playground/validator.v9"
|
||||
)
|
||||
|
||||
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
|
||||
func authenticateMaster(tokenString string) bool {
|
||||
if tokenString == config.Config.Server.MasterKey {
|
||||
@@ -210,7 +212,6 @@ func keyUpdate(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
network.KeyUpdateTimeStamp = time.Now().Unix()
|
||||
|
||||
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)
|
||||
filter := bson.M{"netid": netid}
|
||||
|
||||
|
||||
var network models.Network
|
||||
|
||||
network, err := functions.GetParentNetwork(netid)
|
||||
@@ -308,7 +308,6 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
networkChange.NetID = network.NetID
|
||||
}
|
||||
|
||||
|
||||
err = validateNetworkUpdate(networkChange)
|
||||
if err != nil {
|
||||
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.
|
||||
//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 != "" {
|
||||
|
||||
network.AddressRange = networkChange.AddressRange
|
||||
@@ -387,7 +390,6 @@ func updateNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
if haschange {
|
||||
network.SetNetworkLastModified()
|
||||
}
|
||||
|
||||
// prepare update model.
|
||||
update := 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
|
||||
//Need to implement some better validation across the board
|
||||
|
||||
if network.IsLocal == nil {
|
||||
falsevar := false
|
||||
network.IsLocal = &falsevar
|
||||
@@ -516,7 +519,6 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
collection := mongoconn.Client.Database("netmaker").Collection("networks")
|
||||
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
|
||||
|
||||
|
||||
// insert our network into the network table
|
||||
result, err := collection.InsertOne(ctx, network)
|
||||
|
||||
@@ -532,7 +534,6 @@ func createNetwork(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
// BEGIN KEY MANAGEMENT SECTION
|
||||
|
||||
|
||||
//TODO: Very little error handling
|
||||
//accesskey is created as a json string inside the Network collection item in mongo
|
||||
func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
||||
@@ -563,6 +564,7 @@ func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
||||
if accesskey.Value == "" {
|
||||
accesskey.Value = functions.GenKey()
|
||||
}
|
||||
|
||||
if accesskey.Uses == 0 {
|
||||
accesskey.Uses = 1
|
||||
}
|
||||
@@ -577,7 +579,6 @@ func createAccessKey(w http.ResponseWriter, r *http.Request) {
|
||||
privAddr = network.LocalRange
|
||||
}
|
||||
|
||||
|
||||
netID := params["networkname"]
|
||||
address := gconf.ServerGRPC + gconf.PortGRPC
|
||||
|
||||
@@ -653,7 +654,6 @@ func getAccessKeys(w http.ResponseWriter, r *http.Request) {
|
||||
json.NewEncoder(w).Encode(keys)
|
||||
}
|
||||
|
||||
|
||||
//delete key. Has to do a little funky logic since it's not a collection item
|
||||
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
|
||||
//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-- {
|
||||
|
||||
currentkey := network.AccessKeys[i]
|
||||
if currentkey.Name == keyname {
|
||||
network.AccessKeys = append(network.AccessKeys[:i],
|
||||
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")
|
||||
|
||||
|
@@ -1,24 +1,24 @@
|
||||
package controller
|
||||
|
||||
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"
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"github.com/gorilla/mux"
|
||||
"go.mongodb.org/mongo-driver/bson"
|
||||
"go.mongodb.org/mongo-driver/mongo/options"
|
||||
"go.mongodb.org/mongo-driver/mongo"
|
||||
)
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
"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) {
|
||||
|
||||
@@ -346,7 +346,6 @@ func UpdateUser(userchange models.User, user models.User) (models.User, error) {
|
||||
|
||||
fmt.Println("Updating User " + user.UserName)
|
||||
|
||||
|
||||
// prepare update model.
|
||||
update := bson.D{
|
||||
{"$set", bson.D{
|
||||
@@ -384,7 +383,6 @@ func updateUser(w http.ResponseWriter, r *http.Request) {
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
var userchange models.User
|
||||
|
||||
// we decode our body request params
|
||||
@@ -447,15 +445,12 @@ func deleteUser(w http.ResponseWriter, r *http.Request) {
|
||||
|
||||
if err != nil {
|
||||
returnErrorResponse(w, r, formatError(err, "internal"))
|
||||
json.NewEncoder(w).Encode("Could not delete user " + params["username"])
|
||||
return
|
||||
} else if !success {
|
||||
returnErrorResponse(w, r, formatError(errors.New("Delete unsuccessful."), "internal"))
|
||||
json.NewEncoder(w).Encode("Could not delete user " + params["username"])
|
||||
returnErrorResponse(w, r, formatError(errors.New("Delete unsuccessful."), "badrequest"))
|
||||
return
|
||||
}
|
||||
|
||||
|
||||
json.NewEncoder(w).Encode(params["username"] + " deleted.")
|
||||
}
|
||||
|
||||
|
@@ -3,7 +3,7 @@ set -e
|
||||
|
||||
[ -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
|
||||
sudo ./netclient -c install -t $KEY
|
||||
rm -f netclient
|
||||
|
@@ -2,6 +2,7 @@ package main
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"encoding/json"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
@@ -50,6 +51,19 @@ func TestMain(m *testing.M) {
|
||||
var waitgroup sync.WaitGroup
|
||||
waitgroup.Add(1)
|
||||
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
|
||||
time.Sleep(time.Second * 1)
|
||||
os.Exit(m.Run())
|
||||
@@ -178,12 +192,16 @@ func networkExists(t *testing.T) bool {
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
err = json.NewDecoder(response.Body).Decode(&Networks)
|
||||
assert.Nil(t, err, err)
|
||||
if Networks == nil {
|
||||
for i, network := range Networks {
|
||||
t.Log(i, network)
|
||||
if network.NetID == "" {
|
||||
return false
|
||||
} else {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
func deleteNetworks(t *testing.T) {
|
||||
|
||||
@@ -194,7 +212,7 @@ func deleteNetworks(t *testing.T) {
|
||||
err = json.NewDecoder(response.Body).Decode(&Networks)
|
||||
assert.Nil(t, err, err)
|
||||
for _, network := range Networks {
|
||||
name := network.DisplayName
|
||||
name := network.NetID
|
||||
_, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/"+name, "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
}
|
||||
|
@@ -12,15 +12,13 @@ import (
|
||||
)
|
||||
|
||||
func TestCreateNetwork(t *testing.T) {
|
||||
|
||||
network := models.Network{}
|
||||
network.NetID = "skynet"
|
||||
network.AddressRange = "10.71.0.0/16"
|
||||
if networkExists(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) {
|
||||
response, err := api(t, network, http.MethodPost, baseURL+"/api/networks", "badkey")
|
||||
assert.Nil(t, err, err)
|
||||
@@ -32,21 +30,34 @@ func TestCreateNetwork(t *testing.T) {
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
||||
})
|
||||
t.Run("BadName", func(t *testing.T) {
|
||||
//issue #42
|
||||
t.Skip()
|
||||
})
|
||||
t.Run("BadAddress", func(t *testing.T) {
|
||||
//issue #42
|
||||
t.Skip()
|
||||
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("DuplicateNetwork", func(t *testing.T) {
|
||||
//issue #42
|
||||
t.Skip()
|
||||
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("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) {
|
||||
|
||||
t.Run("ValidToken", func(t *testing.T) {
|
||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
@@ -69,6 +80,7 @@ func TestGetNetworks(t *testing.T) {
|
||||
}
|
||||
|
||||
func TestGetNetwork(t *testing.T) {
|
||||
|
||||
t.Run("ValidToken", func(t *testing.T) {
|
||||
var network models.Network
|
||||
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) {
|
||||
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 TestDeleteMetwork(t *testing.T) {
|
||||
|
||||
func TestDeletenetwork(t *testing.T) {
|
||||
t.Run("InvalidKey", func(t *testing.T) {
|
||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet", "badkey")
|
||||
assert.Nil(t, err, err)
|
||||
@@ -173,14 +150,14 @@ func TestDeletenetwork(t *testing.T) {
|
||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
||||
})
|
||||
t.Run("NodesExist", func(t *testing.T) {
|
||||
t.Skip()
|
||||
|
||||
})
|
||||
}
|
||||
|
||||
func TestCreateAccessKey(t *testing.T) {
|
||||
if !networkExists(t) {
|
||||
func TestCreateKey(t *testing.T) {
|
||||
//ensure we are working with known networks
|
||||
deleteNetworks(t)
|
||||
createNetwork(t)
|
||||
}
|
||||
|
||||
key := models.AccessKey{}
|
||||
key.Name = "skynet"
|
||||
@@ -199,7 +176,7 @@ func TestCreateAccessKey(t *testing.T) {
|
||||
})
|
||||
deleteKey(t, "skynet", "skynet")
|
||||
t.Run("ZeroUse", func(t *testing.T) {
|
||||
//t.Skip()
|
||||
//
|
||||
key.Uses = 0
|
||||
response, err := api(t, key, http.MethodPost, baseURL+"/api/networks/skynet/keys", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
@@ -244,6 +221,11 @@ func TestCreateAccessKey(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) {
|
||||
//fails -- deletecount not returned
|
||||
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.Skip()
|
||||
//responds ok, will nil record returned.. should be an error.
|
||||
response, err := api(t, "", http.MethodDelete, baseURL+"/api/networks/skynet/keys/badkey", "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 key does not exist.", message.Message)
|
||||
assert.Equal(t, http.StatusNotFound, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Equal(t, "key badkey does not exist", message.Message)
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
})
|
||||
t.Run("KeyInValidnetwork", func(t *testing.T) {
|
||||
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) {
|
||||
//ensure we are working with known networks
|
||||
deleteNetworks(t)
|
||||
createNetwork(t)
|
||||
createKey(t)
|
||||
t.Run("Valid", func(t *testing.T) {
|
||||
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)
|
||||
assert.Nil(t, err, err)
|
||||
})
|
||||
//deletekeys
|
||||
t.Run("Invalidnetwork", func(t *testing.T) {
|
||||
response, err := api(t, "", http.MethodGet, baseURL+"/api/networks/badnetwork/keys", "secretkey")
|
||||
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
|
||||
deleteNetworks(t)
|
||||
createNetwork(t)
|
||||
@@ -341,28 +324,13 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
network.NetID = "wirecat"
|
||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
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
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
assert.Equal(t, "W1R3: You are unauthorized to access this endpoint.", message.Message)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Equal(t, "NetID is not editable", message.Message)
|
||||
})
|
||||
t.Run("Invalidnetwork", func(t *testing.T) {
|
||||
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, 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) {
|
||||
type Network struct {
|
||||
AddressRange string
|
||||
@@ -415,13 +370,13 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
network.AddressRange = "10.0.0.1/36"
|
||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusInternalServerError, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
defer response.Body.Close()
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusInternalServerError, message.Code)
|
||||
assert.Contains(t, message.Message, "Invalid Range")
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Contains(t, message.Message, "validation for 'AddressRange' failed")
|
||||
|
||||
})
|
||||
t.Run("UpdateDisplayName", func(t *testing.T) {
|
||||
@@ -440,9 +395,6 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
|
||||
})
|
||||
t.Run("UpdateDisplayNameInvalidName", func(t *testing.T) {
|
||||
// -----needs fixing ----
|
||||
// fails silently
|
||||
t.Skip()
|
||||
type Network struct {
|
||||
DisplayName string
|
||||
}
|
||||
@@ -455,12 +407,12 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
network.DisplayName = name
|
||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
||||
assert.Equal(t, "W1R3: Field validation for 'DisplayName' failed.", message.Message)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Contains(t, message.Message, "Field validation for 'DisplayName' failed")
|
||||
})
|
||||
t.Run("UpdateInterface", func(t *testing.T) {
|
||||
type Network struct {
|
||||
@@ -492,9 +444,6 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
assert.Equal(t, network.DefaultListenPort, returnedNetwork.DefaultListenPort)
|
||||
})
|
||||
t.Run("UpdateListenPortInvalidPort", func(t *testing.T) {
|
||||
// ---needs fixing -----
|
||||
// value is updated anyways
|
||||
t.Skip()
|
||||
type Network struct {
|
||||
DefaultListenPort int32
|
||||
}
|
||||
@@ -505,9 +454,9 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
||||
assert.Equal(t, "W1R3: Field validation for 'DefaultListenPort' failed.", message.Message)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Contains(t, message.Message, "Field validation for 'DefaultListenPort' failed")
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
})
|
||||
t.Run("UpdatePostUP", func(t *testing.T) {
|
||||
type Network struct {
|
||||
@@ -527,19 +476,19 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
// -------needs fixing ------
|
||||
// mismatch in models.Network between struc name and json/bson name
|
||||
// does not get updated.
|
||||
t.Skip()
|
||||
|
||||
type Network struct {
|
||||
DefaultPostDown string
|
||||
DefaultPreUp string
|
||||
}
|
||||
var network Network
|
||||
network.DefaultPostDown = "test string"
|
||||
network.DefaultPreUp = "test string"
|
||||
response, err := api(t, network, http.MethodPut, baseURL+"/api/networks/skynet", "secretkey")
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusOK, response.StatusCode)
|
||||
defer response.Body.Close()
|
||||
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
||||
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) {
|
||||
type Network struct {
|
||||
@@ -556,7 +505,7 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
assert.Equal(t, network.DefaultKeepalive, returnedNetwork.DefaultKeepalive)
|
||||
})
|
||||
t.Run("UpdateKeepAliveTooBig", func(t *testing.T) {
|
||||
//fails silently
|
||||
//does not fails ----- value gets updated.
|
||||
// ----- needs fixing -----
|
||||
t.Skip()
|
||||
type Network struct {
|
||||
@@ -569,13 +518,13 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, message.Code)
|
||||
assert.Equal(t, "W1R3: Field validation for 'DefaultKeepAlive' failed.", message.Message)
|
||||
assert.Equal(t, http.StatusUnprocessableEntity, response.StatusCode)
|
||||
assert.Equal(t, http.StatusBadRequest, message.Code)
|
||||
assert.Contains(t, message.Message, "Field validation for 'DefaultKeepAlive' failed")
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
})
|
||||
t.Run("UpdateSaveConfig", func(t *testing.T) {
|
||||
//causes panic
|
||||
t.Skip()
|
||||
//does not appear to be updatable
|
||||
type Network struct {
|
||||
DefaultSaveConfig *bool
|
||||
}
|
||||
@@ -591,7 +540,6 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
assert.Equal(t, *network.DefaultSaveConfig, *returnedNetwork.DefaultSaveConfig)
|
||||
})
|
||||
t.Run("UpdateManualSignUP", func(t *testing.T) {
|
||||
t.Skip()
|
||||
type Network struct {
|
||||
AllowManualSignUp *bool
|
||||
}
|
||||
@@ -604,10 +552,10 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
defer response.Body.Close()
|
||||
err = json.NewDecoder(response.Body).Decode(&returnedNetwork)
|
||||
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) {
|
||||
//value is not returned in struct ---
|
||||
//value is not updated
|
||||
t.Skip()
|
||||
type Network struct {
|
||||
DefaultCheckInInterval int32
|
||||
@@ -625,6 +573,7 @@ func TestUpdatenetwork(t *testing.T) {
|
||||
t.Run("DefaultCheckIntervalTooBig", func(t *testing.T) {
|
||||
//value is not returned in struct ---
|
||||
t.Skip()
|
||||
|
||||
type Network struct {
|
||||
DefaultCheckInInterval int32
|
||||
}
|
||||
|
@@ -40,13 +40,10 @@ func TestAdminCreation(t *testing.T) {
|
||||
defer response.Body.Close()
|
||||
var message models.ErrorResponse
|
||||
err = json.NewDecoder(response.Body).Decode(&message)
|
||||
t.Log(message)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
assert.Equal(t, http.StatusUnauthorized, message.Code)
|
||||
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 {
|
||||
t.Log("admin exists")
|
||||
}
|
||||
|
||||
t.Run("GetUserWithValidToken", func(t *testing.T) {
|
||||
t.Skip()
|
||||
token, err := authenticate(t)
|
||||
assert.Nil(t, err, err)
|
||||
response, err := api(t, "", http.MethodGet, "http://localhost:8081/api/users/admin", token)
|
||||
t.Log(response)
|
||||
assert.Nil(t, err, err)
|
||||
defer response.Body.Close()
|
||||
var user models.User
|
||||
@@ -74,10 +68,16 @@ func TestGetUser(t *testing.T) {
|
||||
assert.Equal(t, true, user.IsAdmin)
|
||||
})
|
||||
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)
|
||||
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) {
|
||||
admin.UserName = "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)
|
||||
defer response.Body.Close()
|
||||
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, http.StatusOK, response.StatusCode)
|
||||
})
|
||||
|
||||
}
|
||||
|
||||
func TestDeleteUser(t *testing.T) {
|
||||
|
||||
if !adminExists(t) {
|
||||
t.Log("Creating Admin")
|
||||
addAdmin(t)
|
||||
}
|
||||
token, err := authenticate(t)
|
||||
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) {
|
||||
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.Equal(t, http.StatusUnauthorized, response.StatusCode)
|
||||
var message models.ErrorResponse
|
||||
json.NewDecoder(response.Body).Decode(&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, http.StatusOK, response.StatusCode)
|
||||
})
|
||||
t.Run("DeleteUser-NoAdmin", func(t *testing.T) {
|
||||
//skip for now ... shouldn't panic
|
||||
t.Skip()
|
||||
function := func() {
|
||||
_, _ = api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
|
||||
}
|
||||
assert.Panics(t, function, "")
|
||||
t.Run("DeleteUser-NonExistantAdmin", func(t *testing.T) {
|
||||
response, err := api(t, "", http.MethodDelete, "http://localhost:8081/api/users/admin", token)
|
||||
assert.Nil(t, err, err)
|
||||
assert.Equal(t, http.StatusBadRequest, response.StatusCode)
|
||||
var message models.ErrorResponse
|
||||
defer response.Body.Close()
|
||||
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) {
|
||||
|
||||
cases := []AuthorizeTestCase{
|
||||
AuthorizeTestCase{
|
||||
testname: "Invalid User",
|
||||
@@ -199,7 +196,6 @@ func TestAuthenticateUser(t *testing.T) {
|
||||
errMessage: "W1R3: Device Admin Authorized",
|
||||
},
|
||||
}
|
||||
|
||||
if !adminExists(t) {
|
||||
addAdmin(t)
|
||||
}
|
||||
|
Reference in New Issue
Block a user