Skip to content

Commit 7a83179

Browse files
author
parauliya
committedMar 5, 2020
Changes in test framework
- Restructing the code - Added new test case - chnaged naming conventions
1 parent 33008dd commit 7a83179

25 files changed

+397
-238
lines changed
 

‎hack/update-gofmt.sh

+15
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
#!/bin/bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
find_files() {
8+
find . -not \( \
9+
\( \
10+
-wholename '*/vendor/*' \
11+
\) -prune \
12+
\) -name '*.go'
13+
}
14+
15+
find_files | xargs gofmt -w -s

‎hack/verify-gofmt.sh

+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
#!/bin/bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
find_files() {
8+
find . -not \( \
9+
\( \
10+
-wholename '*/vendor/*' \
11+
\) -prune \
12+
\) -name '*.go'
13+
}
14+
15+
bad_files=$(find_files | xargs gofmt -d -s 2>&1)
16+
if [[ -n "${bad_files}" ]]; then
17+
echo "${bad_files}" >&2
18+
echo >&2
19+
echo "Run ./hack/update-gofmt.sh" >&2
20+
exit 1
21+
fi

‎hack/verify-golint.sh

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
#!/bin/bash
2+
3+
set -o errexit
4+
set -o nounset
5+
set -o pipefail
6+
7+
find_files() {
8+
find . -not \( \
9+
\( \
10+
-wholename '*/vendor/*' \
11+
\) -prune \
12+
\) -name '*.go'
13+
}
14+
15+
bad_files=$(find_files | xargs -I@ bash -c "golint @")
16+
if [[ -n "${bad_files}" ]]; then
17+
echo "${bad_files}"
18+
exit 1
19+
fi

‎hack/verify-govet.sh

+7
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
#!/bin/bash
2+
3+
set -x
4+
5+
go vet ./pkg/...
6+
go vet ./cmd/...
7+
go vet -tags=test ./test/...

‎test-docker-compose.yml

+2-56
Original file line numberDiff line numberDiff line change
@@ -53,8 +53,8 @@ services:
5353
depends_on:
5454
- "fluentbit"
5555
healthcheck:
56-
#test: ["CMD-SHELL", "pg_isready -U rover"]
57-
test: ["CMD-SHELL","psql -U rover -c \"select COUNT(*) from hardware;\""]
56+
test: ["CMD-SHELL", "pg_isready -U rover"]
57+
#test: ["CMD-SHELL","psql -U rover -c \"select COUNT(*) from hardware;\""]
5858
interval: 1s
5959
timeout: 1s
6060
retries: 30
@@ -100,16 +100,6 @@ services:
100100
depends_on:
101101
db:
102102
condition: service_healthy
103-
ccli:
104-
build:
105-
context: ../cacher/cmd/cacherc
106-
environment:
107-
CACHER_CERT_URL: http://cacher.${FACILITY:-lab1}.packet.net:42112/cert
108-
CACHER_GRPC_AUTHORITY: cacher.${FACILITY:-lab1}.packet.net:42111
109-
depends_on:
110-
- "fluentbit"
111-
links:
112-
- cserver:cacher.${FACILITY:-lab1}.packet.net
113103

114104
registry:
115105
build:
@@ -134,50 +124,6 @@ services:
134124
tag: registry
135125
network_mode: host
136126

