-
Notifications
You must be signed in to change notification settings - Fork 2
/
marathon_deploy.go
79 lines (74 loc) · 3.68 KB
/
marathon_deploy.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package main
import (
"github.com/gambol99/go-marathon"
"os"
"log"
"flag"
"fmt"
"time"
)
var dockerRegistryUrl = flag.String("docker.registry.url", "master:5000", "Docker registry address <ip:port>.")
var master = flag.String("master", "127.0.0.1:5050", "Mesos Master address <ip:port>.")
var topics = flag.String("topics", "", "Comma-separated list of topics")
var threadsPerTask = flag.Int("task.threads", 3, "Max threads per task.")
var artifactServerHost = flag.String("artifacts.host", "0.0.0.0", "Host for artifact server.")
var artifactServerPort = flag.Int("artifacts.port", 8888, "Binding port for artifact server.")
var targetUrl = flag.String("target.url", "", "Target URL.")
var consumerConfigPath = flag.String("consumer.config", "consumer.properties", "Kafka consumer config file")
var certFile = flag.String("ssl.cert", "", "SSL certificate file path.")
var keyFile = flag.String("ssl.key", "", "SSL private key file path.")
var caFile = flag.String("ssl.cacert", "", "Certifying Authority SSL Certificate file path.")
var apiKey = flag.String("api.key", "", "Elodina API key")
var apiUser = flag.String("api.user", "", "Elodina API user")
var marathonURL = flag.String("marathon.url", "http://127.0.0.1:8080", "Marathon URL.")
const launchPattern = "./scheduler --master %s --topics %s --task.threads %d --artifacts.host %s --artifacts.port %d --ssl.cert %s --ssl.key %s --ssl.cacert %s --consumer.config %s --target.url %s --api.key %s --api.user %s --cpu.per.task 0.1 --mem.per.task 128"
func main() {
flag.Parse()
marathonConfig := marathon.NewDefaultConfig()
marathonConfig.URL = *marathonURL
marathonConfig.LogOutput = os.Stdout
if marathonClient, err := marathon.NewClient(marathonConfig); err != nil {
log.Fatal(err)
} else {
launchCommand := fmt.Sprintf(launchPattern, *master, *topics, *threadsPerTask, *artifactServerHost, *artifactServerPort, *certFile, *keyFile, *caFile, *consumerConfigPath, *targetUrl, *apiKey, *apiUser)
healthCheck := marathon.NewDefaultHealthCheck()
healthCheck.Path = "/health"
application := &marathon.Application{
ID: "/syphon",
Cmd: launchCommand,
CPUs: 1,
Instances: 1,
Mem: 256,
Ports: []int{*artifactServerPort},
RequirePorts: true,
HealthChecks: []*marathon.HealthCheck{healthCheck},
Container: &marathon.Container{
Type: "DOCKER",
Docker: &marathon.Docker{
Image: fmt.Sprintf("%s/elodina/syphon", *dockerRegistryUrl),
Network: "BRIDGE",
PortMappings: []*marathon.PortMapping{
&marathon.PortMapping{
ContainerPort: *artifactServerPort,
HostPort: *artifactServerPort,
Protocol: "tcp",
ServicePort: *artifactServerPort,
},
},
},
},
}
if app, err := marathonClient.CreateApplication(application, false); err != nil {
fmt.Println(err.Error())
} else {
tasks, err := marathonClient.Tasks(fmt.Sprintf("%s", app.ID))
for err != nil || len(tasks.Tasks) == 0 ||
!tasks.Tasks[0].HasHealthCheckResults() ||
!tasks.Tasks[0].HealthCheckResult[len(tasks.Tasks[0].HealthCheckResult)-1].Alive {
tasks, err = marathonClient.Tasks(fmt.Sprintf("%s", app.ID))
time.Sleep(5 * time.Second)
}
fmt.Println("Successfully deployed")
}
}
}