From a9a266c08c4422b293cd9f6cae61b4642f7dd4e5 Mon Sep 17 00:00:00 2001 From: Sergiusz Bazanski Date: Sat, 6 Apr 2019 01:21:25 +0200 Subject: [PATCH] go/svc/leasifier: fixes, add statusz table --- go/svc/leasifier/BUILD.bazel | 8 ++-- go/svc/leasifier/main.go | 20 ++++++++-- go/svc/leasifier/statusz.go | 73 ++++++++++++++++++++++++++++++++++++ 3 files changed, 94 insertions(+), 7 deletions(-) create mode 100644 go/svc/leasifier/statusz.go diff --git a/go/svc/leasifier/BUILD.bazel b/go/svc/leasifier/BUILD.bazel index 386f8868..c03fb358 100644 --- a/go/svc/leasifier/BUILD.bazel +++ b/go/svc/leasifier/BUILD.bazel @@ -2,15 +2,17 @@ load("@io_bazel_rules_go//go:def.bzl", "go_binary", "go_library") go_library( name = "go_default_library", - srcs = ["main.go"], + srcs = [ + "main.go", + "statusz.go", + ], importpath = "code.hackerspace.pl/hscloud/go/svc/leasifier", visibility = ["//visibility:private"], deps = [ "//go/mirko:go_default_library", + "//go/statusz:go_default_library", "//proto/hswaw:go_default_library", "@com_github_golang_glog//:go_default_library", - "@org_golang_google_grpc//codes:go_default_library", - "@org_golang_google_grpc//status:go_default_library", ], ) diff --git a/go/svc/leasifier/main.go b/go/svc/leasifier/main.go index 9b2cf5ac..09090b6e 100644 --- a/go/svc/leasifier/main.go +++ b/go/svc/leasifier/main.go @@ -138,14 +138,16 @@ func parseLeases(f io.Reader, now time.Time) ([]lease, error) { } type service struct { - leaseFile string - leaseC chan chan []lease + leaseFile string + leaseRefreshString string + leaseRefresh time.Duration + leaseC chan chan []lease } func (s *service) work(ctx context.Context) { leases := []lease{} - ticker := time.NewTicker(30 * time.Second) + ticker := time.NewTicker(s.leaseRefresh) start := make(chan struct{}, 1) start <- struct{}{} @@ -189,7 +191,9 @@ func (s *service) Leases(ctx context.Context, req *hpb.LeasifierLeasesRequest) ( s.leaseC <- c leases := <-c - res := &hpb.LeasifierLeasesResponse{} + res := &hpb.LeasifierLeasesResponse{ + Leases: make([]*hpb.LeasifierLease, len(leases)), + } for i, l := range leases { res.Leases[i] = &hpb.LeasifierLease{ @@ -207,8 +211,15 @@ func main() { } flag.StringVar(&s.leaseFile, "lease_file", "/var/db/dhcpd.leases", "Location of leasefile") + flag.StringVar(&s.leaseRefreshString, "lease_refresh", "1m", "How often to refresh leases") flag.Parse() + d, err := time.ParseDuration(s.leaseRefreshString) + if err != nil { + glog.Exit(err) + } + s.leaseRefresh = d + m := mirko.New() if err := m.Listen(); err != nil { glog.Exitf("Could not listen: %v", err) @@ -216,6 +227,7 @@ func main() { hpb.RegisterLeasifierServer(m.GRPC(), s) + s.setupStatusz(m) go s.work(m.Context()) if err := m.Serve(); err != nil { diff --git a/go/svc/leasifier/statusz.go b/go/svc/leasifier/statusz.go new file mode 100644 index 00000000..7f34a372 --- /dev/null +++ b/go/svc/leasifier/statusz.go @@ -0,0 +1,73 @@ +package main + +import ( + "context" + + mirko "code.hackerspace.pl/hscloud/go/mirko" + "code.hackerspace.pl/hscloud/go/statusz" +) + +const statuszFragment = ` + +
+ Current leases: {{ .Leases | len }}
+ + + + + + + + {{range .Leases }} + + + + + + + {{end}} +
IP AddressMAC AddressStartEnd
{{ .IP }}{{ .MAC }}{{ .Start }}{{ .End }}
+
+` + +type szLeases struct { + IP string + MAC string + Start string + End string +} + +func (s *service) setupStatusz(m *mirko.Mirko) { + statusz.AddStatusPart("Leases", statuszFragment, func(ctx context.Context) interface{} { + c := make(chan []lease) + s.leaseC <- c + leases := <-c + + ls := make([]szLeases, len(leases)) + + for i, l := range leases { + ls[i].IP = l.ip.String() + ls[i].MAC = l.hardware.String() + ls[i].Start = l.from.String() + ls[i].End = l.to.String() + } + + return struct { + Leases []szLeases + }{ + Leases: ls, + } + }) +}