137-
boots:
138-
build:
139-
context: ../boots
140-
network_mode: host
141-
command: -dhcp-addr 0.0.0.0:67 -tftp-addr 127.0.0.1:69 -http-addr 127.0.0.1:8080 -log-level DEBUG
142-
environment:
143-
API_AUTH_TOKEN: ${PACKET_API_AUTH_TOKEN:-PcyR6MvHb7wMmyYf9p8dJ2Dvnb9HxX8E}
144-
API_CONSUMER_TOKEN: ${PACKET_CONSUMER_TOKEN:-djR2TAvbnkY92i8Ea2KFMZW6MusW1fk7qzeCUHgtnQRSsXnqxoCr6V2vhSxpqASf}
145-
FACILITY_CODE: ${FACILITY:-lab1}
146-
PACKET_ENV: ${PACKET_ENV:-testing}
147-
PACKET_VERSION: ${PACKET_VERSION:-5efab5ef3a42cb88f2d54f4ed3201c2dd6797b7d}
148-
ROLLBAR_TOKEN: ${ROLLBAR_TOKEN:-9b78d0ad01d1467aa92c49c3a349b79d}
149-
ROLLBAR_DISABLE: ${ROLLBAR_DISABLE:-0}
150-
MIRROR_HOST: ${MIRROR_HOST:-127.0.0.1}
151-
CACHER_GRPC_AUTHORITY: 127.0.0.1:42111
152-
CACHER_CERT_URL: http://127.0.0.1:42114/cert
153-
DNS_SERVERS: 8.8.8.8
154-
PUBLIC_IP: 127.0.0.1
155-
BOOTP_BIND: 127.0.0.1:67
156-
HTTP_BIND: 127.0.0.1:80
157-
SYSLOG_BIND: 127.0.0.1:514
158-
TFTP_BIND: 127.0.0.1:69
159-
DOCKER_REGISTRY: 127.0.0.1
160-
REGISTRY_USERNAME: username
161-
REGISTRY_PASSWORD: password
162-
ROVER_GRPC_AUTHORITY: 127.0.0.1:42113
163-
ROVER_CERT_URL: http://127.0.0.1:42114/cert
164-
ELASTIC_SEARCH_URL: 127.0.0.1:9200
165-
depends_on:
166-
db:
167-
condition: service_healthy
168-
rover:
169-
condition: service_healthy
170-
fluentbit:
171-
condition: service_started
172-
logging:
173-
driver: fluentd
174-
options:
175-
tag: boots
176-
ports:
177-
- 127.0.0.1:80:80/tcp
178-
- 67:67/udp
179-
- 69:69/udp
180-
181127
elasticsearch:
182128
image: elasticsearch:7.3.0
183129
ports:

‎test/actions/action3/Dockerfile

-2
This file was deleted.
File renamed without changes.
File renamed without changes.

‎test/build_images.sh

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#!/bin/bash
22

3-
docker build -t localhost/action1 actions/action1/
4-
docker build -t localhost/action2 actions/action2/
5-
docker build -t localhost/action3 actions/action3/
3+
docker pull bash
4+
docker tag bash:latest localhost/bash
5+
docker build -t localhost/update-data actions/update_data/
6+
docker build -t localhost/overwrite-data actions/overwrite_data/
67

‎test/data/template/sample_1

+9-9
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@ version: '0.1'
22
name: packet_osie_provision
33
global_timeout: 600
44
tasks:
5-
- name: "OS Installation"
5+
- name: "run_one_worker"
66
worker: "{{index .Targets "machine1" "mac_addr"}}"
77
actions:
8-
- name: "server_partitioning"
9-
image: action1
8+
- name: "update-data"
9+
image: update-data
1010
timeout: 60
11-
on-timeout: do_partion recover -timeout
12-
on-failure: do_partion recover -failure
13-
- name: "update_db"
14-
image: action2
11+
on-timeout: ["echo", "Timeout"]
12+
on-failure: ["echo", "Failure"]
13+
- name: "overwrite-data"
14+
image: overwrite-data
1515
timeout: 50
16-
on-timeout: "rover_client update-timeout"
17-
on-failure: "rover_client update-failed"
16+
on-timeout: ["echo", "Timeout"]
17+
on-failure: ["echo", "Failure"]

‎test/data/template/sample_2

+11-10
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@ version: '0.1'
22
name: packet_osie_provision
33
global_timeout: 600
44
tasks:
5-
- name: "OS Installation"
5+
- name: "timeout-task"
66
worker: "{{index .Targets "machine1" "mac_addr"}}"
77
actions:
8-
- name: "server_partitioning"
9-
image: action1
10-
timeout: 60
11-
on-timeout: "echo Timeout"
12-
on-failure: "echo Failure"
13-
- name: os_instaddll
14-
image: action3
8+
- name: "update-data"
9+
image: update-data
10+
timeout: 10
11+
on-timeout: ["echo", "Timeout"]
12+
on-failure: ["echo", "Failure"]
13+
- name: "sleep-till-timeout"
14+
image: bash
15+
command: ["sleep", "20"]
1516
timeout: 6
16-
on-timeout: "echo os_install -timeout"
17-
on-failure: "echo os_install -failure"
17+
on-timeout: ["echo", "Timeout"]
18+
on-failure: ["echo", "Failure"]

‎test/data/template/sample_3

