Index: third_party/gsutil/boto/boto/cloudsearch/optionstatus.py |
diff --git a/third_party/gsutil/boto/boto/cloudsearch/optionstatus.py b/third_party/gsutil/boto/boto/cloudsearch/optionstatus.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..dddda76f970d1d950e88d259ec6ff099fac7d4c1 |
--- /dev/null |
+++ b/third_party/gsutil/boto/boto/cloudsearch/optionstatus.py |
@@ -0,0 +1,248 @@ |
+# Copyright (c) 2012 Mitch Garnaat http://garnaat.org/ |
+# Copyright (c) 2012 Amazon.com, Inc. or its affiliates. |
+# All Rights Reserved |
+# |
+# Permission is hereby granted, free of charge, to any person obtaining a |
+# copy of this software and associated documentation files (the |
+# "Software"), to deal in the Software without restriction, including |
+# without limitation the rights to use, copy, modify, merge, publish, dis- |
+# tribute, sublicense, and/or sell copies of the Software, and to permit |
+# persons to whom the Software is furnished to do so, subject to the fol- |
+# lowing conditions: |
+# |
+# The above copyright notice and this permission notice shall be included |
+# in all copies or substantial portions of the Software. |
+# |
+# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS |
+# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABIL- |
+# ITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT |
+# SHALL THE AUTHOR BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, |
+# WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
+# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS |
+# IN THE SOFTWARE. |
+# |
+ |
+import time |
+from boto.compat import json |
+ |
+ |
+class OptionStatus(dict): |
+ """ |
+ Presents a combination of status field (defined below) which are |
+ accessed as attributes and option values which are stored in the |
+ native Python dictionary. In this class, the option values are |
+ merged from a JSON object that is stored as the Option part of |
+ the object. |
+ |
+ :ivar domain_name: The name of the domain this option is associated with. |
+ :ivar create_date: A timestamp for when this option was created. |
+ :ivar state: The state of processing a change to an option. |
+ Possible values: |
+ |
+ * RequiresIndexDocuments: the option's latest value will not |
+ be visible in searches until IndexDocuments has been called |
+ and indexing is complete. |
+ * Processing: the option's latest value is not yet visible in |
+ all searches but is in the process of being activated. |
+ * Active: the option's latest value is completely visible. |
+ |
+ :ivar update_date: A timestamp for when this option was updated. |
+ :ivar update_version: A unique integer that indicates when this |
+ option was last updated. |
+ """ |
+ |
+ def __init__(self, domain, data=None, refresh_fn=None, save_fn=None): |
+ self.domain = domain |
+ self.refresh_fn = refresh_fn |
+ self.save_fn = save_fn |
+ self.refresh(data) |
+ |
+ def _update_status(self, status): |
+ self.creation_date = status['creation_date'] |
+ self.status = status['state'] |
+ self.update_date = status['update_date'] |
+ self.update_version = int(status['update_version']) |
+ |
+ def _update_options(self, options): |
+ if options: |
+ self.update(json.loads(options)) |
+ |
+ def refresh(self, data=None): |
+ """ |
+ Refresh the local state of the object. You can either pass |
+ new state data in as the parameter ``data`` or, if that parameter |
+ is omitted, the state data will be retrieved from CloudSearch. |
+ """ |
+ if not data: |
+ if self.refresh_fn: |
+ data = self.refresh_fn(self.domain.name) |
+ if data: |
+ self._update_status(data['status']) |
+ self._update_options(data['options']) |
+ |
+ def to_json(self): |
+ """ |
+ Return the JSON representation of the options as a string. |
+ """ |
+ return json.dumps(self) |
+ |
+ def startElement(self, name, attrs, connection): |
+ return None |
+ |
+ def endElement(self, name, value, connection): |
+ if name == 'CreationDate': |
+ self.created = value |
+ elif name == 'State': |
+ self.state = value |
+ elif name == 'UpdateDate': |
+ self.updated = value |
+ elif name == 'UpdateVersion': |
+ self.update_version = int(value) |
+ elif name == 'Options': |
+ self.update_from_json_doc(value) |
+ else: |
+ setattr(self, name, value) |
+ |
+ def save(self): |
+ """ |
+ Write the current state of the local object back to the |
+ CloudSearch service. |
+ """ |
+ if self.save_fn: |
+ data = self.save_fn(self.domain.name, self.to_json()) |
+ self.refresh(data) |
+ |
+ def wait_for_state(self, state): |
+ """ |
+ Performs polling of CloudSearch to wait for the ``state`` |
+ of this object to change to the provided state. |
+ """ |
+ while self.state != state: |
+ time.sleep(5) |
+ self.refresh() |
+ |
+ |
+class IndexFieldStatus(OptionStatus): |
+ |
+ def _update_options(self, options): |
+ self.update(options) |
+ |
+ def save(self): |
+ pass |
+ |
+ |
+class RankExpressionStatus(IndexFieldStatus): |
+ |
+ pass |
+ |
+class ServicePoliciesStatus(OptionStatus): |
+ |
+ def new_statement(self, arn, ip): |
+ """ |
+ Returns a new policy statement that will allow |
+ access to the service described by ``arn`` by the |
+ ip specified in ``ip``. |
+ |
+ :type arn: string |
+ :param arn: The Amazon Resource Notation identifier for the |
+ service you wish to provide access to. This would be |
+ either the search service or the document service. |
+ |
+ :type ip: string |
+ :param ip: An IP address or CIDR block you wish to grant access |
+ to. |
+ """ |
+ return { |
+ "Effect":"Allow", |
+ "Action":"*", # Docs say use GET, but denies unless * |
+ "Resource": arn, |
+ "Condition": { |
+ "IpAddress": { |
+ "aws:SourceIp": [ip] |
+ } |
+ } |
+ } |
+ |
+ def _allow_ip(self, arn, ip): |
+ if 'Statement' not in self: |
+ s = self.new_statement(arn, ip) |
+ self['Statement'] = [s] |
+ self.save() |
+ else: |
+ add_statement = True |
+ for statement in self['Statement']: |
+ if statement['Resource'] == arn: |
+ for condition_name in statement['Condition']: |
+ if condition_name == 'IpAddress': |
+ add_statement = False |
+ condition = statement['Condition'][condition_name] |
+ if ip not in condition['aws:SourceIp']: |
+ condition['aws:SourceIp'].append(ip) |
+ |
+ if add_statement: |
+ s = self.new_statement(arn, ip) |
+ self['Statement'].append(s) |
+ self.save() |
+ |
+ def allow_search_ip(self, ip): |
+ """ |
+ Add the provided ip address or CIDR block to the list of |
+ allowable address for the search service. |
+ |
+ :type ip: string |
+ :param ip: An IP address or CIDR block you wish to grant access |
+ to. |
+ """ |
+ arn = self.domain.search_service_arn |
+ self._allow_ip(arn, ip) |
+ |
+ def allow_doc_ip(self, ip): |
+ """ |
+ Add the provided ip address or CIDR block to the list of |
+ allowable address for the document service. |
+ |
+ :type ip: string |
+ :param ip: An IP address or CIDR block you wish to grant access |
+ to. |
+ """ |
+ arn = self.domain.doc_service_arn |
+ self._allow_ip(arn, ip) |
+ |
+ def _disallow_ip(self, arn, ip): |
+ if 'Statement' not in self: |
+ return |
+ need_update = False |
+ for statement in self['Statement']: |
+ if statement['Resource'] == arn: |
+ for condition_name in statement['Condition']: |
+ if condition_name == 'IpAddress': |
+ condition = statement['Condition'][condition_name] |
+ if ip in condition['aws:SourceIp']: |
+ condition['aws:SourceIp'].remove(ip) |
+ need_update = True |
+ if need_update: |
+ self.save() |
+ |
+ def disallow_search_ip(self, ip): |
+ """ |
+ Remove the provided ip address or CIDR block from the list of |
+ allowable address for the search service. |
+ |
+ :type ip: string |
+ :param ip: An IP address or CIDR block you wish to grant access |
+ to. |
+ """ |
+ arn = self.domain.search_service_arn |
+ self._disallow_ip(arn, ip) |
+ |
+ def disallow_doc_ip(self, ip): |
+ """ |
+ Remove the provided ip address or CIDR block from the list of |
+ allowable address for the document service. |
+ |
+ :type ip: string |
+ :param ip: An IP address or CIDR block you wish to grant access |
+ to. |
+ """ |
+ arn = self.domain.doc_service_arn |
+ self._disallow_ip(arn, ip) |