1919from  oslo_config  import  cfg 
2020from  oslo_log  import  log  as  logging 
2121
22- from  cinder  import  context  as  cinder_context 
23- from  cinder .objects .volume  import  VolumeList 
22+ from  cinder  import  db 
2423from  cinder .scheduler  import  filters 
2524from  cinder .service_auth  import  SERVICE_USER_GROUP 
2625from  cinder  import  utils  as  cinder_utils 
@@ -66,9 +65,6 @@ class ShardFilter(filters.BaseBackendFilter):
6665    _CAPABILITY_NAME  =  'vcenter-shard' 
6766    _ALL_SHARDS  =  "sharding_enabled" 
6867
69-     # To be populated by the host manager 
70-     all_backend_states  =  []
71- 
7268    def  _get_keystone_adapter (self ):
7369        """Return a keystone adapter 
7470
@@ -151,11 +147,7 @@ def _get_shards(self, project_id):
151147        return  self ._PROJECT_SHARD_CACHE .get (project_id )
152148
153149    def  _is_vmware (self , backend_state ):
154-         # We only need the shard filter for vmware based pools 
155150        if  backend_state .vendor_name  !=  'VMware' :
156-             LOG .info (
157-                 "Shard Filter ignoring backend %s as it's not " 
158-                 "vmware based driver" , backend_state .backend_id )
159151            return  False 
160152        return  True 
161153
@@ -172,8 +164,10 @@ def _filter_by_k8s_cluster(self, backends, filter_properties):
172164        project_id  =  vol_props .get ('project_id' , None )
173165        metadata  =  vol_props .get ('metadata' , {})
174166
167+         is_vmware  =  any (self ._is_vmware (b ) for  b  in  backends )
175168        if  (not  metadata  or  not  project_id 
176-                 or  spec .get ('snapshot_id' )):
169+                 or  spec .get ('snapshot_id' )
170+                 or  not  is_vmware ):
177171            return  backends 
178172
179173        cluster_name  =  metadata .get (CSI_CLUSTER_METADATA_KEY )
@@ -186,42 +180,28 @@ def _filter_by_k8s_cluster(self, backends, filter_properties):
186180        if  availability_zone :
187181            query_filters  =  {'availability_zone' : availability_zone }
188182
189-         query_metadata  =  {CSI_CLUSTER_METADATA_KEY : cluster_name }
190-         k8s_volumes  =  VolumeList .get_all_by_metadata (
191-             cinder_context .get_admin_context (),
192-             project_id , query_metadata ,
183+         k8s_host  =  db .get_host_by_volume_metadata (
184+             key = CSI_CLUSTER_METADATA_KEY ,
185+             value = cluster_name ,
193186            filters = query_filters )
194187
195-         if  not  k8s_volumes :
196-             return  backends 
197- 
198-         k8s_hosts  =  set (volume_utils .extract_host (v .host , 'host' )
199-                         for  v  in  k8s_volumes 
200-                         if  v .id  !=  spec .get ('volume_id' ) and  v .host )
201-         if  not  k8s_hosts :
188+         if  not  k8s_host :
202189            return  backends 
203190
204-         def  _backend_shards (backend_state ):
205-             cap  =  backend_state .capabilities .get (self ._CAPABILITY_NAME )
206-             return  cap .split (',' ) if  cap  else  []
207- 
208-         hosts_shards_map  =  {
209-             volume_utils .extract_host (bs .host , 'host' ):
210-                 _backend_shards (bs )
211-             for  bs  in  self .all_backend_states }
212- 
213-         k8s_shards  =  set ()
214-         for  host  in  k8s_hosts :
215-             shards  =  hosts_shards_map [host ]
216-             k8s_shards .update (shards )
217- 
218191        return  [
219192            b  for  b  in  backends  if 
220193            (not  self ._is_vmware (b ) or 
221-              set ( _backend_shards ( b ))  &   k8s_shards )
194+              volume_utils . extract_host ( b . host ,  'host' )  ==   k8s_host )
222195        ]
223196
224197    def  _backend_passes (self , backend_state , filter_properties ):
198+         # We only need the shard filter for vmware based pools 
199+         if  not  self ._is_vmware (backend_state ):
200+             LOG .info (
201+                 "Shard Filter ignoring backend %s as it's not " 
202+                 "vmware based driver" , backend_state .backend_id )
203+             return  True 
204+ 
225205        spec  =  filter_properties .get ('request_spec' , {})
226206        vol  =  spec .get ('volume_properties' , {})
227207        project_id  =  vol .get ('project_id' , None )
0 commit comments