+19-11
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,24 @@ version: '0.1'
22
name: packet_osie_provision
33
global_timeout: 600
44
tasks:
5-
- name: "OS Installation"
5+
- name: "run-first-worker"
66
worker: "{{index .Targets "machine1" "mac_addr"}}"
77
actions:
8-
- name: "server_partitioning"
9-
image: hello-world
10-
timeout: 3
11-
on-timeout: "echo Timeout"
12-
on-failure: "echo Failed"
13-
- name: os_install
14-
image: hello-world
15-
timeout: 3
16-
on-timeout: "echo Timeout"
17-
on-failure: "echo Failed"
8+
- name: "update-data"
9+
image: update-data
10+
timeout: 10
11+
on-timeout: ["echo", "Timeout"]
12+
on-failure: ["echo", "Failure"]
13+
- name: "overwrite-data"
14+
image: overwrite-data
15+
timeout: 10
16+
on-timeout: ["echo", "Timeout"]
17+
on-failure: ["echo", "Failure"]
18+
- name: "run-second-worker"
19+
worker: "{{index .Targets "machine2" "mac_addr"}}"
20+
actions:
21+
- name: "overwrite-again"
22+
image: update-data
23+
timeout: 10
24+
on-timeout: ["echo", "Timeout"]
25+
on-failure: ["echo", "Failure"]

‎test/e2e_test.go

+23-93
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,20 @@
11
package e2e
22

33
import (
4-
"context"
5-
"fmt"
64
"os"
75
"testing"
86
"time"
97

108
"github.com/packethost/rover/client"
119
"github.com/packethost/rover/protos/workflow"
1210
"github.com/packethost/rover/test/framework"
13-
"github.com/stretchr/testify/assert"
11+
"github.com/sirupsen/logrus"
1412
)
1513

