Ejemplo n.º 1
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.º 2
0
 def unmount_host(self):
     if self.volume_type == STORAGE_SHARE_TYPE_NFS:
         return Result('nfs type volume')
     
     rlt = MountDB.instance().read_mount_list(self.cluster_name, self.pv_name)
     if not rlt.success:
         Log(1, 'AddPVWork.unmount_host read_mount_list[%s][%s]fail,as[%s]'%(self.cluster_name, self.pv_name, rlt.message))
         return Result('done')
     
     app_node_list = []
     mount_id_list = []
     for host in rlt.content:
         mount_id_list.append(host.get(ID))
         node = {}
         node['ip'] = host.get('ip')
         node['port'] = host.get('port')
         app_node_list.append(node)
         
     if not app_node_list:
         return Result('not mount')
     
     data = {}
     data['name'] = self.pv_name
     data['cluster_id'] = self.get_cluster_id()
     
     rlt = self.veclient.unmount_volume(data, app_node_list)
     if not rlt.success:
         Log(1, 'AddPVWork.mount_host mount_volume[%s]fail,as[%s]'%(str(data), rlt.message))
         return rlt
     
     rlt = MountDB.instance().delete_mount_records(self.cluster_name, mount_id_list)
     if not rlt.success:
         Log(1, 'AddPVWork.mount_host save_mount_info[%s]fail,as[%s]'%(str(data), rlt.message))
     return rlt
Ejemplo n.º 3
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.º 4
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.º 5
0
    def delete_storage_class(self, cluster_name, info, operator):
        storage_class = info.get('storage_class_name')
        if info.get('status') == STORAGE_CLASS_STATUS_NOT_READY:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class [%s][%s]fail,as[The storage class not ready]'%(cluster_name, storage_class))
            return self.delete_storage_class_from_db(storage_class)
        
        kube_client = KubeClientMgr.instance().get_cluster_client(cluster_name)
        if kube_client is None:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class get_cluster_client[%s]fail'%(cluster_name))
            return Result('', INVALID_PARAM_ERR, 'cluster_name is invalid', http.BAD_REQUEST)
        
        rlt = kube_client.remove_storage_class_deploy(STORAGE_CLASS_DEFAULT_NAMESPACE, storage_class)
        if not rlt.success:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class remove_storage_class_deploy[%s]fail,as[%s]'%(storage_class, rlt.message))
            return rlt

        mount_node_list = []
        rlt = MountDB.instance().read_mount_list(cluster_name, info.get('volume_name'))
        if not rlt.success:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class read_mount_list[%s]fail,as[%s]'%(cluster_name, info.get('volume_name'), rlt.message))
        else:
            mount_node_list = rlt.content
        
        rlt = self.delete_volume(cluster_name, info.get('volume_id'), mount_node_list)
        if not rlt.success:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class delete_volume[%s]fail,as[%s]'%(storage_class, rlt.message))
        
        rlt = kube_client.delete_storage_class(storage_class)
        if not rlt.success:
            Log(1, 'DeleteStorageNodeWork.delete_storage_class delete_storage_class[%s]fail,as[%s]'%(storage_class, rlt.message))
        
        return self.delete_storage_class_from_db(storage_class)
Ejemplo n.º 6
0
 def delete_pv(self, cluster_name, volume_name, operator):
     mount_node_list = []
     rlt = MountDB.instance().read_mount_list(cluster_name, volume_name)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_pv read_mount_list[%s]fail,as[%s]'%(cluster_name, volume_name, rlt.message))
     else:
         mount_node_list = rlt.content
     
     if len(mount_node_list) > 1:
         return self.umount_volume(cluster_name, volume_name, mount_node_list)
     
     return self._delete_pv(cluster_name, volume_name, mount_node_list, operator)
Ejemplo n.º 7
0
 def delete_pvs(self):
     rlt = MountDB.instance().get_volume_by_mount_ip(self.cluster_name, self.ip)
     if not rlt.success:
         Log(1, 'DeleteStorageNodeWork.delete_pvs get_volume_by_mount_ip[%s][%s]fail,as[%s]'%(self.cluster_name, self.ip, rlt.message))
         return Result('done')
     
     if not len(rlt.content):
         Log(1, 'DeleteStorageNodeWork.delete_pvs [%s][%s]success,as[not mount volumes]'%(self.cluster_name, self.ip))
         return Result('done')
     
     for volume_name in rlt.content:
         self.delete_pv(self.cluster_name, volume_name, self.operator)
             
     return Result(len(rlt.content))
Ejemplo n.º 8
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.º 9
0
 def mount_host(self):
     if self.volume_type == STORAGE_SHARE_TYPE_NFS:
         return Result('done')
     
     rlt = StorageNodeDB.instance().read_app_node_list(self.cluster_name)
     if not rlt.success:
         Log(1, 'AddPVWork.mount_host read_app_node_list[%s]fail,as[%s]'%(self.cluster_name, rlt.message))
         return Result('done')
     
     app_node_list = []
     for node in rlt.content:
         if node.get('ip') == self.ip:
             continue
         
         app_node_list.append({'ip':node.get('ip'), 'port':node.get('app_api_port', APPLICATION_HOST_PORT)})
         
     if not app_node_list:
         return Result('done')
     
     app_node_list = self._get_ramdom_host(app_node_list, 2)
     
     data = {}
     data['name'] = self.pv_name
     data['cluster_id'] = self.get_cluster_id()
     data['share_type'] = self.volume_type
     data['targetdport'] = self.targetdport
     rlt = self.veclient.mount_volume(data, app_node_list)
     if not rlt.success:
         Log(1, 'AddPVWork.mount_host mount_volume[%s]fail,as[%s]'%(str(data), rlt.message))
         return rlt
     
     self.app_node_list = app_node_list
     
     rlt = MountDB.instance().save_mount_info(self.cluster_name, data, app_node_list)
     if not rlt.success:
         Log(1, 'AddPVWork.mount_host save_mount_info[%s]fail,as[%s]'%(str(data), rlt.message))
     return rlt
Ejemplo n.º 10
0
        if not rlt.success:
            Log(
                1, 'Storage.add_volume create_volume[%s]fail,as[%s]' %
                (str(data), rlt.message))
            return rlt

        rlt = client.get_volume_info(data['cluster_id'],
                                     DEFAULT_STORAGE_DOMAIN,
                                     DEFAULT_STORAGE_POOL_NAME, data['name'])
        if not rlt.success:
            Log(
                1, 'Storage.add_volume get_volume_info[%s]fail,as[%s]' %
                (str(data), rlt.message))
            return rlt

        rlt = MountDB.instance().create_mount_record(data['cluster_name'],
                                                     data)
        if not rlt.success:
            Log(
                1, 'Storage.add_volume create_mount_record[%s]fail,as[%s]' %
                (str(data), rlt.message))
            return rlt

        volume_info = rlt.content
        data['creator'] = args.get('passport', {}).get('username', '')
        data['bind'] = ''
        data['status'] = volume_info.get('status', '-')
        data['flag'] = volume_info.get('flag', '-')
        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',