diff --git a/src/rockstor/cli/api_wrapper.py b/src/rockstor/cli/api_wrapper.py index da055399c..d4baf9730 100644 --- a/src/rockstor/cli/api_wrapper.py +++ b/src/rockstor/cli/api_wrapper.py @@ -38,7 +38,7 @@ def __init__(self, client_id=None, client_secret=None, url=None): self.client_secret = client_secret self.url = url - if (client_id is None or client_secret is None or url is None): + if (url is None): self.url = 'https://localhost' try: mgmt_ip = NetworkInterface.objects.get(itype='management').ipaddr @@ -49,12 +49,12 @@ def __init__(self, client_id=None, client_secret=None, url=None): except NetworkInterface.DoesNotExist: pass + def set_token(self): + if (self.client_id is None or self.client_secret is None): app = OauthApp.objects.get(name=settings.OAUTH_INTERNAL_APP) self.client_id = app.application.client_id self.client_secret = app.application.client_secret - - def set_token(self): token_request_data = { 'grant_type': 'client_credentials', 'client_id': self.client_id, diff --git a/src/rockstor/fs/btrfs.py b/src/rockstor/fs/btrfs.py index 8a1477157..bb57ce67a 100644 --- a/src/rockstor/fs/btrfs.py +++ b/src/rockstor/fs/btrfs.py @@ -254,9 +254,19 @@ def snapshot_list(mnt_pt): return snaps -def shares_info(mnt_pt): +def shares_info(pool): # return a list of share names under this mount_point. # useful to gather names of all shares in a pool + try: + mnt_pt = mount_root(pool) + except CommandException, e: + if (e.rc == 32): + #mount failed, so we just assume that something has gone wrong at a + #lower level, like a device failure. Return empty share map. + #application state can be removed. If the low level failure is + #recovered, state gets reconstructed anyway. + return {} + raise o, e, rc = run_command([BTRFS, 'subvolume', 'list', '-s', mnt_pt]) snap_idmap = {} for l in o: @@ -325,14 +335,10 @@ def snaps_info(mnt_pt, share_name): if (fields[-1] == share_name): share_id = fields[1] share_uuid = fields[12] - - if (share_id is None): - raise Exception('Failed to get uuid of the share(%s) under mount(%s)' - % (share_name, mnt_pt)) + if (share_id is None): return {} o, e, rc = run_command([BTRFS, 'subvolume', 'list', '-s', '-p', '-q', '-u', mnt_pt]) - snaps_d = {} snap_uuids = [] for l in o: diff --git a/src/rockstor/scripts/prep_db.py b/src/rockstor/scripts/prep_db.py index 7585deb70..1a9ba52ad 100644 --- a/src/rockstor/scripts/prep_db.py +++ b/src/rockstor/scripts/prep_db.py @@ -38,13 +38,16 @@ def register_services(): 'ZTaskd': 'ztask-daemon', 'Bootstrap': 'rockstor-bootstrap', } - keylist = services.keys() - for s in keylist: - if (not Service.objects.filter(display_name=s).exists()): - s_o = Service(display_name=s, name=services[s]) - s_o.save() + for k,v in services.items(): + try: + so = Service.objects.get(name=v) + so.display_name = k + except Service.DoesNotExist: + so = Service(display_name=k, name=v) + finally: + so.save() for so in Service.objects.filter(): - if (so.display_name not in keylist): + if (so.display_name not in services): so.delete() diff --git a/src/rockstor/storageadmin/views/command.py b/src/rockstor/storageadmin/views/command.py index 868d76f8c..495f3badc 100644 --- a/src/rockstor/storageadmin/views/command.py +++ b/src/rockstor/storageadmin/views/command.py @@ -28,7 +28,7 @@ from rest_framework.permissions import IsAuthenticated from system.osi import (uptime, kernel_info) from fs.btrfs import (mount_share, device_scan, mount_root, qgroup_create, - get_pool_info, pool_raid, pool_usage, shares_info, + get_pool_info, pool_raid, pool_usage, share_usage, snaps_info, mount_snap) from system.ssh import (sftp_mount_map, sftp_mount) from system.services import systemctl @@ -225,15 +225,22 @@ def post(self, request, command): if (command == 'refresh-pool-state'): for p in Pool.objects.all(): - fd = p.disk_set.first() - if (fd is None): + if (p.disk_set.count() == 0): p.delete() - mount_root(p) - pool_info = get_pool_info(fd.name) - p.name = pool_info['label'] - p.raid = pool_raid('%s%s' % (settings.MNT_PT, p.name))['data'] - p.size = pool_usage('%s%s' % (settings.MNT_PT, p.name))[0] - p.save() + continue + try: + mount_root(p) + fd = p.disk_set.first() + pool_info = get_pool_info(fd.name) + p.name = pool_info['label'] + p.raid = pool_raid('%s%s' % (settings.MNT_PT, p.name))['data'] + p.size = pool_usage('%s%s' % (settings.MNT_PT, p.name))[0] + p.save() + except Exception, e: + logger.error('Exception while refreshing state for ' + 'Pool(%s). Moving on: %s' % + (p.name, e.__str__())) + logger.exception(e) return Response() if (command == 'refresh-share-state'): diff --git a/src/rockstor/storageadmin/views/share.py b/src/rockstor/storageadmin/views/share.py index b3f5185a8..a14e9eaa0 100644 --- a/src/rockstor/storageadmin/views/share.py +++ b/src/rockstor/storageadmin/views/share.py @@ -25,9 +25,8 @@ from storageadmin.models import (Share, Disk, Pool, Snapshot, NFSExport, SambaShare, SFTP) from smart_manager.models import (ShareUsage, Replica) -from fs.btrfs import (add_share, remove_share, update_quota, - share_usage, set_property, mount_share, qgroup_id, - shares_info, qgroup_create) +from fs.btrfs import (add_share, remove_share, update_quota, share_usage, + set_property, mount_share, qgroup_id, qgroup_create) from system.osi import is_share_mounted from storageadmin.serializers import ShareSerializer from storageadmin.util import handle_exception diff --git a/src/rockstor/storageadmin/views/share_helpers.py b/src/rockstor/storageadmin/views/share_helpers.py index 358d1e4db..bcbfdedc8 100644 --- a/src/rockstor/storageadmin/views/share_helpers.py +++ b/src/rockstor/storageadmin/views/share_helpers.py @@ -72,7 +72,7 @@ def toggle_sftp_visibility(share, snap_name, on=True): def import_shares(pool, request): disk = Disk.objects.filter(pool=pool)[0].name shares = [s.name for s in Share.objects.filter(pool=pool)] - shares_d = shares_info('%s%s' % (settings.MNT_PT, pool.name)) + shares_d = shares_info(pool) for s in shares: if (s not in shares_d): Share.objects.get(pool=pool, name=s).delete()