Skip to content

Commit 2cc51da

Browse files
committed
Move docker related functions to separate file
1 parent 6b60233 commit 2cc51da

File tree

2 files changed

+152
-141
lines changed

2 files changed

+152
-141
lines changed

docker-gen.go

Lines changed: 0 additions & 141 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,13 @@
11
package main
22

33
import (
4-
"encoding/json"
54
"flag"
65
"fmt"
7-
"io"
86
"log"
9-
"net"
10-
"net/http"
11-
"net/http/httputil"
127
"os"
138
"os/exec"
14-
"os/signal"
159
"strings"
1610
"sync"
17-
"syscall"
1811
"time"
1912

2013
"github.com/BurntSushi/toml"
@@ -65,28 +58,6 @@ func (i *DockerImage) String() string {
6558
return ret
6659
}
6760

68-
func splitDockerImage(img string) (string, string, string) {
69-
70-
index := 0
71-
repository := img
72-
var registry, tag string
73-
if strings.Contains(img, "/") {
74-
separator := strings.Index(img, "/")
75-
registry = img[index:separator]
76-
index = separator + 1
77-
repository = img[index:]
78-
}
79-
80-
if strings.Contains(img, ":") {
81-
separator := strings.Index(img, ":")
82-
repository = img[index:separator]
83-
index = separator + 1
84-
tag = img[index:]
85-
}
86-
87-
return registry, repository, tag
88-
}
89-
9061
type Config struct {
9162
Template string
9263
Dest string
@@ -121,116 +92,6 @@ func usage() {
12192
println("Usage: docker-gen [-config file] [-watch=false] [-notify=\"restart xyz\"] [-interval=0] <template> [<dest>]")
12293
}
12394

124-
func newConn() (*httputil.ClientConn, error) {
125-
conn, err := net.Dial("unix", "/var/run/docker.sock")
126-
if err != nil {
127-
return nil, err
128-
}
129-
return httputil.NewClientConn(conn, nil), nil
130-
}
131-
132-
func getEvents() chan *Event {
133-
eventChan := make(chan *Event, 100)
134-
go func() {
135-
defer close(eventChan)
136-
137-
restart:
138-
139-
c, err := newConn()
140-
if err != nil {
141-
log.Printf("cannot connect to docker: %s\n", err)
142-
return
143-
}
144-
defer c.Close()
145-
146-
req, err := http.NewRequest("GET", "/events", nil)
147-
if err != nil {
148-
log.Printf("bad request for events: %s\n", err)
149-
return
150-
}
151-
152-
resp, err := c.Do(req)
153-
if err != nil {
154-
log.Printf("cannot connect to events endpoint: %s\n", err)
155-
return
156-
}
157-
defer resp.Body.Close()
158-
159-
// handle signals to stop the socket
160-
sigChan := make(chan os.Signal, 1)
161-
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
162-
go func() {
163-
for sig := range sigChan {
164-
log.Printf("received signal '%v', exiting\n", sig)
165-
166-
c.Close()
167-
close(eventChan)
168-
os.Exit(0)
169-
}
170-
}()
171-
172-
dec := json.NewDecoder(resp.Body)
173-
for {
174-
var event *Event
175-
if err := dec.Decode(&event); err != nil {
176-
if err == io.EOF {
177-
break
178-
}
179-
log.Printf("cannot decode json: %s\n", err)
180-
goto restart
181-
}
182-
eventChan <- event
183-
}
184-
log.Printf("closing event channel\n")
185-
}()
186-
return eventChan
187-
}
188-
189-
func getContainers(client *docker.Client) ([]*RuntimeContainer, error) {
190-
apiContainers, err := client.ListContainers(docker.ListContainersOptions{
191-
All: false,
192-
})
193-
if err != nil {
194-
return nil, err
195-
}
196-
197-
containers := []*RuntimeContainer{}
198-
for _, apiContainer := range apiContainers {
199-
container, err := client.InspectContainer(apiContainer.ID)
200-
if err != nil {
201-
log.Printf("error inspecting container: %s: %s\n", apiContainer.ID, err)
202-
continue
203-
}
204-
205-
registry, repository, tag := splitDockerImage(container.Config.Image)
206-
runtimeContainer := &RuntimeContainer{
207-
ID: container.ID,
208-
Image: DockerImage{
209-
Registry: registry,
210-
Repository: repository,
211-
Tag: tag,
212-
},
213-
Addresses: []Address{},
214-
Env: make(map[string]string),
215-
}
216-
for k, _ := range container.NetworkSettings.Ports {
217-
runtimeContainer.Addresses = append(runtimeContainer.Addresses,
218-
Address{
219-
IP: container.NetworkSettings.IPAddress,
220-
Port: k.Port(),
221-
})
222-
}
223-
224-
for _, entry := range container.Config.Env {
225-
parts := strings.Split(entry, "=")
226-
runtimeContainer.Env[parts[0]] = parts[1]
227-
}
228-
229-
containers = append(containers, runtimeContainer)
230-
}
231-
return containers, nil
232-
233-
}
23495
func generateFromContainers(client *docker.Client) {
23596
containers, err := getContainers(client)
23697
if err != nil {
@@ -296,7 +157,6 @@ func generateAtInterval(client *docker.Client, configs ConfigFile) {
296157
return
297158
}
298159
}
299-
300160
}()
301161
}
302162
}
@@ -316,7 +176,6 @@ func generateFromEvents(client *docker.Client, configs ConfigFile) {
316176
generateFromContainers(client)
317177
}
318178
}
319-
320179
}
321180

