Skip to content

Commit

Permalink
Test worker with configuration as well
Browse files Browse the repository at this point in the history
  • Loading branch information
PatWie committed Jan 6, 2020
1 parent f2a7c4f commit b961a36
Show file tree
Hide file tree
Showing 6 changed files with 126 additions and 60 deletions.
6 changes: 5 additions & 1 deletion api/worker/submission_handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -260,7 +260,11 @@ func (h *RealSubmissionHandler) Handle(body []byte) error {
}

// 5. run docker test
ds := service.NewDockerServiceWithTimeout(configuration.Configuration.Worker.Docker.Timeout)
ds, err := service.NewDockerServiceWithTimeout(configuration.Configuration.Worker.Docker.Timeout)
if err != nil {
DefaultLogger.Printf("error: %v\n", err)
return err
}
defer ds.Client.Close()

var exit int64
Expand Down
165 changes: 112 additions & 53 deletions cmd/console/configuration_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -21,24 +21,27 @@ package console

import (
"bytes"
"context"
"fmt"
"log"
"os"
"path"
"path/filepath"
"text/template"
"time"

"github.com/docker/docker/api/types"
"github.com/docker/docker/api/types/container"
"github.com/docker/docker/client"
"github.com/franela/goblin"
"github.com/infomark-org/infomark/auth"
"github.com/infomark-org/infomark/configuration"
"github.com/infomark-org/infomark/configuration/bytefmt"
"github.com/infomark-org/infomark/configuration/fs"
"github.com/spf13/cobra"
"github.com/streadway/amqp"
"gopkg.in/yaml.v2"

// "os"
"text/template"
"time"

redis "github.com/go-redis/redis"
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
Expand All @@ -50,7 +53,10 @@ var ConfigurationCmd = &cobra.Command{
Short: "infomark configuration commands",
}

var test string

func init() {
TestConfiguration.Flags().StringVarP(&test, "test", "t", "server", "Test target for configuration")
ConfigurationCmd.AddCommand(CreateConfiguration)
ConfigurationCmd.AddCommand(TestConfiguration)
ConfigurationCmd.AddCommand(CreateDockercompose)
Expand Down Expand Up @@ -178,68 +184,121 @@ var TestConfiguration = &cobra.Command{
Short: "will create and print a configuration to stdout",
Args: cobra.ExactArgs(1),
Run: func(cmd *cobra.Command, args []string) {

status_code := 0

report := goblin.DetailedReporter{}
report.SetTextFancier(&goblin.TerminalFancier{})
report.BeginDescribe("Test configuration services")

report.BeginDescribe("Test configuration")
status_code := 0
config, err := configuration.ParseConfiguration(args[0])
showResult(report, err, "read configuration from file")
if err != nil {
status_code = -1
}

// Try to connect to postgres
db, err := sqlx.Connect("postgres", config.Server.PostgresURL())
showResult(report, err, "connect to postgres db")
if err != nil {
status_code = -1
} else {
db.Close()
}

// Try to connect to Redis
option, _ := redis.ParseURL(config.Server.RedisURL())

redisClient := redis.NewClient(option)
_, err = redisClient.Ping().Result()
showResult(report, err, "connect to redis url")
if err != nil {
status_code = -1
} else {
redisClient.Close()
}

report.EndDescribe()

report.BeginDescribe("Test configuration paths")
err = fs.DirExists(config.Server.Paths.Common)
showResult(report, err, "common path readable")
if err != nil {
status_code = -1
}

err = fs.IsDirWriteable(config.Server.Paths.Uploads)
showResult(report, err, "upload path writeable")
if err != nil {
status_code = -1
}
if test == "server" {

report.BeginDescribe("Test services")
// Try to connect to postgres
db, err := sqlx.Connect("postgres", config.Server.PostgresURL())
showResult(report, err, "connect to postgres db")
if err != nil {
status_code = -1
} else {
db.Close()
}

// Try to connect to Redis
option, _ := redis.ParseURL(config.Server.RedisURL())
redisClient := redis.NewClient(option)
_, err = redisClient.Ping().Result()
showResult(report, err, "connect to redis url")
if err != nil {
status_code = -1
} else {
redisClient.Close()
}

// Try to connect to RabbitMQ
mqConnection, err := amqp.Dial(config.Server.Services.RabbitMQ.URL())
showResult(report, err, "connect to rabbit mq")
if err != nil {
status_code = -1
} else {
mqConnection.Close()
}
report.EndDescribe()

report.BeginDescribe("Test paths")
err = fs.DirExists(config.Server.Paths.Common)
showResult(report, err, "common path readable")
if err != nil {
status_code = -1
}

err = fs.IsDirWriteable(config.Server.Paths.Uploads)
showResult(report, err, "upload path writeable")
if err != nil {
status_code = -1
}

err = fs.IsDirWriteable(config.Server.Paths.GeneratedFiles)
showResult(report, err, "generated_files path writeable")
if err != nil {
status_code = -1
}

privacyFile := fmt.Sprintf("%s/privacy_statement.md", config.Server.Paths.Common)
err = fs.FileExists(privacyFile)
showResult(report, err, fmt.Sprintf("Read privacy Statement from %s", privacyFile))
if err != nil {
status_code = -1
}
report.EndDescribe()

err = fs.IsDirWriteable(config.Server.Paths.GeneratedFiles)
showResult(report, err, "generated_files path writeable")
if err != nil {
status_code = -1
}
} else {
// Just test docker and rabbitMQ for worker

report.BeginDescribe("Test services")
// Try to connect to RabbitMQ
mqConnection, err := amqp.Dial(config.Server.Services.RabbitMQ.URL())
showResult(report, err, "connect to rabbit mq")
if err != nil {
status_code = -1
} else {
mqConnection.Close()
}

// Test docker "hello world"
dockerClient, err := client.NewClientWithOpts(client.WithAPIVersionNegotiation())
showResult(report, err, "create docker client")
if err != nil {
status_code = -1
} else {
ctx := context.Background()
resp, err := dockerClient.ContainerCreate(ctx, &container.Config{
Image: "hello-world",
Cmd: []string{},
Tty: true,
AttachStdin: false,
AttachStdout: true,
AttachStderr: true,
NetworkDisabled: true, // no network activity required
}, nil, nil, "")
showResult(report, err, "create docker container")

if err != nil {
status_code = -1
} else {
dockerClient.ContainerRemove(ctx, resp.ID, types.ContainerRemoveOptions{})

}

dockerClient.Close()
}
report.EndDescribe()

privacyFile := fmt.Sprintf("%s/privacy_statement.md", config.Server.Paths.Common)
err = fs.FileExists(privacyFile)
showResult(report, err, fmt.Sprintf("Read privacy Statement from %s", privacyFile))
if err != nil {
status_code = -1
}
report.EndDescribe()

os.Exit(status_code)
},
Expand Down
5 changes: 4 additions & 1 deletion cmd/console/submission_cmd.go
Original file line number Diff line number Diff line change
Expand Up @@ -129,7 +129,10 @@ var SubmissionRunCmd = &cobra.Command{

log.Println("try starting docker...")

ds := service.NewDockerServiceWithTimeout(configuration.Configuration.Worker.Docker.Timeout)
ds, err := service.NewDockerServiceWithTimeout(configuration.Configuration.Worker.Docker.Timeout)
if err != nil {
log.Fatal(err)
}
defer ds.Client.Close()

var exit int64
Expand Down
2 changes: 1 addition & 1 deletion configuration/configuration.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ type RabbitMQConfiguration struct {
Key string `yaml:"key"`
}

func (config *RabbitMQConfiguration) RabbitMQURL() string {
func (config *RabbitMQConfiguration) URL() string {
return fmt.Sprintf("amqp://%s:%s@%s:%v/", config.User, config.Password, config.Host, config.Port)
}

Expand Down
2 changes: 1 addition & 1 deletion service/common.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func NewConfig(config *configuration.RabbitMQConfiguration) *Config {
return &Config{

Tag: "SimpleSubmission",
Connection: config.RabbitMQURL(),
Connection: config.URL(),
Exchange: "infomark-worker-exchange",
ExchangeType: "direct",
Queue: "infomark-worker-submissions",
Expand Down
6 changes: 3 additions & 3 deletions service/docker.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,16 +38,16 @@ type DockerService struct {
Timeout time.Duration
}

func NewDockerServiceWithTimeout(timeout time.Duration) *DockerService {
func NewDockerServiceWithTimeout(timeout time.Duration) (*DockerService, error) {
cli, err := client.NewClientWithOpts(client.WithAPIVersionNegotiation())
if err != nil {
panic(err)
return nil, err
}

return &DockerService{
Timeout: timeout,
Client: cli,
}
}, nil
}

// ListContainers lists all docker containers
Expand Down

0 comments on commit b961a36

Please sign in to comment.