8787from requests .exceptions import HTTPError
8888
8989
90- class MissingUpdateParameter (F5SDKError ):
91- """Raises this when update requires specific
90+ class MissingRequiredCommandParameter (F5SDKError ):
91+ """Various values MUST be provided to execute a command."""
92+ pass
9293
93- parameters together
9494
95- """
95+ class ExclusiveAttributesPresent (F5SDKError ):
96+ """Raises this when exclusive attributes are present."""
97+ pass
98+
99+
100+ class MissingUpdateParameter (F5SDKError ):
101+ """Raises this when update requires specific parameters together."""
96102 pass
97103
98104
@@ -173,7 +179,13 @@ def __init__(self, container):
173179 self ._set_meta_data_uri ()
174180 # Supported versions for each class will be defined here.
175181 # List can be modified downstream in each sub-class
176- self ._meta_data ['supported_versions' ] = set (['11.6.0' , '12.0.0' ])
182+ self ._meta_data ['minimum_version' ] = '11.6.0'
183+ # Commands you can run on a resource or collection, we define it here
184+ self ._meta_data ['allowed_commands' ] = []
185+ # Define required command parameters
186+ self ._meta_data ['required_command_parameters' ] = set ()
187+ # You can't have more than one of the attributes in any of these sets.
188+ self ._meta_data ['exclusive_attributes' ] = []
177189
178190 def _set_meta_data_uri (self ):
179191 base_uri = self .__class__ .__name__ .lower ()
@@ -190,19 +202,41 @@ def _set_meta_data_uri(self):
190202 self ._meta_data ['uri' ] = final_uri
191203
192204 def _check_load_parameters (self , ** kwargs ):
193- ''' Params given to load should at least satisfy required params.
205+ """ Params given to load should at least satisfy required params.
194206
195207 :params: kwargs
196208 :raises: MissingRequiredReadParameter
197- '''
198- key_set = set (kwargs .keys ())
199- required_minus_received = \
200- self ._meta_data ['required_load_parameters' ] - key_set
201- if required_minus_received != set ():
202- error_message = 'Missing required params: %r' \
203- % required_minus_received
209+ """
210+ rset = self ._meta_data ['required_load_parameters' ]
211+ check = self ._missing_required_parameters (rset , ** kwargs )
212+ if check :
213+ error_message = 'Missing required params: %s' % check
204214 raise MissingRequiredReadParameter (error_message )
205215
216+ def _check_create_parameters (self , ** kwargs ):
217+ """Params given to create should satisfy required params.
218+
219+ :params: kwargs
220+ :raises: MissingRequiredCreateParameter
221+ """
222+ rset = self ._meta_data ['required_creation_parameters' ]
223+ check = self ._missing_required_parameters (rset , ** kwargs )
224+ if check :
225+ error_message = 'Missing required params: %s' % check
226+ raise MissingRequiredCreationParameter (error_message )
227+
228+ def _check_command_parameters (self , ** kwargs ):
229+ """Params given to exec_cmd should satisfy required params.
230+
231+ :params: kwargs
232+ :raises: MissingRequiredCommandParameter
233+ """
234+ rset = self ._meta_data ['required_command_parameters' ]
235+ check = self ._missing_required_parameters (rset , ** kwargs )
236+ if check :
237+ error_message = 'Missing required params: %s' % check
238+ raise MissingRequiredCommandParameter (error_message )
239+
206240 def _local_update (self , rdict ):
207241 """Call this with a response dictionary to update instance attrs.
208242
@@ -295,6 +329,37 @@ def _handle_requests_params(self, kwargs):
295329 requests_params .update ({'params' : params })
296330 return requests_params
297331
332+ def _check_exclusive_parameters (self , ** kwargs ):
333+ """Check for mutually exclusive attributes in kwargs.
334+
335+ :raises ExclusiveAttributesPresent
336+ """
337+ if len (self ._meta_data ['exclusive_attributes' ]) > 0 :
338+ attr_set = set (kwargs .keys ())
339+ ex_set = set (self ._meta_data ['exclusive_attributes' ][0 ])
340+ common_set = attr_set .intersection (ex_set )
341+ if len (common_set ) > 1 :
342+ cset = ', ' .join (common_set )
343+ error = 'Mutually exclusive arguments submitted. ' \
344+ 'The following arguments cannot be set ' \
345+ 'together: "%s".' % cset
346+ raise ExclusiveAttributesPresent (error )
347+
348+ @staticmethod
349+ def _missing_required_parameters (rqset , ** kwargs ):
350+ """Helper function to do operation on sets.
351+
352+ Checks for any missing required parameters.
353+ Returns non-empty or empty list. With empty
354+ list being False.
355+
356+ ::returns list
357+ """
358+ key_set = set (kwargs .keys ())
359+ required_minus_received = rqset - key_set
360+ if required_minus_received != set ():
361+ return list (required_minus_received )
362+
298363 @property
299364 def raw (self ):
300365 """Display the attributes that the current object has and their values.
@@ -362,8 +427,6 @@ def __init__(self, container):
362427 :param container: instance is an attribute of a ResourceBase container
363428 """
364429 super (ResourceBase , self ).__init__ (container )
365- # Commands you can run on a resource or collection, we define it here
366- self ._meta_data ['allowed_commands' ] = []
367430
368431 def _update (self , ** kwargs ):
369432 """wrapped with update, override that in a subclass to customize"""
@@ -603,8 +666,6 @@ def __init__(self, container):
603666 self ._meta_data ['required_creation_parameters' ] = set (('name' ,))
604667 # Refresh fails without these.
605668 self ._meta_data ['required_load_parameters' ] = set (('name' ,))
606- # You can't have more than one of the attrs in any of these sets.
607- self ._meta_data ['exclusive_attributes' ] = []
608669 # You can't set these attributes, only 'read' them.
609670 self ._meta_data ['read_only_attributes' ] = []
610671
@@ -665,14 +726,9 @@ def _create(self, **kwargs):
665726 "resource, the _meta_data['uri'] is %s and it should" \
666727 " not be changed." % (self ._meta_data ['uri' ])
667728 raise URICreationCollision (error )
729+ self ._check_exclusive_parameters (** kwargs )
668730 requests_params = self ._handle_requests_params (kwargs )
669- key_set = set (kwargs .keys ())
670- required_minus_received = \
671- self ._meta_data ['required_creation_parameters' ] - key_set
672- if required_minus_received != set ():
673- error_message = 'Missing required params: %r' \
674- % required_minus_received
675- raise MissingRequiredCreationParameter (error_message )
731+ self ._check_create_parameters (** kwargs )
676732
677733 # Make convenience variable with short names for this method.
678734 _create_uri = self ._meta_data ['container' ]._meta_data ['uri' ]
0 commit comments