Skip to content
This repository was archived by the owner on Jan 21, 2020. It is now read-only.

Commit f6e94d6

Browse files
author
David Chung
authored
Environment variables for AWS plugin and bug fixes (#686)
Signed-off-by: David Chung <[email protected]>
1 parent a84e9a9 commit f6e94d6

File tree

23 files changed

+264
-135
lines changed

23 files changed

+264
-135
lines changed

cmd/metadata/aws/main.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import (
1111
metadata_rpc "github.com/docker/infrakit/pkg/rpc/metadata"
1212
"github.com/docker/infrakit/pkg/run"
1313
"github.com/docker/infrakit/pkg/template"
14+
"github.com/docker/infrakit/pkg/types"
1415
"github.com/spf13/cobra"
1516
)
1617

@@ -35,7 +36,7 @@ func main() {
3536
metadataPlugin, err := metadata.NewPlugin(metadata.Options{
3637
Template: templateURL,
3738
TemplateOptions: template.Options{},
38-
PollInterval: poll,
39+
PollInterval: types.Duration(poll),
3940
StackName: stack,
4041
},
4142
stop)

dockerfiles/Dockerfile.bundle

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
1-
FROM docker:latest
1+
FROM alpine:latest
2+
3+
RUN apk add --update wget ca-certificates openssl libvirt-dev openssh
24

35
RUN mkdir -p /infrakit/plugins /infrakit/configs /infrakit/logs /infrakit/cli /infrakit/instance/terraform
46

docs/controller/ingress/example.yml

Lines changed: 7 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,8 @@ options:
4848
# properties block map to pkg/controller/ingress/types/Properties
4949
properties:
5050
- Backends:
51-
Groups:
52-
53-
# This is a group at socket(group), groupID(cattle).
54-
- group/cattle
51+
Groups:
52+
- group/workers # This is a group at socket(group), groupID(workers).
5553

5654
# This is the plugin name of the L4 plugin. When you run `infrakit plugin start ... simulator`
5755
# the default socket file name is 'simulator' and there's a default lb2 in the RPC object.
@@ -68,10 +66,8 @@ properties:
6866
RouteSources:
6967
swarm:
7068
Host: unix:///var/run/docker.sock
71-
72-
# This field here is required and leave it at 'default'. (TODO - make this not required).
73-
# default will match any services that don't have vhost information.
74-
# There are ways to specify the vhost for a service in the label. If that information
75-
# isn't there, the service will have to be lumped to a 'default' vhost. Otherwise,
76-
# the value of this field will be used to group and match the service which loadbalancer.
77-
Vhost: default
69+
# This is the vhost corresponding to the public service endpoint. Currently there is only
70+
# one matcher in the system which matches all services in a swarm to all 'vhosts'. Additional
71+
# matchers can be implemented to take swarm service label and match services to different vhosts
72+
# and therefore different loadbalancers. Because it's match-all, it's ok to leave this field out.
73+
#Vhost: test.com

pkg/controller/ingress/managed.go

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import (
1212
"github.com/docker/infrakit/pkg/fsm"
1313
logutil "github.com/docker/infrakit/pkg/log"
1414
"github.com/docker/infrakit/pkg/manager"
15+
"github.com/docker/infrakit/pkg/plugin"
1516
group_rpc "github.com/docker/infrakit/pkg/rpc/group"
1617
loadbalancer_rpc "github.com/docker/infrakit/pkg/rpc/loadbalancer"
1718
"github.com/docker/infrakit/pkg/spi/group"
@@ -66,6 +67,9 @@ type managed struct {
6667
ticker <-chan time.Time
6768
poller *controller.Poller
6869

70+
groupClients map[plugin.Name]group.Plugin
71+
groupClientsLock gsync.RWMutex
72+
6973
lock gsync.RWMutex
7074
}
7175

@@ -75,15 +79,31 @@ func (c *managed) state() ingress.Properties {
7579
}
7680

7781
func (c *managed) groupPlugin(g ingress.Group) (group.Plugin, error) {
82+
c.groupClientsLock.Lock()
83+
defer c.groupClientsLock.Unlock()
84+
7885
if c.plugins == nil {
7986
return nil, fmt.Errorf("no lookup")
8087
}
8188

82-
endpoint, err := c.plugins().Find(g.Plugin())
83-
if err != nil {
84-
return nil, err
89+
if c.groupClients == nil {
90+
c.groupClients = map[plugin.Name]group.Plugin{}
91+
}
92+
93+
found, has := c.groupClients[g.Plugin()]
94+
if !has {
95+
endpoint, err := c.plugins().Find(g.Plugin())
96+
if err != nil {
97+
return nil, err
98+
}
99+
cl, err := group_rpc.NewClient(endpoint.Address)
100+
if err != nil {
101+
return nil, err
102+
}
103+
c.groupClients[g.Plugin()] = cl
104+
found = cl
85105
}
86-
return group_rpc.NewClient(endpoint.Address)
106+
return found, nil
87107
}
88108

89109
func (c *managed) l4Client(spec ingress.Spec) (loadbalancer.L4, error) {

pkg/controller/ingress/swarm/listener.go

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,20 @@ func (l *listener) extPort() int {
121121
}
122122
}
123123

124+
const (
125+
// HostNotSpecified is a constant that indicates no host information is provided
126+
// so a route / listener derived from this Swarm service should apply to any (or all) loadbalancers.
127+
HostNotSpecified = ""
128+
)
129+
124130
func (l *listener) host() string {
125131
hostport := ":80"
126132
if l.URL != nil {
127133
hostport = l.URL.Host
128134
}
129135
h := strings.Split(hostport, ":")[0]
130136
if h == "" {
131-
return "default"
137+
return HostNotSpecified
132138
}
133139
return h
134140
}

pkg/controller/ingress/swarm/listener_test.go

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ func TestListener(t *testing.T) {
1717
require.Equal(t, int(80), l.extPort())
1818
require.Equal(t, int(30000), l.SwarmPort)
1919
require.Equal(t, "foo", l.Service)
20-
require.Equal(t, "default", l.host())
20+
require.Equal(t, HostNotSpecified, l.host())
2121

2222
l, err = newListener("foo", 30000, "http://", emptyCert)
2323
require.NoError(t, err)
@@ -26,7 +26,7 @@ func TestListener(t *testing.T) {
2626
require.Equal(t, int(80), l.extPort())
2727
require.Equal(t, int(30000), l.SwarmPort)
2828
require.Equal(t, "foo", l.Service)
29-
require.Equal(t, "default", l.host())
29+
require.Equal(t, HostNotSpecified, l.host())
3030

3131
l, err = newListener("foo", 30000, "http://localswarm:8080", emptyCert)
3232
require.NoError(t, err)
@@ -50,7 +50,7 @@ func TestListenerSSLCertNoPort(t *testing.T) {
5050
require.Equal(t, int(443), l.extPort())
5151
require.Equal(t, int(30000), l.SwarmPort)
5252
require.Equal(t, "foo", l.Service)
53-
require.Equal(t, "default", l.host())
53+
require.Equal(t, HostNotSpecified, l.host())
5454
require.Equal(t, &cert, l.CertASN())
5555
require.Equal(t, []int{443}, l.CertPorts())
5656
r := l.asRoute()
@@ -66,7 +66,7 @@ func TestListenerSSLCertNoPort(t *testing.T) {
6666
require.Equal(t, int(444), l.extPort())
6767
require.Equal(t, int(30000), l.SwarmPort)
6868
require.Equal(t, "foo", l.Service)
69-
require.Equal(t, "default", l.host())
69+
require.Equal(t, HostNotSpecified, l.host())
7070
require.Equal(t, &cert, l.CertASN())
7171
require.Equal(t, []int{443}, l.CertPorts())
7272
r = l.asRoute()
@@ -81,7 +81,7 @@ func TestListenerSSLCertNoPort(t *testing.T) {
8181
require.Equal(t, int(443), l.extPort())
8282
require.Equal(t, int(30000), l.SwarmPort)
8383
require.Equal(t, "foo", l.Service)
84-
require.Equal(t, "default", l.host())
84+
require.Equal(t, HostNotSpecified, l.host())
8585
require.Equal(t, emptyCert, l.CertASN())
8686
require.Equal(t, []int{443}, l.CertPorts())
8787
r = l.asRoute()
@@ -104,7 +104,7 @@ func TestListenerSSLCertWithPorts(t *testing.T) {
104104
require.Equal(t, int(443), l.extPort())
105105
require.Equal(t, int(30000), l.SwarmPort)
106106
require.Equal(t, "foo", l.Service)
107-
require.Equal(t, "default", l.host())
107+
require.Equal(t, HostNotSpecified, l.host())
108108
require.Equal(t, &asn, l.CertASN())
109109
require.Equal(t, []int{443}, l.CertPorts())
110110
r := l.asRoute()
@@ -119,7 +119,7 @@ func TestListenerSSLCertWithPorts(t *testing.T) {
119119
require.Equal(t, int(442), l.extPort())
120120
require.Equal(t, int(30000), l.SwarmPort)
121121
require.Equal(t, "foo", l.Service)
122-
require.Equal(t, "default", l.host())
122+
require.Equal(t, HostNotSpecified, l.host())
123123
require.Equal(t, &asn, l.CertASN())
124124
require.Equal(t, []int{442}, l.CertPorts())
125125
r = l.asRoute()
@@ -134,7 +134,7 @@ func TestListenerSSLCertWithPorts(t *testing.T) {
134134
require.Equal(t, int(442), l.extPort())
135135
require.Equal(t, int(30000), l.SwarmPort)
136136
require.Equal(t, "foo", l.Service)
137-
require.Equal(t, "default", l.host())
137+
require.Equal(t, HostNotSpecified, l.host())
138138
require.Equal(t, &asn, l.CertASN())
139139
require.Equal(t, []int{443, 442}, l.CertPorts())
140140
r = l.asRoute()
@@ -149,7 +149,7 @@ func TestListenerSSLCertWithPorts(t *testing.T) {
149149
require.Equal(t, int(442), l.extPort())
150150
require.Equal(t, int(30000), l.SwarmPort)
151151
require.Equal(t, "foo", l.Service)
152-
require.Equal(t, "default", l.host())
152+
require.Equal(t, HostNotSpecified, l.host())
153153
require.Equal(t, &asn, l.CertASN())
154154
require.Equal(t, []int{443}, l.CertPorts())
155155
r = l.asRoute()
@@ -164,7 +164,7 @@ func TestListenerSSLCertWithPorts(t *testing.T) {
164164
require.Equal(t, int(443), l.extPort())
165165
require.Equal(t, int(30000), l.SwarmPort)
166166
require.Equal(t, "foo", l.Service)
167-
require.Equal(t, "default", l.host())
167+
require.Equal(t, HostNotSpecified, l.host())
168168
require.Equal(t, &asn, l.CertASN())
169169
require.Equal(t, []int{443}, l.CertPorts())
170170
r = l.asRoute()
@@ -180,15 +180,15 @@ func TestImpliedSwarmPortToUrl(t *testing.T) {
180180
require.NoError(t, err)
181181
require.NotNil(t, l.URL)
182182
require.Equal(t, int(8080), l.extPort())
183-
require.Equal(t, "default", l.host())
183+
require.Equal(t, HostNotSpecified, l.host())
184184
require.Equal(t, int(0), l.SwarmPort)
185185
require.Equal(t, loadbalancer.HTTP, l.protocol())
186186

187187
l, err = impliedSwarmPortToURL("foo", "https://")
188188
require.NoError(t, err)
189189
require.NotNil(t, l.URL)
190190
require.Equal(t, int(443), l.extPort())
191-
require.Equal(t, "default", l.host())
191+
require.Equal(t, HostNotSpecified, l.host())
192192
require.Equal(t, int(0), l.SwarmPort)
193193
require.Equal(t, loadbalancer.HTTPS, l.protocol())
194194

@@ -241,15 +241,15 @@ func TestExplicitSwarmPortToUrl(t *testing.T) {
241241
require.NoError(t, err)
242242
require.NotNil(t, l.URL)
243243
require.Equal(t, int(8080), l.extPort())
244-
require.Equal(t, "default", l.host())
244+
require.Equal(t, HostNotSpecified, l.host())
245245
require.Equal(t, int(7000), l.SwarmPort)
246246
require.Equal(t, loadbalancer.HTTP, l.protocol())
247247

248248
l, err = explicitSwarmPortToURL("foo", "8999=https://")
249249
require.NoError(t, err)
250250
require.NotNil(t, l.URL)
251251
require.Equal(t, int(443), l.extPort())
252-
require.Equal(t, "default", l.host())
252+
require.Equal(t, HostNotSpecified, l.host())
253253
require.Equal(t, int(8999), l.SwarmPort)
254254
require.Equal(t, loadbalancer.HTTPS, l.protocol())
255255

@@ -305,7 +305,7 @@ func TestListenersToPublishImplicitMapping(t *testing.T) {
305305
require.NotNil(t, l)
306306
require.Equal(t, 1, len(l))
307307
require.Equal(t, "web1", l[0].Service)
308-
require.Equal(t, "default", l[0].host())
308+
require.Equal(t, HostNotSpecified, l[0].host())
309309
require.Equal(t, loadbalancer.HTTP, l[0].protocol())
310310
require.Equal(t, int(8080), l[0].extPort())
311311

@@ -320,7 +320,7 @@ func TestListenersToPublishImplicitMapping(t *testing.T) {
320320
require.NotNil(t, l)
321321
require.Equal(t, 1, len(l))
322322
require.Equal(t, "web1", l[0].Service)
323-
require.Equal(t, "default", l[0].host())
323+
require.Equal(t, HostNotSpecified, l[0].host())
324324
require.Equal(t, loadbalancer.HTTP, l[0].protocol())
325325
require.Equal(t, int(80), l[0].extPort())
326326

@@ -371,7 +371,7 @@ func TestListenersToPublishImplicitMapping(t *testing.T) {
371371
require.Equal(t, int(0), l[0].SwarmPort) // implied, no explicit port=url mapping
372372
require.False(t, l[0].SwarmProtocol.Valid()) // not known yet.
373373
require.Equal(t, "web1", l[1].Service)
374-
require.Equal(t, "default", l[1].host())
374+
require.Equal(t, HostNotSpecified, l[1].host())
375375
require.Equal(t, loadbalancer.HTTPS, l[1].protocol())
376376
require.Equal(t, int(443), l[1].extPort())
377377
require.Equal(t, int(0), l[1].SwarmPort) // implied, no explicit port=url mapping
@@ -393,7 +393,7 @@ func TestListenersToPublishExplicitMapping(t *testing.T) {
393393
require.NotNil(t, l)
394394
require.Equal(t, 1, len(l))
395395
require.Equal(t, "web1", l[0].Service)
396-
require.Equal(t, "default", l[0].host())
396+
require.Equal(t, HostNotSpecified, l[0].host())
397397
require.Equal(t, loadbalancer.HTTP, l[0].protocol())
398398
require.Equal(t, int(8080), l[0].extPort())
399399
require.Equal(t, int(30000), l[0].SwarmPort) // implied, no explicit port=url mapping
@@ -406,7 +406,7 @@ func TestListenersToPublishExplicitMapping(t *testing.T) {
406406
require.NotNil(t, l)
407407
require.Equal(t, 2, len(l))
408408
require.Equal(t, "web1", l[0].Service)
409-
require.Equal(t, "default", l[0].host())
409+
require.Equal(t, HostNotSpecified, l[0].host())
410410
require.Equal(t, loadbalancer.HTTPS, l[0].protocol())
411411
require.Equal(t, int(443), l[0].extPort())
412412
require.Equal(t, int(30000), l[0].SwarmPort)
@@ -491,7 +491,7 @@ func TestListenersFromExposedPorts(t *testing.T) {
491491
require.NotNil(t, l)
492492

493493
require.Equal(t, "web1", l[0].Service)
494-
require.Equal(t, "default", l[0].host())
494+
require.Equal(t, HostNotSpecified, l[0].host())
495495
require.Equal(t, loadbalancer.TCP, l[0].protocol())
496496
require.Equal(t, 8080, l[0].extPort())
497497
require.Equal(t, 8080, l[0].SwarmPort)

pkg/controller/ingress/swarm/routes.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ func (b *RoutesBuilder) Build() (*Routes, error) {
141141
if len(b.matchers) == 0 {
142142
routes.matchers = []*matcher{
143143
{
144-
name: "default",
144+
name: "*",
145145
matchFunc: AnyServices,
146146
toRoutes: routes.RoutesFromServices,
147147
},

pkg/controller/ingress/swarm/services_test.go

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ func TestExternalLoadBalancerListenersFromService1(t *testing.T) {
3737
require.NotNil(t, listenersByHost)
3838
require.Equal(t, 1, len(listenersByHost))
3939

40-
hostname := "default"
40+
hostname := HostNotSpecified
4141
listeners, has := listenersByHost[hostname]
4242
require.True(t, has)
4343
require.Equal(t, 1, len(listeners))
4444
listener := listeners[0]
4545
require.Equal(t, "web1", listener.Service)
4646
require.Equal(t, 8080, listener.SwarmPort)
4747
require.Equal(t, loadbalancer.TCP, listener.SwarmProtocol)
48-
require.Equal(t, "default", listener.host())
48+
require.Equal(t, HostNotSpecified, listener.host())
4949
require.Equal(t, loadbalancer.HTTP, listener.protocol())
5050
require.Equal(t, 8080, listener.extPort())
5151
}
@@ -71,15 +71,15 @@ func TestExternalLoadBalancerListenersFromService2(t *testing.T) {
7171
require.NotNil(t, listenersByHost)
7272
require.Equal(t, 1, len(listenersByHost))
7373

74-
hostname := "default"
74+
hostname := HostNotSpecified
7575
listeners, has := listenersByHost[hostname]
7676
require.True(t, has)
7777
require.Equal(t, 1, len(listeners))
7878
listener := listeners[0]
7979
require.Equal(t, "web1", listener.Service)
8080
require.Equal(t, 30000, listener.SwarmPort)
8181
require.Equal(t, loadbalancer.TCP, listener.SwarmProtocol)
82-
require.Equal(t, "default", listener.host())
82+
require.Equal(t, HostNotSpecified, listener.host())
8383
require.Equal(t, loadbalancer.HTTP, listener.protocol())
8484
require.Equal(t, 80, listener.extPort())
8585
}
@@ -209,12 +209,12 @@ func TestExternalLoadBalancerListenersFromService5(t *testing.T) {
209209
require.NotNil(t, listenersByHost)
210210
require.Equal(t, 3, len(listenersByHost))
211211

212-
hostname := "default"
212+
hostname := HostNotSpecified
213213
listeners, has := listenersByHost[hostname]
214214
require.True(t, has)
215215
require.Equal(t, 2, len(listeners))
216-
require.True(t, findListener(listeners, loadbalancer.TCP, "default", 8080, 8080))
217-
require.True(t, findListener(listeners, loadbalancer.TCP, "default", 4343, 4343))
216+
require.True(t, findListener(listeners, loadbalancer.TCP, HostNotSpecified, 8080, 8080))
217+
require.True(t, findListener(listeners, loadbalancer.TCP, HostNotSpecified, 4343, 4343))
218218

219219
hostname = "foo.bar.com"
220220
listeners, has = listenersByHost[hostname]
@@ -281,10 +281,10 @@ func TestExternalLoadBalancerListenersFromServiceWithNoLabels(t *testing.T) {
281281
require.NotNil(t, listenersByHost)
282282
require.Equal(t, 1, len(listenersByHost))
283283

284-
hostname := "default"
284+
hostname := HostNotSpecified
285285
listeners, has := listenersByHost[hostname]
286286
require.True(t, has)
287287
require.Equal(t, 2, len(listeners))
288-
require.True(t, findListener(listeners, loadbalancer.TCP, "default", 8080, 8080))
289-
require.True(t, findListener(listeners, loadbalancer.TCP, "default", 4343, 4343))
288+
require.True(t, findListener(listeners, loadbalancer.TCP, HostNotSpecified, 8080, 8080))
289+
require.True(t, findListener(listeners, loadbalancer.TCP, HostNotSpecified, 4343, 4343))
290290
}

pkg/controller/ingress/types/funcs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ func (p Properties) HealthChecks() (result map[Vhost][]loadbalancer.HealthCheck,
6969
func (p Properties) Groups() (result map[Vhost][]Group, err error) {
7070
result = map[Vhost][]Group{}
7171
for _, spec := range p {
72-
72+
log.Debug("found spec", "spec", spec, "vhost", spec.Vhost)
7373
if _, has := result[spec.Vhost]; !has {
7474
result[spec.Vhost] = []Group{}
7575
}

0 commit comments

Comments
 (0)