# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements.  See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership.  The ASF licenses this file
# to you 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.
#
# Filsystem access abstraction

from abc import ABCMeta, abstractmethod

class BaseFilesystem(object):
  __metaclass__ = ABCMeta

  @abstractmethod
  def create_file(self, path, file_data, overwrite):
    """Create a file in 'path' and populate with the string 'file_data'. If overwrite is
    True, the file is overwritten. Returns True if successful, False if the file already
    exists and throws an exception otherwise"""
    pass

  @abstractmethod
  def make_dir(self, path, permission):
    """Create a directory in 'path' with octal umask 'permission'.
    Returns True if successful and throws an exception otherwise"""
    pass

  @abstractmethod
  def copy(self, src, dst, overwrite):
    """Copy a file from 'src' to 'dst'. Throws an exception if unsuccessful."""
    pass

  @abstractmethod
  def copy_from_local(self, src, dst):
    """Copies a file from 'src' file on the local filesystem to the 'dst', which can be
    on any HDFS compatible filesystem. Fails if the src file is not on the local
    filesystem. Throws an exception if unsuccessful."""
    pass

  @abstractmethod
  def ls(self, path):
    """Return a list of all files/dirs/keys in path. Throws an exception if path
    is invalid."""
    pass

  @abstractmethod
  def exists(self, path):
    """Returns True if a particular path exists, else it returns False."""
    pass

  @abstractmethod
  def delete_file_dir(self, path, recursive):
    """Delete all files/dirs/keys in a path. Returns True if successful or if the file
    does not exist. Throws an exception otherwise."""
    pass

  @abstractmethod
  def get_all_file_sizes(self, path):
    """Returns a list of integers which are all the file sizes of files found under
    'path'."""
    pass
