Exemple #1
0
 def add_disk(disk_id):
     """
     Add a disk
     :param disk_id: Identifier of the disk  (eg: '/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0' or 'pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0')
     :type disk_id: str
     :return: Disk information about the newly added disk
     :rtype: dict
     """
     disk_data = DiskController.get_disk_data_by_alias(device_alias=disk_id)
     if disk_data['available'] is False:
         raise BadRequest('Disk already configured')
     alias = disk_data['aliases'][0]
     API._logger.info('Add disk {0}'.format(alias))
     with file_mutex('add_disk'), file_mutex('disk_{0}'.format(disk_id)):
         DiskController.prepare_disk(device_alias=alias)
     return DiskController.get_disk_data_by_alias(device_alias=alias)
Exemple #2
0
 def execute_update(status):
     """
     Execute an update
     :param status: Current status of the update
     :type status: str
     """
     with file_mutex('package_update'):
         return UpdateController.execute_update(status)
Exemple #3
0
 def get_package_information_new():
     """
     Retrieve update information
     This call is used by the new framework code (as off 30 Nov 2016)
     In case framework has new code, but SDM runs old code, the asdmanager.py plugin will adjust the old format to the new format
     """
     with file_mutex('package_update'):
         API._logger.info('Locking in place for package update')
         return SDMUpdateController.get_package_information()
Exemple #4
0
 def add_disk(disk_id):
     """
     Add a disk
     :param disk_id: Identifier of the disk
     :type disk_id: str
     """
     API._log('Add disk {0}'.format(disk_id))
     all_disks = DiskController.list_disks()
     if disk_id not in all_disks:
         raise BadRequest('Disk not available')
     if all_disks[disk_id]['available'] is False:
         raise BadRequest('Disk already configured')
     with file_mutex('add_disk'), file_mutex('disk_{0}'.format(disk_id)):
         DiskController.prepare_disk(disk_id)
     all_disks = DiskController.list_disks()
     if disk_id not in all_disks:
         raise BadRequest('Disk could not be added')
     return all_disks[disk_id]
Exemple #5
0
 def add_asd_disk(disk_id):
     """
     Adds an ASD to a disk
     :param disk_id: Identifier of the disk
     :type disk_id: str
     """
     mountpoints = FSTab.read()
     if disk_id not in mountpoints:
         raise BadRequest('Disk {0} is not yet initialized'.format(disk_id))
     with file_mutex('add_asd'):
         ASDController.create_asd(disk_id)
Exemple #6
0
 def execute_update(status):
     """
     This call is required when framework has old code and SDM has been updated (as off 30 Nov 2016)
     Old code tries to initiate update providing a status, while new code no longer requires this status
     :param status: Unused
     :type status: str
     """
     _ = status
     with file_mutex('package_update'):
         SDMUpdateController.update(package_name='alba')
         SDMUpdateController.update(package_name='openvstorage-sdm')
         return {'status': 'done'}
Exemple #7
0
 def add_asd_disk(disk_id):
     """
     Adds an ASD to a disk
     :param disk_id: Identifier of the disk  (eg: '/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0' or 'pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0')
     :type disk_id: str
     :return: None
     """
     disk_data = DiskController.get_disk_data_by_alias(device_alias=disk_id)
     for partition_alias, mountpoint in FSTab.read().iteritems():
         if partition_alias in disk_data['partition_aliases']:
             with file_mutex('add_asd'):
                 ASDController.create_asd(partition_alias=partition_alias)
                 return
     raise BadRequest('Disk {0} is not yet initialized'.format(disk_data['aliases'][0]))
Exemple #8
0
 def get_package_information_old():
     """
     Retrieve update information
     This call is required when framework has old code and SDM has been updated (as off 30 Nov 2016)
     Old code tries to call /update/information and expects data formatted in the old style
     """
     return_value = {'version': '', 'installed': ''}
     with file_mutex('package_update'):
         API._logger.info('Locking in place for package update')
         update_info = SDMUpdateController.get_package_information().get('alba', {})
         if 'openvstorage-sdm' in update_info:
             return_value['version'] = update_info['openvstorage-sdm']['candidate']
             return_value['installed'] = update_info['openvstorage-sdm']['installed']
         elif 'alba' in update_info:
             return_value['version'] = update_info['alba']['candidate']
             return_value['installed'] = update_info['alba']['installed']
     return return_value
