Skip to content

Commit

Permalink
build calico-node-agent
Browse files Browse the repository at this point in the history
  • Loading branch information
zexi committed Nov 18, 2020
1 parent 8ee0335 commit e4e0506
Show file tree
Hide file tree
Showing 9 changed files with 623 additions and 15 deletions.
19 changes: 18 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
@@ -1,18 +1,35 @@
ROOT_DIR = $(CURDIR)
OUTPUT_DIR = $(ROOT_DIR)/_output
BIN_DIR = $(OUTPUT_DIR)/bin
REPO_PREFIX = yunion.io/x/kubecomps

GO_BUILD := go build

CMDS := $(shell find $(ROOT_DIR)/cmd -mindepth 1 -maxdepth 1 -type d)

REGISTRY ?= "registry.cn-beijing.aliyuncs.com/yunionio"
VERSION ?= $(shell git describe --exact-match 2> /dev/null || \
git describe --match=$(git rev-parse --short=8 HEAD) --always --dirty --abbrev=8)

build: clean
@for CMD in $(CMDS); do \
echo build $$CMD; \
$(GO_BUILD) -o $(BIN_DIR)/`basename $${CMD}` $$CMD; \
done

prepare_dir:
@mkdir -p $(BIN_DIR)

cmd/%: prepare_dir
$(GO_BUILD) -o $(BIN_DIR)/$(shell basename $@) $(REPO_PREFIX)/$@

image:
DEBUG=$(DEBUG) ARCH=$(ARCH) TAG=$(VERSION) REGISTRY=$(REGISTRY) $(ROOT_DIR)/scripts/docker_push.sh $(filter-out $@,$(MAKECMDGOALS))

clean:
@rm -rf $(OUTPUT_DIR)

.PHONY: build clean
%:
@:

.PHONY: build clean image
3 changes: 3 additions & 0 deletions build/docker/Dockerfile.calico-node-agent
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
FROM registry.cn-beijing.aliyuncs.com/yunionio/onecloud-base:v0.2

ADD ./_output/alpine-build/bin/calico-node-agent /opt/yunion/bin/calico-node-agent
9 changes: 8 additions & 1 deletion cmd/calico-node-agent/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,18 +3,25 @@ package main
import (
"flag"

"yunion.io/x/log"

"yunion.io/x/kubecomps/pkg/calico-node-agent/serve"
)

var (
conf string
conf string
logLevel string
)

func init() {
flag.StringVar(&conf, "conf", "", "config file")
flag.StringVar(&logLevel, "log-level", "info", "log level")
flag.Parse()
}

func main() {
if err := log.SetLogLevelByString(log.Logger(), logLevel); err != nil {
log.Fatalf("Set log level error: %v", logLevel)
}
serve.Run(conf)
}
5 changes: 3 additions & 2 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,9 +1,10 @@
module yunion.io/x/kubecomps

go 1.15
go 1.14

