+/*
+ * 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 (
- "github.com/iotbzh/xds-agent/lib/apiv1"
- st "github.com/iotbzh/xds-agent/lib/syncthing"
+ "encoding/json"
+ "fmt"
+
+ st "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/syncthing"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-agent/lib/xaapiv1"
+ "gerrit.automotivelinux.org/gerrit/src/xds/xds-server.git/lib/xsapiv1"
)
// IPROJECT interface implementation for syncthing projects
type STProject struct {
*Context
server *XdsServer
- folder *XdsFolderConfig
+ folder *xsapiv1.FolderConfig
eventIDs []int
}
p := STProject{
Context: ctx,
server: svr,
- folder: &XdsFolderConfig{},
+ folder: &xsapiv1.FolderConfig{},
}
return &p
}
// Add a new project
-func (p *STProject) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
+func (p *STProject) Add(cfg xaapiv1.ProjectConfig) (*xaapiv1.ProjectConfig, error) {
var err error
// Add project/folder into XDS Server
locPrj, err := p.SThg.FolderConfigGet(id)
if err != nil {
- svrPrj.Status = apiv1.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
}
// GetProject Get public part of project config
-func (p *STProject) GetProject() *apiv1.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 apiv1.ProjectConfig) (*apiv1.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
}
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
// 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(apiv1.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
to := ev.Data["to"]
switch to {
case "scanning", "syncing":
- sts = apiv1.StatusSyncing
+ sts = xaapiv1.StatusSyncing
case "idle":
- sts = apiv1.StatusEnable
+ sts = xaapiv1.StatusEnable
}
inSync = (to == "idle")
case st.EventFolderPaused:
- if sts == apiv1.StatusEnable {
- sts = apiv1.StatusPause
+ if sts == xaapiv1.StatusEnable {
+ sts = xaapiv1.StatusPause
}
inSync = false
}
p.folder.DataCloudSync.STLocIsInSync = inSync
p.folder.DataCloudSync.STLocStatus = sts
- if err := p.events.Emit(apiv1.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)
}
}
}