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
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
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)}
# 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