3 from __future__
import with_statement
11 from fuse
import FUSE, FuseOSError, Operations
12 from hypervisor
import hypervisor_factory
as hyp_factory
13 from vnfs_operations
import VNFSOperations
20 logger = logging.getLogger(__name__)
52 module_root=
'middleboxes'):
75 def _full_path(self, partial):
76 if partial.startswith(
"/"):
78 path = os.path.join(self.
root, partial)
84 def access(self, path, mode):
86 if not os.access(full_path, mode):
87 raise FuseOSError(errno.EACCES)
89 def chmod(self, path, mode):
91 return os.chmod(full_path, mode)
93 def chown(self, path, uid, gid):
95 return os.chown(full_path, uid, gid)
120 opcode = self.vnfs_ops.vnfs_get_opcode(path)
121 if opcode == VNFSOperations.OP_NF:
122 nf_type = self.vnfs_ops.vnfs_get_nf_type(path)
125 mbox_module = importlib.import_module(
130 logger.error(
'VNF module file missing. Add "' + nf_type
134 raise OSError(errno.ENOSYS)
135 return mbox_module._getattr(self.
root, path, fh)
137 st = os.lstat(full_path)
138 file_name = self.vnfs_ops.vnfs_get_file_name(full_path)
153 def readdir(self, path, fh):
155 dirents = [
'.',
'..']
156 if os.path.isdir(full_path):
157 dirents.extend(os.listdir(full_path))
158 for entry
in dirents:
161 def readlink(self, path):
163 if pathname.startswith(self.
root):
167 def mknod(self, path, mode, dev):
168 return os.mknod(self.
_full_path(path), mode, dev)
170 def rmdir(self, path):
172 return os.rmdir(full_path)
189 opcode = self.vnfs_ops.vnfs_get_opcode(path)
190 if opcode == VNFSOperations.OP_NF:
191 nf_type = self.vnfs_ops.vnfs_get_nf_type(path)
194 path_tokens = path.split(
"/")
195 if path_tokens.index(
"nf-types") == len(path_tokens) - 2:
197 mbox_module = importlib.import_module(
201 result = mbox_module._mkdir(self.
root, path, mode)
202 elif opcode == VNFSOperations.OP_UNDEFINED:
206 def statfs(self, path):
208 stv = os.statvfs(full_path)
225 def unlink(self, path):
228 def symlink(self, name, target):
229 return os.symlink(self.
_full_path(target), name)
231 def rename(self, old, new):
234 def link(self, target, name):
237 def utimens(self, path, times=None):
243 def open(self, path, flags):
245 return os.open(full_path, flags)
247 def create(self, path, mode, fi=None):
249 return os.open(full_path, os.O_WRONLY | os.O_CREAT, mode)
273 def read(self, path, length, offset, fh):
275 opcode = self.vnfs_ops.vnfs_get_opcode(full_path)
276 file_name = self.vnfs_ops.vnfs_get_file_name(full_path)
277 if opcode == self.vnfs_ops.OP_NF:
278 nf_type = self.vnfs_ops.vnfs_get_nf_type(path)
279 mbox_module = importlib.import_module(
283 return mbox_module._read(self.
root, path, length, offset, fh)
284 os.lseek(fh, offset, os.SEEK_SET)
285 return os.read(fh, length)
309 def write(self, path, buf, offset, fh):
310 opcode = self.vnfs_ops.vnfs_get_opcode(path)
312 file_name = self.vnfs_ops.vnfs_get_file_name(path)
313 if opcode == VNFSOperations.OP_NF:
314 nf_type = self.vnfs_ops.vnfs_get_nf_type(full_path)
315 mbox_module = importlib.import_module(
319 return mbox_module._write(self.
root, path, buf, offset, fh)
321 os.lseek(fh, offset, os.SEEK_SET)
322 return os.write(fh, buf)
324 def truncate(self, path, length, fh=None):
326 with open(full_path,
'r+')
as f:
329 def flush(self, path, fh):
332 def release(self, path, fh):
335 def fsync(self, path, fdatasync, fh):
336 return self.
flush(path, fh)
340 arg_parser = argparse.ArgumentParser(
341 description=
"nf.io File System for NFV Orchestration",
342 formatter_class=argparse.ArgumentDefaultsHelpFormatter)
343 arg_parser.add_argument(
345 help=
'Absolute path of nf.io root',
347 arg_parser.add_argument(
349 help=
'Absolute path of nf.io mount point',
351 arg_parser.add_argument(
353 help=
'Hypervisor to use for VNF deployment (DockerDriver/Libvirt)',
354 default=
"DockerDriver")
355 arg_parser.add_argument(
356 '--middlebox_module_root',
357 help=
'Module directory inside the source tree containing middlebox specific implementation of system calls',
358 default=
'middleboxes')
359 arg_parser.add_argument(
361 help=
'[debug|info|warning|error]',
364 args = arg_parser.parse_args()
365 root = args.nfio_root
366 mountpoint = args.nfio_mount
367 hypervisor = args.hypervisor
368 hypervisor_factory = hyp_factory.HypervisorFactory(hypervisor)
369 module_root = args.middlebox_module_root
372 LOG_LEVELS = {
'debug':logging.DEBUG,
374 'warning':logging.WARNING,
375 'error':logging.ERROR,
376 'critical':logging.CRITICAL,
378 log_level = LOG_LEVELS.get(args.log_level, logging.INFO)
379 logging.basicConfig(level=log_level)
381 logging.getLogger(
"requests").setLevel(logging.WARNING)
382 logging.addLevelName( logging.WARNING,
"\033[1;31m%s\033[1;0m" % logging.getLevelName(logging.WARNING))
383 logging.addLevelName( logging.ERROR,
"\033[1;41m%s\033[1;0m" % logging.getLevelName(logging.ERROR))
384 FORMAT =
"[%(filename)s:%(lineno)s - %(funcName)20s() ] %(message)s"
385 logging.basicConfig(format=FORMAT)
396 if __name__ ==
'__main__':
def write
Write to an open file.
Provides a common set of operations for nfio.
def read
Reads an open file.
def _full_path
Returns the absolute path of a partially specified path.
def getattr
Returns the file attributes of the file specified by path Args: path: Path of the file fh: Open file ...
def __init__
Instantiates a Nfio object.
def mkdir
The semantics have been redefined to create a new VNF instance when a directory is created under a sp...