Skip to content

Commit

Permalink
Merge branch 'develop' into 246-show-migration-id-x-should-display-ac…
Browse files Browse the repository at this point in the history
…tive-migrations
  • Loading branch information
James F. Carter committed Mar 29, 2018
2 parents d7ca42c + 4871da9 commit 12a0786
Show file tree
Hide file tree
Showing 7 changed files with 255 additions and 3 deletions.
13 changes: 13 additions & 0 deletions cmd/bytemark/commands/admin/show.go
Original file line number Diff line number Diff line change
Expand Up @@ -245,6 +245,19 @@ func init() {
return c.OutputInDesiredForm(mj)
}),
},
{
Name: "migrations",
Usage: "shows all unfinished migration jobs",
UsageText: "bytemark --admin show migrations",
Action: app.Action(with.Auth, func(c *app.Context) error {
mjs, err := brainRequests.GetMigrationJobs(c.Client())
if err != nil {
return err
}

return c.OutputInDesiredForm(mjs)
}),
},
{
Name: "stopped eligible vms",
Usage: "shows a list of stopped VMs that should be running",
Expand Down
34 changes: 34 additions & 0 deletions cmd/bytemark/commands/admin/show_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,40 @@ func TestAdminShowMigratingDiscsCommand(t *testing.T) {
}
}

func TestAdminShowMigrations(t *testing.T) {
tests := []struct {
name string
mjs brain.MigrationJobs
}{
{
name: "NoJobs",
mjs: brain.MigrationJobs{},
},
{
name: "OneJob",
mjs: brain.MigrationJobs{
{ID: 123},
},
},
}
for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
is := is.New(t)
_, client, app := testutil.BaseTestAuthSetup(t, true, admin.Commands)
client.When("BuildRequest", "GET", lib.BrainEndpoint, "/admin/migration_jobs?unfinished=1%s", []string{""}).Return(&mocks.Request{
T: t,
StatusCode: 200,
ResponseObject: test.mjs,
}).Times(1)
err := app.Run(strings.Split("bytemark --admin show migrations", " "))
is.Nil(err)
if ok, err := client.Verify(); !ok {
t.Fatal(err)
}
})
}
}

