go-common/app/admin/ep/merlin/dao/mysql_machine_test.go
2019-04-22 18:49:16 +08:00

566 lines
15 KiB
Go

package dao
import (
"testing"
"time"
"go-common/app/admin/ep/merlin/model"
"go-common/library/log"
. "github.com/smartystreets/goconvey/convey"
)
var tMachine *model.Machine
func machineFunc(f func()) func() {
return func() {
beforeAllMT()
defer afterAllMT()
f()
}
}
func beforeAllMT() {
var err error
tMachine = &model.Machine{
Name: "test-machine-1",
PodName: "test-machine-0-0",
Status: 100,
Username: "seanan",
BusinessUnit: "test",
Project: "ep",
App: "merlin",
ClusterID: 3,
NetworkID: 5,
Comment: "Unit test for the dao of merlin.",
DelayStatus: 0,
}
if err = d.db.Create(tMachine).Error; err != nil {
log.Error("Failed to init machine(%v) for test, err(%v)", tMachine, err)
return
}
if err = d.db.Create(&model.MachineNode{MachineID: tMachine.ID, BusinessUnit: tMachine.BusinessUnit, Project: tMachine.Project, App: tMachine.App, TreeID: 1234}).Error; err != nil {
log.Error("Failed to init machine node for test, err(%v)", tMachine, err)
return
}
}
func afterAllMT() {
var err error
if err = d.db.Where("name = ?", tMachine.Name).Delete(&model.Machine{}).Error; err != nil {
log.Error("Failed to delete machine(%v) for test, err(%v)", tMachine, err)
return
}
if err = d.db.Where("machine_id = ?", tMachine.ID).Delete(&model.MachineNode{}).Error; err != nil {
log.Error("Failed to delete machine node for test, err(%v)", err)
return
}
}
func TestFindExpiredMachineByDay(t *testing.T) {
Convey("The actualMachines must contain tMachine when deadline day is 0", t, machineFunc(func() {
var err error
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("end_time", time.Now()).Error; err != nil {
log.Error("Cannot update the end_time of tMachine")
return
}
actualMachines, err := d.FindExpiredMachineByDay(0)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("The actualMachines must not contain tMachine when deadline day is not 0", t, machineFunc(func() {
var err error
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("end_time", time.Now()).Error; err != nil {
log.Error("Cannot update the end_time of tMachine")
return
}
actualMachines, err := d.FindExpiredMachineByDay(1)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
So(true, ShouldBeFalse)
return
}
}
}))
}
func TestFindExpiredMachine(t *testing.T) {
Convey("The actualMachines must contain tMachine", t, machineFunc(func() {
var err error
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("end_time", time.Now().AddDate(0, 0, 1)).Error; err != nil {
log.Error("Cannot update the end_time of tMachine")
return
}
actualMachines, err := d.FindExpiredMachine()
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("The actualMachines must not contain tMachine", t, machineFunc(func() {
actualMachines, err := d.FindExpiredMachine()
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
So(true, ShouldBeFalse)
return
}
}
}))
}
func TestQueryMachine(t *testing.T) {
Convey("The actualMachines must be tMachine when id is the id of tMachine", t, machineFunc(func() {
actualMachines, err := d.QueryMachine(tMachine.ID)
So(err, ShouldBeNil)
So(actualMachines.ID, ShouldEqual, tMachine.ID)
}))
Convey("The actualMachines must not be tMachine when id is not the id of tMachine", t, machineFunc(func() {
_, err := d.QueryMachine(0)
So(err, ShouldNotBeNil)
}))
}
// TestDelMachine this test only need positive test because negative case is filtered by service
func TestDelMachine(t *testing.T) {
Convey("The tMachine must be delete", t, machineFunc(func() {
var (
actual = &model.Machine{}
updateBy = "seanan"
)
err := d.DelMachine(tMachine.ID, updateBy)
So(err, ShouldBeNil)
d.db.Where("id = ?", tMachine.ID).Find(actual)
So(actual.Status, ShouldEqual, model.RemovedMachineInMerlin)
So(actual.UpdateBy, ShouldEqual, updateBy)
}))
}
// TestHasMachine HasMachine is fuzzy matching name which is end with -number
func TestHasMachine(t *testing.T) {
Convey("return true when machine existed", t, machineFunc(func() {
b, err := d.HasMachine("test-machine")
So(err, ShouldBeNil)
So(b, ShouldBeTrue)
}))
Convey("return false when machine does not exist", t, machineFunc(func() {
b, err := d.HasMachine("no-test-machine")
So(err, ShouldBeNil)
So(b, ShouldBeFalse)
}))
}
func TestUpdateMachineStatus(t *testing.T) {
Convey("The machine status must be boot", t, machineFunc(func() {
var (
err error
actualMachine = &model.Machine{}
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Error; err != nil {
return
}
err = d.UpdateMachineStatus(tMachine.ID, model.BootMachineInMerlin)
So(err, ShouldBeNil)
if err = d.db.Where("id = ?", tMachine.ID).First(actualMachine).Error; err != nil {
log.Error("find machine err(%v)", err)
return
}
So(actualMachine.Status, ShouldEqual, model.BootMachineInMerlin)
}))
}
func TestQueryMachines(t *testing.T) {
Convey("Find the boot machines by names", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Find the creating machines by requester", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
Requester: "seanan",
}
actualMachines []*model.Machine
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Error; err != nil {
return
}
_, actualMachines, err = d.QueryMachines(nil, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Cannot find the creating machines by other requester", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
Requester: "other",
}
actualMachines []*model.Machine
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Error; err != nil {
return
}
_, actualMachines, err = d.QueryMachines(nil, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
So(true, ShouldBeFalse)
return
}
}
}))
Convey("Find the machines filter by username", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
Username: "sean",
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Find the machines filter by machine name", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
MachineName: "test-machine",
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Find the machines filter by BusinessUnit", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
TreeNode: model.TreeNode{
BusinessUnit: "test",
},
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Find the machines filter by BusinessUnit and Project", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
TreeNode: model.TreeNode{
BusinessUnit: "test",
Project: "ep",
},
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("Find the machines filter by BusinessUnit, Project and App", t, machineFunc(func() {
var (
err error
qmr = &model.QueryMachineRequest{
Pagination: model.Pagination{
PageSize: 5,
PageNum: 1,
},
TreeNode: model.TreeNode{
BusinessUnit: "test",
Project: "ep",
App: "merlin",
},
}
names = []string{"test-machine-0-0"}
actualMachines []*model.Machine
)
_, actualMachines, err = d.QueryMachines(names, qmr)
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.Name == tMachine.Name {
return
}
}
So(true, ShouldBeFalse)
}))
}
func TestUpdateMachineEndTime(t *testing.T) {
Convey("The EndTime and DelayStatus should be updated", t, machineFunc(func() {
var (
actualMachine = &model.Machine{}
expectTime = time.Now().AddDate(0, 1, 0)
expectDelayStatus = 1
err error
)
err = d.UpdateMachineEndTime(tMachine.ID, expectDelayStatus, expectTime)
So(err, ShouldBeNil)
if err = d.db.Where("id = ?", tMachine.ID).First(actualMachine).Error; err != nil {
log.Error("find machine err(%v)", err)
return
}
So(actualMachine.EndTime.Format("2006-01-02 15:04:05"), ShouldEqual, expectTime.Format("2006-01-02 15:04:05"))
So(actualMachine.DelayStatus, ShouldEqual, expectDelayStatus)
}))
}
func TestUpdateMachineDelayStatus(t *testing.T) {
Convey("The DelayStatus should be updated", t, machineFunc(func() {
var (
actualMachine = &model.Machine{}
expectDelayStatus = 1
err error
)
err = d.UpdateMachineDelayStatus(tMachine.ID, expectDelayStatus)
So(err, ShouldBeNil)
if err = d.db.Where("id = ?", tMachine.ID).First(actualMachine).Error; err != nil {
log.Error("find machine err(%v)", err)
return
}
So(actualMachine.DelayStatus, ShouldEqual, expectDelayStatus)
}))
}
func TestQueryPathAndPodNamesMapping(t *testing.T) {
Convey("Find path and podNames mapping when the machine exceeds 20 minutes", t, machineFunc(func() {
var (
pathAndPodNames map[string][]string
err error
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Update("ctime", time.Now().AddDate(0, 0, -1)).Error; err != nil {
return
}
pathAndPodNames, err = d.QueryPathAndPodNamesMapping()
So(err, ShouldBeNil)
expectPath := tMachine.ToTreeNode().TreePath()
for _, pn := range pathAndPodNames[expectPath] {
if pn == tMachine.PodName {
return
}
}
So(true, ShouldBeFalse)
}))
Convey("cannot find path and podNames mapping when the machine does not exceed 20 minutes", t, machineFunc(func() {
var (
pathAndPodNames map[string][]string
err error
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Error; err != nil {
return
}
pathAndPodNames, err = d.QueryPathAndPodNamesMapping()
So(err, ShouldBeNil)
expectPath := tMachine.ToTreeNode().TreePath()
for _, pn := range pathAndPodNames[expectPath] {
if pn == tMachine.PodName {
So(true, ShouldBeFalse)
return
}
}
}))
}
func TestUpdateMachineStatusByPodNames(t *testing.T) {
Convey("cannot find path and podNames mapping when the machine does not exceed 20 minutes", t, machineFunc(func() {
var (
err error
actualMachine *model.Machine
expectStatus = model.BootMachineInMerlin
)
if err = d.db.Model(&model.Machine{}).Where("id = ?", tMachine.ID).Update("status", model.CreatingMachineInMerlin).Error; err != nil {
return
}
err = d.UpdateMachineStatusByPodNames([]string{tMachine.PodName}, expectStatus)
So(err, ShouldBeNil)
if err = d.db.Where("id = ?", tMachine.ID).First(actualMachine).Error; err != nil {
log.Error("find machine err(%v)", err)
return
}
So(actualMachine.Status, ShouldEqual, expectStatus)
}))
}
func TestQueryMachinesByPodNames(t *testing.T) {
Convey("cannot find path and podNames mapping when the machine does not exceed 20 minutes", t, machineFunc(func() {
var (
err error
actualMachines []*model.Machine
)
actualMachines, err = d.QueryMachinesByPodNames([]string{tMachine.PodName})
So(err, ShouldBeNil)
for _, m := range actualMachines {
if m.ID == tMachine.ID {
return
}
}
So(true, ShouldBeFalse)
}))
}
func TestInsertMachines(t *testing.T) {
Convey("Insert 2 machines", t, machineFunc(func() {
var (
testMachine2 = "test-machine-2"
testMachine3 = "test-machine-3"
ins = []*model.CreateInstance{
{
Instance: model.Instance{
InstanceName: testMachine2,
},
InstanceCreateStatus: model.CreatingMachineInPass,
}, {
Instance: model.Instance{
InstanceName: testMachine3,
},
InstanceCreateStatus: model.CreateFailedMachineInPaas,
},
}
u = "seanan"
gmr = &model.GenMachinesRequest{
Env: model.Env{
ClusterID: 1,
NetworkID: 1,
},
PaasMachine: model.PaasMachine{
Name: "test-machine",
Image: "test-Image",
CPURequest: 1000,
MemoryRequest: 1024,
DiskRequest: 20,
VolumnMount: "/data",
},
Nodes: []*model.Node{
{
BusinessUnit: "test",
Project: "ep",
App: "merlin",
TreeID: 1234,
},
},
Comment: "test",
Amount: 1,
}
err error
actualMachine []*model.Machine
flag = 0
)
err = d.InsertMachines(u, gmr, ins)
defer func() {
if err = d.db.Where("name IN (?)", []string{testMachine2, testMachine3}).Delete(&model.Machine{}).Error; err != nil {
log.Error("Failed to delete machine(%v) for test, err(%v)", tMachine, err)
return
}
}()
So(err, ShouldBeNil)
if err = d.db.Where("name IN (?)", []string{testMachine2, testMachine3}).Find(&actualMachine).Error; err != nil {
log.Error("Find machiens err(%v)", err)
return
}
for _, m := range actualMachine {
if m.Name == testMachine2 && m.Status == model.CreatingMachineInMerlin {
flag++
}
if m.Name == testMachine3 && m.Status == model.ImmediatelyFailedMachineInMerlin {
flag += 2
}
}
So(flag, ShouldEqual, 3)
}))
}