kloudbuster/kloudbuster/base_storage.py

89 lines
2.9 KiB
Python

# Copyright 2015 Cisco Systems, Inc. All rights reserved.
#
# 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.
import time
import kloudbuster.log as logging
LOG = logging.getLogger(__name__)
class KBVolCreationException(Exception):
pass
class BaseStorage():
"""
The Base class for cinder storage resources
"""
def __init__(self, cinderclient):
self.cinderclient = cinderclient
def create_vol(self, size, vol_timeout, name=None, type=None):
if type:
vol = self.cinderclient.volumes.create(size, name=name,
volume_type=type)
else:
vol = self.cinderclient.volumes.create(size, name=name)
start_t = time.time()
while (True):
if vol.status == 'creating':
time.sleep(5)
elif vol.status == 'available':
break
elif vol.status == 'error':
raise KBVolCreationException('Not enough disk space in the host?')
if (time.time() - start_t) > vol_timeout:
raise KBVolCreationException('Volume creation timed out')
break
vol = self.cinderclient.volumes.get(vol.id)
return vol
def delete_vol(self, volume):
"""
Sometimes this maybe in use if volume is just deleted
Add a retry mechanism
"""
for _ in range(10):
try:
self.cinderclient.volumes.force_delete(volume)
return True
except Exception:
time.sleep(2)
LOG.error('Failed while deleting volume %s.' % volume.id)
return False
# DO NOT USE THESE TWO APIS, THEY WILL CREATE TROUBLES WHEN TRYING TO DETACH
# OR DELETE THE VOLUMES. Volume attachment should be done via NOVA not CINDER
# def attach_vol(self, volume, instance_uuid, mountpoint):
# self.cinderclient.volumes.attach(volume, instance_uuid, mountpoint)
# def detach_vol(self, volume):
# self.cinderclient.volumes.detach(volume)
class CinderQuota():
def __init__(self, cinderclient, tenant_id):
self.cinderclient = cinderclient
self.tenant_id = tenant_id
def get(self):
return vars(self.cinderclient.quotas.get(self.tenant_id))
def update_quota(self, **kwargs):
self.cinderclient.quotas.update(self.tenant_id, **kwargs)