Skip to content

Commit 334b540

Browse files
author
Bart Spaans
authoredNov 29, 2016
Merge pull request #23 from pnovotnak/feat/pnovotnak/py3-pep8-logging
lots of pep8 cleanup, py3 compatibility, and configurable verbosity
2 parents 83dd8e4 + cc7a6eb commit 334b540

File tree

5 files changed

+55
-36
lines changed

5 files changed

+55
-36
lines changed
 

‎kubefuse/cache.py

+5-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
11
import logging
22
import time
33

4+
logger = logging.getLogger(__name__)
5+
6+
47
class ExpiringCache(object):
58
def __init__(self, expire_in_seconds):
69
self._cache = {}
@@ -11,15 +14,15 @@ def set(self, key, value):
1114
t = time.time() + self.EXPIRE_IN_SECONDS
1215
self._cache[key] = value
1316
self._timestamps[key] = t
14-
logging.info("Add key '%s' to cache (expires %d)" % (key, t))
17+
logger.info("Add key '%s' to cache (expires %d)" % (key, t))
1518

1619
def get(self, key):
1720
if key not in self._timestamps:
1821
return None
1922
now = time.time()
2023
expires_at = self._timestamps[key]
2124
if now < expires_at:
22-
logging.info("Retrieved '%s' from cache" % key)
25+
logger.info("Retrieved '%s' from cache" % key)
2326
return self._cache[key]
2427
self.delete(key)
2528
return None

‎kubefuse/client.py

+7-5
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,9 @@
55

66
from . import cache
77

8+
89
class KubernetesClient(object):
9-
def __init__(self, kubeconfig = None, cluster = None, context = None, user = None):
10+
def __init__(self, kubeconfig=None, cluster=None, context=None, user=None):
1011
self._cache = cache.ExpiringCache(30)
1112
self.kubeconfig = kubeconfig
1213
self.cluster = cluster
@@ -31,7 +32,8 @@ def _run_command(self, cmd):
3132
def _run_command_and_parse_yaml(self, cmd):
3233
return yaml.load(self._run_command(cmd))
3334

34-
def _namespace(self, ns):
35+
@staticmethod
36+
def _namespace(ns):
3537
return ['--namespace', ns] if ns != 'all' else ['--all-namespaces']
3638

3739
def _load_from_cache_or_do(self, key, func):
@@ -49,7 +51,7 @@ def get_namespaces(self):
4951

5052
def get_entities(self, ns, entity):
5153
key = "%s.%s" % (ns, entity)
52-
cb = lambda: self._get_entities(ns,entity)
54+
cb = lambda: self._get_entities(ns, entity)
5355
return self._load_from_cache_or_do(key, cb)
5456

5557
def get_object_in_format(self, ns, entity_type, object, format):
@@ -89,13 +91,13 @@ def _get_namespaces(self):
8991
payload = self._run_command_and_parse_yaml('get ns -o yaml'.split())
9092
if payload is None or 'items' not in payload:
9193
return []
92-
return [ item['metadata']['name'] for item in payload['items']]
94+
return [item['metadata']['name'] for item in payload['items']]
9395

9496
def _get_entities(self, ns, entity):
9597
payload = self._run_command_and_parse_yaml(['get', entity, '-o', 'yaml'] + self._namespace(ns))
9698
if payload is None or 'items' not in payload:
9799
return []
98-
return [ item['metadata']['name'] for item in payload['items']]
100+
return [item['metadata']['name'] for item in payload['items']]
99101

100102
def _get_object_in_format(self, ns, entity_type, object, format):
101103
return self._run_command(['get', entity_type, object, '-o', format] + self._namespace(ns))

‎kubefuse/filesystem.py

+12-7
Original file line numberDiff line numberDiff line change
@@ -1,23 +1,28 @@
1-
from stat import S_IFDIR, S_IFLNK, S_IFREG, S_IFIFO
1+
from stat import S_IFDIR, S_IFREG
22
from time import time
33
import logging
44
import errno
55
from fuse import FuseOSError
66
from . import path
77
KubePath = path.KubePath
88

9+
logger = logging.getLogger(__name__)
10+
11+
912
class KubeFileSystem(object):
1013
def __init__(self, client):
1114
self.client = client
1215
self.open_files = {}
1316
self.flushed = {}
1417

15-
def _stat_dir(self):
18+
@staticmethod
19+
def _stat_dir():
1620
return dict(st_mode=(S_IFDIR | 0o555), st_nlink=2,
1721
st_size=0, st_ctime=time(), st_mtime=time(),
1822
st_atime=time())
1923

20-
def _stat_file(self, client, path, size=None):
24+
@staticmethod
25+
def _stat_file(client, path, size=None):
2126
if size is None:
2227
size = len(path.do_action(client))
2328
ts = path.get_creation_date_for_action_file(client)
@@ -71,10 +76,10 @@ def persist(self, path, data, dry_run=False):
7176
def list_files(self, path):
7277
p = KubePath().parse_path(path)
7378
if not p.exists(self.client):
74-
logging.info("path doesn't exist")
79+
logger.info("path doesn't exist")
7580
raise FuseOSError(errno.ENOENT)
7681
if not p.is_dir():
77-
logging.info("not a directory")
82+
logger.info("not a directory")
7883
raise FuseOSError(errno.ENOTDIR)
7984
if p.object_id is not None:
8085
if p.resource_type != 'pod':
@@ -85,14 +90,14 @@ def list_files(self, path):
8590
return self.client.get_entities(p.namespace, p.resource_type)
8691
if p.namespace is not None:
8792
return p.SUPPORTED_RESOURCE_TYPES
88-
return self.client.get_namespaces() # + ['all']
93+
return self.client.get_namespaces() # + ['all']
8994

