Example #1
0
    def add_disk(disk):
        print 'Add disk {0}'.format(disk)
        with FileMutex('add_disk'), FileMutex('disk_'.format(disk)):
            print 'Got lock for add disk {0}'.format(disk)
            config = Configuration()
            all_disks = API._list_disks()
            if disk not in all_disks:
                raise BadRequest('Disk not available')
            if all_disks[disk]['available'] is False:
                raise BadRequest('Disk already configured')

            # Partitioning and mounting
            print 'Preparing disk {0}'.format(disk)
            asd_id = ''.join(random.choice(string.ascii_letters + string.digits) for _ in range(32))
            Disks.prepare_disk(disk, asd_id)

            # Prepare & start service
            print 'Setting up service for disk {0}'.format(disk)
            port = int(config.data['network']['port'])
            ips = config.data['network']['ips']
            used_ports = [all_disks[_disk]['port'] for _disk in all_disks
                          if all_disks[_disk]['available'] is False and 'port' in all_disks[_disk]]
            while port in used_ports:
                port += 1
            asd_config = {'home': '/mnt/alba-asd/{0}/data'.format(asd_id),
                          'node_id': config.data['main']['node_id'],
                          'asd_id': asd_id,
                          'log_level': 'info',
                          'port': port}
            
            if config.data.get('extra_parameters') is not None:
                for extrakey in config.data['extra_parameters']:
                    asd_config[extrakey] = config.data['extra_parameters'][extrakey]
            
            if ips is not None and len(ips) > 0:
                asd_config['ips'] = ips
            with open('/mnt/alba-asd/{0}/asd.json'.format(asd_id), 'w') as conffile:
                conffile.write(json.dumps(asd_config))
            check_output('chmod 666 /mnt/alba-asd/{0}/asd.json'.format(asd_id), shell=True)
            check_output('chown alba:alba /mnt/alba-asd/{0}/asd.json'.format(asd_id), shell=True)
            with open('/opt/alba-asdmanager/config/upstart/alba-asd.conf', 'r') as template:
                contents = template.read()
            service_name = '{0}{1}'.format(API.SERVICE_PREFIX, asd_id)
            contents = contents.replace('<ASD>', asd_id)
            contents = contents.replace('<SERVICE_NAME>', service_name)
            with open('/etc/init/{0}.conf'.format(service_name), 'w') as upstart:
                upstart.write(contents)
            check_output('start {0}'.format(service_name), shell=True)

            print 'Returning info about added disk {0}'.format(disk)
            all_disks = API._list_disks()
            data = all_disks[disk]
            API._disk_hateoas(data, disk)
            data['_link'] = '/disks/{0}'.format(disk)
            return data
Example #2
0
 def _list_disks():
     print 'Fetching disks'
     disks = Disks.list_disks()
     for disk_id in disks:
         if disks[disk_id]['available'] is False:
             asd_id = disks[disk_id]['asd_id']
             if disks[disk_id]['state']['state'] != 'error':
                 if os.path.exists('/mnt/alba-asd/{0}/asd.json'.format(asd_id)):
                     try:
                         with open('/mnt/alba-asd/{0}/asd.json'.format(asd_id), 'r') as conffile:
                             disks[disk_id].update(json.load(conffile))
                     except ValueError:
                         disks[disk_id]['state'] = {'state': 'error',
                                                    'detail': 'corruption'}
                 else:
                     disks[disk_id]['state'] = {'state': 'error',
                                                'detail': 'servicefailure'}
                 if disks[disk_id]['state']['state'] != 'error':
                     service_state = check_output('status {0}{1} || true'.format(API.SERVICE_PREFIX, asd_id), shell=True)
                     if 'start/running' not in service_state:
                         disks[disk_id]['state'] = {'state': 'error',
                                                    'detail': 'servicefailure'}
         disks[disk_id]['name'] = disk_id
         disks[disk_id]['node_id'] = Configuration().data['main']['node_id']
         API._disk_hateoas(disks[disk_id], disk_id)
     print 'Fetching disks completed'
     return disks
Example #3
0
    def delete_disk(disk):
        print 'Deleting disk {0}'.format(disk)
        with FileMutex('disk_'.format(disk)):
            print 'Got lock for deleting disk {0}'.format(disk)
            all_disks = API._list_disks()
            if disk not in all_disks:
                raise BadRequest('Disk not available')
            if all_disks[disk]['available'] is True:
                raise BadRequest('Disk not yet configured')

            # Stop and remove service
            print 'Removing services for disk {0}'.format(disk)
            asd_id = all_disks[disk]['asd_id']
            service_name = '{0}{1}'.format(API.SERVICE_PREFIX, asd_id)
            check_output('stop {0} || true'.format(service_name), shell=True)
            if os.path.exists('/etc/init/{0}.conf'.format(service_name)):
                os.remove('/etc/init/{0}.conf'.format(service_name))

            # Cleanup & unmount disk
            print 'Cleaning disk {0}'.format(disk)
            Disks.clean_disk(disk, asd_id)

            return {'_link': '/disks/{0}'.format(disk)}
Example #4
0
# Copyright 2014 Open vStorage NV
#
# Licensed 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.

"""
API module
"""

from source.tools.disks import Disks
from flask import Flask
app = Flask(__name__)

Disks.scan_controllers()

from api import API