Ejemplo n.º 1
0
    def delete_data_volume(self):
        if not self.volume_id:
            return Result('done')

        rlt = VolumeDB.instance().read_volume_info(self.cluster_name,
                                                   self.volume_id)
        if not rlt.success:
            Log(
                1,
                'AddStorageClassWork.read_volume_info [%s][%s]from etcd fail,as[%s]'
                % (self.cluster_name, self.volume_id, rlt.message))
            return rlt

        volume = rlt.content

        app_node_list = []
        mount_id_list = []
        rlt = MountDB.instance().read_mount_list(self.cluster_name,
                                                 self.pv_name)
        if not rlt.success:
            Log(
                1,
                'AddStorageClassWork.delete_data_volume read_mount_list[%s][%s]fail,as[%s]'
                % (self.cluster_name, self.pv_name, rlt.message))
        else:
            for node in rlt.content:
                mount_id_list.append(node.get(ID))
                app_node_list.append({
                    'ip': node.get('ip'),
                    'port': node.get('port')
                })

        if app_node_list:
            rlt = self.veclient.unmount_volume(volume, app_node_list)
            if not rlt.success:
                Log(
                    1,
                    'AddStorageClassWork.delete_data_volume unmount_volume[%s][%s]fail,as[%s]'
                    % (self.cluster_name, volume.get('name'), rlt.message))
                return rlt
            MountDB.instance().delete_mount_records(self.cluster_name,
                                                    mount_id_list)

        rlt = self.veclient.delete_volume(volume['cluster_id'],
                                          volume.get('name'))
        if not rlt.success:
            Log(
                1,
                'AddStorageClassWork.delete_data_volume delete_volume[%s][%s]fail,as[%s]'
                % (self.cluster_name, volume.get('name'), rlt.message))
            return rlt

        rlt = VolumeDB.instance().delete_volume(self.cluster_name,
                                                self.volume_id)
        if not rlt.success:
            Log(
                1,
                'AddStorageClassWork.delete_data_volume delete_volume[%s][%s]from etcd fail,as[%s]'
                % (self.cluster_name, self.volume_id, rlt.message))
        return rlt
Ejemplo n.º 2
0
 def delete_volume(self, cluster_name, volume_id, mount_node_list):
     rlt = VolumeDB.instance().read_volume_info(cluster_name, volume_id)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_volume read_volume_info[%s][%s]fail,as[%s]'%(cluster_name, volume_id, rlt.message))
         return rlt
     
     volume = rlt.content
     
     app_node_list = []
     mount_id_list = []
     for node in rlt.mount_node_list:
         mount_id_list.append(node.get(ID))
         app_node_list.append({'ip':node.get('ip'), 'port':node.get('port')})
         
     if app_node_list:
         rlt = self.client.unmount_volume(volume, app_node_list)
         if not rlt.success:
             Log(1, 'DeleteStorageNodeWork.delete_volume unmount_volume[%s][%s]fail,as[%s]'%(cluster_name, volume.get('name'), rlt.message))
             return rlt
         
         MountDB.instance().delete_mount_records(cluster_name, mount_id_list)
     
     cluster_id = self.get_cluster_id()
     rlt = self.client.delete_volume(cluster_id, volume.get('name'))
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_volume delete_volume[%s][%s]fail,as[%s]'%(cluster_name, volume.get('name'), rlt.message))
         return rlt
     
     rlt = VolumeDB.instance().delete_volume(cluster_name, volume_id)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_volume delete_volume[%s][%s] from etcd fail,as[%s]'%(cluster_name, volume_id, rlt.message))
     return rlt
