9 "github.com/iotbzh/xds-agent/lib/apiv1"
10 common "github.com/iotbzh/xds-common/golib"
13 // IPROJECT interface implementation for native/path mapping projects
19 folder *XdsFolderConfig
22 // NewProjectPathMap Create a new instance of PathMap
23 func NewProjectPathMap(ctx *Context, svr *XdsServer) *PathMap {
27 folder: &XdsFolderConfig{},
33 func (p *PathMap) Add(cfg apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
36 errMsg := "ClientPath sanity check error (%d): %v"
38 // Sanity check to verify that we have RW permission and path-mapping is correct
40 if !common.Exists(dir) {
41 // try to create if not existing
42 if err := os.MkdirAll(dir, 0755); err != nil {
43 return nil, fmt.Errorf("Cannot create ClientPath directory: %s", dir)
46 if !common.Exists(dir) {
47 return nil, fmt.Errorf("ClientPath directory is not accessible: %s", dir)
49 if file, err = ioutil.TempFile(dir, ".xds_pathmap_check"); err != nil {
50 return nil, fmt.Errorf(errMsg, 1, err)
52 // Write a specific message that will be check by server during folder add
53 msg := "Pathmap checked message written by xds-agent ID: " + p.Config.AgentUID + "\n"
54 if n, err := file.WriteString(msg); n != len(msg) || err != nil {
55 return nil, fmt.Errorf(errMsg, 2, err)
59 os.Remove(file.Name())
64 // Convert to Xds folder
65 fld := p.server.ProjectToFolder(cfg)
66 fld.DataPathMap.CheckFile = file.Name()
67 fld.DataPathMap.CheckContent = msg
69 // Send request to create folder on XDS server side
70 err = p.server.FolderAdd(fld, p.folder)
75 // 2nd part of sanity checker
76 // check specific message added by XDS Server during folder add processing
77 content, err := ioutil.ReadFile(file.Name())
79 return nil, fmt.Errorf(errMsg, 3, err)
81 if !strings.Contains(string(content),
82 "Pathmap checked message written by xds-server ID") {
83 return nil, fmt.Errorf(errMsg, 4, "file content differ")
86 return p.GetProject(), nil
90 func (p *PathMap) Delete() error {
91 return p.server.FolderDelete(p.folder.ID)
94 // GetProject Get public part of project config
95 func (p *PathMap) GetProject() *apiv1.ProjectConfig {
96 prj := p.server.FolderToProject(*p.folder)
97 prj.ServerID = p.server.ID
101 // Setup Setup local project config
102 func (p *PathMap) Setup(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
103 p.folder = p.server.ProjectToFolder(prj)
105 if err := p.events.Emit(apiv1.EVTProjectChange, np, ""); err != nil {
111 // Update Update some field of a project
112 func (p *PathMap) Update(prj apiv1.ProjectConfig) (*apiv1.ProjectConfig, error) {
113 if p.folder.ID != prj.ID {
114 return nil, fmt.Errorf("Invalid id")
117 err := p.server.FolderUpdate(p.server.ProjectToFolder(prj), p.folder)
122 return p.GetProject(), nil
125 // GetServer Get the XdsServer that holds this project
126 func (p *PathMap) GetServer() *XdsServer {
130 // Sync Force project files synchronization
131 func (p *PathMap) Sync() error {
135 // IsInSync Check if project files are in-sync
136 func (p *PathMap) IsInSync() (bool, error) {