322181
func main() {

docker_client.go

Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
package main
2+
3+
import (
4+
"encoding/json"
5+
"io"
6+
"log"
7+
"net"
8+
"net/http"
9+
"net/http/httputil"
10+
"os"
11+
"os/signal"
12+
"strings"
13+
"syscall"
14+
15+
docker "github.com/fsouza/go-dockerclient"
16+
)
17+
18+
type DockerContainer struct {
19+
}
20+
21+
func splitDockerImage(img string) (string, string, string) {
22+
index := 0
23+
repository := img
24+
var registry, tag string
25+
if strings.Contains(img, "/") {
26+
separator := strings.Index(img, "/")
27+
registry = img[index:separator]
28+
index = separator + 1
29+
repository = img[index:]
30+
}
31+
32+
if strings.Contains(img, ":") {
33+
separator := strings.Index(img, ":")
34+
repository = img[index:separator]
35+
index = separator + 1
36+
tag = img[index:]
37+
}
38+
39+
return registry, repository, tag
40+
}
41+
42+
func newConn() (*httputil.ClientConn, error) {
43+
conn, err := net.Dial("unix", "/var/run/docker.sock")
44+
if err != nil {
45+
return nil, err
46+
}
47+
return httputil.NewClientConn(conn, nil), nil
48+
}
49+
50+
func getEvents() chan *Event {
51+
eventChan := make(chan *Event, 100)
52+
go func() {
53+
defer close(eventChan)
54+
55+
restart:
56+
57+
c, err := newConn()
58+
if err != nil {
59+
log.Printf("cannot connect to docker: %s\n", err)
60+
return
61+
}
62+
defer c.Close()
63+
64+
req, err := http.NewRequest("GET", "/events", nil)
65+
if err != nil {
66+
log.Printf("bad request for events: %s\n", err)
67+
return
68+
}
69+
70+
resp, err := c.Do(req)
71+
if err != nil {
72+
log.Printf("cannot connect to events endpoint: %s\n", err)
73+
return
74+
}
75+
defer resp.Body.Close()
76+
77+
// handle signals to stop the socket
78+
sigChan := make(chan os.Signal, 1)
79+
signal.Notify(sigChan, os.Interrupt, syscall.SIGTERM, syscall.SIGQUIT)
80+
go func() {
81+
for sig := range sigChan {
82+
log.Printf("received signal '%v', exiting\n", sig)
83+
84+
c.Close()
85+
close(eventChan)
86+
os.Exit(0)
87+
}
88+
}()
89+
90+
dec := json.NewDecoder(resp.Body)
91+
for {
92+
var event *Event
93+
if err := dec.Decode(&event); err != nil {
94+
if err == io.EOF {
95+
break
96+
}
97+
log.Printf("cannot decode json: %s\n", err)
98+
goto restart
99+
}
100+
eventChan <- event
101+
}
102+
log.Printf("closing event channel\n")
103+
}()
104+
return eventChan
105+
}
106+
107+
func getContainers(client *docker.Client) ([]*RuntimeContainer, error) {
108+
109+
apiContainers, err := client.ListContainers(docker.ListContainersOptions{
110+
All: false,
111+
})
112+
if err != nil {
113+
return nil, err
114+
}
115+
116+
containers := []*RuntimeContainer{}
117+
for _, apiContainer := range apiContainers {
118+
container, err := client.InspectContainer(apiContainer.ID)
119+
if err != nil {
120+
log.Printf("error inspecting container: %s: %s\n", apiContainer.ID, err)
121+
continue
122+
}
123+
124+
registry, repository, tag := splitDockerImage(container.Config.Image)
125+
runtimeContainer := &RuntimeContainer{
126+
ID: container.ID,
127+
Image: DockerImage{
128+
Registry: registry,
129+
Repository: repository,
130+
Tag: tag,
131+
},
132+
Addresses: []Address{},
133+
Env: make(map[string]string),
134+
}
135+
for k, _ := range container.NetworkSettings.Ports {
136+
runtimeContainer.Addresses = append(runtimeContainer.Addresses,
137+
Address{
138+
IP: container.NetworkSettings.IPAddress,
139+
Port: k.Port(),
140+
})
141+
}
142+
143+
for _, entry := range container.Config.Env {
144+
parts := strings.Split(entry, "=")
145+
runtimeContainer.Env[parts[0]] = parts[1]
146+
}
147+
148+
containers = append(containers, runtimeContainer)
149+
}
150+
return containers, nil
151+
152+
}

0 commit comments

Comments
 (0)