diff --git a/.gitignore b/.gitignore index 36d08466990bc88340b5b126ea6ee1b3f78852ce..127ccd6d603655c68db19dda5c0fdbc060240f1b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,9 @@ # tooling build-tools/ +artifacts/ # non vimmers +.devcontainer/ .vscode/ .idea/ diff --git a/gnmitarget/target.go b/gnmitarget/target.go index 710a637c266eab1f1c52e1be60a27a18866a50f4..62bc59b8f8c990695412bc847d04f97d049e584e 100644 --- a/gnmitarget/target.go +++ b/gnmitarget/target.go @@ -27,7 +27,7 @@ var GnmiTargetYgot ygot.ValidatedGoStruct func scheduler(server *gnmiserver.Server, osclient os_clients.Osclient) { for { - <-time.After(5 * time.Second) + <-time.After(30 * time.Second) log.Info("Update config...") go server.InternalUpdate(currentosclient.UpdateConfig) } @@ -66,7 +66,7 @@ func StartGNMITarget(bindAddress string, configFile string, osclient string) err } } - gnmiServer, err := gnmiserver.NewServer(model, GnmiTargetYgot, nil) + gnmiServer, err := gnmiserver.NewServer(model, GnmiTargetYgot, currentosclient.GetCallbackFunc()) if err != nil { log.Fatalf("error in creating GNMI target: %v", err) } diff --git a/os_clients/ubuntu/ubuntu.go b/os_clients/ubuntu/ubuntu.go index 1227139cd421bea9d6995da0f3486a70919ef163..c287dbce3d35438585a2ceafbca02c4017f69a81 100644 --- a/os_clients/ubuntu/ubuntu.go +++ b/os_clients/ubuntu/ubuntu.go @@ -1,15 +1,16 @@ package ubuntu import ( - "fmt" "net" "os" "os/exec" "strings" + "syscall" "time" "code.fbi.h-da.de/danet/gnmi-target/modeldata/gnmitargetygot" + gnmiv "github.com/openconfig/gnmi/value" "github.com/openconfig/ygot/ygot" log "github.com/sirupsen/logrus" "github.com/vishvananda/netlink" @@ -32,19 +33,19 @@ func (ou OsclientUbuntu) UpdateConfig(config *ygot.ValidatedGoStruct) error { func (ou *OsclientUbuntu) GetConfig() *gnmitargetygot.Gnmitarget { ou.gt = &gnmitargetygot.Gnmitarget{} - // Create Interfaces - h, err := netlink.NewHandle() - if err != nil { - log.WithFields(log.Fields{}).Error(err) - } - // defer h.Delete() - localIfaces, err := h.LinkList() - if err != nil { - log.WithFields(log.Fields{}).Error(err) - } - for _, localIface := range localIfaces { - ou.createInterfaces(localIface, ou.gt) - } + // // Create Interfaces + // h, err := netlink.NewHandle() + // if err != nil { + // log.WithFields(log.Fields{}).Error(err) + // } + // // defer h.Delete() + // localIfaces, err := h.LinkList() + // if err != nil { + // log.WithFields(log.Fields{}).Error(err) + // } + // for _, localIface := range localIfaces { + // ou.createInterfaces(localIface, ou.gt) + // } ou.getSystem(ou.gt) @@ -52,11 +53,35 @@ func (ou *OsclientUbuntu) GetConfig() *gnmitargetygot.Gnmitarget { } func (ou *OsclientUbuntu) GetCallbackFunc() func(ygot.ValidatedGoStruct) error { - return callbackFunc + return ou.callbackFunc } -func callbackFunc(config ygot.ValidatedGoStruct) error { - fmt.Printf("config: %v\n", config) +func (ou *OsclientUbuntu) callbackFunc(config ygot.ValidatedGoStruct) error { + diffs, err := ygot.Diff(ou.GetConfig(), config) + if err != nil { + return err + } + for _, diff := range diffs.GetUpdate() { + path, err := ygot.PathToString(diff.GetPath()) + if err != nil { + return err + } + log.Info(path) + switch path { + case "/system/config/hostname": + value, err := gnmiv.ToScalar(diff.GetVal()) + if err != nil { + return err + } + err = syscall.Sethostname([]byte(value.(string))) + if err != nil { + return err + } + default: + //INFO: currently this case is ignored + } + } + return nil }