Initial commit
[ta/distributed-state-server.git] / plugins / dssfile.py
diff --git a/plugins/dssfile.py b/plugins/dssfile.py
new file mode 100644 (file)
index 0000000..841e566
--- /dev/null
@@ -0,0 +1,147 @@
+# Copyright 2019 Nokia
+#
+# 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.
+#
+
+from dss.api import dss_plugin
+from dss.api import dss_error
+
+import ConfigParser
+import logging
+import os
+
+class dssfile(dss_plugin.DSSPlugin):
+    """
+    Read the ini file. The structure is as follows
+    [default]
+    directory = <directory>
+    """
+    def __init__(self, config_file):
+        super(dssfile, self).__init__(config_file)
+        self.directory = None
+        try:
+            config = ConfigParser.ConfigParser()
+            config.read([config_file])
+            self.directory = config.get('default', 'directory')
+        except Exception as exp:
+            raise dss_error.Error('Failed to parse configuration, got error %s' % exp)
+
+        if not os.path.isdir(self.directory):
+            raise dss_error.Error('%s is not a valid directory name' % self.directory)
+
+    def read_file(self, domain):
+        filename = self.directory + '/' + domain
+        if not os.path.isfile(filename):
+            raise dss_error.Error('Key not found %s' % domain)
+
+        try:
+            with open(filename) as f:
+                return f.read().splitlines()
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+    def write_file(self, domain, lines):
+        filename = self.directory + '/' + domain
+        try:
+            with open(filename, 'w') as f:
+                for line in lines:
+                    f.write(line+'\n')
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+    def get(self, domain, name):
+        lines = self.read_file(domain)
+        try:
+            for line in lines:
+                index=line.find('=')
+                part0 = line[:index]
+                part1 = line[index+1:]
+                if name == part0:
+                    return part1
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+        raise dss_error.Error('Key not found %s/%s' % (domain, name))
+
+    def get_domain(self, domain):
+        lines = self.read_file(domain)
+        ret = {}
+        for line in lines:
+            index=line.find('=')
+            part0 = line[:index]
+            part1 = line[index+1:]
+            ret[part0] = part1
+        return ret
+
+    def get_domains(self):
+        ret = []
+        try:
+            entries = os.listdir(self.directory)
+            for entry in entries:
+                filename = self.directory + '/' + entry
+                if os.path.isfile(filename):
+                    ret.append(entry)
+            if not ret:
+                raise dss_error.Error('No domains found')
+
+            return ret
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+    def set(self, domain, name, value):
+        filename = self.directory + '/' + domain
+        lines = []
+        if os.path.isfile(filename):
+            lines = self.read_file(domain)
+        try:
+            found = False
+            for index, line in enumerate(lines):
+                i=line.find('=')
+                part0 = line[:i]
+                part1 = line[i+1:]
+                if part0 == name:
+                    found = True
+                    lines[index] = name+'='+value
+                    break
+            if not found:
+                lines.append(name+'='+value)
+            self.write_file(domain, lines)
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+    def delete(self, domain, name):
+        lines = self.read_file(domain)
+        found_index = -1
+        try:
+            for index, line in enumerate(lines):
+                i=line.find('=')
+                part0 = line[:i]
+                part1 = line[i+1:]
+                if part0 == name:
+                    found_index = index
+                    break
+            if found_index != -1:
+                del lines[found_index]
+                self.write_file(domain, lines)
+        except Exception as exp:
+            raise dss_error.Error('Failed with error %s' % exp)
+
+        if found_index == -1:
+            raise dss_error.Error('%s/%s not found' % (domain, name))
+
+    def delete_domain(self, domain):
+        filename = self.directory + '/' + domain
+        if os.path.isfile(filename):
+            os.remove(filename)
+        else:
+            raise dss_error.Error('Invalid domain %s' % domain)