14+
var log *logrus.Logger = framework.Log
15+
1616
func TestMain(m *testing.M) {
17-
fmt.Println("########Creating Setup########")
17+
log.Infoln("########Creating Setup########")
1818
err := framework.StartStack()
1919
time.Sleep(10 * time.Second)
2020
if err != nil {
@@ -23,120 +23,50 @@ func TestMain(m *testing.M) {
2323
os.Setenv("ROVER_GRPC_AUTHORITY", "127.0.0.1:42113")
2424
os.Setenv("ROVER_CERT_URL", "http://127.0.0.1:42114/cert")
2525
client.Setup()
26-
fmt.Println("########Setup Created########")
26+
log.Infoln("########Setup Created########")
2727

28-
fmt.Println("Creating hardware inventory")
28+
log.Infoln("Creating hardware inventory")
2929
//push hardware data into hardware table
3030
hwData := []string{"hardware_1.json", "hardware_2.json"}
3131
err = framework.PushHardwareData(hwData)
3232
if err != nil {
33-
fmt.Println("Failed to push hardware inventory : ", err)
33+
log.Errorln("Failed to push hardware inventory : ", err)
3434
os.Exit(2)
3535
}
36-
fmt.Println("Hardware inventory created")
36+
log.Infoln("Hardware inventory created")
3737

38-
fmt.Println("########Starting Tests########")
38+
log.Infoln("########Starting Tests########")
3939
status := m.Run()
40-
fmt.Println("########Finished Tests########")
41-
fmt.Println("########Removing setup########")
40+
log.Infoln("########Finished Tests########")
41+
log.Infoln("########Removing setup########")
4242
//err = framework.TearDown()
4343
if err != nil {
4444
os.Exit(3)
4545
}
46-
fmt.Println("########Setup removed########")
46+
log.Infoln("########Setup removed########")
4747
os.Exit(status)
4848
}
4949

50-
var testCases = []struct {
51-
//name string
50+
var testCases = map[string]struct {
5251
target string
5352
template string
5453
workers int64
5554
expected workflow.ActionState
5655
ephData string
5756
}{
58-
{"target_1.json", "sample_1", 1, workflow.ActionState_ACTION_SUCCESS, `{"action_02": "data_02}`},
59-
{"target_1.json", "sample_2", 1, workflow.ActionState_ACTION_TIMEOUT, `{"action_01": "data_01}`},
57+
"testWfWithWorker": {"target_1.json", "sample_1", 1, workflow.ActionState_ACTION_SUCCESS, `{"action_02": "data_02"}`},
58+
"testWfTimeout": {"target_1.json", "sample_2", 1, workflow.ActionState_ACTION_TIMEOUT, `{"action_01": "data_01"}`},
59+
"testWfWithMultiWorkers": {"target_1.json", "sample_3", 2, workflow.ActionState_ACTION_SUCCESS, `{"action_01": "data_01"}`},
6060
}
6161

62-
func TestOneWorker(t *testing.T) {
63-
64-
// Start test
65-
if len(testCases) > 0 {
66-
test := testCases[0]
67-
wfID, err := framework.SetupWorkflow(test.target, test.template)
68-
69-
if err != nil {
70-
t.Error(err)
71-
}
72-
assert.NoError(t, err, "Create Workflow")
73-
74-
// Start the Worker
75-
workerStatus := make(chan int64, test.workers)
76-
wfStatus, err := framework.StartWorkers(test.workers, workerStatus, wfID)
77-
if err != nil {
78-
fmt.Printf("Test Failed\n")
79-
t.Error(err)
80-
}
81-
assert.Equal(t, test.expected, wfStatus)
82-
assert.NoError(t, err, "Workers Failed")
83-
84-
for i := int64(0); i < test.workers; i++ {
85-
if len(workerStatus) > 0 {
86-
//Check for worker exit status
87-
status := <-workerStatus
88-
expected := 0
89-
if test.expected != workflow.ActionState_ACTION_SUCCESS {
90-
expected = 1
91-
}
92-
assert.Equal(t, int64(expected), status)
93-
//checking for ephemeral data validation
94-
resp, err := client.WorkflowClient.GetWorkflowData(context.Background(), &workflow.GetWorkflowDataRequest{WorkflowID: wfID, Version: 0})
95-
if err != nil {
96-
assert.Equal(t, test.ephData, string(resp.GetData()))
97-
}
98-
}
99-
}
100-
}
62+
var runTestMap = map[string]func(t *testing.T){
63+
"testWfWithWorker": TestWfWithWorker,
64+
"testWfTimeout": TestWfTimeout,
65+
"testWfWithMultiWorkers": TestWfWithMultiWorkers,
10166
}
10267

103-
func TestTimeout(t *testing.T) {
104-
// Start test
105-
if len(testCases) > 1 {
106-
test := testCases[1]
107-
wfID, err := framework.SetupWorkflow(test.target, test.template)
108-
109-
if err != nil {
110-
t.Error(err)
111-
}
112-
assert.NoError(t, err, "Create Workflow")
113-
114-
// Start the Worker
115-
workerStatus := make(chan int64, test.workers)
116-
wfStatus, err := framework.StartWorkers(test.workers, workerStatus, wfID)
117-
if err != nil {
118-
fmt.Printf("Test Failed\n")
119-
t.Error(err)
120-
}
121-
assert.Equal(t, test.expected, wfStatus)
122-
assert.NoError(t, err, "Workers Failed")
123-
124-
for i := int64(0); i < test.workers; i++ {
125-
if len(workerStatus) > 0 {
126-
// Check for worker exit status
127-
status := <-workerStatus
128-
expected := 0
129-
if test.expected != workflow.ActionState_ACTION_SUCCESS {
130-
expected = 1
131-
}
132-
assert.Equal(t, int64(expected), status)
133-
134-
//checking for ephemeral data validation
135-
resp, err := client.WorkflowClient.GetWorkflowData(context.Background(), &workflow.GetWorkflowDataRequest{WorkflowID: wfID, Version: 0})
136-
if err != nil {
137-
assert.Equal(t, test.ephData, string(resp.GetData()))
138-
}
139-
}
140-
}
68+
func TestE2E(t *testing.T) {
69+
for key, val := range runTestMap {
70+
t.Run(key, val)
14171
}
14272
}

‎test/framework/hardware.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func readHwData(file string) (string, error) {
2323
return string(data), nil
2424
}
2525

26+
// PushHardwareData : push hardware data
2627
func PushHardwareData(hwDataFiles []string) error {
2728
for _, hwFile := range hwDataFiles {
2829
filepath := "data/hardware/" + hwFile

‎test/framework/setup.go

+68-6
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11
package framework
22

33
import (
4-
"fmt"
54
"os"
65
"os/exec"
6+
"strings"
77

88
"github.com/pkg/errors"
9+
"github.com/sirupsen/logrus"
910
)
1011

1112
func buildCerts(filepath string) error {
@@ -48,13 +49,72 @@ func startDb(filepath string) error {
4849
return err
4950
}
5051

52+
func removeWorkerImage() error {
53+
cmd := exec.Command("/bin/sh", "-c", "docker image rm worker")
54+
cmd.Stdout = os.Stdout
55+
cmd.Stderr = os.Stderr
56+
err := cmd.Run()
57+
return err
58+
59+
}
60+
61+
func createWorkerImage() error {
62+
cmd := exec.Command("/bin/sh", "-c", "docker build -t worker ../worker/")
63+
cmd.Stdout = os.Stdout
64+
cmd.Stderr = os.Stderr
65+
err := cmd.Run()
66+
if err != nil {
67+
logger.Errorln("Faield to create worker image", err)
68+
}
69+
logger.Infoln("Worker Image created")
70+
return err
71+
}
72+
73+
func initializeLogger() {
74+
level := os.Getenv("TEST_LOG_LEVEL")
75+
if level != "" {
76+
switch strings.ToLower(level) {
77+
case "panic":
78+
logger.SetLevel(logrus.PanicLevel)
79+
case "fatal":
80+
logger.SetLevel(logrus.FatalLevel)
81+
case "error":
82+
logger.SetLevel(logrus.ErrorLevel)
83+
case "warn", "warning":
84+
logger.SetLevel(logrus.WarnLevel)
85+
case "info":
86+
logger.SetLevel(logrus.InfoLevel)
87+
case "debug":
88+
logger.SetLevel(logrus.DebugLevel)
89+
case "trace":
90+
logger.SetLevel(logrus.TraceLevel)
91+
default:
92+
logger.SetLevel(logrus.InfoLevel)
93+
logger.Errorln("Invalid value for TEST_LOG_LEVEL ", level, " .Setting it to default(Info)")
94+
}
95+
} else {
96+
logger.SetLevel(logrus.InfoLevel)
97+
logger.Errorln("Variable TEST_LOG_LEVEL is not set. Default is Info.")
98+
}
99+
logger.SetFormatter(&logrus.JSONFormatter{})
100+
}
101+
51102
// StartStack : Starting stack
52103
func StartStack() error {
53104
// Docker compose file for starting the containers
54105
filepath := "../test-docker-compose.yml"
55106

107+
// Intialize logger
108+
initializeLogger()
109+
110+
// Start Db and logging components
111+
err := startDb(filepath)
112+
if err != nil {
113+
return err
114+
}
115+
56116
// Building certs
57-
err := buildCerts(filepath)
117+
err = buildCerts(filepath)
58118
if err != nil {
59119
return err
60120
}
@@ -77,19 +137,21 @@ func StartStack() error {
77137
return err
78138
}
79139

80-
// Start Db and logging components
81-
err = startDb(filepath)
140+
//Remove older worker image
141+
err = removeWorkerImage()
82142
if err != nil {
83143
return err
84144
}
85145

86-
//Create Worker image locally
146+
//Create new Worker image locally
87147
err = createWorkerImage()
88148
if err != nil {
89-
fmt.Println("failed to create worker Image")
149+
logger.Errorln("failed to create worker Image")
90150
return errors.Wrap(err, "worker image creation failed")
91151
}
92152

153+
initializeLogger()
154+
93155
// Start other containers
94156
cmd := exec.Command("/bin/sh", "-c", "docker-compose -f "+filepath+" up --build -d")
95157
cmd.Stdout = os.Stdout

‎test/framework/target.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func getTargets(file string) (string, error) {
2323
return string(data), nil
2424
}
2525

26+
// CreateTargets : create target in the database
2627
func CreateTargets(tar string) (string, error) {
2728
filepath := "data/target/" + tar
2829
data, err := getTargets(filepath)

‎test/framework/tearDown.go

+1
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import (
55
"os/exec"
66
)
77

8+
// TearDown : remove the setup
89
func TearDown() error {
910
cmd := exec.Command("/bin/sh", "-c", "docker-compose rm -svf")
1011
cmd.Stdout = os.Stdout

‎test/framework/template.go

+1
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ func readTemplateData(file string) ([]byte, error) {
2323
return data, nil
2424
}
2525

26+
// CreateTemplate : create template in the database
2627
func CreateTemplate(tmpl string) (string, error) {
2728
filePath := "data/template/" + tmpl
2829
// Read Content of template

‎test/framework/utils.go

+13-5
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,34 @@
11
package framework
22

3-
import "fmt"
3+
import (
4+
"github.com/sirupsen/logrus"
5+
)
6+
7+
var logger = logrus.New()
8+
var log *logrus.Entry
9+
10+
// Log : This Log will be used in test cases.
11+
var Log = logger
412

513
// SetupWorkflow ... Set up workflow
614
func SetupWorkflow(tar string, tmpl string) (string, error) {
7-
815
//Add target machine mac/ip addr into targets table
916
targetID, err := CreateTargets(tar)
1017
if err != nil {
1118
return "", err
1219
}
13-
fmt.Println("Target Created : ", targetID)
20+
logger.Infoln("Target Created : ", targetID)
1421
//Add template in template table
1522
templateID, err := CreateTemplate(tmpl)
1623
if err != nil {
1724
return "", err
1825
}
19-
fmt.Println("Template Created : ", templateID)
26+
logger.Infoln("Template Created : ", templateID)
2027
workflowID, err := CreateWorkflow(templateID, targetID)
2128
if err != nil {
29+
logger.Debugln("Workflow is not Created because : ", err)
2230
return "", err
2331
}
24-
fmt.Println("Workflow Created : ", workflowID)
32+
logger.Infoln("Workflow Created : ", workflowID)
2533
return workflowID, nil
2634
}

‎test/framework/worker.go

+21-37
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,14 @@ package framework
22

33
import (
44
"context"
5-
"fmt"
6-
"os"
7-
"os/exec"
85
"sync"
96

107
"github.com/docker/docker/api/types"
118
"github.com/docker/docker/api/types/container"
129
dc "github.com/docker/docker/client"
1310
"github.com/packethost/rover/protos/workflow"
1411
"github.com/pkg/errors"
12+
"github.com/sirupsen/logrus"
1513
)
1614

1715
var cli *dc.Client
@@ -25,20 +23,8 @@ func initializeDockerClient() (*dc.Client, error) {
2523
return c, nil
2624
}
2725

28-
func createWorkerImage() error {
29-
cmd := exec.Command("/bin/sh", "-c", "docker build -t worker ../worker/")
30-
cmd.Stdout = os.Stdout
31-
cmd.Stderr = os.Stderr
32-
err := cmd.Run()
33-
if err != nil {
34-
fmt.Println("Faield to create worker image", err)
35-
}
36-
fmt.Println("Worker Image created")
37-
return err
38-
}
39-
4026
func createWorkerContainer(ctx context.Context, cli *dc.Client, workerID string, wfID string) (string, error) {
41-
volume := map[string]struct{}{"/var/run/docker.sock": struct{}{}}
27+
volume := map[string]struct{}{"/var/run/docker.sock": {}}
4228
config := &container.Config{
4329
Image: "worker",
4430
AttachStdout: true,
@@ -71,9 +57,9 @@ func waitContainer(ctx context.Context, cli *dc.Client, id string, wg *sync.Wait
7157
select {
7258
case status := <-wait:
7359
statusChannel <- status.StatusCode
74-
fmt.Println("Worker with id ", id, "finished sucessfully with status code ", status.StatusCode)
60+
log.Infoln("Worker with id ", id, "finished sucessfully with status code ", status.StatusCode)
7561
case err := <-errC:
76-
fmt.Println("Worker with id ", id, "failed : ", err)
62+
log.Infoln("Worker with id ", id, "failed : ", err)
7763
failedWorkers <- id
7864
}
7965
wg.Done()
@@ -91,7 +77,7 @@ func removeContainer(ctx context.Context, cli *dc.Client, id string) error {
9177
if err != nil {
9278
return err
9379
}
94-
fmt.Println("Worker Container removed : ", id)
80+
log.Infoln("Worker Container removed : ", id)
9581
return nil
9682
}
9783
func checkCurrentStatus(ctx context.Context, wfID string, workflowStatus chan workflow.ActionState) {
@@ -100,8 +86,9 @@ func checkCurrentStatus(ctx context.Context, wfID string, workflowStatus chan wo
10086
}
10187
}
10288

89+
// StartWorkers : start the workers
10390
func StartWorkers(workers int64, workerStatus chan<- int64, wfID string) (workflow.ActionState, error) {
104-
91+
log = logger.WithField("workflow_id", wfID)
10592
var wg sync.WaitGroup
10693
failedWorkers := make(chan string, workers)
10794
workflowStatus := make(chan workflow.ActionState, 1)
@@ -114,25 +101,22 @@ func StartWorkers(workers int64, workerStatus chan<- int64, wfID string) (workfl
114101
for i = 0; i < workers; i++ {
115102
ctx := context.Background()
116103
cID, err := createWorkerContainer(ctx, cli, workerID[i], wfID)
104+
log = logger.WithFields(logrus.Fields{"workflow_id": wfID, "worker_id": workerID[i]})
117105
if err != nil {
118-
fmt.Println("Worker with failed to create: ", err)
119-
// TODO Should be remove all the containers which previously created?
106+
log.Errorln("Failed to create worker container : ", err)
120107
} else {
121108
workerContainer[i] = cID
122-
fmt.Println("Worker Created with ID : ", cID)
109+
log.Debugln("Worker container created with ID : ", cID)
123110
// Run container
124-
125111
err = runContainer(ctx, cli, cID)
126-
}
127-
128-
if err != nil {
129-
fmt.Println("Worker with id ", cID, " failed to start: ", err)
130-
// TODO Should be remove the containers which started previously?
131-
} else {
132-
fmt.Println("Worker started with ID : ", cID)
133-
wg.Add(1)
134-
go waitContainer(ctx, cli, cID, &wg, failedWorkers, workerStatus)
135-
go checkCurrentStatus(ctx, wfID, workflowStatus)
112+
if err != nil {
113+
log.Errorln("Worker container with id ", cID, " failed to start: ", err)
114+
} else {
115+
log.Infoln("Worker container started with ID : ", cID)
116+
wg.Add(1)
117+
go waitContainer(ctx, cli, cID, &wg, failedWorkers, workerStatus)
118+
go checkCurrentStatus(ctx, wfID, workflowStatus)
119+
}
136120
}
137121
}
138122

@@ -141,21 +125,21 @@ func StartWorkers(workers int64, workerStatus chan<- int64, wfID string) (workfl
141125
}
142126

143127
status := <-workflowStatus
144-
fmt.Println("Status of Workflow : ", status)
128+
log.Infoln("Status of Workflow : ", status)
145129
wg.Wait()
146130
ctx := context.Background()
147131
for _, cID := range workerContainer {
148132
err := removeContainer(ctx, cli, cID)
149133
if err != nil {
150-
fmt.Println("Failed to remove worker container with ID : ", cID)
134+
log.Errorln("Failed to remove worker container with ID : ", cID)
151135
}
152136
}
153137

154138
if len(failedWorkers) > 0 {
155139
for i = 0; i < workers; i++ {
156140
failedContainer, ok := <-failedWorkers
157141
if ok {
158-
fmt.Println("Worker Failed : ", failedContainer)
142+
log.Errorln("Worker Failed : ", failedContainer)
159143
err = errors.New("Test Failed")
160144
}
161145

‎test/framework/workflow.go

+3-3
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,12 @@ package framework
22

33
import (
44
"context"
5-
"fmt"
65

76
"github.com/packethost/rover/client"
87
"github.com/packethost/rover/protos/workflow"
98
)
109

10+
// CreateWorkflow : create workflow
1111
func CreateWorkflow(template string, target string) (string, error) {
1212
req := workflow.CreateRequest{Template: template, Target: target}
1313
res, err := client.WorkflowClient.CreateWorkflow(context.Background(), &req)
@@ -17,12 +17,12 @@ func CreateWorkflow(template string, target string) (string, error) {
1717
return res.Id, nil
1818
}
1919

20+
// GetCurrentStatus : get the current status of workflow from server
2021
func GetCurrentStatus(ctx context.Context, wfID string, status chan workflow.ActionState) {
2122
req := workflow.GetRequest{Id: wfID}
2223
wf, err := client.WorkflowClient.GetWorkflowContext(ctx, &req)
23-
//fmt.Println("This is in Getting status : ", wf.CurrentActionState)
2424
if err != nil {
25-
fmt.Println("This is in Getting status ERROR: ", err)
25+
log.Errorln("This is in Getting status ERROR: ", err)
2626
status <- workflow.ActionState_ACTION_FAILED
2727
}
2828
if wf.CurrentActionState == workflow.ActionState_ACTION_FAILED {

‎test/push_images.sh

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,6 @@ do
88
fi
99
sleep 1
1010
done
11-
docker push localhost/action1
12-
docker push localhost/action2
13-
docker push localhost/action3
11+
docker push localhost/update-data
12+
docker push localhost/overwrite-data
13+
docker push localhost/bash

‎test/test_wf_timeout.go

+49
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/packethost/rover/client"
8+
"github.com/packethost/rover/protos/workflow"
9+
"github.com/packethost/rover/test/framework"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
// TestWfTimeout : Timeout Test
14+
func TestWfTimeout(t *testing.T) {
15+
// Start test only if the test case exist in the table
16+
if test, ok := testCases["testWfTimeout"]; ok {
17+
wfID, err := framework.SetupWorkflow(test.target, test.template)
18+
19+
if err != nil {
20+
t.Error(err)
21+
}
22+
assert.NoError(t, err, "Create Workflow")
23+
24+
// Start the Worker
25+
workerStatus := make(chan int64, test.workers)
26+
wfStatus, err := framework.StartWorkers(test.workers, workerStatus, wfID)
27+
if err != nil {
28+
log.Errorf("Test Failed\n")
29+
t.Error(err)
30+
}
31+
assert.Equal(t, test.expected, wfStatus)
32+
assert.NoError(t, err, "Workers Failed")
33+
34+
for i := int64(0); i < test.workers; i++ {
35+
if len(workerStatus) > 0 {
36+
// Check for worker exit status
37+
status := <-workerStatus
38+
expected := 0
39+
assert.Equal(t, int64(expected), status)
40+
41+
//checking for ephemeral data validation
42+
resp, err := client.WorkflowClient.GetWorkflowData(context.Background(), &workflow.GetWorkflowDataRequest{WorkflowID: wfID, Version: 0})
43+
if err != nil {
44+
assert.Equal(t, test.ephData, string(resp.GetData()))
45+
}
46+
}
47+
}
48+
}
49+
}

‎test/test_wf_with_multi_workers.go

+52
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/packethost/rover/client"
8+
"github.com/packethost/rover/protos/workflow"
9+
"github.com/packethost/rover/test/framework"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
// TestWfWithMultiWorkers : Two Worker Test
14+
func TestWfWithMultiWorkers(t *testing.T) {
15+
// Start test only if the test case exist in the table
16+
if test, ok := testCases["testWfWithMultiWorkers"]; ok {
17+
wfID, err := framework.SetupWorkflow(test.target, test.template)
18+
19+
if err != nil {
20+
t.Error(err)
21+
}
22+
assert.NoError(t, err, "Create Workflow")
23+
24+
// Start the Worker
25+
workerStatus := make(chan int64, test.workers)
26+
wfStatus, err := framework.StartWorkers(test.workers, workerStatus, wfID)
27+
if err != nil {
28+
log.Errorf("Test Failed\n")
29+
t.Error(err)
30+
}
31+
assert.Equal(t, test.expected, wfStatus)
32+
assert.NoError(t, err, "Workers Failed")
33+
34+
for i := int64(0); i < test.workers; i++ {
35+
if len(workerStatus) > 0 {
36+
// Check for worker exit status
37+
status := <-workerStatus
38+
expected := 0
39+
if test.expected != workflow.ActionState_ACTION_SUCCESS {
40+
expected = 1
41+
}
42+
assert.Equal(t, int64(expected), status)
43+
44+
//checking for ephemeral data validation
45+
resp, err := client.WorkflowClient.GetWorkflowData(context.Background(), &workflow.GetWorkflowDataRequest{WorkflowID: wfID, Version: 0})
46+
if err != nil {
47+
assert.Equal(t, test.ephData, string(resp.GetData()))
48+
}
49+
}
50+
}
51+
}
52+
}

‎test/test_wf_with_worker.go

+54
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package e2e
2+
3+
import (
4+
"context"
5+
"testing"
6+
7+
"github.com/packethost/rover/client"
8+
"github.com/packethost/rover/protos/workflow"
9+
"github.com/packethost/rover/test/framework"
10+
"github.com/stretchr/testify/assert"
11+
)
12+
13+
// TestWfWithWorker : One Worker Test
14+
func TestWfWithWorker(t *testing.T) {
15+
16+
// Start test only if the test case exist in the table
17+
if test, ok := testCases["testWfWithWorker"]; ok {
18+
wfID, err := framework.SetupWorkflow(test.target, test.template)
19+
20+
if err != nil {
21+
t.Error(err)
22+
}
23+
if !assert.NoError(t, err, "Create Workflow") {
24+
t.Fatal(err)
25+
}
26+
27+
// Start the Worker
28+
workerStatus := make(chan int64, test.workers)
29+
wfStatus, err := framework.StartWorkers(test.workers, workerStatus, wfID)
30+
if err != nil {
31+
log.Errorf("Test Failed\n")
32+
t.Error(err)
33+
}
34+
assert.Equal(t, test.expected, wfStatus)
35+
assert.NoError(t, err, "Workers Failed")
36+
37+
for i := int64(0); i < test.workers; i++ {
38+
if len(workerStatus) > 0 {
39+
//Check for worker exit status
40+
status := <-workerStatus
41+
expected := 0
42+
if test.expected != workflow.ActionState_ACTION_SUCCESS {
43+
expected = 1
44+
}
45+
assert.Equal(t, int64(expected), status)
46+
//checking for ephemeral data validation
47+
resp, err := client.WorkflowClient.GetWorkflowData(context.Background(), &workflow.GetWorkflowDataRequest{WorkflowID: wfID, Version: 0})
48+
if err != nil {
49+
assert.Equal(t, test.ephData, string(resp.GetData()))
50+
}
51+
}
52+
}
53+
}
54+
}

0 commit comments

Comments
 (0)
Please sign in to comment.