Use go module as dependency tool instead of glide
[src/xds/xds-agent.git] / lib / agent / project-st.go
index c0d2550..fb88b05 100644 (file)
@@ -1,7 +1,29 @@
+/*
+ * Copyright (C) 2017-2018 "IoT.bzh"
+ * Author Sebastien Douheret <sebastien@iot.bzh>
+ *
+ * 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 agent
 
 import (
-       st "github.com/iotbzh/xds-agent/lib/syncthing"
+       "encoding/json"
+       "fmt"
+
+       st "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/syncthing"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent.git/lib/xaapiv1"
+       "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
 )
 
 // IPROJECT interface implementation for syncthing projects
@@ -10,7 +32,7 @@ import (
 type STProject struct {
        *Context
        server   *XdsServer
-       folder   *XdsFolderConfig
+       folder   *xsapiv1.FolderConfig
        eventIDs []int
 }
 
@@ -19,13 +41,13 @@ func NewProjectST(ctx *Context, svr *XdsServer) *STProject {
        p := STProject{
                Context: ctx,
                server:  svr,
-               folder:  &XdsFolderConfig{},
+               folder:  &xsapiv1.FolderConfig{},
        }
        return &p
 }
 
 // Add a new project
-func (p *STProject) Add(cfg ProjectConfig) (*ProjectConfig, error) {
+func (p *STProject) Add(cfg xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) {
        var err error
 
        // Add project/folder into XDS Server
@@ -48,15 +70,15 @@ func (p *STProject) Add(cfg ProjectConfig) (*ProjectConfig, error) {
 
        locPrj, err := p.SThg.FolderConfigGet(id)
        if err != nil {
-               svrPrj.Status = StatusErrorConfig
+               svrPrj.Status = xaapiv1.StatusErrorConfig
                return nil, err
        }
        if svrPrj.ID != locPrj.ID {
                p.Log.Errorf("Project ID in XDSServer and local ST differ: %s != %s", svrPrj.ID, locPrj.ID)
        }
 
-       // Use Update function to setup remains fields
-       return p.UpdateProject(*svrPrj)
+       // Use Setup function to setup remains fields
+       return p.Setup(*svrPrj)
 }
 
 // Delete a project
@@ -70,23 +92,22 @@ func (p *STProject) Delete() error {
 }
 
 // GetProject Get public part of project config
-func (p *STProject) GetProject() *ProjectConfig {
+func (p *STProject) GetProject() *xaapiv1.ProjectConfig {
        prj := p.server.FolderToProject(*p.folder)
        prj.ServerID = p.server.ID
        return &prj
 }
 
-// UpdateProject Update project config
-func (p *STProject) UpdateProject(prj ProjectConfig) (*ProjectConfig, error) {
+// Setup Setup local project config
+func (p *STProject) Setup(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) {
        // Update folder
        p.folder = p.server.ProjectToFolder(prj)
        svrPrj := p.GetProject()
 
        // Register events to update folder status
        // Register to XDS Server events
-       p.server.EventOn("event:FolderStateChanged", p._cbServerFolderChanged)
-       if err := p.server.EventRegister("FolderStateChanged", svrPrj.ID); err != nil {
-               p.Log.Warningf("XDS Server EventRegister failed: %v", err)
+       if _, err := p.server.EventOn(xsapiv1.EVTFolderStateChange, "", p._cbServerFolderChanged); err != nil {
+               p.Log.Errorf("XDS Server EventOn '%s' failed: %v", xsapiv1.EVTFolderStateChange, err)
                return svrPrj, err
        }
 
@@ -102,6 +123,21 @@ func (p *STProject) UpdateProject(prj ProjectConfig) (*ProjectConfig, error) {
        return svrPrj, nil
 }
 
+// Update Update some field of a project
+func (p *STProject) Update(prj xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) {
+
+       if p.folder.ID != prj.ID {
+               return nil, fmt.Errorf("Invalid id")
+       }
+
+       err := p.server.FolderUpdate(p.server.ProjectToFolder(prj), p.folder)
+       if err != nil {
+               return nil, err
+       }
+
+       return p.GetProject(), nil
+}
+
 // GetServer Get the XdsServer that holds this project
 func (p *STProject) GetServer() *XdsServer {
        return p.server
@@ -127,24 +163,39 @@ func (p *STProject) IsInSync() (bool, error) {
 
 // callback use to update (XDS Server) folder IsInSync status
 
-func (p *STProject) _cbServerFolderChanged(data interface{}) {
-       evt := data.(XdsEventFolderChange)
+func (p *STProject) _cbServerFolderChanged(pData interface{}, data interface{}) error {
+       evt := xsapiv1.EventMsg{}
+       d, err := json.Marshal(data)
+       if err != nil {
+               p.Log.Errorf("Cannot marshal XDS Server event folder-change err=%v", err)
+               return err
+       }
+       if err = json.Unmarshal(d, &evt); err != nil {
+               p.Log.Errorf("Cannot unmarshal XDS Server event folder-change err=%v", err)
+               return err
+       }
+
+       fld, err := evt.DecodeFolderConfig()
+       if err != nil {
+               p.Log.Errorf("Cannot decode FolderChanged event: %v", data)
+       }
 
        // Only process event that concerns this project/folder ID
-       if p.folder.ID != evt.Folder.ID {
-               return
+       if p.folder.ID != fld.ID {
+               return nil
        }
 
-       if evt.Folder.IsInSync != p.folder.DataCloudSync.STSvrIsInSync ||
-               evt.Folder.Status != p.folder.DataCloudSync.STSvrStatus {
+       if fld.IsInSync != p.folder.DataCloudSync.STSvrIsInSync ||
+               fld.Status != p.folder.DataCloudSync.STSvrStatus {
 
-               p.folder.DataCloudSync.STSvrIsInSync = evt.Folder.IsInSync
-               p.folder.DataCloudSync.STSvrStatus = evt.Folder.Status
+               p.folder.DataCloudSync.STSvrIsInSync = fld.IsInSync
+               p.folder.DataCloudSync.STSvrStatus = fld.Status
 
-               if err := p.events.Emit(EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
-                       p.Log.Warningf("Cannot notify project change: %v", err)
+               if err := p.events.Emit(xaapiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil {
+                       p.Log.Warningf("Cannot notify project change (from server): %v", err)
                }
        }
+       return nil
 }
 
 // callback use to update IsInSync status
@@ -161,15 +212,15 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) {
                to := ev.Data["to"]
                switch to {
                case "scanning", "syncing":
-                       sts = StatusSyncing
+                       sts = xaapiv1.StatusSyncing
                case "idle":
-                       sts = StatusEnable
+                       sts = xaapiv1.StatusEnable
                }
                inSync = (to == "idle")
 
        case st.EventFolderPaused:
-               if sts == StatusEnable {
-                       sts = StatusPause
+               if sts == xaapiv1.StatusEnable {
+                       sts = xaapiv1.StatusPause
                }
                inSync = false
        }
@@ -179,8 +230,8 @@ func (p *STProject) _cbLocalSTEvents(ev st.Event, data *st.EventsCBData) {
                p.folder.DataCloudSync.STLocIsInSync = inSync
                p.folder.DataCloudSync.STLocStatus = sts
 
-               if err := p.events.Emit(EVTProjectChange, p.server.FolderToProject(*p.folder)); err != nil {
-                       p.Log.Warningf("Cannot notify project change: %v", err)
+               if err := p.events.Emit(xaapiv1.EVTProjectChange, p.server.FolderToProject(*p.folder), ""); err != nil {
+                       p.Log.Warningf("Cannot notify project change (local): %v", err)
                }
        }
 }