This repository has been archived by the owner on Nov 16, 2020. It is now read-only.
/
local.go
129 lines (110 loc) · 3.84 KB
/
local.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
///////////////////////////////////////////////////////////////////////
// Copyright (c) 2017 VMware, Inc. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
///////////////////////////////////////////////////////////////////////
package dispatchserver
import (
"fmt"
"io"
log "github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/vmware/dispatch/pkg/api-manager/gateway/local"
"github.com/vmware/dispatch/pkg/dispatchcli/i18n"
"github.com/vmware/dispatch/pkg/events/transport"
dockerfaas "github.com/vmware/dispatch/pkg/functions/docker"
"github.com/vmware/dispatch/pkg/http"
"github.com/vmware/dispatch/pkg/secret-store/service"
)
type localConfig struct {
DockerHost string `mapstructure:"docker-host" json:"docker-host,omitempty"`
GatewayPort int `mapstructure:"gateway-port" json:"gateway-port,omitempty"`
GatewayTLSPort int `mapstructure:"gateway-tls-port" json:"gateway-tls-port,omitempty"`
}
// NewCmdLocal creates a subcommand to run Dispatch Local server
func NewCmdLocal(out io.Writer, config *serverConfig) *cobra.Command {
cmd := &cobra.Command{
Use: "local",
Short: i18n.T("Run Dispatch local server with all services"),
Args: cobra.NoArgs,
PreRun: bindLocalFlags(&config.Local),
Run: func(cmd *cobra.Command, args []string) {
runLocal(config)
},
}
cmd.SetOutput(out)
cmd.Flags().String("docker-host", "127.0.0.1", "Docker host/IP. It must be reachable from Dispatch Server.")
cmd.Flags().Int("gateway-port", 8081, "Port for local API Gateway")
cmd.Flags().Int("gateway-tls-port", 8444, "TLS port for local API Gateway (only when TLS Enabled in global flags)")
return cmd
}
func runLocal(config *serverConfig) {
config.DisableRegistry = true
store := entityStore(config)
docker := dockerClient(config)
functions := functionsClient(config)
secrets := secretsClient(config)
services := servicesClient(config)
images := imagesClient(config)
secretsService := &service.DBSecretsService{EntityStore: store}
secretsHandler := initSecrets(config, secretsService)
imagesHandler, imagesShutdown := initImages(config, store)
defer imagesShutdown()
faas := dockerfaas.New(docker)
functionsDeps := functionsDependencies{
store: store,
faas: faas,
dockerclient: docker,
imagesClient: images,
secretsClient: secrets,
servicesClient: services,
}
functionsHandler, functionsShutdown := initFunctions(config, functionsDeps)
defer functionsShutdown()
gw, err := local.NewGateway(functions)
if err != nil {
log.Fatalf("Error creating API Gateway: %v", err)
}
gw.Server = httpServer(config)
gw.Server.Port = config.Local.GatewayPort
gw.Server.TLSPort = config.Local.GatewayTLSPort
gw.Server.Name = "API Gateway"
go func() {
err := gw.Serve()
if err != nil {
log.Errorf("Error running API Gateway: %v", err)
}
}()
apisHandler, apisShutdown := initAPIs(config, store, gw)
defer apisShutdown()
eventTransport := transport.NewInMemory()
eventsDeps := eventsDependencies{
store: store,
transport: eventTransport,
// TODO: add backend for event drivers in docker
driversBackend: nil,
functionsClient: functions,
secretsClient: secrets,
}
eventsHandler, eventsShutdown := initEvents(config, eventsDeps)
defer eventsShutdown()
dispatchHandler := &http.AllInOneRouter{
FunctionsHandler: functionsHandler,
ImagesHandler: imagesHandler,
SecretsHandler: secretsHandler,
EventsHandler: eventsHandler,
APIHandler: apisHandler,
}
handler := addMiddleware(dispatchHandler)
server := httpServer(config)
server.SetHandler(handler)
defer server.Shutdown()
if err := server.Serve(); err != nil {
log.Error(err)
}
}
func getLocalEndpoint(config *serverConfig) string {
if !config.DisableHTTP {
return fmt.Sprintf("http://%s:%d", config.Host, config.Port)
}
return fmt.Sprintf("https://%s:%d", config.Host, config.TLSPort)
}