require (
github.com/projectcalico/libcalico-go v1.7.2-0.20201110235728-977c570b2f4b
github.com/fsnotify/fsnotify v1.4.9
github.com/projectcalico/libcalico-go v0.0.0-20200318234626-d63b0c8ad26c
k8s.io/api v0.17.3
k8s.io/apimachinery v0.17.3
yunion.io/x/jsonutils v0.0.0-20201110084044-3e4e1cb49769
Expand Down
16 changes: 16 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -163,7 +163,10 @@ github.com/containernetworking/cni v0.7.1/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ
github.com/containernetworking/cni v0.8.0/go.mod h1:LGwApLUm2FpoOfxTDEeq8T9ipbpZ61X79hmU3w8FmsY=
github.com/coredns/coredns v1.3.0/go.mod h1:zASH/MVDgR6XZTbxvOnsZfffS+31vg6Ackf/wo1+AM0=
github.com/coredns/corefile-migration v1.0.4/go.mod h1:OFwBp/Wc9dJt5cAZzHWMNhK1r5L0p0jDwIBc6j8NC8E=
github.com/coreos/bbolt v1.3.3/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk=
github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/etcd v3.3.18+incompatible h1:Zz1aXgDrFFi1nadh58tA9ktt06cmPTwNNP3dXwIq1lE=
github.com/coreos/etcd v3.3.18+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE=
github.com/coreos/go-etcd v2.0.0+incompatible/go.mod h1:Jez6KQU2B/sWsbdaef3ED8NzMklzPG4d5KIOhIy30Tk=
github.com/coreos/go-oidc v2.1.0+incompatible/go.mod h1:CgnwVTmzoESiwO9qyAFEMiHoZ1nMCKZlZ9V6mm3/LKc=
github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk=
Expand Down Expand Up @@ -342,6 +345,7 @@ github.com/golang/mock v1.3.1/go.mod h1:sBzyDLLjw3U8JLTeZvSv8jJB+tU5PVekmnlKIyFU
github.com/golang/protobuf v0.0.0-20161109072736-4bd1920723d7/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.3.2 h1:6nsPYzhq5kReh6QImI3k5qWzO4PEbvbIW2cwSfR/6xs=
github.com/golang/protobuf v1.3.2/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U=
github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8=
github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA=
Expand Down Expand Up @@ -378,6 +382,7 @@ github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ
github.com/google/cadvisor v0.35.0/go.mod h1:1nql6U13uTHaLYB8rLS5x9IJc2qT6Xd/Tr1sTX6NE48=
github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M=
github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.3.1 h1:Xye71clBPdm5HgqGwUkwhbynsUJZhDbS20FvLhQ2izg=
github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU=
github.com/google/go-cmp v0.4.0 h1:xsAVV57WRhGj6kEIi8ReJzQlHHqcBYCElAvkovg3B/4=
github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE=
Expand Down Expand Up @@ -653,17 +658,23 @@ github.com/projectcalico/go-json v0.0.0-20161128004156-6219dc7339ba h1:aaF2byUCZ
github.com/projectcalico/go-json v0.0.0-20161128004156-6219dc7339ba/go.mod h1:q8EdCgBdMQzgiX/uk4GXLWLk+gIHd1a7mWUAamJKDb4=
github.com/projectcalico/go-yaml-wrapper v0.0.0-20191112210931-090425220c54 h1:Jt2Pic9dxgJisekm8q2WV9FaWxUJhhRfwHSP640drww=
github.com/projectcalico/go-yaml-wrapper v0.0.0-20191112210931-090425220c54/go.mod h1:UgC0aTQ2KMDxlX3lU/stndk7DMUBJqzN40yFiILHgxc=
github.com/projectcalico/libcalico-go v0.0.0-20200318234626-d63b0c8ad26c h1:YMflvC0DSohJpUoallWmhjAd6mc5DKyWMg1Sa/cgyyA=
github.com/projectcalico/libcalico-go v0.0.0-20200318234626-d63b0c8ad26c/go.mod h1:yd3FK67e+YeaYtKw5ImPw+YFyFF/G0ZCzbbwNAwwZh8=
github.com/projectcalico/libcalico-go v1.7.2-0.20201110235728-977c570b2f4b h1:kdp8OPW72f5qFodEo5vGOBwB7qVtgG9QvKzibZZ3lMo=
github.com/projectcalico/libcalico-go v1.7.2-0.20201110235728-977c570b2f4b/go.mod h1:E4u7FYxNZ8SMeEtCbTZEaSPYxKRIsorcS13tAfxpICU=
github.com/prometheus/client_golang v0.0.0-20171005112915-5cec1d0429b0/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw=
github.com/prometheus/client_golang v1.0.0 h1:vrDKnkGzuGvhNAL56c7DBz29ZL+KxnoR0x7enabFceM=
github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo=
github.com/prometheus/client_model v0.0.0-20170216185247-6f3806018612/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90 h1:S/YWwWx/RA8rT8tKFRuGUZhuA90OyIBpPCXkcbwU8DE=
github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA=
github.com/prometheus/common v0.0.0-20171104095907-e3fb1a1acd76/go.mod h1:daVV7qP5qjZbuso7PdcryaAu0sAZbrN9i7WWcTMWvro=
github.com/prometheus/common v0.4.1 h1:K0MGApIoQvMw27RTdJkPbr3JZ7DNbtxQNyi5STVM6Kw=
github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4=
github.com/prometheus/procfs v0.0.0-20171017214025-a6e9df898b13/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk=
github.com/prometheus/procfs v0.0.2 h1:6LJUbpNm42llc4HRCuvApCSWB/WfhuNo9K98Q9sNGfs=
github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA=
Expand Down Expand Up @@ -826,6 +837,7 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U
golang.org/x/crypto v0.0.0-20190829043050-9756ffdc2472/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191002192127-34f69633bfdc/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413 h1:ULYEB3JvPRE/IfO+9uO7vKV/xzVTO7XPAwm8xbf4w2g=
golang.org/x/crypto v0.0.0-20191206172530-e9b2fee46413/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72 h1:+ELyKg6m8UBf0nPFSqD0mi7zUfwPyXo23HNjMnXPz7w=
golang.org/x/crypto v0.0.0-20200204104054-c9f3fb736b72/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
Expand Down Expand Up @@ -890,6 +902,7 @@ golang.org/x/net v0.0.0-20191004110552-13f9640d40b9/go.mod h1:z5CRVTTTmAJ677TzLL
golang.org/x/net v0.0.0-20191007182048-72f939374954/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20191209160850-c0dbc17a3553/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200202094626-16171245cfb2/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b h1:0mm1VjtFUOIlE1SbDlwjYaDxZVDP2S5ou6y0gSgXHu8=
golang.org/x/net v0.0.0-20200226121028-0de0cce0169b/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7 h1:AeiKBIuRw3UomYXSbLy0Mc2dDLfdtbT/IVn4keq83P0=
golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A=
Expand Down Expand Up @@ -946,6 +959,7 @@ golang.org/x/sys v0.0.0-20191003212358-c178f38b412c/go.mod h1:h1NjWce9XRLGQEsW7w
golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8 h1:JA8d3MPx/IToSyXZG/RhwYEtfrKO1Fxrqe8KrkiLXKM=
golang.org/x/sys v0.0.0-20191228213918-04cbcbbfeed8/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200202164722-d101bd2416d5/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
Expand Down Expand Up @@ -1106,6 +1120,8 @@ gopkg.in/yaml.v2 v2.0.0-20170812160011-eb3733d160e7/go.mod h1:JAlM8MvJe8wmxCU4Bl
gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10=
gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
gopkg.in/yaml.v2 v2.3.0 h1:clyUAQHOM3G0M3f5vQj7LuJrETvjVot3Z5el9nffUtU=
gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI=
Expand Down
77 changes: 77 additions & 0 deletions pkg/calico-node-agent/config/watcher.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package config

import (
"context"
"path/filepath"

"github.com/fsnotify/fsnotify"

"yunion.io/x/log"
"yunion.io/x/pkg/errors"
)

type WatchHandler interface {
OnCreate(ctx context.Context, pathName string)
OnUpdate(ctx context.Context, pathName string)
OnDelete(ctx context.Context, pathName string)
OnError(ctx context.Context, err error)
}

func StartWatcher(ctx context.Context, configFile string, handler WatchHandler) error {
watcher, err := fsnotify.NewWatcher()
if err != nil {
return errors.Wrap(err, "fsnotify.NewWatcher")
}
defer watcher.Close()

cfBasename := filepath.Base(configFile)
done := make(chan bool)
go func() {
for {
select {
case event, ok := <-watcher.Events:
if !ok {
log.Errorf("Get events from watcher not ok")
return
}

curBasename := filepath.Base(event.Name)
if cfBasename != curBasename {
log.Debugf("ignore event %s", event)
continue
}

if event.Op&fsnotify.Chmod == fsnotify.Chmod {
// not care about CHMOD
continue
}

log.Infof("Watcher event happened: %s", event)

if event.Op&fsnotify.Create == fsnotify.Create {
handler.OnCreate(ctx, event.Name)
} else if event.Op&fsnotify.Write == fsnotify.Write {
handler.OnUpdate(ctx, event.Name)
} else if event.Op&fsnotify.Remove == fsnotify.Remove {
handler.OnDelete(ctx, event.Name)
} else {
log.Warningf("Unhandle watcher event: %s", event)
}

case err, ok := <-watcher.Errors:
if !ok {
log.Errorf("Get errors from watcher not ok")
return
}
handler.OnError(ctx, err)
}
}
}()

dirname := filepath.Dir(configFile)
if err := watcher.Add(dirname); err != nil {
return errors.Wrapf(err, "watch config file dir %s", dirname)
}
<-done
return nil
}
80 changes: 69 additions & 11 deletions pkg/calico-node-agent/serve/serve.go
Original file line number Diff line number Diff line change
Expand Up @@ -28,40 +28,52 @@ func Run(configFile string) {

nodeCfg, err := config.GetNodeConfigByFile(configFile)
if err != nil {
log.Fatalf("Get node config error: %v", err)
log.Errorf("Get node config error: %v", err)
}

calicoCli, err := client.NewClient(client.DefaultConfigPath)
if err != nil {
log.Fatalf("New calico client error: %v", err)
}

srv := newServer(nodeCfg, calicoCli)
if err := srv.start(context.Background()); err != nil {
log.Fatalf("Start serve error: %v", err)
}
srv := newServer(calicoCli)
srv.setConfig(nodeCfg)

ctx := context.Background()

go func() {
if err := config.StartWatcher(ctx, configFile, srv.watchHandler()); err != nil {
log.Fatalf("StartWatcher error: %v", err)
}
}()

srv.start(ctx)
}

type server struct {
nodeConfig *types.NodeConfig
calicoCli cclient.Interface
}

func newServer(nodeCfg *types.NodeConfig, calicoCli cclient.Interface) *server {
func newServer(calicoCli cclient.Interface) *server {
s := &server{
nodeConfig: nodeCfg,
calicoCli: calicoCli,
calicoCli: calicoCli,
}
return s
}

func (s *server) start(ctx context.Context) error {
for {
func (s *server) start(ctx context.Context) {
stopCh := make(chan bool, 0)
if s.nodeConfig != nil {
if err := s.syncIPPools(ctx); err != nil {
log.Errorf("syncIPPools error: %v", err)
}
time.Sleep(30 * time.Minute)
}
<-stopCh
}

func (s *server) setConfig(nodeCfg *types.NodeConfig) {
s.nodeConfig = nodeCfg
}

func getIPPoolName(nodeName string, pool *types.NodeIPPool) string {
Expand Down Expand Up @@ -201,3 +213,49 @@ func (s *server) syncIPPools(ctx context.Context) error {
// TODO: record tmpPools and start watch logical
return nil
}

func (s *server) watchHandler() config.WatchHandler {
return newConfigWatchHandler(s)
}

type configWatchHandler struct {
server *server
}

func newConfigWatchHandler(s *server) config.WatchHandler {
return &configWatchHandler{
server: s,
}
}

func (h *configWatchHandler) reloadConfig(pathName string) error {
nodeCfg, err := config.GetNodeConfigByFile(pathName)
if err != nil {
return errors.Wrapf(err, "reloadConfig %s by watcher", pathName)
}
h.server.setConfig(nodeCfg)
return nil
}

func (h *configWatchHandler) doSync(ctx context.Context, pathName string) {
if err := h.reloadConfig(pathName); err != nil {
log.Errorf("reloadConfig error: %v", err)
return
}
h.server.syncIPPools(ctx)
}

func (h *configWatchHandler) OnCreate(ctx context.Context, pathName string) {
h.doSync(ctx, pathName)
}

func (h *configWatchHandler) OnUpdate(ctx context.Context, pathName string) {
h.doSync(ctx, pathName)
}

func (h *configWatchHandler) OnDelete(ctx context.Context, pathName string) {
}

func (h *configWatchHandler) OnError(ctx context.Context, err error) {
log.Errorf("[configWatchHandler] error: %v", err)
}
Loading

0 comments on commit e4e0506

Please sign in to comment.