Skip to content

Commit 2915b50

Browse files
committed
Auto create cni default network
Signed-off-by: Abhinandan Prativadi <abhi@docker.com>
1 parent 629e7f7 commit 2915b50

6 files changed

Lines changed: 64 additions & 12 deletions

File tree

client/network.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ func (cli *NetworkCli) CmdNetworkCreate(chain string, args ...string) error {
8585
}
8686

8787
// Construct network create request body
88-
nc := networkCreate{Name: cmd.Arg(0), NetworkType: *flDriver, ID: *flID, IPv4Conf: icList, DriverOpts: driverOpts, NetworkOpts: networkOpts}
88+
nc := NetworkCreate{Name: cmd.Arg(0), NetworkType: *flDriver, ID: *flID, IPv4Conf: icList, DriverOpts: driverOpts, NetworkOpts: networkOpts}
8989
obj, _, err := readBody(cli.call("POST", "/networks", nc, nil))
9090
if err != nil {
9191
return err
@@ -137,7 +137,7 @@ func (cli *NetworkCli) CmdNetworkLs(chain string, args ...string) error {
137137
*last = 1
138138
}
139139

140-
var networkResources []networkResource
140+
var networkResources []NetworkResource
141141
err = json.Unmarshal(obj, &networkResources)
142142
if err != nil {
143143
return err
@@ -189,7 +189,7 @@ func (cli *NetworkCli) CmdNetworkInfo(chain string, args ...string) error {
189189
if err != nil {
190190
return err
191191
}
192-
networkResource := &networkResource{}
192+
networkResource := &NetworkResource{}
193193
if err := json.NewDecoder(bytes.NewReader(obj)).Decode(networkResource); err != nil {
194194
return err
195195
}
@@ -222,7 +222,7 @@ func lookupNetworkID(cli *NetworkCli, nameID string) (string, error) {
222222
return "", fmt.Errorf("name query failed for %s due to : statuscode(%d) %v", nameID, statusCode, string(obj))
223223
}
224224

225-
var list []*networkResource
225+
var list []*NetworkResource
226226
err = json.Unmarshal(obj, &list)
227227
if err != nil {
228228
return "", err

client/service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ func lookupServiceID(cli *NetworkCli, nwName, svNameID string) (string, error) {
3333
if err != nil {
3434
return "", err
3535
}
36-
var nwList []networkResource
36+
var nwList []NetworkResource
3737
if err = json.Unmarshal(obj, &nwList); err != nil {
3838
return "", err
3939
}
@@ -46,7 +46,7 @@ func lookupServiceID(cli *NetworkCli, nwName, svNameID string) (string, error) {
4646
if err != nil {
4747
return "", err
4848
}
49-
networkResource := &networkResource{}
49+
networkResource := &NetworkResource{}
5050
if err := json.NewDecoder(bytes.NewReader(obj)).Decode(networkResource); err != nil {
5151
return "", err
5252
}

client/types.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@ import (
1010
Resources
1111
************/
1212

13-
// networkResource is the body of the "get network" http response message
14-
type networkResource struct {
13+
// NetworkResource is the body of the "get network" http response message
14+
type NetworkResource struct {
1515
Name string `json:"name"`
1616
ID string `json:"id"`
1717
Type string `json:"type"`
@@ -42,8 +42,8 @@ type ipamConf struct {
4242
AuxAddresses map[string]string
4343
}
4444

45-
// networkCreate is the expected body of the "create network" http request message
46-
type networkCreate struct {
45+
// NetworkCreate is the expected body of the "create network" http request message
46+
type NetworkCreate struct {
4747
Name string `json:"name"`
4848
ID string `json:"id"`
4949
NetworkType string `json:"network_type"`

config/config.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,10 @@ func ParseConfig(tomlCfgFile string) (*Config, error) {
7777
if cfg.Cluster.Discovery == "" {
7878
cfg.Cluster.Discovery = os.Getenv("DNET_DISCOVERY")
7979
}
80+
//TODO (ABHI): Handle this better. default to etcd for now
81+
if !(strings.Contains(cfg.Cluster.Discovery, "etcd") || strings.Contains(cfg.Cluster.Discovery, "consul")) {
82+
cfg.Cluster.Discovery = "etcd://" + cfg.Cluster.Discovery
83+
}
8084
fmt.Printf("cluster address=%s, discovery=%s \n", cfg.Cluster.Address, cfg.Cluster.Discovery)
8185

8286
if _, ok := cfg.Scopes[datastore.GlobalScope]; !ok {

pkg/cniapi/api.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ func (l *LibNetCniClient) SetupPod(args *skel.CmdArgs) (*current.Result, error)
5656
log.Infof("Received Setup Pod %+v", args)
5757
podNetInfo, err := validatePodNetworkInfo(args)
5858
if err != nil {
59-
return nil, fmt.Errorf("failed to valid cni arguements, error: %v", err)
59+
return nil, fmt.Errorf("failed to valid cni arguments, error: %v", err)
6060
}
6161
buf, err := json.Marshal(podNetInfo)
6262
if err != nil {
@@ -110,7 +110,7 @@ func (l *LibNetCniClient) TearDownPod(args *skel.CmdArgs) error {
110110
log.Infof("Received Teardown Pod request %+v", args)
111111
podNetInfo, err := validatePodNetworkInfo(args)
112112
if err != nil {
113-
return fmt.Errorf("failed to valid cni arguements, error: %v", err)
113+
return fmt.Errorf("failed to valid cni arguments, error: %v", err)
114114
}
115115
buf, err := json.Marshal(podNetInfo)
116116
if err != nil {

pkg/server/cniserver/add_pod.go

Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,14 @@ func createSandbox(ContainerID, netns string) (string, error) {
106106

107107
func createEndpoint(ContainerID string, netConfig types.NetConf) (client.EndpointInfo, error) {
108108
var ep client.EndpointInfo
109+
// Create network if it doesnt exist. Need to handle refcount to delete
110+
// network on last pod delete. Also handle different network types and option
111+
if !networkExists(netConfig.Name) {
112+
if err := createNetwork(netConfig.Name, "overlay"); err != nil {
113+
return ep, err
114+
}
115+
}
116+
109117
sc := client.ServiceCreate{Name: ContainerID, Network: netConfig.Name, DisableResolution: true}
110118
obj, _, err := readBody(httpCall("POST", "/services", sc, nil))
111119
if err != nil {
@@ -123,3 +131,43 @@ func endpointJoin(sandboxID, endpointID, netns string) (retErr error) {
123131

124132
return err
125133
}
134+
135+
func networkExists(networkName string) bool {
136+
fmt.Printf("Check if %s network exists \n", networkName)
137+
obj, statusCode, err := readBody(httpCall("GET", "/networks?name="+networkName, nil, nil))
138+
if err != nil {
139+
fmt.Printf("%s network does not exists \n", networkName)
140+
return false
141+
}
142+
if statusCode != http.StatusOK {
143+
fmt.Printf("%s network does not exists \n", networkName)
144+
return false
145+
}
146+
var list []*client.NetworkResource
147+
err = json.Unmarshal(obj, &list)
148+
if err != nil {
149+
return false
150+
}
151+
fmt.Printf("%s network exists \n", networkName)
152+
return (len(list) != 0)
153+
}
154+
155+
// createNetwork is a very simple utility to create a default network
156+
// if not present. This needs to be expanded into a more full utility function
157+
func createNetwork(networkName string, driver string) error {
158+
fmt.Printf("Creating a network %s driver: %s \n", networkName, driver)
159+
driverOpts := make(map[string]string)
160+
driverOpts["hostaccess"] = ""
161+
nc := client.NetworkCreate{Name: networkName, NetworkType: driver,
162+
DriverOpts: driverOpts}
163+
obj, _, err := readBody(httpCall("POST", "/networks", nc, nil))
164+
if err != nil {
165+
return err
166+
}
167+
var replyID string
168+
err = json.Unmarshal(obj, &replyID)
169+
if err != nil {
170+
return err
171+
}
172+
return nil
173+
}

0 commit comments

Comments
 (0)