Ejemplo n.º 3
0
    def _sync_volume_info(self, cluster_name, filtername=''):
        rlt = VolumeDB.instance().read_volume_list(cluster_name)
        if not rlt.success:
            Log(
                1, 'Storage.volumes read_volume_list[%s]fail,as[%s]' %
                (cluster_name, rlt.message))
            return rlt

        volumes = rlt.content
        if len(volumes) == 0:
            Log(3, 'volumes[%s]no volume exist in etcd.')
            return Result([])

        cluster_id = volumes[0].get('cluster_id')

        client = VespaceMgr.instance().get_cluster_client(cluster_name)
        rlt = client.get_volume_list(cluster_id, filtername)
        if not rlt.success:
            Log(
                1, 'Storage.volumes get_volume_list[%s]fail,as[%s]' %
                (cluster_name, rlt.message))
            return rlt

        tmp = {}
        for volume in rlt.content.get('List', []):
            tmp[volume['name']] = volume

        if not tmp:
            Log(3, 'volumes[%s]no volume exist in server.')
            return Result([])

        arr = []
        for volume in volumes:
            volume_name = volume['name']
            if volume_name not in tmp:
                Log(
                    1, 'The volume[%s][%s] not exist in server' %
                    (cluster_name, volume_name))
                VolumeDB.instance().delete_volume(cluster_name,
                                                  volume['volume_id'])
                continue

            volume['status'] = tmp[volume_name].get('status', '-')
            volume['flag'] = tmp[volume_name].get('flag', '-')
            volume['capacity_num'] = tmp[volume_name].get('capacity', 0)
            volume['mounted'] = tmp[volume_name].get('mounted', [])
            volume['accesspath'] = tmp[volume_name].get('accesspath', [])
            volume['controllerhosts'] = tmp[volume_name].get(
                'controllerhosts', {}).get('default', [])
            arr.append(volume)

        return Result(arr)
Ejemplo n.º 4
0
 def create_data_volume(self):
     data = {}
     data['ip'] = self.ip
     data['name'] = self.pv_name
     data['capacity'] = self.capacity
     data['share_type'] = self.volume_type
     data['replica'] = self.replica
     data['cluster_id'] = self.get_cluster_id()
     if self.volume_type == STORAGE_SHARE_TYPE_ISCSI:
         self.targetdport = VolumeDB.instance().get_iscsi_target_port(self.cluster_name)
         data['target_port'] = self.targetdport
         
     rlt = self.veclient.create_volume(data)
     if not rlt.success:
         Log(1, 'AddPVWork.create_data_volume create_volume[%s]fail,as[%s]'%(str(data), rlt.message))
         return rlt
     
     rlt = self.veclient.get_volume_info(data['cluster_id'], DEFAULT_STORAGE_DOMAIN, DEFAULT_STORAGE_POOL_NAME, data['name'])
     if not rlt.success:
         Log(1, 'AddPVWork.create_data_volume get_volume_info[%s][%s]fail,as[%s]'%(data['cluster_id'], data['name'], rlt.message))
         return rlt
     
     volume_info = rlt.content
     rlt = self.parse_volume_accesspath(volume_info.get('accesspath'))
     if not rlt.success:
         Log(1, 'AddPVWork.create_data_volume parse_volume_accesspath[%s]fail,as[%s]'%(str(volume_info.get('accesspath')), rlt.message))
         return rlt
     
     rlt = MountDB.instance().create_mount_record(self.cluster_name, data)
     if not rlt.success:
         Log(1, 'AddPVWork.create_data_volume create_mount_record[%s]fail,as[%s]'%(str(data), rlt.message))
         return rlt
     
     self.volume_status = volume_info.get('status', 0)
     data['creator'] = self.creator
     data['cluster_name'] = self.cluster_name
     data['bind'] = self.pv_name
     data['status'] = self.volume_status
     data['flag'] = volume_info.get('flag', 0)
     data['capacity_num'] = volume_info.get('capacity',0)
     data['mounted'] = volume_info.get('mounted',[])
     data['accesspath'] = volume_info.get('accesspath',[])
     data['controllerhosts'] = volume_info.get('controllerhosts',{}).get('default',[])
     rlt = VolumeDB.instance().create_volume(self.cluster_name, data)
     if rlt.success:
         self.volume_id = rlt.content
     else:
         Log(1, 'AddPVWork.create_data_volume create_volume in etcd[%s]fail,as[%s]'%(str(data), rlt.message))
     return rlt
Ejemplo n.º 5
0
 def umount_volume(self, cluster_name, volume_id, mount_node_list):
     node_list = []
     mount_id = ''
     for node in mount_node_list:
         if node.get('ip') == self.ip:
             node_list.append({'ip':node.get('ip'),'port':node.get('port')})
             mount_id = node.get(ID)
             
     if not node_list:
         Log(1, 'umount_volume[%s][%s]fail,as the volume not mount to this host[%s]'%(cluster_name, volume_id, self.ip))
         return Result('skip')
     
     rlt = VolumeDB.instance().read_volume_info(cluster_name, volume_id)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_volume read_volume_info[%s][%s]fail,as[%s]'%(cluster_name, volume_id, rlt.message))
         return rlt
     
     volume = rlt.content
     rlt = self.client.unmount_volume(volume, node_list)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_volume unmount_volume[%s][%s]fail,as[%s]'%(cluster_name, volume.get('name'), rlt.message))
         return rlt
     
     rlt = MountDB.instance().delete_mount_record(cluster_name, mount_id)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.umount_volume delete_mount_record[%s][%s] from etcd fail,as[%s]'%(cluster_name, mount_id, rlt.message))
     return rlt