Exemple #9
0
    def delete_disk(disk_id):
        """
        Delete a disk
        :param disk_id: Identifier of the disk  (eg: '/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0' or 'pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0')
        :type disk_id: str
        :return: None
        """
        try:
            disk_data = DiskController.get_disk_data_by_alias(device_alias=disk_id)
        except DiskNotFoundError:
            API._logger.warning('Disk with ID {0} is no longer detected on the filesystem'.format(disk_id))
            disk_data = {}

        if disk_data.get('available') is True:
            raise BadRequest('Disk not yet configured')

        if disk_data:
            alias = disk_data['aliases'][0]
            mountpoint = disk_data['mountpoint'] or None
            partition_aliases = disk_data['partition_aliases']
            API._logger.info('Deleting disk {0}'.format(alias))
        else:  # Disk is most likely missing from filesystem
            alias = None
            mountpoint = None
            partition_aliases = json.loads(request.form['partition_aliases'])
            API._logger.info('Deleting unknown disk with partition aliases "{0}"'.format('", "'.join(partition_aliases)))

        if mountpoint is None:  # 'lsblk' did not return mountpoint for the device, but perhaps it's still mounted according to FSTab
            for partition_alias, mtpt in FSTab.read().iteritems():
                if partition_alias in partition_aliases:
                    API._logger.warning('Disk with ID {0} is still mounted on {1} according to FSTab'.format(disk_id, mountpoint))
                    mountpoint = mtpt
                    break

        with file_mutex('disk_{0}'.format(disk_id)):
            if mountpoint is not None:
                for asd_id in ASDController.list_asds(mountpoint=mountpoint):
                    ASDController.remove_asd(asd_id=asd_id,
                                             mountpoint=mountpoint)
            DiskController.clean_disk(device_alias=alias,
                                      mountpoint=mountpoint,
                                      partition_aliases=partition_aliases)
Exemple #10
0
 def delete_disk(disk_id):
     """
     Delete a disk
     :param disk_id: Identifier of the disk
     :type disk_id: str
     """
     API._log('Deleting disk {0}'.format(disk_id))
     all_disks = DiskController.list_disks()
     if disk_id not in all_disks:
         raise BadRequest('Disk not available')
     if all_disks[disk_id]['available'] is True:
         raise BadRequest('Disk not yet configured')
     with file_mutex('disk_{0}'.format(disk_id)):
         mountpoints = FSTab.read()
         if disk_id in mountpoints:
             mountpoint = mountpoints[disk_id]
             asds = ASDController.list_asds(mountpoint)
             for asd_id in asds:
                 ASDController.remove_asd(asd_id, mountpoint)
             DiskController.clean_disk(disk_id, mountpoint)
Exemple #11
0
 def restart_disk(disk_id):
     """
     Restart a disk
     :param disk_id: Identifier of the disk  (eg: '/dev/disk/by-path/pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0' or 'pci-0000:03:00.0-sas-0x5000c29f4cf04566-lun-0')
     :type disk_id: str
     :return: None
     """
     API._logger.info('Restarting disk {0}'.format(disk_id))
     disk_data = DiskController.get_disk_data_by_alias(device_alias=disk_id)
     alias = disk_data['aliases'][0]
     with file_mutex('disk_{0}'.format(disk_id)):
         API._logger.info('Got lock for restarting disk {0}'.format(alias))
         for partition_alias, mountpoint in FSTab.read().iteritems():
             if partition_alias in disk_data['partition_aliases']:
                 asds = ASDController.list_asds(mountpoint=mountpoint)
                 for asd_id in asds:
                     ASDController.stop_asd(asd_id=asd_id)
                 DiskController.remount_disk(device_alias=alias,
                                             mountpoint=mountpoint)
                 asds = ASDController.list_asds(mountpoint=mountpoint)
                 for asd_id in asds:
                     ASDController.start_asd(asd_id=asd_id)
                 break
Exemple #12
0
 def restart_disk(disk_id):
     """
     Restart a disk
     :param disk_id: Identifier of the disk
     :type disk_id: str
     """
     API._log('Restarting disk {0}'.format(disk_id))
     all_disks = DiskController.list_disks()
     if disk_id not in all_disks:
         raise BadRequest('Disk not available')
     if all_disks[disk_id]['available'] is False:
         raise BadRequest('Disk already configured')
     with file_mutex('disk_{0}'.format(disk_id)):
         API._log('Got lock for restarting disk {0}'.format(disk_id))
         mountpoints = FSTab.read()
         if disk_id in mountpoints:
             mountpoint = mountpoints[disk_id]
             asds = ASDController.list_asds(mountpoint)
             for asd_id in asds:
                 ASDController.stop_asd(asd_id)
             DiskController.remount_disk(disk_id, mountpoint)
             asds = ASDController.list_asds(mountpoint)
             for asd_id in asds:
                 ASDController.start_asd(asd_id)
#     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.

"""
Script to install/upgrade the openvstorage-sdm package
"""

import sys
from datetime import datetime
sys.path.append('/opt/asd-manager')


def _log(message):
    print '{0} - {1}'.format(str(datetime.now()), message)

if __name__ == '__main__':
    from source.tools.filemutex import file_mutex
    from subprocess import check_output

    _log('Upgrading package openvstorage-sdm')
    with file_mutex('package_update'):
        _log('Lock in place, starting upgrade')
        for line in check_output('apt-get install -y --force-yes openvstorage-sdm', shell=True).splitlines():
            _log('  {0}'.format(line))
    _log('Upgrade completed')
Exemple #14
0
 def restart_services():
     """ Restart services """
     with file_mutex('package_update'):
         return SDMUpdateController.restart_services()
Exemple #15
0
 def update(package_name):
     """
     Install the specified package
     """
     with file_mutex('package_update'):
         return SDMUpdateController.update(package_name=package_name)
Exemple #16
0
 def get_update_information():
     """ Retrieve update information """
     with file_mutex('package_update'):
         API._log('Locking in place for package update')
         return UpdateController.get_update_information()