@@ -17,6 +17,7 @@ package handlers
17
17
import (
18
18
"fmt"
19
19
"math/rand"
20
+ "net"
20
21
"strings"
21
22
22
23
"github.com/docker/docker/pkg/namesgenerator"
@@ -37,10 +38,13 @@ import (
37
38
"github.com/vmware/vic/pkg/vsphere/spec"
38
39
"github.com/vmware/vic/pkg/vsphere/tasks"
39
40
"github.com/vmware/vic/pkg/vsphere/vm"
41
+ "github.com/vmware/vic/portlayer/network"
40
42
)
41
43
42
44
// ExecHandlersImpl is the receiver for all of the exec handler methods
43
- type ExecHandlersImpl struct {}
45
+ type ExecHandlersImpl struct {
46
+ netCtx * network.Context
47
+ }
44
48
45
49
var (
46
50
execSession = & session.Session {}
@@ -51,7 +55,7 @@ const (
51
55
)
52
56
53
57
// 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 ) {
55
59
var err error
56
60
57
61
api .ExecContainerCreateHandler = exec .ContainerCreateHandlerFunc (handler .ContainerCreateHandler )
@@ -73,12 +77,73 @@ func (handler *ExecHandlersImpl) Configure(api *operations.PortLayerAPI) {
73
77
if err != nil {
74
78
log .Fatalf ("ERROR: %s" , err )
75
79
}
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
76
140
}
77
141
78
142
// ContainerCreateHandler creates a new container
79
143
func (handler * ExecHandlersImpl ) ContainerCreateHandler (params exec.ContainerCreateParams ) middleware.Responder {
80
144
defer trace .End (trace .Begin ("ContainerCreate" ))
81
145
146
+ var err error
82
147
var name string
83
148
session := execSession
84
149
@@ -122,9 +187,26 @@ func (handler *ExecHandlersImpl) ContainerCreateHandler(params exec.ContainerCre
122
187
Cmd : cmd ,
123
188
},
124
189
},
190
+ Networks : make (map [string ]metadata.NetworkEndpoint ),
125
191
}
126
192
log .Infof ("Metadata: %#v" , m )
127
193
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
+
128
210
specconfig := & spec.VirtualMachineConfigSpecConfig {
129
211
// FIXME: hardcoded values
130
212
NumCPUs : 2 ,
0 commit comments