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

Commit

Permalink
Merge pull request #23 from ibuildthecloud/sub
Browse files Browse the repository at this point in the history
Subscribe to Rancher events for reload
  • Loading branch information
ibuildthecloud authored Oct 10, 2016
2 parents 9a1613b + 2436347 commit 5982272
Show file tree
Hide file tree
Showing 213 changed files with 26,243 additions and 12 deletions.
7 changes: 4 additions & 3 deletions .drone.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,8 @@
pipeline:
build:
privileged: true
image: rancher/dind:v1.10.0-rancher1
image: rancher/dapper:1.10.3
volumes:
- /var/run/docker.sock:/var/run/docker.sock
commands:
- wrapdocker
- make ci
- dapper ci
2 changes: 1 addition & 1 deletion Dockerfile.dapper
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM golang:1.6
FROM golang:1.7.1
RUN go get github.com/rancher/trash
RUN go get github.com/golang/lint/golint
RUN curl -sL https://get.docker.com/builds/Linux/x86_64/docker-1.9.1 > /usr/bin/docker && \
Expand Down
28 changes: 24 additions & 4 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -97,6 +97,10 @@ func getCliApp() *cli.App {
Value: "",
Usage: "PID to write to",
},
cli.BoolFlag{
Name: "subscribe",
Usage: "Subscribe to Rancher events",
},
}

return app
Expand Down Expand Up @@ -131,14 +135,25 @@ func appMain(ctx *cli.Context) error {
ctx.GlobalBool("xff"),
)

if ctx.Bool("subscribe") {
logrus.Info("Subscribing to events")
s := NewSubscriber(os.Getenv("CATTLE_URL"),
os.Getenv("CATTLE_ACCESS_KEY"),
os.Getenv("CATTLE_SECRET_KEY"),
ctx.String("answers"),
sc.loadAnswersFromFile)
if err := s.Subscribe(); err != nil {
logrus.Fatal("Failed to subscribe", err)
}
}

// Start the server
sc.Start()

return nil
}

