88# LICENSE.txt file in the root directory of this source tree.
99#
1010#########################################################################
11- from datetime import datetime , timedelta
11+
1212import logging
13+ from datetime import datetime , timedelta
1314from geoserver .layer import Layer
1415from geoserver .resource import FeatureType
1516from geoserver .store import (
3233import requests
3334from requests .packages .urllib3 .util .retry import Retry
3435from requests .adapters import HTTPAdapter
36+ from six import string_types
3537
3638try :
3739 from past .builtins import basestring
@@ -77,9 +79,9 @@ def _name(named):
7779 as long as it's a string
7880 * otherwise, we raise a ValueError
7981 """
80- if isinstance (named , basestring ) or named is None :
82+ if isinstance (named , string_types ) or named is None :
8183 return named
82- elif hasattr (named , 'name' ) and isinstance (named .name , basestring ):
84+ elif hasattr (named , 'name' ) and isinstance (named .name , string_types ):
8385 return named .name
8486 else :
8587 raise ValueError ("Can't interpret %s as a name or a configuration object" % named )
@@ -100,14 +102,15 @@ class Catalog(object):
100102 - Namespaces, which provide unique identifiers for resources
101103 """
102104
103- def __init__ (self , service_url , username = "admin" , password = "geoserver" , validate_ssl_certificate = True , access_token = None ):
105+ def __init__ (self , service_url , username = "admin" , password = "geoserver" , validate_ssl_certificate = True , access_token = None , retries = 3 , backoff_factor = 0.9 ):
104106 self .service_url = service_url .strip ("/" )
105107 self .username = username
106108 self .password = password
107109 self .validate_ssl_certificate = validate_ssl_certificate
108110 self .access_token = access_token
109- self .setup_connection ()
110-
111+ self .retries = retries
112+ self .backoff_factor = backoff_factor
113+ self .setup_connection (retries = self .retries , backoff_factor = self .backoff_factor )
111114 self ._cache = {}
112115 self ._version = None
113116
@@ -121,20 +124,21 @@ def __getstate__(self):
121124 def __setstate__ (self , state ):
122125 '''restore http connection upon unpickling'''
123126 self .__dict__ .update (state )
124- self .setup_connection ()
127+ self .setup_connection (retries = self . retries , backoff_factor = self . backoff_factor )
125128
126- def setup_connection (self ):
129+ def setup_connection (self , retries = 3 , backoff_factor = 0.9 ):
127130 self .client = requests .session ()
128131 self .client .verify = self .validate_ssl_certificate
129132 parsed_url = urlparse (self .service_url )
130133 retry = Retry (
131- total = 6 ,
132- status = 6 ,
133- backoff_factor = 0.9 ,
134+ total = retries or self .retries ,
135+ status = retries or self .retries ,
136+ read = retries or self .retries ,
137+ connect = retries or self .retries ,
138+ backoff_factor = backoff_factor or self .backoff_factor ,
134139 status_forcelist = [502 , 503 , 504 ],
135140 method_whitelist = set (['HEAD' , 'TRACE' , 'GET' , 'PUT' , 'POST' , 'OPTIONS' , 'DELETE' ])
136141 )
137-
138142 self .client .mount ("{}://" .format (parsed_url .scheme ), HTTPAdapter (max_retries = retry ))
139143
140144 def http_request (self , url , data = None , method = 'get' , headers = {}):
@@ -295,8 +299,6 @@ def save(self, obj, content_type="application/xml"):
295299 def _return_first_item (self , _list ):
296300 if len (_list ) == 0 :
297301 return None
298- elif len (_list ) > 1 :
299- raise AmbiguousRequestError ("Multiple items found" )
300302 else :
301303 return _list [0 ]
302304
@@ -330,7 +332,7 @@ def get_stores(self, names=None, workspaces=None):
330332
331333 if names is None :
332334 names = []
333- elif isinstance (names , basestring ):
335+ elif isinstance (names , string_types ):
334336 names = [s .strip () for s in names .split (',' ) if s .strip ()]
335337
336338 if stores and names :
@@ -348,7 +350,7 @@ def get_store(self, name, workspace=None):
348350 return self ._return_first_item (stores )
349351
350352 def create_datastore (self , name , workspace = None ):
351- if isinstance (workspace , basestring ):
353+ if isinstance (workspace , string_types ):
352354 workspace = self .get_workspaces (names = workspace )[0 ]
353355 elif workspace is None :
354356 workspace = self .get_default_workspace ()
@@ -381,7 +383,7 @@ def create_wmslayer(self, workspace, store, name, nativeName=None):
381383 return self .get_layer (name )
382384
383385 def add_data_to_store (self , store , name , data , workspace = None , overwrite = False , charset = None ):
384- if isinstance (store , basestring ):
386+ if isinstance (store , string_types ):
385387 store = self .get_stores (names = store , workspaces = [workspace ])[0 ]
386388 if workspace is not None :
387389 workspace = _name (workspace )
@@ -498,7 +500,7 @@ def create_imagemosaic(self, name, data, configure='first', workspace=None, over
498500 if hasattr (data , 'read' ):
499501 # Adding this check only to pass tests. We should drop support for passing a file object
500502 upload_data = data
501- elif isinstance (data , basestring ):
503+ elif isinstance (data , string_types ):
502504 if os .path .splitext (data )[- 1 ] == ".zip" :
503505 upload_data = open (data , 'rb' )
504506 else :
@@ -652,7 +654,7 @@ def add_granule(self, data, store, workspace=None):
652654
653655 params = dict ()
654656 workspace_name = workspace
655- if isinstance (store , basestring ):
657+ if isinstance (store , string_types ):
656658 store_name = store
657659 else :
658660 store_name = store .name
@@ -690,7 +692,7 @@ def delete_granule(self, coverage, store, granule_id, workspace=None):
690692 params = dict ()
691693
692694 workspace_name = workspace
693- if isinstance (store , basestring ):
695+ if isinstance (store , string_types ):
694696 store_name = store
695697 else :
696698 store_name = store .name
@@ -741,7 +743,7 @@ def list_granules(self, coverage, store, workspace=None, filter=None, limit=None
741743 params ['offset' ] = offset
742744
743745 workspace_name = workspace
744- if isinstance (store , basestring ):
746+ if isinstance (store , string_types ):
745747 store_name = store
746748 else :
747749 store_name = store .name
@@ -903,7 +905,7 @@ def get_resources(self, names=None, stores=None, workspaces=None):
903905 resources = []
904906 for s in _stores :
905907 try :
906- if isinstance (s , basestring ):
908+ if isinstance (s , string_types ):
907909 s = self .get_store (
908910 s ,
909911 workspace = workspaces [0 ] if workspaces else None
@@ -914,7 +916,7 @@ def get_resources(self, names=None, stores=None, workspaces=None):
914916
915917 if names is None :
916918 names = []
917- elif isinstance (names , basestring ):
919+ elif isinstance (names , string_types ):
918920 names = [s .strip () for s in names .split (',' ) if s .strip ()]
919921
920922 if resources and names :
@@ -944,7 +946,7 @@ def get_layer(self, name):
944946 return None
945947
946948 def get_layers (self , resource = None ):
947- if isinstance (resource , basestring ):
949+ if isinstance (resource , string_types ):
948950 ws_name = None
949951 if self .get_short_version () >= "2.13" :
950952 if ":" in resource :
@@ -978,7 +980,7 @@ def get_layergroups(self, names=None, workspaces=None):
978980 groups = self .get_xml (url )
979981 layergroups .extend ([LayerGroup (self , g .find ("name" ).text , None ) for g in groups .findall ("layerGroup" )])
980982 workspaces = []
981- elif isinstance (workspaces , basestring ):
983+ elif isinstance (workspaces , string_types ):
982984 workspaces = [s .strip () for s in workspaces .split (',' ) if s .strip ()]
983985 elif isinstance (workspaces , Workspace ):
984986 workspaces = [workspaces ]
@@ -1001,7 +1003,7 @@ def get_layergroups(self, names=None, workspaces=None):
10011003
10021004 if names is None :
10031005 names = []
1004- elif isinstance (names , basestring ):
1006+ elif isinstance (names , string_types ):
10051007 names = [s .strip () for s in names .split (',' ) if s .strip ()]
10061008
10071009 if layergroups and names :
@@ -1039,7 +1041,7 @@ def get_styles(self, names=None, workspaces=None):
10391041 styles = self .get_xml (url )
10401042 all_styles .extend ([Style (self , s .find ('name' ).text ) for s in styles .findall ("style" )])
10411043 workspaces = []
1042- elif isinstance (workspaces , basestring ):
1044+ elif isinstance (workspaces , string_types ):
10431045 workspaces = [s .strip () for s in workspaces .split (',' ) if s .strip ()]
10441046 elif isinstance (workspaces , Workspace ):
10451047 workspaces = [workspaces ]
@@ -1066,7 +1068,7 @@ def get_styles(self, names=None, workspaces=None):
10661068
10671069 if names is None :
10681070 names = []
1069- elif isinstance (names , basestring ):
1071+ elif isinstance (names , string_types ):
10701072 names = [s .strip () for s in names .split (',' ) if s .strip ()]
10711073
10721074 if all_styles and names :
@@ -1157,7 +1159,7 @@ def get_workspaces(self, names=None):
11571159 '''
11581160 if names is None :
11591161 names = []
1160- elif isinstance (names , basestring ):
1162+ elif isinstance (names , string_types ):
11611163 names = [s .strip () for s in names .split (',' ) if s .strip ()]
11621164
11631165 data = self .get_xml ("{}/workspaces.xml" .format (self .service_url ))
0 commit comments