Skip to content

Commit f8300fb

Browse files
committed
add list network api
1 parent d7a1256 commit f8300fb

File tree

11 files changed

+443
-148
lines changed

11 files changed

+443
-148
lines changed

cluster/calcium/network.go

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package calcium
2+
3+
import (
4+
"fmt"
5+
6+
"gitlab.ricebook.net/platform/core/types"
7+
"gitlab.ricebook.net/platform/core/utils"
8+
)
9+
10+
// list networks for podname
11+
// just get one node from podname
12+
// and call docker network ls
13+
// only get those driven by network driver
14+
func (c *calcium) ListNetworks(podname string) ([]*types.Network, error) {
15+
networks := []*types.Network{}
16+
nodes, err := c.ListPodNodes(podname)
17+
if err != nil {
18+
return networks, err
19+
}
20+
21+
if len(nodes) == 0 {
22+
return networks, fmt.Errorf("Pod %s has no nodes", podname)
23+
}
24+
25+
node := nodes[0]
26+
ctx := utils.ToDockerContext(node.Engine)
27+
return c.network.ListNetworks(ctx)
28+
}

cluster/cluster.go

+1
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ type Cluster interface {
1414
ListPodNodes(podname string) ([]*types.Node, error)
1515
GetContainer(id string) (*types.Container, error)
1616
GetContainers(ids []string) ([]*types.Container, error)
17+
ListNetworks(podname string) ([]*types.Network, error)
1718

1819
// cluster methods
1920
BuildImage(repository, version, uid, artifact string) (chan *types.BuildImageMessage, error)

devtools/client.py

+17
Original file line numberDiff line numberDiff line change
@@ -95,6 +95,23 @@ def get_pod_nodes(ctx, name):
9595
click.echo(node)
9696

9797

98+
@cli.command('pod:networks')
99+
@click.argument('name')
100+
@click.pass_context
101+
def get_pod_networks(ctx, name):
102+
stub = _get_stub(ctx)
103+
opts = pb.GetPodOptions(name=name)
104+
105+
try:
106+
r = stub.ListNetworks(opts, 5)
107+
except AbortionError as e:
108+
click.echo(click.style('abortion error: %s' % e.details, fg='red', bold=True))
109+
ctx.exit(-1)
110+
111+
for n in r.networks:
112+
click.echo('%s: %s' % (n.name, ','.join(n.subnets)))
113+
114+
98115
@cli.command('node:get')
99116
@click.argument('podname')
100117
@click.argument('nodename')

devtools/core_pb2.py

+161-49
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

network/calico/plugin.go

+34-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,9 @@ import (
55
"net"
66

77
log "github.com/Sirupsen/logrus"
8+
enginetypes "github.com/docker/engine-api/types"
89
enginenetwork "github.com/docker/engine-api/types/network"
10+
"gitlab.ricebook.net/platform/core/types"
911
"gitlab.ricebook.net/platform/core/utils"
1012
"golang.org/x/net/context"
1113
)
@@ -33,7 +35,7 @@ func (t *titanium) ConnectToNetwork(ctx context.Context, containerID, networkID,
3335

3436
engine, ok := utils.FromDockerContext(ctx)
3537
if !ok {
36-
return fmt.Errorf("Not actually a `engineapi.Client` for value engine in context", containerID)
38+
return fmt.Errorf("Not actually a `engineapi.Client` for value engine in context")
3739
}
3840

3941
config := &enginenetwork.EndpointSettings{
@@ -63,13 +65,43 @@ func (t *titanium) DisconnectFromNetwork(ctx context.Context, containerID, netwo
6365

6466
engine, ok := utils.FromDockerContext(ctx)
6567
if !ok {
66-
return fmt.Errorf("Not actually a `engineapi.Client` for value engine in context", containerID)
68+
return fmt.Errorf("Not actually a `engineapi.Client` for value engine in context")
6769
}
6870

6971
log.Debugf("Disconnect %q from %q", containerID, networkID)
7072
return engine.NetworkDisconnect(context.Background(), networkID, containerID, false)
7173
}
7274

75+
// list networks from context
76+
func (t *titanium) ListNetworks(ctx context.Context) ([]*types.Network, error) {
77+
networks := []*types.Network{}
78+
engine, ok := utils.FromDockerContext(ctx)
79+
if !ok {
80+
return networks, fmt.Errorf("Not actually a `engineapi.Client` for value engine in context")
81+
}
82+
83+
ns, err := engine.NetworkList(context.Background(), enginetypes.NetworkListOptions{})
84+
if err != nil {
85+
return networks, err
86+
}
87+
88+
driver := t.Name()
89+
for _, n := range ns {
90+
// TODO 之后可以用filter driver=xxx
91+
// 但是现在版本的API还没有给出
92+
if n.Driver != driver {
93+
continue
94+
}
95+
96+
subnets := []string{}
97+
for _, config := range n.IPAM.Config {
98+
subnets = append(subnets, config.Subnet)
99+
}
100+
networks = append(networks, &types.Network{Name: n.Name, Subnets: subnets})
101+
}
102+
return networks, nil
103+
}
104+
73105
func New() *titanium {
74106
return &titanium{}
75107
}

network/network.go

+6-1
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,16 @@
11
package network
22

3-
import "golang.org/x/net/context"
3+
import (
4+
"gitlab.ricebook.net/platform/core/types"
5+
"golang.org/x/net/context"
6+
)
47

58
type Network interface {
69
// connect and disconnect
710
ConnectToNetwork(ctx context.Context, containerID, networkID, ipv4 string) error
811
DisconnectFromNetwork(ctx context.Context, containerID, networkID string) error
12+
// list networks
13+
ListNetworks(ctx context.Context) ([]*types.Network, error)
914
// type and name to identify the network manager
1015
// this will determine when to call connect/disconnect
1116
Type() string

0 commit comments

Comments
 (0)