func TestAdminShowMigration(t *testing.T) {
tests := []struct {
name string
Expand Down
3 changes: 0 additions & 3 deletions lib/brain/migration_job.go
Original file line number Diff line number Diff line change
Expand Up @@ -143,9 +143,6 @@ func (mj MigrationJob) PrettyPrint(wr io.Writer, detail prettyprint.DetailLevel)
return prettyprint.Run(wr, template, "migration_job"+string(detail), mj)
}




// DefaultFields appeases quality tests
func (mjq MigrationJobQueue) DefaultFields(f output.Format) string {
return ""
Expand Down
32 changes: 32 additions & 0 deletions lib/brain/migration_jobs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package brain

import (
"io"

"github.com/BytemarkHosting/bytemark-client/lib/output"
"github.com/BytemarkHosting/bytemark-client/lib/output/prettyprint"
)

// MigrationJobs represents more than one account in output.Outputtable form.
type MigrationJobs []MigrationJob

// DefaultFields returns the list of default fields to feed to github.com/BytemarkHosting/row.From for this type, which is the same as MigrationJob.DefaultFields.
func (mjs MigrationJobs) DefaultFields(f output.Format) string {
return (MigrationJob{}).DefaultFields(f)
}

// PrettyPrint writes a human-readable summary of the migration jobs to writer at the given detail level.
func (mjs MigrationJobs) PrettyPrint(wr io.Writer, detail prettyprint.DetailLevel) error {
migrationjobsTpl := `
{{ define "migrationjobs_sgl" }}{{ len . }} servers{{ end }}
{{ define "migrationjobs_medium" -}}
{{- range . -}}
{{- prettysprint . "_sgl" }}
{{ end -}}
{{- end }}
{{ define "migrationjobs_full" }}{{ template "migrationjobs_medium" . }}{{ end }}
`
return prettyprint.Run(wr, migrationjobsTpl, "migrationjobs"+string(detail), mjs)
}
67 changes: 67 additions & 0 deletions lib/brain/migration_jobs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
package brain

import (
"bytes"
"testing"

"github.com/BytemarkHosting/bytemark-client/lib/output/prettyprint"
)

func TestFormatMigrationJobs(t *testing.T) {
tests := []struct {
name string
in MigrationJobs
detail prettyprint.DetailLevel
exp string
}{
{
name: "NoJobs",
in: MigrationJobs{},
detail: prettyprint.Full,
exp: ``,
},
{
name: "OneJob",
in: MigrationJobs{{
ID: 123,
Queue: MigrationJobQueue{
Discs: []int{1, 2},
},
}},
detail: prettyprint.Full,
exp: ` ▸ 123 queue: 1 2` + "\n",
},
{
name: "TwoJobs",
in: MigrationJobs{
{
ID: 123,
Queue: MigrationJobQueue{
Discs: []int{1, 2},
},
},
{
ID: 456,
Queue: MigrationJobQueue{
Discs: []int{3, 4},
},
},
},
detail: prettyprint.Full,
exp: ` ▸ 123 queue: 1 2` + "\n" + ` ▸ 456 queue: 3 4` + "\n",
},
}

for _, test := range tests {
t.Run(test.name, func(t *testing.T) {
b := new(bytes.Buffer)
err := test.in.PrettyPrint(b, test.detail)
if err != nil {
t.Error(err)
}
if b.String() != test.exp {
t.Errorf("unexpected output: %s", b.String())
}
})
}
}
17 changes: 17 additions & 0 deletions lib/requests/brain/get_migration_jobs.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package brain

import (
"github.com/BytemarkHosting/bytemark-client/lib"
"github.com/BytemarkHosting/bytemark-client/lib/brain"
)

// GetMigrationJobs returns an array of unfinished migration jobs
func GetMigrationJobs(client lib.Client) (mjs brain.MigrationJobs, err error) {
r, err := client.BuildRequest("GET", lib.BrainEndpoint, "/admin/migration_jobs?unfinished=1%s", "")
if err != nil {
return
}

_, _, err = r.Run(nil, &mjs)
return
}
92 changes: 92 additions & 0 deletions lib/requests/brain/get_migration_jobs_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
package brain_test

import (
"encoding/json"
"testing"

"github.com/BytemarkHosting/bytemark-client/lib"
"github.com/BytemarkHosting/bytemark-client/lib/brain"
brainMethods "github.com/BytemarkHosting/bytemark-client/lib/requests/brain"
"github.com/BytemarkHosting/bytemark-client/lib/testutil"
"github.com/BytemarkHosting/bytemark-client/lib/testutil/assert"
"github.com/BytemarkHosting/bytemark-client/lib/util"
)

func TestGetMigrationJobs(t *testing.T) {
testName := testutil.Name(0)

testMigrationJobs := brain.MigrationJobs{{
ID: 123,
Args: brain.MigrationJobSpec{
Sources: brain.MigrationJobLocations{
Discs: []util.NumberOrString{"3"},
},
Destinations: brain.MigrationJobLocations{
Pools: []util.NumberOrString{"pool.21"},
},
},
Queue: brain.MigrationJobQueue{
Discs: []int{3},
},
Destinations: brain.MigrationJobDestinations{
Pools: []int{21},
},
Status: brain.MigrationJobStatus{
Discs: brain.MigrationJobDiscStatus{
Done: []int{},
Errored: []int{},
Cancelled: []int{},
Skipped: []int{},
},
},
Priority: 5,
CreatedAt: "2018-03-15T14:23:00.579Z",
UpdatedAt: "2018-03-15T15:28:28.244Z",
}}

rts := testutil.RequestTestSpec{
Method: "GET",
URL: "/admin/migration_jobs",
AssertRequest: assert.QueryValue("unfinished", "1"),
Endpoint: lib.BrainEndpoint,
Response: json.RawMessage(`[{
"id": 123,
"args": {
"options": {},
"sources": {
"discs": [3]
},
"destinations": {
"pools": ["pool.21"]
}
},
"queue": {
"discs": [3]
},
"destinations": {
"pools": [21]
},
"status": {
"discs": {
"done": [],
"errored": [],
"cancelled": [],
"skipped": []
}
},
"priority": 5,
"started_at": null,
"finished_at": null,
"created_at": "2018-03-15T14:23:00.579Z",
"updated_at": "2018-03-15T15:28:28.244Z"
}]`),
}

rts.Run(t, testName, true, func(client lib.Client) {
migrationJobs, err := brainMethods.GetMigrationJobs(client)
if err != nil {
t.Fatal(err)
}
assert.Equal(t, testName, migrationJobs, testMigrationJobs)
})
}

0 comments on commit 12a0786

Please sign in to comment.