Skip to content

Commit e9d9e90

Browse files
author
Hasan Mahmood
committed
Adding net support to docker create
Adding net support to port layer exec create
1 parent 4823993 commit e9d9e90

File tree

11 files changed

+161
-38
lines changed

11 files changed

+161
-38
lines changed

apiservers/engine/backends/container.go

+20
Original file line numberDiff line numberDiff line change
@@ -283,6 +283,7 @@ func (c *Container) dockerContainerCreateParamsToPortlayer(cc types.ContainerCre
283283
// network
284284
portLayerConfig.CreateConfig.NetworkDisabled = new(bool)
285285
*portLayerConfig.CreateConfig.NetworkDisabled = cc.Config.NetworkDisabled
286+
portLayerConfig.CreateConfig.NetworkSettings = toModelsNetworkConfig(cc)
286287

287288
// working dir
288289
portLayerConfig.CreateConfig.WorkingDir = new(string)
@@ -291,6 +292,25 @@ func (c *Container) dockerContainerCreateParamsToPortlayer(cc types.ContainerCre
291292
return portLayerConfig
292293
}
293294

295+
func toModelsNetworkConfig(cc types.ContainerCreateConfig) *models.NetworkConfig {
296+
if cc.Config.NetworkDisabled {
297+
return nil
298+
}
299+
300+
nc := &models.NetworkConfig{
301+
NetworkName: cc.HostConfig.NetworkMode.NetworkName(),
302+
}
303+
if cc.NetworkingConfig != nil {
304+
if es, ok := cc.NetworkingConfig.EndpointsConfig[nc.NetworkName]; ok {
305+
if es.IPAMConfig != nil {
306+
nc.Address = &es.IPAMConfig.IPv4Address
307+
}
308+
}
309+
}
310+
311+
return nc
312+
}
313+
294314
func (c *Container) imageExist(imageID string) (storeName string, err error) {
295315
// Call the storage port layer to determine if the image currently exist
296316
host, err := os.Hostname()

apiservers/engine/backends/network.go

+2
Original file line numberDiff line numberDiff line change
@@ -92,10 +92,12 @@ func (n *Network) CreateNetwork(name, driver string, ipam apinet.IPAM, options m
9292
var pools []string
9393
if len(ipam.Config) > 0 {
9494
if ipam.Config[0].Gateway != "" {
95+
gateway = new(string)
9596
*gateway = ipam.Config[0].Gateway
9697
}
9798

9899
if ipam.Config[0].Subnet != "" {
100+
subnet = new(string)
99101
*subnet = ipam.Config[0].Subnet
100102
}
101103

apiservers/portlayer/restapi/configure_port_layer.go

+23-10
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
package restapi
1616

1717
import (
18+
"net"
1819
"net/http"
1920

2021
log "github.com/Sirupsen/logrus"
@@ -26,15 +27,20 @@ import (
2627
"github.com/vmware/vic/apiservers/portlayer/restapi/handlers"
2728
"github.com/vmware/vic/apiservers/portlayer/restapi/operations"
2829
"github.com/vmware/vic/apiservers/portlayer/restapi/options"
30+
"github.com/vmware/vic/portlayer/network"
2931
)
3032

3133
// This file is safe to edit. Once it exists it will not be overwritten
3234

33-
type portlayerhandlers struct {
34-
storageHandlers handlers.StorageHandlersImpl
35-
miscHandlers handlers.MiscHandlersImpl
36-
scopesHandlers handlers.ScopesHandlersImpl
37-
execHandlers handlers.ExecHandlersImpl
35+
type handler interface {
36+
Configure(api *operations.PortLayerAPI, netCtx *network.Context)
37+
}
38+
39+
var portlayerhandlers = []handler{
40+
&handlers.StorageHandlersImpl{},
41+
&handlers.MiscHandlersImpl{},
42+
&handlers.ScopesHandlersImpl{},
43+
&handlers.ExecHandlersImpl{},
3844
}
3945

4046
func configureFlags(api *operations.PortLayerAPI) {
@@ -63,12 +69,19 @@ func configureAPI(api *operations.PortLayerAPI) http.Handler {
6369

6470
api.TxtProducer = httpkit.TextProducer()
6571

66-
allhandlers := portlayerhandlers{}
72+
netCtx, err := network.NewContext(
73+
net.IPNet{
74+
IP: net.IPv4(172, 16, 0, 0),
75+
Mask: net.CIDRMask(12, 32),
76+
},
77+
net.CIDRMask(16, 32))
78+
if err != nil {
79+
log.Fatalf("failed to create network context: %s", err)
80+
}
6781

68-
allhandlers.storageHandlers.Configure(api)
69-
allhandlers.miscHandlers.Configure(api)
70-
allhandlers.scopesHandlers.Configure(api)
71-
allhandlers.execHandlers.Configure(api)
82+
for _, handler := range portlayerhandlers {
83+
handler.Configure(api, netCtx)
84+
}
7285

7386
api.ServerShutdown = func() {}
7487
return setupGlobalMiddleware(api.Serve(setupMiddlewares))

apiservers/portlayer/restapi/handlers/exec_handlers.go

+84-2
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ package handlers
1717
import (
1818
"fmt"
1919
"math/rand"
20+
"net"
2021
"strings"
2122

2223
"github.com/docker/docker/pkg/namesgenerator"
@@ -37,10 +38,13 @@ import (
3738
"github.com/vmware/vic/pkg/vsphere/spec"
3839
"github.com/vmware/vic/pkg/vsphere/tasks"
3940
"github.com/vmware/vic/pkg/vsphere/vm"
41+
"github.com/vmware/vic/portlayer/network"
4042
)
4143

4244
// ExecHandlersImpl is the receiver for all of the exec handler methods
43-
type ExecHandlersImpl struct{}
45+
type ExecHandlersImpl struct {
46+
netCtx *network.Context
47+
}
4448

4549
var (
4650
execSession = &session.Session{}
@@ -51,7 +55,7 @@ const (
5155
)
5256

5357
// Configure assigns functions to all the exec api handlers
54-
func (handler *ExecHandlersImpl) Configure(api *operations.PortLayerAPI) {
58+
func (handler *ExecHandlersImpl) Configure(api *operations.PortLayerAPI, netCtx *network.Context) {
5559
var err error
5660

5761
api.ExecContainerCreateHandler = exec.ContainerCreateHandlerFunc(handler.ContainerCreateHandler)
@@ -73,12 +77,73 @@ func (handler *ExecHandlersImpl) Configure(api *operations.PortLayerAPI) {
7377
if err != nil {
7478
log.Fatalf("ERROR: %s", err)
7579
}
80+
81+
handler.netCtx = netCtx
82+
}
83+
84+
func (handler *ExecHandlersImpl) addContainerToScope(name string, ns *models.NetworkConfig) (*metadata.NetworkEndpoint, *network.Scope, error) {
85+
if ns == nil {
86+
return nil, nil, nil
87+
}
88+
89+
var err error
90+
var s *network.Scope
91+
switch ns.NetworkName {
92+
// docker's default network, usually maps to the default bridge network
93+
case "default":
94+
s = handler.netCtx.DefaultScope()
95+
96+
default:
97+
var scopes []*network.Scope
98+
scopes, err = handler.netCtx.Scopes(&ns.NetworkName)
99+
if err != nil || len(scopes) != 1 {
100+
return nil, nil, err
101+
}
102+
103+
// should have only one match at this point
104+
s = scopes[0]
105+
}
106+
107+
var ip *net.IP
108+
if ns.Address != nil {
109+
i := net.ParseIP(*ns.Address)
110+
if i == nil {
111+
return nil, nil, fmt.Errorf("invalid ip address")
112+
}
113+
114+
ip = &i
115+
}
116+
117+
var e *network.Endpoint
118+
e, err = s.AddContainer(name, ip)
119+
if err != nil {
120+
return nil, nil, err
121+
}
122+
123+
ne := &metadata.NetworkEndpoint{
124+
IP: net.IPNet{
125+
IP: e.IP(),
126+
Mask: e.Subnet().Mask,
127+
},
128+
Network: metadata.ContainerNetwork{
129+
// FIXME: https://github.com/vmware/vic/issues/444
130+
// FIXME: this needs to point to switch or port group name
131+
Name: e.Scope().Name(),
132+
Gateway: net.IPNet{
133+
IP: e.Gateway(),
134+
Mask: e.Subnet().Mask,
135+
},
136+
},
137+
}
138+
139+
return ne, s, nil
76140
}
77141

78142
// ContainerCreateHandler creates a new container
79143
func (handler *ExecHandlersImpl) ContainerCreateHandler(params exec.ContainerCreateParams) middleware.Responder {
80144
defer trace.End(trace.Begin("ContainerCreate"))
81145

146+
var err error
82147
var name string
83148
session := execSession
84149

@@ -122,9 +187,26 @@ func (handler *ExecHandlersImpl) ContainerCreateHandler(params exec.ContainerCre
122187
Cmd: cmd,
123188
},
124189
},
190+
Networks: make(map[string]metadata.NetworkEndpoint),
125191
}
126192
log.Infof("Metadata: %#v", m)
127193

194+
// network config
195+
ns := params.CreateConfig.NetworkSettings
196+
ne, s, err := handler.addContainerToScope(name, ns)
197+
defer func() {
198+
if err != nil {
199+
log.Errorf(err.Error())
200+
if s != nil {
201+
s.RemoveContainer(name)
202+
}
203+
}
204+
}()
205+
206+
if ne != nil {
207+
m.Networks[ne.Network.Name] = *ne
208+
}
209+
128210
specconfig := &spec.VirtualMachineConfigSpecConfig{
129211
// FIXME: hardcoded values
130212
NumCPUs: 2,

apiservers/portlayer/restapi/handlers/misc_handlers.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -18,12 +18,13 @@ import (
1818
"github.com/go-swagger/go-swagger/httpkit/middleware"
1919
"github.com/vmware/vic/apiservers/portlayer/restapi/operations"
2020
"github.com/vmware/vic/apiservers/portlayer/restapi/operations/misc"
21+
"github.com/vmware/vic/portlayer/network"
2122
)
2223

2324
type MiscHandlersImpl struct{}
2425

2526
// Configure assigns functions to all the miscellaneous api handlers
26-
func (handler *MiscHandlersImpl) Configure(api *operations.PortLayerAPI) {
27+
func (handler *MiscHandlersImpl) Configure(api *operations.PortLayerAPI, netCtx *network.Context) {
2728
api.MiscPingHandler = misc.PingHandlerFunc(handler.Ping)
2829
}
2930

apiservers/portlayer/restapi/handlers/scopes_handlers.go

+7-18
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ import (
1919
"net"
2020
"net/http"
2121

22-
log "github.com/Sirupsen/logrus"
2322
middleware "github.com/go-swagger/go-swagger/httpkit/middleware"
2423

2524
"github.com/vmware/vic/apiservers/portlayer/models"
@@ -30,26 +29,16 @@ import (
3029

3130
// ScopesHandlersImpl is the receiver for all of the storage handler methods
3231
type ScopesHandlersImpl struct {
33-
ctx *network.Context
32+
netCtx *network.Context
3433
}
3534

36-
// Configure assigns functions to all the storage api handlers
37-
func (handler *ScopesHandlersImpl) Configure(api *operations.PortLayerAPI) {
35+
// Configure assigns functions to all the scopes api handlers
36+
func (handler *ScopesHandlersImpl) Configure(api *operations.PortLayerAPI, netCtx *network.Context) {
3837
api.ScopesCreateHandler = scopes.CreateHandlerFunc(handler.ScopesCreate)
3938
api.ScopesListAllHandler = scopes.ListAllHandlerFunc(handler.ScopesListAll)
4039
api.ScopesListHandler = scopes.ListHandlerFunc(handler.ScopesList)
4140

42-
var err error
43-
handler.ctx, err = network.NewContext(
44-
net.IPNet{
45-
IP: net.IPv4(172, 16, 0, 0),
46-
Mask: net.CIDRMask(12, 32),
47-
},
48-
net.CIDRMask(16, 32))
49-
50-
if err != nil {
51-
log.Fatalf("could not create network context: %s", err)
52-
}
41+
handler.netCtx = netCtx
5342
}
5443

5544
func parseScopeConfig(cfg *models.ScopeConfig) (subnet *net.IPNet, gateway net.IP, dns []net.IP, err error) {
@@ -104,7 +93,7 @@ func (handler *ScopesHandlersImpl) ScopesCreate(params scopes.CreateParams) midd
10493
return scopes.NewCreateDefault(http.StatusServiceUnavailable).WithPayload(&models.Error{Message: err.Error()})
10594
}
10695

107-
s, err := handler.ctx.NewScope(cfg.ScopeType, cfg.Name, subnet, gateway, dns, cfg.IPAM)
96+
s, err := handler.netCtx.NewScope(cfg.ScopeType, cfg.Name, subnet, gateway, dns, cfg.IPAM)
10897
if _, ok := err.(network.DuplicateResourceError); ok {
10998
return scopes.NewCreateConflict()
11099
}
@@ -117,7 +106,7 @@ func (handler *ScopesHandlersImpl) ScopesCreate(params scopes.CreateParams) midd
117106
}
118107

119108
func (handler *ScopesHandlersImpl) ScopesListAll() middleware.Responder {
120-
cfgs, err := listScopes(handler.ctx, "")
109+
cfgs, err := listScopes(handler.netCtx, "")
121110
if err != nil {
122111
return scopes.NewListDefault(http.StatusServiceUnavailable).WithPayload(&models.Error{Message: err.Error()})
123112
}
@@ -126,7 +115,7 @@ func (handler *ScopesHandlersImpl) ScopesListAll() middleware.Responder {
126115
}
127116

128117
func (handler *ScopesHandlersImpl) ScopesList(params scopes.ListParams) middleware.Responder {
129-
cfgs, err := listScopes(handler.ctx, params.IDName)
118+
cfgs, err := listScopes(handler.netCtx, params.IDName)
130119
if _, ok := err.(network.ResourceNotFoundError); ok {
131120
return scopes.NewListNotFound()
132121
}

apiservers/portlayer/restapi/handlers/storage_handlers.go

+2-1
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ import (
2929
"github.com/vmware/vic/apiservers/portlayer/restapi/options"
3030
"github.com/vmware/vic/pkg/vsphere/session"
3131

32+
"github.com/vmware/vic/portlayer/network"
3233
spl "github.com/vmware/vic/portlayer/storage"
3334
"github.com/vmware/vic/portlayer/util"
3435
vsphere "github.com/vmware/vic/portlayer/vsphere/storage"
@@ -43,7 +44,7 @@ var (
4344
)
4445

4546
// Configure assigns functions to all the storage api handlers
46-
func (handler *StorageHandlersImpl) Configure(api *operations.PortLayerAPI) {
47+
func (handler *StorageHandlersImpl) Configure(api *operations.PortLayerAPI, netCtx *network.Context) {
4748
var err error
4849

4950
ctx := context.Background()

apiservers/portlayer/swagger.yml

+12-1
Original file line numberDiff line numberDiff line change
@@ -283,7 +283,7 @@ paths:
283283
summary: "Starts an existing container"
284284
operationId: ContainerStart
285285
tags: ["exec"]
286-
consumes:
286+
consumes:
287287
- application/octet-stream
288288
parameters:
289289
- name: id
@@ -408,8 +408,19 @@ definitions:
408408
type: string
409409
networkDisabled:
410410
type: boolean
411+
networkSettings:
412+
$ref: "#/definitions/NetworkConfig"
411413
ContainerCreatedInfo:
412414
type: object
413415
properties:
414416
containerID:
415417
type: string
418+
NetworkConfig:
419+
type: object
420+
required:
421+
- networkName
422+
properties:
423+
networkName:
424+
type: string
425+
address:
426+
type: string

portlayer/network/context.go

+7-3
Original file line numberDiff line numberDiff line change
@@ -29,8 +29,8 @@ type Context struct {
2929
defaultBridgePool *AddressSpace
3030
defaultBridgeMask net.IPMask
3131

32-
scopes map[string]*Scope
33-
defaultBridgeScope *Scope
32+
scopes map[string]*Scope
33+
defaultScope *Scope
3434
}
3535

3636
func NewContext(bridgePool net.IPNet, bridgeMask net.IPMask) (*Context, error) {
@@ -51,7 +51,7 @@ func NewContext(bridgePool net.IPNet, bridgeMask net.IPMask) (*Context, error) {
5151
return nil, err
5252
}
5353

54-
ctx.defaultBridgeScope = s
54+
ctx.defaultScope = s
5555
return ctx, nil
5656
}
5757

@@ -347,3 +347,7 @@ func (c *Context) Scopes(idName *string) ([]*Scope, error) {
347347

348348
return _scopes, nil
349349
}
350+
351+
func (c *Context) DefaultScope() *Scope {
352+
return c.defaultScope
353+
}

0 commit comments

Comments
 (0)