Ejemplo n.º 6
0
 def volumes(self, cluster_name):
     rlt = VolumeDB.instance().read_volume_list(cluster_name)
     if not rlt.success:
         Log(
             1, 'Storage.volumes read_volume_list[%s]fail,as[%s]' %
             (cluster_name, rlt.message))
     return rlt
Ejemplo n.º 7
0
    def free_volumes(self, cluster_name):
        rlt = VolumeDB.instance().read_volume_list(cluster_name)
        if not rlt.success:
            Log(
                1, 'Storage.volumes read_volume_list[%s]fail,as[%s]' %
                (cluster_name, rlt.message))
            return rlt

        arr = []
        for volume in rlt.content:
            if not volume.get('bind'):
                arr.append(volume)

        return Result(arr)
Ejemplo n.º 8
0
    def workspace_volumes(self, workspace):
        rlt = WorkSpacedb.instance().read_workspace(workspace)
        if not rlt.success:
            Log(
                1, 'Storage.workspace_volumes read_workspace[%s]fail,as[%s]' %
                (workspace, rlt.message))
            return rlt

        cluster_name = rlt.content.get('cluster_name')
        rlt = VolumeDB.instance().read_volume_list(cluster_name)
        if not rlt.success:
            Log(
                1, 'Storage.volumes read_volume_list[%s]fail,as[%s]' %
                (cluster_name, rlt.message))
        return rlt
Ejemplo n.º 9
0
    def calc_cluster_info(self, cluster_name):
        statistic = {}
        host_number = 0
        total = 0
        free = 0
        volume_num = 0
        volumes = []

        rlt = StorageNodeDB.instance().read_node_list(cluster_name)
        if not rlt.success:
            Log(
                1, 'Storage.clusters read_node_list[%s] fail,as[%s]' %
                (cluster_name, rlt.message))
        else:
            for node in rlt.content:
                if node.get('store_api_port'):
                    host_number += 1
                    ret = self._statistics_host_storage(cluster_name, node)
                    if not ret.success:
                        Log(
                            1,
                            'Storage.clusters _statistics_host_storage[%s]fail,as[%s]'
                            % (str(node), ret.message))
                        continue

                    total += ret.content['total']
                    free += ret.content['free']

            ret = VolumeDB.instance().read_volume_list(cluster_name)
            if ret.success:
                volumes = ret.content
                volume_num = len(ret.content)

        statistic['total'] = total
        statistic['free'] = free
        statistic['host_number'] = host_number
        statistic['volumes'] = volumes
        statistic['volume_num'] = volume_num
        return statistic
Ejemplo n.º 10
0
        try:
            data = json.loads(post_data.replace("'", "\'"))
        except Exception, e:
            Log(1,
                "Configure.add load data to json fail,input[%s]" % (post_data))
            return Result('', INVALID_JSON_DATA_ERR, str(e), http.BAD_REQUEST)

        if 'cluster_name' not in data or not data['cluster_name']:
            return Result('', INVALID_PARAM_ERR, 'cluster name is invalid',
                          http.BAD_REQUEST)

        if 'name' not in data or not data['name']:
            return Result('', INVALID_PARAM_ERR, 'volume name is invalid',
                          http.BAD_REQUEST)

        if VolumeDB.instance().is_volume_exist(data['cluster_name'],
                                               data['name']):
            return Result('', INVALID_PARAM_ERR, 'volume name is repeat',
                          http.BAD_REQUEST)

        if 'capacity' not in data or not data['capacity']:
            return Result('', INVALID_PARAM_ERR, 'capacity is invalid',
                          http.BAD_REQUEST)

        if 'ip' not in data or not StorageNodeDB.instance().is_app_node_exist(
                data['cluster_name'], data['ip']):
            return Result('', INVALID_PARAM_ERR, 'ip is invalid',
                          http.BAD_REQUEST)

        rlt = StoregeClusterDB.instance().get_cluster_info(
            data['cluster_name'])
        if not rlt.success: