X-Git-Url: https://gerrit.automotivelinux.org/gerrit/gitweb?a=blobdiff_plain;f=lib%2Fxdsserver%2Ffolder-st.go;h=9c89700e7bcea53e761d95a096967c1a08d1deb0;hb=2a7a112bbffcd41a3436c086f1910ea7a9c94744;hp=04bbf76e2e03cd4defd5129ac4f1c3c79187d31d;hpb=2f7828d01f4c4ca2909f95f098627cd5475ed225;p=src%2Fxds%2Fxds-server.git diff --git a/lib/xdsserver/folder-st.go b/lib/xdsserver/folder-st.go index 04bbf76..9c89700 100644 --- a/lib/xdsserver/folder-st.go +++ b/lib/xdsserver/folder-st.go @@ -1,3 +1,20 @@ +/* + * Copyright (C) 2017-2018 "IoT.bzh" + * Author Sebastien Douheret + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + package xdsserver import ( @@ -6,8 +23,8 @@ import ( "path/filepath" "strings" - "github.com/iotbzh/xds-server/lib/xsapiv1" - st "github.com/iotbzh/xds-server/lib/syncthing" + st "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/syncthing" + "gerrit.automotivelinux.org/gerrit/src/xds/xds-server/lib/xsapiv1" uuid "github.com/satori/go.uuid" "github.com/syncthing/syncthing/lib/config" ) @@ -17,14 +34,14 @@ import ( // STFolder . type STFolder struct { *Context - st *st.SyncThing - fConfig xsapiv1.FolderConfig - stfConfig config.FolderConfiguration - eventIDs []int - eventChangeCB *FolderEventCB - eventChangeCBData *FolderEventCBData + st *st.SyncThing + fConfig xsapiv1.FolderConfig + stfConfig config.FolderConfiguration + eventIDs []string } +var stEventMonitored = []string{st.EventStateChanged, st.EventFolderPaused} + // NewFolderST Create a new instance of STFolder func NewFolderST(ctx *Context, sthg *st.SyncThing) *STFolder { return &STFolder{ @@ -62,33 +79,42 @@ func (f *STFolder) Add(cfg xsapiv1.FolderConfig) (*xsapiv1.FolderConfig, error) f.fConfig = cfg // Update Syncthing folder - // (except if status is ErrorConfig) - // TODO: add cache to avoid multiple requests on startup - if f.fConfig.Status != xsapiv1.StatusErrorConfig { - id, err := f.st.FolderChange(f.fConfig) - if err != nil { - return nil, err - } + _, err := f.st.FolderChange(f.fConfig) + if err != nil { + return nil, err + } + + // Use Setup function to setup remains fields + return f.Setup(f.fConfig) +} + +// Setup Setup local project config +func (f *STFolder) Setup(fld xsapiv1.FolderConfig) (*xsapiv1.FolderConfig, error) { + + var err error + + // Update folder Config + f.fConfig = fld + + // Retrieve Syncthing folder config + f.stfConfig, err = f.st.FolderConfigGet(f.fConfig.ID) + if err != nil { + f.fConfig.Status = xsapiv1.StatusErrorConfig + return nil, err + } - f.stfConfig, err = f.st.FolderConfigGet(id) + // Register to events to update folder status + for _, evName := range stEventMonitored { + evID, err := f.st.Events.Register(evName, f.cbEventState, f.fConfig.ID, nil) if err != nil { - f.fConfig.Status = xsapiv1.StatusErrorConfig return nil, err } - - // Register to events to update folder status - for _, evName := range []string{st.EventStateChanged, st.EventFolderPaused} { - evID, err := f.st.Events.Register(evName, f.cbEventState, id, nil) - if err != nil { - return nil, err - } - f.eventIDs = append(f.eventIDs, evID) - } - - f.fConfig.IsInSync = false // will be updated later by events - f.fConfig.Status = xsapiv1.StatusEnable + f.eventIDs = append(f.eventIDs, evID) } + f.fConfig.IsInSync = false // will be updated later by events + f.fConfig.Status = xsapiv1.StatusEnable + return &f.fConfig, nil } @@ -132,15 +158,27 @@ func (f *STFolder) ConvPathSvr2Cli(s string) string { // Remove a folder func (f *STFolder) Remove() error { - err := f.st.FolderDelete(f.stfConfig.ID) + var err1 error + // Un-register events + for _, evID := range f.eventIDs { + if err := f.st.Events.UnRegister(evID); err != nil && err1 == nil { + // only report 1st error + err1 = err + } + } + + // Delete in Syncthing + err2 := f.st.FolderDelete(f.stfConfig.ID) // Delete folder on server side - err2 := os.RemoveAll(f.GetFullPath("")) + err3 := os.RemoveAll(f.GetFullPath("")) - if err != nil { - return err + if err1 != nil { + return err1 + } else if err2 != nil { + return err2 } - return err2 + return err3 } // Update update some fields of a folder @@ -152,20 +190,6 @@ func (f *STFolder) Update(cfg xsapiv1.FolderConfig) (*xsapiv1.FolderConfig, erro return &f.fConfig, nil } -// RegisterEventChange requests registration for folder event change -func (f *STFolder) RegisterEventChange(cb *FolderEventCB, data *FolderEventCBData) error { - f.eventChangeCB = cb - f.eventChangeCBData = data - return nil -} - -// UnRegisterEventChange remove registered callback -func (f *STFolder) UnRegisterEventChange() error { - f.eventChangeCB = nil - f.eventChangeCBData = nil - return nil -} - // Sync Force folder files synchronization func (f *STFolder) Sync() error { return f.st.FolderScan(f.stfConfig.ID, "") @@ -205,9 +229,10 @@ func (f *STFolder) cbEventState(ev st.Event, data *st.EventsCBData) { f.fConfig.IsInSync = false } - if f.eventChangeCB != nil && - (prevSync != f.fConfig.IsInSync || prevStatus != f.fConfig.Status) { - cpConf := f.fConfig - (*f.eventChangeCB)(&cpConf, f.eventChangeCBData) + if prevSync != f.fConfig.IsInSync || prevStatus != f.fConfig.Status { + // Emit Folder state change event + if err := f.events.Emit(xsapiv1.EVTFolderStateChange, &f.fConfig, ""); err != nil { + f.Log.Warningf("Cannot notify folder change: %v", err) + } } }