1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 try:
18 import json
19 except ImportError:
20 import simplejson as json
21
22 import copy
23 import datetime
24 import time
25
26 __docformat__ = "epytext"
27
28 -class Attr(object):
29 """
30 Encapsulates information about an attribute in the JSON encoding of the
31 object. It identifies properties of the attribute such as whether it's
32 read-only, its type, etc.
33 """
34 DATE_FMT = "%Y-%m-%dT%H:%M:%S.%fZ"
35
36 - def __init__(self, atype=None, rw=True, is_api_list=False):
37 self._atype = atype
38 self._is_api_list = is_api_list
39 self.rw = rw
40
41 - def to_json(self, value, preserve_ro):
42 """
43 Returns the JSON encoding of the given attribute value.
44
45 If the value has a 'to_json_dict' object, that method is called. Otherwise,
46 the following values are returned for each input type:
47 - datetime.datetime: string with the API representation of a date.
48 - dictionary: if 'atype' is ApiConfig, a list of ApiConfig objects.
49 - python list: python list (or ApiList) with JSON encoding of items
50 - the raw value otherwise
51 """
52 if hasattr(value, 'to_json_dict'):
53 return value.to_json_dict(preserve_ro)
54 elif isinstance(value, dict) and self._atype == ApiConfig:
55 return config_to_api_list(value)
56 elif isinstance(value, datetime.datetime):
57 return value.strftime(self.DATE_FMT)
58 elif isinstance(value, list) or isinstance(value, tuple):
59 if self._is_api_list:
60 return ApiList(value).to_json_dict()
61 else:
62 return [ self.to_json(x, preserve_ro) for x in value ]
63 else:
64 return value
65
67 """
68 Parses the given JSON value into an appropriate python object.
69
70 This means:
71 - a datetime.datetime if 'atype' is datetime.datetime
72 - a converted config dictionary or config list if 'atype' is ApiConfig
73 - if the attr is an API list, an ApiList with instances of 'atype'
74 - an instance of 'atype' if it has a 'from_json_dict' method
75 - a python list with decoded versions of the member objects if the input
76 is a python list.
77 - the raw value otherwise
78 """
79 if data is None:
80 return None
81
82 if self._atype == datetime.datetime:
83 return datetime.datetime.strptime(data, self.DATE_FMT)
84 elif self._atype == ApiConfig:
85
86
87
88 if not data['items']:
89 return { }
90 first = data['items'][0]
91 return json_to_config(data, len(first) == 2)
92 elif self._is_api_list:
93 return ApiList.from_json_dict(data, resource_root, self._atype)
94 elif isinstance(data, list):
95 return [ self.from_json(resource_root, x) for x in data ]
96 elif hasattr(self._atype, 'from_json_dict'):
97 return self._atype.from_json_dict(data, resource_root)
98 else:
99 return data
100
102 """
103 Subclass that just defines the attribute as read-only.
104 """
105 - def __init__(self, atype=None, is_api_list=False):
106 Attr.__init__(self, atype=atype, rw=False, is_api_list=is_api_list)
107
110 """
111 Checks if the resource_root's API version it at least the given minimum
112 version.
113 """
114 if resource_root.version < min_version:
115 raise Exception("API version %s is required but %s is in use."
116 % (min_version, resource_root.version))
117
118
119 -def call(method, path, ret_type,
120 ret_is_list=False, data=None, params=None, api_version=1):
121 """
122 Generic function for calling a resource method and automatically dealing with
123 serialization of parameters and deserialization of return values.
124
125 @param method: method to call (must be bound to a resource;
126 e.g., "resource_root.get").
127 @param path: the full path of the API method to call.
128 @param ret_type: return type of the call.
129 @param ret_is_list: whether the return type is an ApiList.
130 @param data: Optional data to send as payload to the call.
131 @param params: Optional query parameters for the call.
132 @param api_version: minimum API version for the call.
133 """
134 check_api_version(method.im_self, api_version)
135 if data is not None:
136 data = json.dumps(Attr(is_api_list=True).to_json(data, False))
137 ret = method(path, data=data, params=params)
138 else:
139 ret = method(path, params=params)
140 if ret_type is None:
141 return
142 elif ret_is_list:
143 return ApiList.from_json_dict(ret, method.im_self, ret_type)
144 elif isinstance(ret, list):
145 return [ ret_type.from_json_dict(x, method.im_self) for x in ret ]
146 else:
147 return ret_type.from_json_dict(ret, method.im_self)
148
150 """
151 The BaseApiObject helps with (de)serialization from/to JSON.
152
153 The derived class has two ways of defining custom attributes:
154 - Overwriting the '_ATTRIBUTES' field with the attribute dictionary
155 - Override the _get_attributes() method, in case static initialization of
156 the above field is not possible.
157
158 It's recommended that the _get_attributes() implementation do caching to
159 avoid computing the dictionary on every invocation.
160
161 The derived class's constructor must call the base class's init() static
162 method. All constructor arguments (aside from self and resource_root) must
163 be keywords arguments with default values (typically None), or
164 from_json_dict() will not work.
165 """
166
167 _ATTRIBUTES = { }
168 _WHITELIST = ( '_resource_root', '_attributes' )
169
170 @classmethod
172 """
173 Returns a map of property names to attr instances (or None for default
174 attribute behavior) describing the properties of the object.
175
176 By default, this method will return the class's _ATTRIBUTES field.
177 Classes can override this method to do custom initialization of the
178 attributes when needed.
179 """
180 return cls._ATTRIBUTES
181
182 @staticmethod
183 - def init(obj, resource_root, attrs=None):
184 """
185 Wraper around the real constructor to avoid issues with the 'self'
186 argument. Call like this, from a subclass's constructor:
187
188 - BaseApiObject.init(self, locals())
189 """
190
191
192 str_attrs = { }
193 if attrs:
194 for k, v in attrs.iteritems():
195 if k not in ('self', 'resource_root'):
196 str_attrs[k] = v
197 BaseApiObject.__init__(obj, resource_root, **str_attrs)
198
199 - def __init__(self, resource_root, **attrs):
200 """
201 Initializes internal state and sets all known writable properties of the
202 object to None. Then initializes the properties given in the provided
203 attributes dictionary.
204
205 @param resource_root: API resource object.
206 @param attrs: optional dictionary of attributes to set. This should only
207 contain r/w attributes.
208 """
209 self._resource_root = resource_root
210
211 for name, attr in self._get_attributes().iteritems():
212 object.__setattr__(self, name, None)
213 if attrs:
214 self._set_attrs(attrs, from_json=False)
215
216 - def _set_attrs(self, attrs, allow_ro=False, from_json=True):
217 """
218 Sets all the attributes in the dictionary. Optionally, allows setting
219 read-only attributes (e.g. when deserializing from JSON) and skipping
220 JSON deserialization of values.
221 """
222 for k, v in attrs.iteritems():
223 attr = self._check_attr(k, allow_ro)
224 if attr and from_json:
225 v = attr.from_json(self._get_resource_root(), v)
226 object.__setattr__(self, k, v)
227
232
234 if name not in self._get_attributes():
235 raise AttributeError('Invalid property %s for class %s.' %
236 (name, self.__class__.__name__))
237 attr = self._get_attributes()[name]
238 if not allow_ro and attr and not attr.rw:
239 raise AttributeError('Attribute %s of class %s is read only.' %
240 (name, self.__class__.__name__))
241 return attr
242
244 return self._resource_root
245
247 """Copy state from api_obj to this object."""
248 if not isinstance(self, api_obj.__class__):
249 raise ValueError(
250 "Class %s does not derive from %s; cannot update attributes." %
251 (self.__class__, api_obj.__class__))
252
253 for name in self._get_attributes().keys():
254 try:
255 val = getattr(api_obj, name)
256 setattr(self, name, val)
257 except AttributeError, ignored:
258 pass
259
261 dic = { }
262 for name, attr in self._get_attributes().iteritems():
263 if not preserve_ro and attr and not attr.rw:
264 continue
265 try:
266 value = getattr(self, name)
267 if value is not None:
268 if attr:
269 dic[name] = attr.to_json(value, preserve_ro)
270 else:
271 dic[name] = value
272 except AttributeError:
273 pass
274 return dic
275
277 """
278 Default implementation of __str__. Uses the type name and the first
279 attribute retrieved from the attribute map to create the string.
280 """
281 name = self._get_attributes().keys()[0]
282 value = getattr(self, name, None)
283 return "<%s>: %s = %s" % (self.__class__.__name__, name, value)
284
285 @classmethod
287 obj = cls(resource_root)
288 obj._set_attrs(dic, allow_ro=True)
289 return obj
290
292 """
293 A specialization of BaseApiObject that provides some utility methods for
294 resources. This class allows easier serialization / deserialization of
295 parameters and return values.
296 """
297
299 """
300 Returns the minimum API version for this resource. Defaults to 1.
301 """
302 return 1
303
305 """
306 Returns the path to the resource.
307
308 e.g., for a service 'foo' in cluster 'bar', this should return
309 '/clusters/bar/services/foo'.
310 """
311 raise NotImplementedError
312
314 """
315 Raise an exception if the version of the api is less than the given version.
316
317 @param version: The minimum required version.
318 """
319 actual_version = self._get_resource_root().version
320 version = max(version, self._api_version())
321 if actual_version < version:
322 raise Exception("API version %s is required but %s is in use."
323 % (version, actual_version))
324
325 - def _cmd(self, command, data=None, params=None, api_version=1):
326 """
327 Invokes a command on the resource. Commands are expected to be under the
328 "commands/" sub-resource.
329 """
330 return self._post("commands/" + command, ApiCommand,
331 data=data, params=params, api_version=api_version)
332
342
348
349 - def _delete(self, rel_path, ret_type, ret_is_list=False, params=None,
350 api_version=1):
351 return self._call('delete', rel_path, ret_type, ret_is_list, None, params,
352 api_version)
353
354 - def _get(self, rel_path, ret_type, ret_is_list=False, params=None,
355 api_version=1):
356 return self._call('get', rel_path, ret_type, ret_is_list, None, params,
357 api_version)
358
359 - def _post(self, rel_path, ret_type, ret_is_list=False, data=None, params=None,
360 api_version=1):
361 return self._call('post', rel_path, ret_type, ret_is_list, data, params,
362 api_version)
363
364 - def _put(self, rel_path, ret_type, ret_is_list=False, data=None, params=None,
365 api_version=1):
366 return self._call('put', rel_path, ret_type, ret_is_list, data, params,
367 api_version)
368
369 - def _call(self, method, rel_path, ret_type, ret_is_list=False, data=None,
370 params=None, api_version=1):
371 path = self._path()
372 if rel_path:
373 path += '/' + rel_path
374 return call(getattr(self._get_resource_root(), method),
375 path,
376 ret_type,
377 ret_is_list,
378 data,
379 params,
380 api_version)
381
383 """A list of some api object"""
384 LIST_KEY = "items"
385
386 - def __init__(self, objects, resource_root=None, **attrs):
390
392 return "<ApiList>(%d): [%s]" % (
393 len(self.objects),
394 ", ".join([str(item) for item in self.objects]))
395
401
404
407
410
412 return self.objects.__getslice__(i, j)
413
414 @classmethod
433
435 _ATTRIBUTES = {
436 'hostId' : None,
437 }
438
439 - def __init__(self, resource_root, hostId=None):
441
443 return "<ApiHostRef>: %s" % (self.hostId)
444
446 _ATTRIBUTES = {
447 'clusterName' : None,
448 'serviceName' : None,
449 'peerName' : None,
450 }
451
452 - def __init__(self, resource_root, serviceName=None, clusterName=None,
453 peerName=None):
455
457 _ATTRIBUTES = {
458 'clusterName' : None,
459 }
460
461 - def __init__(self, resource_root, clusterName = None):
463
465 _ATTRIBUTES = {
466 'clusterName' : None,
467 'serviceName' : None,
468 'roleName' : None,
469 }
470
471 - def __init__(self, resource_root, serviceName=None, roleName=None,
472 clusterName=None):
474
476 _ATTRIBUTES = {
477 'roleConfigGroupName' : None,
478 }
479
480 - def __init__(self, resource_root, roleConfigGroupName=None):
482
484 SYNCHRONOUS_COMMAND_ID = -1
485
486 @classmethod
488 if not cls.__dict__.has_key('_ATTRIBUTES'):
489 cls._ATTRIBUTES = {
490 'id' : ROAttr(),
491 'name' : ROAttr(),
492 'startTime' : ROAttr(datetime.datetime),
493 'endTime' : ROAttr(datetime.datetime),
494 'active' : ROAttr(),
495 'success' : ROAttr(),
496 'resultMessage' : ROAttr(),
497 'clusterRef' : ROAttr(ApiClusterRef),
498 'serviceRef' : ROAttr(ApiServiceRef),
499 'roleRef' : ROAttr(ApiRoleRef),
500 'hostRef' : ROAttr(ApiHostRef),
501 'children' : ROAttr(ApiCommand, is_api_list=True),
502 'parent' : ROAttr(ApiCommand),
503 'resultDataUrl' : ROAttr(),
504 'canRetry' : ROAttr(),
505 }
506 return cls._ATTRIBUTES
507
509 return "<ApiCommand>: '%s' (id: %s; active: %s; success: %s)" % (
510 self.name, self.id, self.active, self.success)
511
513 return '/commands/%d' % self.id
514
526
527 - def wait(self, timeout=None):
528 """
529 Wait for command to finish.
530
531 @param timeout: (Optional) Max amount of time (in seconds) to wait. Wait
532 forever by default.
533 @return: The final ApiCommand object, containing the last known state.
534 The command may still be running in case of timeout.
535 """
536 if self.id == ApiCommand.SYNCHRONOUS_COMMAND_ID:
537 return self
538
539 SLEEP_SEC = 5
540
541 if timeout is None:
542 deadline = None
543 else:
544 deadline = time.time() + timeout
545
546 while True:
547 cmd = self.fetch()
548 if not cmd.active:
549 return cmd
550
551 if deadline is not None:
552 now = time.time()
553 if deadline < now:
554 return cmd
555 else:
556 time.sleep(min(SLEEP_SEC, deadline - now))
557 else:
558 time.sleep(SLEEP_SEC)
559
560
573
583
589
601
607 """Metric reading data."""
608
609 _ATTRIBUTES = {
610 'timestamp' : ROAttr(datetime.datetime),
611 'value' : ROAttr(),
612 }
613
616
632
638 _ATTRIBUTES = {
639 'name' : ROAttr(),
640 'type' : ROAttr(),
641 'parent' : ROAttr(),
642 'startTime' : ROAttr(),
643 'finishTime' : ROAttr(),
644 'id' : ROAttr(),
645 'status' : ROAttr(),
646 'user' : ROAttr(),
647 'group' : ROAttr(),
648 'inputDir' : ROAttr(),
649 'outputDir' : ROAttr(),
650 'mapper' : ROAttr(),
651 'combiner' : ROAttr(),
652 'reducer' : ROAttr(),
653 'queueName' : ROAttr(),
654 'schedulerPriority' : ROAttr(),
655 }
656
659
661 return "<ApiActivity>: %s (%s)" % (self.name, self.status)
662
663
664
665
666
667 -class ApiCmPeer(BaseApiObject):
668 _ATTRIBUTES = {
669 'name' : None,
670 'url' : None,
671 'username' : None,
672 'password' : None,
673 'type' : None,
674 'clouderaManagerCreatedUser' : None,
675 }
676
678 return "<ApiPeer>: %s (%s)" % (self.name, self.url)
679
685
693
695 _ATTRIBUTES = {
696 'sourceService' : Attr(ApiServiceRef),
697 'sourcePath' : None,
698 'destinationPath' : None,
699 'mapreduceServiceName' : None,
700 'userName' : None,
701 'sourceUser' : None,
702 'numMaps' : None,
703 'dryRun' : None,
704 'bandwidthPerMap' : None,
705 'logPath' : None,
706 'schedulerPoolName' : None,
707 'abortOnError' : None,
708 'preservePermissions' : None,
709 'preserveBlockSize' : None,
710 'preserveReplicationCount' : None,
711 'removeMissingFiles' : None,
712 'skipChecksumChecks' : None,
713 'skipListingChecksumChecks' : None,
714 'skipTrash' : None,
715 'replicationStrategy' : None,
716 'preserveXAttrs' : None,
717 'exclusionFilters' : None,
718 'raiseSnapshotDiffFailures' : None,
719 }
720
732
734 _ATTRIBUTES = {
735 'progress' : ROAttr(),
736 'counters' : ROAttr(),
737 'numBytesDryRun' : ROAttr(),
738 'numFilesDryRun' : ROAttr(),
739 'numFilesExpected' : ROAttr(),
740 'numBytesExpected' : ROAttr(),
741 'numFilesCopied' : ROAttr(),
742 'numBytesCopied' : ROAttr(),
743 'numFilesSkipped' : ROAttr(),
744 'numBytesSkipped' : ROAttr(),
745 'numFilesDeleted' : ROAttr(),
746 'numFilesCopyFailed' : ROAttr(),
747 'numBytesCopyFailed' : ROAttr(),
748 'setupError' : ROAttr(),
749 'jobId' : ROAttr(),
750 'jobDetailsUri' : ROAttr(),
751 'dryRun' : ROAttr(),
752 'snapshottedDirs' : ROAttr(),
753 'failedFiles' : ROAttr(),
754 'runAsUser' : ROAttr(),
755 'runOnSourceAsUser' : ROAttr(),
756 'remainingTime' : ROAttr(),
757 'throughput' : ROAttr(),
758 'estimatedCompletionTime' : ROAttr(),
759 }
760
762 _ATTRIBUTES = {
763 'database' : None,
764 'tableName' : None,
765 }
766
768 return "<ApiHiveTable>: %s, %s" % (self.database, self.tableName)
769
771 _ATTRIBUTES = {
772 'database' : ROAttr(),
773 'signature' : ROAttr(),
774 }
775
777 return "<ApiImpalaUDF>: %s, %s" % (self.database, self.signature)
778
780 _ATTRIBUTES = {
781 'database' : ROAttr(),
782 'signature' : ROAttr(),
783 }
784
786 return "<ApiHiveUDF>: %s, %s" % (self.database, self.signature)
787
789 _ATTRIBUTES = {
790 'sourceService' : Attr(ApiServiceRef),
791 'tableFilters' : Attr(ApiHiveTable),
792 'exportDir' : None,
793 'force' : None,
794 'replicateData' : None,
795 'hdfsArguments' : Attr(ApiHdfsReplicationArguments),
796 'dryRun' : None,
797 'replicateImpalaMetadata' : None,
798 'runInvalidateMetadata' : None,
799 'numThreads' : None,
800 }
801
803 _ATTRIBUTES = {
804 'tableCount' : ROAttr(),
805 'tables' : ROAttr(ApiHiveTable),
806 'impalaUDFCount' : ROAttr(),
807 'impalaUDFs' : ROAttr(ApiImpalaUDF),
808 'hiveUDFCount' : ROAttr(),
809 'hiveUDFs' : ROAttr(ApiHiveUDF),
810 'errorCount' : ROAttr(),
811 'errors' : ROAttr(),
812 'dataReplicationResult' : ROAttr(ApiHdfsReplicationResult),
813 'dryRun' : ROAttr(),
814 'runAsUser' : ROAttr(),
815 'runOnSourceAsUser' : ROAttr(),
816 'phase' : ROAttr(),
817 'statsAvailable' : ROAttr(),
818 'dbProcessed' : ROAttr(),
819 'tableProcessed' : ROAttr(),
820 'partitionProcessed' : ROAttr(),
821 'functionProcessed' : ROAttr(),
822 'indexProcessed' : ROAttr(),
823 'statsProcessed' : ROAttr(),
824 'dbExpected' : ROAttr(),
825 'tableExpected' : ROAttr(),
826 'partitionExpected' : ROAttr(),
827 'functionExpected' : ROAttr(),
828 'indexExpected' : ROAttr(),
829 'statsExpected' : ROAttr(),
830 }
831
843
845 _ATTRIBUTES = {
846 'startTime' : Attr(datetime.datetime),
847 'endTime' : Attr(datetime.datetime),
848 'interval' : None,
849 'intervalUnit' : None,
850 'paused' : None,
851 'hdfsArguments' : Attr(ApiHdfsReplicationArguments),
852 'hiveArguments' : Attr(ApiHiveReplicationArguments),
853 'hdfsCloudArguments' : Attr(ApiHdfsCloudReplicationArguments),
854 'alertOnStart' : None,
855 'alertOnSuccess' : None,
856 'alertOnFail' : None,
857 'alertOnAbort' : None,
858 'id' : ROAttr(),
859 'displayName' : ROAttr(),
860 'description' : ROAttr(),
861 'nextRun' : ROAttr(datetime.datetime),
862 'history' : ROAttr(ApiReplicationCommand),
863 'active' : None,
864 'displayName' : None,
865 'description' : None
866 }
867
869 _ATTRIBUTES = {
870 'tableRegExps' : None,
871 'storage' : None,
872 }
873
878
880 _ATTRIBUTES = {
881 'snapshotName' : None,
882 'tableName' : None,
883 'creationTime' : ROAttr(datetime.datetime),
884 'storage' : None,
885 }
886
894
896 _ATTRIBUTES = {
897 'path' : None,
898 'snapshotName' : None,
899 'snapshotPath' : None,
900 'creationTime' : ROAttr(datetime.datetime),
901 }
902
910
912 _ATTRIBUTES = {
913 'processedTableCount' : ROAttr(),
914 'processedTables' : ROAttr(),
915 'unprocessedTableCount' : ROAttr(),
916 'unprocessedTables' : ROAttr(),
917 'createdSnapshotCount' : ROAttr(),
918 'createdSnapshots' : ROAttr(ApiHBaseSnapshot),
919 'deletedSnapshotCount' : ROAttr(),
920 'deletedSnapshots' : ROAttr(ApiHBaseSnapshot),
921 'creationErrorCount' : ROAttr(),
922 'creationErrors' : ROAttr(ApiHBaseSnapshotError),
923 'deletionErrorCount' : ROAttr(),
924 'deletionErrors' : ROAttr(ApiHBaseSnapshotError),
925 }
926
928 _ATTRIBUTES = {
929 'processedPathCount' : ROAttr(),
930 'processedPaths' : ROAttr(),
931 'unprocessedPathCount' : ROAttr(),
932 'unprocessedPaths' : ROAttr(),
933 'createdSnapshotCount' : ROAttr(),
934 'createdSnapshots' : ROAttr(ApiHdfsSnapshot),
935 'deletedSnapshotCount' : ROAttr(),
936 'deletedSnapshots' : ROAttr(ApiHdfsSnapshot),
937 'creationErrorCount' : ROAttr(),
938 'creationErrors' : ROAttr(ApiHdfsSnapshotError),
939 'deletionErrorCount' : ROAttr(),
940 'deletionErrors' : ROAttr(ApiHdfsSnapshotError),
941 }
942
954
956 """
957 @type name: str
958 @ivar name: Name of the snapshot policy.
959 @type description: str
960 @ivar description: Description of the snapshot policy.
961 @type hourly_snapshots: int
962 @ivar hourly_snapshots: Number of hourly snapshots to be retained (default: 0).
963 @type daily_snapshots: int
964 @ivar daily_snapshots: Number of daily snapshots to be retained (default: 0).
965 @type weekly_snapshots: int
966 @ivar weekly_snapshots: Number of weekly snapshots to be retained (default: 0).
967 @type monthly_snapshots: int
968 @ivar monthly_snapshots: Number of monthly snapshots to be retained (default: 0).
969 @type yearly_snapshots: int
970 @ivar yearly_snapshots: Number of yearly snapshots to be retained (default: 0).
971 @type hours_for_hourly_snapshots: list of int
972 @ivar hours_for_hourly_snapshots: Hours of the day that hourly snapshots should be created.
973 Valid values are 0 to 23. If this list is empty, then hourly snapshots are
974 created for every hour.
975 @type minute_of_hour: int
976 @ivar minute_of_hour: Minute in the hour that hourly, daily, weekly, monthly and yearly
977 snapshots should be created. Valid values are 0 to 59 (default: 0).
978 @type hour_of_day: int
979 @ivar hour_of_day: Hour in the day that daily, weekly, monthly and yearly snapshots should be created.
980 Valid values are 0 to 23 (default: 0).
981 @type day_of_week: int
982 @ivar day_of_week: Day of the week that weekly snapshots should be created.
983 Valid values are 1 to 7, 1 representing Sunday (default: 1).
984 @type day_of_month: int
985 @ivar day_of_month: Day of the month that monthly and yearly snapshots should be created.
986 Values from 1 to 31 are allowed. Additionally 0 to -30 can be used to
987 specify offsets from the last day of the month (default: 1).
988 @type month_of_year: int
989 @ivar month_of_year: Month of the year that yearly snapshots should be created.
990 Valid values are 1 to 12, 1 representing January (default: 1).
991 @ivar alert_on_start: whether to generate alerts on start of snapshot creation/deletion activity.
992 @ivar alert_on_success: whether to generate alerts on successful completion of snapshot creation/deletion activity.
993 @ivar alert_on_fail: whether to generate alerts on failure of snapshot creation/deletion activity.
994 @ivar alert_on_abort: whether to generate alerts on abort of snapshot creation/deletion activity.
995 @ivar paused: whether to run the policy on schedule
996 @type hbaseArguments: ApiHBaseSnapshotPolicyArguments
997 @ivar hbaseArguments: HBase specific arguments for the replication job.
998 @type hdfsArguments: ApiHdfsSnapshotPolicyArguments
999 @ivar hdfsArguments: HDFS specific arguments for the replication job.
1000 """
1001 _ATTRIBUTES = {
1002 'name' : None,
1003 'description' : None,
1004 'hourlySnapshots' : None,
1005 'dailySnapshots' : None,
1006 'weeklySnapshots' : None,
1007 'monthlySnapshots' : None,
1008 'yearlySnapshots' : None,
1009 'minuteOfHour' : None,
1010 'hourOfDay' : None,
1011 'dayOfWeek' : None,
1012 'dayOfMonth' : None,
1013 'monthOfYear' : None,
1014 'hoursForHourlySnapshots' : None,
1015 'alertOnStart' : None,
1016 'alertOnSuccess' : None,
1017 'alertOnFail' : None,
1018 'alertOnAbort' : None,
1019 'paused' : None,
1020 'hbaseArguments' : Attr(ApiHBaseSnapshotPolicyArguments),
1021 'hdfsArguments' : Attr(ApiHdfsSnapshotPolicyArguments),
1022 'lastCommand' : ROAttr(ApiSnapshotCommand),
1023 'lastSuccessfulCommand' : ROAttr(ApiSnapshotCommand),
1024 }
1025
1031 """One element in a batch request."""
1032 _ATTRIBUTES = {
1033 'method' : None,
1034 'url' : None,
1035 'body' : None,
1036 'contentType' : None,
1037 'acceptType' : None,
1038 }
1039
1041 """One element in a batch response."""
1042 _ATTRIBUTES = {
1043 'statusCode' : ROAttr(),
1044 'response' : ROAttr(),
1045 }
1046
1053
1054
1055
1056
1057
1058 -class ApiConfig(BaseApiObject):
1059 _ATTRIBUTES = {
1060 'name' : None,
1061 'value' : None,
1062 'required' : ROAttr(),
1063 'default' : ROAttr(),
1064 'displayName' : ROAttr(),
1065 'description' : ROAttr(),
1066 'relatedName' : ROAttr(),
1067 'sensitive' : ROAttr(),
1068 'validationState' : ROAttr(),
1069 'validationMessage' : ROAttr(),
1070 'validationWarningsSuppressed' : ROAttr()
1071 }
1072
1073 - def __init__(self, resource_root, name=None, value=None):
1075
1077 return "<ApiConfig>: %s = %s" % (self.name, self.value)
1078
1080 _ATTRIBUTES = {
1081 'queryId' : ROAttr(),
1082 'queryState' : ROAttr(),
1083 'queryType' : ROAttr(),
1084 'statement' : ROAttr(),
1085 'database' : ROAttr(),
1086 'rowsProduced' : ROAttr(),
1087 'coordinator' : ROAttr(ApiHostRef),
1088 'user' : ROAttr(),
1089 'startTime' : ROAttr(datetime.datetime),
1090 'endTime' : ROAttr(datetime.datetime),
1091 'detailsAvailable' : ROAttr(),
1092 'attributes' : ROAttr(),
1093 'durationMillis' : ROAttr()
1094 }
1095
1097 return "<ApiImpalaQuery>: %s" % (self.queryId)
1098
1104
1105 _ATTRIBUTES = {
1106 'path' : None
1107 }
1108
1110 return "<ApiWatchedDir>: %s" % (self.path)
1111
1118
1125
1127 _ATTRIBUTES = {
1128 'details' : ROAttr()
1129 }
1130
1132 return "<AipImpalaQueryDetailsResponse> %s" % self.details
1133
1135 _ATTRIBUTES = {
1136 'warning' : ROAttr()
1137 }
1138
1140 return "<ApiImpalaCancelResponse> %s" % self.warning
1141
1143
1144 _ATTRIBUTES = {
1145 'name' : ROAttr(),
1146 'type' : ROAttr(),
1147 'displayName' : ROAttr(),
1148 'supportsHistograms' : ROAttr(),
1149 'description' : ROAttr()
1150 }
1151
1153 return "<ApiImpalaQueryAttribute> %s" % name
1154
1162
1164 _ATTRIBUTES = {
1165 'applicationId' : ROAttr(),
1166 'name' : ROAttr(),
1167 'user' : ROAttr(),
1168 'startTime' : ROAttr(datetime.datetime),
1169 'endTime' : ROAttr(datetime.datetime),
1170 'pool' : ROAttr(),
1171 'state' : ROAttr(),
1172 'progress' : ROAttr(),
1173 'mr2AppInformation' : ROAttr(ApiMr2AppInformation),
1174 'attributes' : ROAttr(),
1175 'allocatedMB' : ROAttr(),
1176 'allocatedVCores' : ROAttr(),
1177 'runningContainers' : ROAttr(),
1178 'applicationTags' : ROAttr(),
1179 'allocatedMemorySeconds' : ROAttr(),
1180 'allocatedVcoreSeconds' : ROAttr(),
1181 'containerUsedMemorySeconds' : ROAttr(),
1182 'containerUsedCpuSeconds' : ROAttr(),
1183 'containerUsedVcoreSeconds' : ROAttr(),
1184 'containerAllocatedMemorySeconds' : ROAttr(),
1185 'containerAllocatedVcoreSeconds' : ROAttr(),
1186 'containerUsedMemoryMax' : ROAttr(),
1187 }
1188
1190 return "<ApiYarnApplication>: %s" % (self.applicationId)
1191
1198
1200 _ATTRIBUTES = {
1201 'warning' : ROAttr()
1202 }
1203
1205 return "<ApiYarnKillResponse> %s" % self.warning
1206
1208
1209 _ATTRIBUTES = {
1210 'name' : ROAttr(),
1211 'type' : ROAttr(),
1212 'displayName' : ROAttr(),
1213 'supportsHistograms' : ROAttr(),
1214 'description' : ROAttr()
1215 }
1216
1218 return "<ApiYarnApplicationAttribute> %s" % name
1219
1221 _ATTRIBUTES = {
1222 'query' : None,
1223 'from' : None,
1224 'to' : None,
1225 'contentType' : None,
1226 'desiredRollup' : None,
1227 'mustUseDesiredRollup' : None
1228 }
1229
1231 return "<ApiTimeSeriesRequest>: %s" % (self.query)
1232
1234 _ATTRIBUTES = {
1235 'version' : None,
1236 'product' : None,
1237 }
1238
1240 _ATTRIBUTES = {
1241 'name' : None,
1242 'value' : None,
1243 'ref' : None,
1244 'variable' : None,
1245 'autoConfig' : None,
1246 }
1247
1256
1258 _ATTRIBUTES = {
1259 'refName' : None,
1260 'roleType' : None,
1261 }
1262
1264 _ATTRIBUTES = {
1265 'refName' : None,
1266 'cardinality' : None,
1267 'roleConfigGroupsRefNames' : None,
1268 }
1269
1271 _ATTRIBUTES = {
1272 'hostName' : None,
1273 'hostNameRange' : None,
1274 'rackId' : None,
1275 'hostTemplateRefName' : None,
1276 'roleRefNames' : None,
1277 }
1278
1280 _ATTRIBUTES = {
1281 'name' : None,
1282 'value' : None,
1283 }
1284
1286 _ATTRIBUTES = {
1287 'rcgRefName' : None,
1288 'name' : None,
1289 }
1290
1298
1308
1320
1322 """
1323 Converts a python dictionary into a list containing the proper
1324 ApiConfig encoding for configuration data.
1325
1326 @param dic: Key-value pairs to convert.
1327 @return: JSON dictionary of an ApiConfig list (*not* an ApiList).
1328 """
1329 config = [ ]
1330 for k, v in dic.iteritems():
1331 config.append({ 'name' : k, 'value': v })
1332 return { ApiList.LIST_KEY : config }
1333
1335 """
1336 Converts a python dictionary into a JSON payload.
1337
1338 The payload matches the expected "apiConfig list" type used to update
1339 configuration parameters using the API.
1340
1341 @param dic: Key-value pairs to convert.
1342 @return: String with the JSON-encoded data.
1343 """
1344 return json.dumps(config_to_api_list(dic))
1345
1347 """
1348 Converts a JSON-decoded config dictionary to a python dictionary.
1349
1350 When materializing the full view, the values in the dictionary will be
1351 instances of ApiConfig, instead of strings.
1352
1353 @param dic: JSON-decoded config dictionary.
1354 @param full: Whether to materialize the full view of the config data.
1355 @return: Python dictionary with config data.
1356 """
1357 config = { }
1358 for entry in dic['items']:
1359 k = entry['name']
1360 if full:
1361 config[k] = ApiConfig.from_json_dict(entry, None)
1362 else:
1363 config[k] = entry.get('value')
1364 return config
1365