9095
def getattr(self, path):
9196
p = KubePath().parse_path(path)
9297
if path in self.open_files:
9398
return self._stat_file(self.client, p, len(self.open_files[path]))
9499
if not p.exists(self.client):
95-
logging.info("path doesn't exist")
100+
logger.info("path '%s' doesn't exist" % path)
96101
raise FuseOSError(errno.ENOENT)
97102
if p.action is not None:
98103
return self._stat_file(self.client, p)

‎kubefuse/kubefuse.py

+27-20
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,24 @@
11
#!/usr/bin/env python
22

33
import logging
4-
import sys
5-
import os
6-
import errno
74
import six
85
import argparse
96
import sys
107
try:
118
from fuse import FUSE, FuseOSError, Operations, LoggingMixIn
129
except EnvironmentError:
13-
print "It looks like the Fuse system library is missing."
14-
print "Please install libfuse using your OS's package manager, or download OSXFUSE if you're on a Mac"
10+
print("It looks like the Fuse system library is missing.")
11+
print("Please install libfuse using your OS's package manager, or download OSXFUSE if you're on a Mac")
1512
sys.exit(1)
1613

1714

1815
from . import client
19-
from . import filesystem
16+
from . import filesystem
17+
2018

2119
class KubeFuse(LoggingMixIn, Operations):
2220

23-
def __init__(self, mount, kubeconfig = None, cluster = None, context = None, user = None):
21+
def __init__(self, mount, kubeconfig=None, cluster=None, context=None, user=None):
2422
self.client = client.KubernetesClient(kubeconfig, cluster, context, user)
2523
self.fs = filesystem.KubeFileSystem(self.client)
2624
self.fd = 0
@@ -58,23 +56,32 @@ def release(self, path, fh):
5856

5957
def parse_args():
6058
parser = argparse.ArgumentParser(description='A file system view for Kubernetes')
61-
parser.add_argument('mountpoint', metavar='MOUNTPOINT', type=str,
62-
help='The directory to mount on')
63-
parser.add_argument('--kubeconfig', dest='kubeconfig',
64-
help='Path to the kubeconfig file')
65-
parser.add_argument('--cluster', dest='cluster',
66-
help='The name of the kubeconfig cluster to use')
67-
parser.add_argument('--context', dest='context',
68-
help='The name of the kubeconfig context to use')
69-
parser.add_argument('--user', dest='user',
70-
help='The name of the kubeconfig user to use')
59+
parser.add_argument('mountpoint', metavar='MOUNTPOINT', type=str,
60+
help='The directory to mount on')
61+
parser.add_argument('--kubeconfig', dest='kubeconfig',
62+
help='Path to the kubeconfig file')
63+
parser.add_argument('--cluster', dest='cluster',
64+
help='The name of the kubeconfig cluster to use')
65+
parser.add_argument('--context', dest='context',
66+
help='The name of the kubeconfig context to use')
67+
parser.add_argument('--user', dest='user',
68+
help='The name of the kubeconfig user to use')
69+
parser.add_argument('--verbose', '-v', action='count', dest='verbosity',
70+
default=0, help='Verbosity of program output')
7171
return parser.parse_args()
7272

7373
def main():
7474
args = parse_args()
75-
logging.basicConfig(level=logging.INFO)
76-
fuse = FUSE(KubeFuse(args.mountpoint, args.kubeconfig, args.cluster, args.context),
77-
args.mountpoint, foreground=True)
75+
if args.verbosity == 0:
76+
logging.basicConfig(level=logging.WARNING)
77+
elif args.verbosity == 1:
78+
logging.basicConfig(level=logging.INFO)
79+
elif args.verbosity == 2:
80+
logging.basicConfig(level=logging.DEBUG)
81+
else:
82+
logging.basicConfig(level=0)
83+
FUSE(KubeFuse(args.mountpoint, args.kubeconfig, args.cluster, args.context),
84+
args.mountpoint, foreground=True)
7885

7986
if __name__ == '__main__':
8087
main()

‎kubefuse/path.py

+4-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
import json
22
from datetime import datetime
33

4+
45
class KubePath(object):
5-
def __init__(self, namespace = None, resource_type = None, object_id = None, action = None):
6+
def __init__(self, namespace=None, resource_type=None, object_id=None, action=None):
67
self.namespace = namespace
78
self.resource_type = resource_type
89
self.object_id = object_id
@@ -33,7 +34,8 @@ def __init__(self, namespace = None, resource_type = None, object_id = None, act
3334
self.SUPPORTED_POD_ACTIONS = ['logs'] + self.SUPPORTED_ACTIONS
3435

3536
def parse_path(self, path):
36-
if path == '/': return self
37+
if path == '/':
38+
return self
3739
parts = path[1:].split("/")
3840
self.namespace = parts[0] if len(parts) > 0 else None
3941
self.resource_type = parts[1] if len(parts) > 1 else None

0 commit comments

Comments
 (0)
Please sign in to comment.