Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(607)

Unified Diff: third_party/gsutil/boto/boto/cloudsearch/optionstatus.py

Issue 12042069: Scripts to download files from google storage based on sha1 sums (Closed) Base URL: https://chromium.googlesource.com/chromium/tools/depot_tools.git@master
Patch Set: Review fixes, updated gsutil Created 7 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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)

Powered by Google App Engine
This is Rietveld 408576698