diff options
Diffstat (limited to 'src/dkv/api/backendFilesystemConnection.go')
-rw-r--r-- | src/dkv/api/backendFilesystemConnection.go | 200 |
1 files changed, 200 insertions, 0 deletions
diff --git a/src/dkv/api/backendFilesystemConnection.go b/src/dkv/api/backendFilesystemConnection.go new file mode 100644 index 0000000..f09e74f --- /dev/null +++ b/src/dkv/api/backendFilesystemConnection.go @@ -0,0 +1,200 @@ +/* + * Copyright 2018 Intel Corporation, Inc + * + * 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 api + +import ( + "errors" + uuid "github.com/hashicorp/go-uuid" + "net/http" + "os" +) + +type DirectoryOperationer interface { + // Service Operations. + CreateService(CreateRegisterServiceBody) (string, error) + RemoveService(string) error + CreateServiceSubdomain(string, string) error + RemoveServiceSubdomain(string, string) error + // Directory Operations. + CreateDirectory(string) error + RemoveDirectory(string) error + RemoveSubDirectory(string, string) error + RemoveFile(string, string, string) error + FindService(string) (string, bool, error) + FetchFile(http.ResponseWriter, *http.Request, string, string, string) + CreateFile(string) (*os.File, error) +} + +type DirectoryStruct struct { + directory string +} + +const ( + MOUNTPATH = "../../mountpath/" + JSONPATH = "api/token_service_map.json" +) + +var Directory DirectoryOperationer + +func (d *DirectoryStruct) CreateService(body CreateRegisterServiceBody) (string, error) { + + // Having same name is prohibited? + found, err := FindServiceInJSON(JSONPATH, body.Domain) + if err != nil { + return "", err + } + if found { + return "", errors.New("Service already found. Check name.") + } + + token, err := uuid.GenerateUUID() + if err != nil { + return "", err + } + + err = d.CreateDirectory(token) + if err != nil { + return "", err + } + + err = WriteJSON(JSONPATH, token, body.Domain) + + if err != nil { + return "", err + } + return token, nil +} + +func (d *DirectoryStruct) CreateServiceSubdomain(token string, subdomain string) error { + foundToken, err := FindTokenInJSON(JSONPATH, token) + if err != nil { + return err + } + if foundToken == false { + return errors.New("Token not found. Please check token or if service is created.") + } + err = d.CreateSubDirectory(token, subdomain) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) RemoveService(token string) error { + err := DeleteInJSON(JSONPATH, token) + if err != nil { + return err + } + err = d.RemoveDirectory(token) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) FindService(token string) (string, bool, error) { + service, found, err := GetServicebyToken(JSONPATH, token) + if err != nil { + return "", false, err + } + return service, found, nil +} + +func (d *DirectoryStruct) RemoveServiceSubdomain(token string, subdomain string) error { + foundToken, err := FindTokenInJSON(JSONPATH, token) + if err != nil { + return err + } + if foundToken == false { + return errors.New("Token not found. Please check token or if service is created.") + } + err = d.RemoveSubDirectory(token, subdomain) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) CreateDirectory(token string) error { + // Permissions inside mount point? + err := os.Mkdir(MOUNTPATH+token, os.FileMode(0770)) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) CreateSubDirectory(token string, subdomain string) error { + err := os.Mkdir(MOUNTPATH+token+"/"+subdomain, os.FileMode(0770)) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) RemoveDirectory(token string) error { + err := os.RemoveAll(MOUNTPATH + token) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) RemoveSubDirectory(token string, subdomain string) error { + err := os.RemoveAll(MOUNTPATH + token + "/" + subdomain) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) RemoveFile(token string, subdomain string, filename string) error { + var filepath = "" + if subdomain != "" { + filepath += MOUNTPATH + token + "/" + subdomain + "/" + filename + } else { + filepath += MOUNTPATH + token + "/" + filename + } + // If error, it seems to show the mounthpath back to the client. This is not good + // error return practise. It shoudn't return the exact file path on the system. + err := os.Remove(filepath) + if err != nil { + return err + } + return nil +} + +func (d *DirectoryStruct) FetchFile( + w http.ResponseWriter, r *http.Request, token string, subdomain string, filename string) { + + var filepath = "" + if subdomain != "" { + filepath += MOUNTPATH + token + "/" + subdomain + "/" + filename + } else { + filepath += MOUNTPATH + token + "/" + filename + } + + http.ServeFile(w, r, filepath) +} + +func (d *DirectoryStruct) CreateFile(filepath string) (*os.File, error) { + f, err := os.OpenFile(filepath, os.O_CREATE|os.O_WRONLY, 0770) + if err != nil { + return nil, err + } + return f, nil +} |