Skip to content
This repository was archived by the owner on Aug 3, 2020. It is now read-only.

Commit 7d5e19b

Browse files
Merge pull request #9 from ibuildthecloud/support-1.2
Support 1.2
2 parents ac4bfa4 + 0404f3d commit 7d5e19b

File tree

3 files changed

+83
-31
lines changed

3 files changed

+83
-31
lines changed

kubernetesevents/change_handler.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package kubernetesevents
2+
3+
import (
4+
"github.com/rancher/go-rancher/client"
5+
"github.com/rancher/kubernetes-agent/kubernetesclient"
6+
"github.com/rancher/kubernetes-model/model"
7+
)
8+
9+
func NewChangeHandler(rancherClient *client.RancherClient, kubernetesClient *kubernetesclient.Client, kindHandled string) *ChangeHandler {
10+
return &ChangeHandler{
11+
rancherClient: rancherClient,
12+
kClient: kubernetesClient,
13+
kindHandled: kindHandled,
14+
}
15+
}
16+
17+
type ChangeHandler struct {
18+
rancherClient *client.RancherClient
19+
kClient *kubernetesclient.Client
20+
kindHandled string
21+
}
22+
23+
func (h *ChangeHandler) GetKindHandled() string {
24+
return h.kindHandled
25+
}
26+
27+
func (h *ChangeHandler) Handle(event model.WatchEvent) error {
28+
_, err := h.rancherClient.Publish.Create(&client.Publish{
29+
Name: "service.kubernetes.change",
30+
Data: map[string]interface{}{
31+
"type": event.Type,
32+
"object": event.Object,
33+
},
34+
})
35+
36+
return err
37+
}

main.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,11 @@ func main() {
5353
Usage: "Port to configure an HTTP health check listener on",
5454
EnvVar: "HEALTH_CHECK_PORT",
5555
},
56+
cli.StringSliceFlag{
57+
Name: "watch-kind",
58+
Value: &cli.StringSlice{"namespaces", "services", "replicationcontrollers", "pods"},
59+
Usage: "Which k8s kinds to watch and report changes to Rancher",
60+
},
5661
}
5762

5863
app.Run(os.Args)
@@ -73,6 +78,11 @@ func launch(c *cli.Context) {
7378
svcHandler := kubernetesevents.NewHandler(rClient, kClient, kubernetesevents.ServiceKind)
7479
handlers := []kubernetesevents.Handler{svcHandler}
7580

81+
log.Info("Watching changes for kinds: ", c.StringSlice("watch-kind"))
82+
for _, kind := range c.StringSlice("watch-kind") {
83+
handlers = append(handlers, kubernetesevents.NewChangeHandler(rClient, kClient, kind))
84+
}
85+
7686
go func(rc chan error) {
7787
err := kubernetesevents.ConnectToEventStream(handlers, conf)
7888
log.Errorf("Kubernetes stream listener exited with error: %s", err)

rancherevents/eventhandlers/provide_lables_handler.go

Lines changed: 36 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
package eventhandlers
22

33
import (
4-
log "github.com/Sirupsen/logrus"
54
"strings"
65

6+
log "github.com/Sirupsen/logrus"
7+
"github.com/mitchellh/mapstructure"
78
revents "github.com/rancher/go-machine-service/events"
89
"github.com/rancher/go-rancher/client"
910
"github.com/rancher/kubernetes-agent/kubernetesclient"
@@ -85,37 +86,41 @@ func (h *syncHandler) Handler(event *revents.Event, cli *client.RancherClient) e
8586
return nil
8687
}
8788

88-
func (h *syncHandler) getPod(event *revents.Event) (string, string) {
89-
// TODO Rewrite this horror
90-
data := event.Data
91-
if ihm, ok := data["instanceHostMap"]; ok {
92-
if ihmMap, ok := ihm.(map[string]interface{}); ok {
93-
if i, ok := ihmMap["instance"]; ok {
94-
if iMap, ok := i.(map[string]interface{}); ok {
95-
if d, ok := iMap["data"]; ok {
96-
if dMap, ok := d.(map[string]interface{}); ok {
97-
if f, ok := dMap["fields"]; ok {
98-
if fMap, ok := f.(map[string]interface{}); ok {
99-
if labels, ok := fMap["labels"]; ok {
100-
if lMap, ok := labels.(map[string]interface{}); ok {
101-
if l, ok := lMap["io.kubernetes.pod.name"]; ok {
102-
if label, ok := l.(string); ok {
103-
parts := strings.SplitN(label, "/", 2)
104-
if len(parts) == 2 {
105-
return parts[0], parts[1]
106-
}
107-
}
108-
}
109-
}
110-
}
111-
}
112-
}
113-
}
114-
}
115-
}
116-
}
89+
func (h *syncHandler) getPod(event *revents.Event) (ns, name string) {
90+
ihm := &struct {
91+
IHM struct {
92+
I struct {
93+
D struct {
94+
F struct {
95+
Labels map[string]string `mapstructure:"labels"`
96+
} `mapstructure:"fields"`
97+
} `mapstructure:"data"`
98+
} `mapstructure:"instance"`
99+
} `mapstructure:"instanceHostMap"`
100+
}{}
101+
102+
err := mapstructure.Decode(event.Data, &ihm)
103+
if err != nil {
104+
log.Error("Cannot parse event")
105+
return
106+
}
107+
108+
labels := ihm.IHM.I.D.F.Labels
109+
if len(labels) == 0 {
110+
return
111+
}
112+
113+
var ok bool
114+
if ns, ok = labels["io.kubernetes.pod.namespace"]; ok {
115+
// version >= 1.2
116+
name = labels["io.kubernetes.pod.name"]
117+
} else if name, ok = labels["io.kubernetes.pod.name"]; ok {
118+
// try to parse
119+
parts := strings.SplitN(name, "/", 2)
120+
if len(parts) == 2 {
121+
ns, name = parts[0], parts[1]
117122
}
118123
}
119124

120-
return "", ""
125+
return
121126
}

0 commit comments

Comments
 (0)