func NewServerConfig(answersFilePath, listen, listenReload string, enableXff bool) *ServerConfig {

router := mux.NewRouter()
reloadRouter := mux.NewRouter()
reloadChan := make(chan chan error)
Expand Down Expand Up @@ -170,9 +185,14 @@ func (sc *ServerConfig) Start() {
}

func (sc *ServerConfig) loadAnswers() error {
logrus.Debug("Loading answers: %s", sc.answersFilePath)
_, err := sc.loadAnswersFromFile(sc.answersFilePath)
return err
}

func (sc *ServerConfig) loadAnswersFromFile(file string) (Versions, error) {
logrus.Debug("Loading answers")
sc.loading = true
neu, err := ParseAnswers(sc.answersFilePath)
neu, err := ParseAnswers(file)
if err == nil {
for _, data := range neu {
defaults, ok := data[DEFAULT_KEY]
Expand All @@ -193,7 +213,7 @@ func (sc *ServerConfig) loadAnswers() error {
logrus.Errorf("Failed to load answers: %v", err)
}

return err
return sc.answers, err
}

func mergeDefaults(clientAnswers *Answers, defaultAnswers map[string]interface{}) {
Expand Down
5 changes: 5 additions & 0 deletions package/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
FROM ubuntu:16.04
RUN apt-get update && \
apt-get install -y iptables iproute2
COPY metadata rancher-metadata router /usr/bin/
CMD ["rancher-metadata"]
5 changes: 5 additions & 0 deletions package/metadata
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
#!/bin/bash
set -e

ip addr show dev eth0 | grep 'inet ' | awk '{print $2}' | cut -f1 -d/ > /var/tmp/ip
exec rancher-metadata -subscribe
27 changes: 27 additions & 0 deletions package/router
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
#!/bin/bash
set -e

trap "exit 0" SIGTERM SIGINT

STATE=/var/tmp/ip
IP=

while true; do
if [ -e $STATE ]; then
NEW_IP=$(<$STATE)
if [ "$NEW_IP" != "$IP" ]; then
iptables -w -t nat -N CATTLE_METADATA || true
iptables -w -t nat -F CATTLE_METADATA
iptables -w -t nat -A CATTLE_METADATA -p tcp -d 169.254.169.250 --dport 80 -j DNAT --to ${NEW_IP}:80
for i in PREROUTING OUTPUT; do
iptables -w -t nat -D $i -j CATTLE_METADATA || true
iptables -w -t nat -I $i -j CATTLE_METADATA
done
IP=${NEW_IP}
echo Forwarding traffic to $IP
fi
else
echo Waiting for $STATE
fi
sleep 2
done
22 changes: 21 additions & 1 deletion scripts/package
Original file line number Diff line number Diff line change
@@ -1,6 +1,26 @@
#!/bin/bash

cd $(dirname $0)/..
ARCH=${ARCH:-"amd64"}
SUFFIX=""
[ "${ARCH}" != "amd64" ] && SUFFIX="_${ARCH}"

source $(dirname $0)/version

cd $(dirname $0)/../package

TAG=${TAG:-${VERSION}${SUFFIX}}
REPO=${REPO:-rancher}

if $(echo ${TAG} | grep -q dirty); then
TAG=dev
fi

cp ../bin/rancher-metadata .
docker build -t ${REPO}/metadata:${TAG} .

echo Built ${REPO}/metadata:${TAG}

cd ..

CONTENT=$(</proc/sys/kernel/random/uuid)

Expand Down
10 changes: 7 additions & 3 deletions scripts/version
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,14 @@ if [ -n "$(git status --porcelain --untracked-files=no)" ]; then
fi

COMMIT=$(git rev-parse --short HEAD)
TAG=$(git tag -l --contains HEAD | head -n 1)
GIT_TAG=$(git tag -l --contains HEAD | head -n 1)

if [[ -z "$DIRTY" && -n "$TAG" ]]; then
VERSION=$TAG
if [[ -z "$DIRTY" && -n "$GIT_TAG" ]]; then
VERSION=$GIT_TAG
else
VERSION="${COMMIT}${DIRTY}"
fi

if [ -z "$ARCH" ]; then
ARCH=amd64
fi
144 changes: 144 additions & 0 deletions subscribe.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
package main

import (
"io"
"net/http"
"os"

"github.com/Sirupsen/logrus"
"github.com/mitchellh/mapstructure"
revents "github.com/rancher/event-subscriber/events"
"github.com/rancher/go-rancher/v2"
)

type ReloadFunc func(file string) (Versions, error)

type Subscriber struct {
url string
accessKey string
secretKey string
reload ReloadFunc
answerFile string
client *http.Client
}

func NewSubscriber(url, accessKey, secretKey, answerFile string, reload ReloadFunc) *Subscriber {
return &Subscriber{
url: url,
accessKey: accessKey,
secretKey: secretKey,
reload: reload,
answerFile: answerFile,
client: &http.Client{},
}
}

func (s *Subscriber) Subscribe() error {
handlers := map[string]revents.EventHandler{
"ping": s.noOp,
"config.update": s.configUpdate,
}

router, err := revents.NewEventRouter("", 0, s.url, s.accessKey, s.secretKey, nil, handlers, "", 3, revents.DefaultPingConfig)
if err != nil {
return err
}

go func() {
logrus.Fatalf("Exiting subscriber: %v", router.StartWithoutCreate(nil))
}()

return nil
}

func (s *Subscriber) noOp(event *revents.Event, c *client.RancherClient) error {
return nil
}

func (s *Subscriber) configUpdate(event *revents.Event, c *client.RancherClient) error {
update := ConfigUpdateData{}
if err := mapstructure.Decode(event.Data, &update); err != nil {
return err
}

found := false
for _, item := range update.Items {
if found = item.Name == "metadata-answers"; found {
if err := s.downloadAndReload(); err != nil {
return err
}
break
}
}

_, err := c.Publish.Create(&client.Publish{
Name: event.ReplyTo,
PreviousIds: []string{event.ID},
})
return err
}

func (s *Subscriber) downloadAndReload() error {
url := s.url + "/configcontent/metadata-answers"
req, err := http.NewRequest("GET", url, nil)
if err != nil {
return err
}
req.SetBasicAuth(s.accessKey, s.secretKey)
resp, err := s.client.Do(req)
if err != nil {
return err
}
defer resp.Body.Close()

tempFile := s.answerFile + ".temp"
out, err := os.Create(tempFile)
if err != nil {
return err
}
defer func() {
out.Close()
os.Remove(tempFile)
}()

_, err = io.Copy(out, resp.Body)
if err != nil {
return err
}

versions, err := s.reload(tempFile)
if err != nil {
return err
}

os.Rename(tempFile, s.answerFile)
def, ok := versions["latest"]["default"].(map[string]interface{})
if ok {
version, _ := def["version"].(string)
logrus.Infof("Applied %s", url+"?version="+version)
req, err := http.NewRequest("PUT", url+"?version="+version, nil)
if err != nil {
return err
}

req.SetBasicAuth(s.accessKey, s.secretKey)
resp, err := s.client.Do(req)
if err != nil {
return err
}
if resp.Body != nil {
resp.Body.Close()
}
}

return err
}

type ConfigUpdateData struct {
ConfigUrl string
Items []ConfigUpdateItem
}

type ConfigUpdateItem struct {
Name string
}
5 changes: 5 additions & 0 deletions trash.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,10 @@ github.com/codegangsta/cli 55f715e28c46073d0e217e2ce8eb46b0b45e3db6
github.com/golang/gddo/httputil eb1f515e0b6ceb153937f5b282636ba541ead31c
github.com/gorilla/context 215affda49addc4c8ef7e2534915df2c8c35c6cd
github.com/gorilla/mux 104068abd5cf50032c57aecbf2b8ce5b0a08a2cb
github.com/gorilla/websocket 2d1e4548da234d9cb742cc3628556fef86aafbac
github.com/mitchellh/mapstructure a6ef2f080c66d0a2e94e97cf74f80f772855da63
github.com/pkg/errors 839d9e913e063e28dfd0e6c7b7512793e0a48be9
github.com/rancher/event-subscriber ddef5975d2b174e234d7232c811bd55e5e2bf22f
github.com/rancher/go-rancher f0378de1178a553cfb64666c0281486f593f0f05
github.com/Sirupsen/logrus 07d998d174c4e2dc90e2f1989a20724220bca1ff
gopkg.in/yaml.v2 fc96f64724b16cf262e47fb355e6dcea3127beb5 https://github.com/rancher/yaml.git
25 changes: 25 additions & 0 deletions vendor/github.com/gorilla/websocket/.gitignore

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

17 changes: 17 additions & 0 deletions vendor/github.com/gorilla/websocket/.travis.yml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

8 changes: 8 additions & 0 deletions vendor/github.com/gorilla/websocket/AUTHORS

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Loading

0 comments on commit 5982272

Please sign in to comment.