Add script to convert datastore-indexes.xml to index.yaml

The gcloud datastore cleanup-indexes command takes its input in index.yaml form instead of datastore-indexes.yaml form. This simple translation script allows us to generate one from the other.

-------------
Created by MOE: https://github.com/google/moe
MOE_MIGRATED_REVID=169260811
This commit is contained in:
mountford 2017-09-19 10:26:11 -07:00 committed by jianglai
parent f34d4b6bbb
commit 0994ce76c7
5 changed files with 301 additions and 0 deletions

View file

@ -0,0 +1,20 @@
package(default_visibility = ["//java/google/registry:registry_project"])
licenses(["notice"]) # Apache 2.0
py_binary(
name = "xml_to_index_yaml_translator",
srcs = ["xml_to_index_yaml_translator.py"],
deps = ["//python:python_directory_import"],
)
py_test(
name = "xml_to_index_yaml_translator_test",
size = "small",
srcs = ["xml_to_index_yaml_translator_test.py"],
data = [
"testdata/datastore-indexes.xml",
"testdata/index.yaml",
],
deps = [":xml_to_index_yaml_translator"],
)

View file

@ -0,0 +1,86 @@
<datastore-indexes autoGenerate="false">
<!-- For finding contact resources by registrar. -->
<datastore-index kind="ContactResource" ancestor="false" source="manual">
<property name="currentSponsorClientId" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For finding domain resources by registrar. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="^i" direction="asc"/>
<property name="currentSponsorClientId" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For finding domain resources by TLD. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="^i" direction="asc"/>
<property name="tld" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For finding domain resources by registrar. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="currentSponsorClientId" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For finding host resources by registrar. -->
<datastore-index kind="HostResource" ancestor="false" source="manual">
<property name="currentSponsorClientId" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For finding account balance of registrar and viewing billing history. -->
<datastore-index kind="RegistrarBillingEntry" ancestor="true" source="manual">
<property name="currency" direction="asc"/>
<property name="created" direction="desc"/>
</datastore-index>
<!-- For determining the active domains linked to a given contact. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="allContacts.contact" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For determining the active domains linked to a given host. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="nsHosts" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For RDAP searches by linked nameserver. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="^i" direction="asc"/>
<property name="nsHosts" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For WHOIS IP address lookup -->
<datastore-index kind="HostResource" ancestor="false" source="manual">
<property name="inetAddresses" direction="asc"/>
<property name="deletionTime" direction="asc"/>
</datastore-index>
<!-- For Poll -->
<datastore-index kind="PollMessage" ancestor="false" source="manual">
<property name="clientId" direction="asc"/>
<property name="eventTime" direction="asc"/>
</datastore-index>
<datastore-index kind="PollMessage" ancestor="true" source="manual">
<property name="clientId" direction="asc"/>
<property name="eventTime" direction="asc"/>
</datastore-index>
<!-- For the history viewer. -->
<datastore-index kind="HistoryEntry" ancestor="true" source="manual">
<property name="modificationTime" direction="asc"/>
</datastore-index>
<!-- For RDAP. -->
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="^i" direction="asc"/>
<property name="fullyQualifiedDomainName" direction="asc"/>
</datastore-index>
<datastore-index kind="DomainBase" ancestor="false" source="manual">
<property name="^i" direction="asc"/>
<property name="tld" direction="asc"/>
<property name="fullyQualifiedDomainName" direction="asc"/>
</datastore-index>
<datastore-index kind="HostResource" ancestor="false" source="manual">
<property name="deletionTime" direction="asc"/>
<property name="fullyQualifiedHostName" direction="asc"/>
</datastore-index>
<datastore-index kind="ContactResource" ancestor="false" source="manual">
<property name="deletionTime" direction="asc"/>
<property name="searchName" direction="asc"/>
</datastore-index>
</datastore-indexes>

View file

@ -0,0 +1,93 @@
indexes:
- kind: ContactResource
properties:
- name: currentSponsorClientId
- name: deletionTime
- kind: DomainBase
properties:
- name: ^i
- name: currentSponsorClientId
- name: deletionTime
- kind: DomainBase
properties:
- name: ^i
- name: tld
- name: deletionTime
- kind: DomainBase
properties:
- name: currentSponsorClientId
- name: deletionTime
- kind: HostResource
properties:
- name: currentSponsorClientId
- name: deletionTime
- kind: RegistrarBillingEntry
ancestor: yes
properties:
- name: currency
- name: created
direction: desc
- kind: DomainBase
properties:
- name: allContacts.contact
- name: deletionTime
- kind: DomainBase
properties:
- name: nsHosts
- name: deletionTime
- kind: DomainBase
properties:
- name: ^i
- name: nsHosts
- name: deletionTime
- kind: HostResource
properties:
- name: inetAddresses
- name: deletionTime
- kind: PollMessage
properties:
- name: clientId
- name: eventTime
- kind: PollMessage
ancestor: yes
properties:
- name: clientId
- name: eventTime
- kind: HistoryEntry
ancestor: yes
properties:
- name: modificationTime
- kind: DomainBase
properties:
- name: ^i
- name: fullyQualifiedDomainName
- kind: DomainBase
properties:
- name: ^i
- name: tld
- name: fullyQualifiedDomainName
- kind: HostResource
properties:
- name: deletionTime
- name: fullyQualifiedHostName
- kind: ContactResource
properties:
- name: deletionTime
- name: searchName

View file

@ -0,0 +1,51 @@
# Copyright 2017 The Nomulus Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Convert App Engine Java datastore-indexes.xml file to index.yaml format.
Pass the name of a datastore-indexes.xml file. The output will be dumped to
stdout.
The resulting file can be used to call the gcloud cleanup-indexes command,
which interactively removes indexes which are defined on an App Engine
project but not present in the file. The syntax for that command is:
gcloud datastore cleanup-indexes {index.yaml file} --project={project-id}
"""
import sys
from xml.etree import ElementTree
def main(argv):
if len(argv) < 2:
print 'Usage: command {datastore-indexes.xml file}'
return 1
root = ElementTree.parse(argv[1]).getroot()
print 'indexes:'
for index in root:
print ''
print '- kind: %s' % index.attrib['kind']
if index.attrib['ancestor'] != 'false':
print ' ancestor: %s' % ('yes' if (index.attrib['ancestor'] == 'true')
else 'no')
print ' properties:'
for index_property in index:
print ' - name: %s' % index_property.attrib['name']
if index_property.attrib['direction'] != 'asc':
print ' direction: %s' % index_property.attrib['direction']
if __name__ == '__main__':
main(sys.argv)

View file

@ -0,0 +1,51 @@
# Copyright 2017 The Nomulus Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
"""Tests for xml_to_index_yaml_translator.py."""
import contextlib
import StringIO
import sys
import unittest
from google.registry.scripts import xml_to_index_yaml_translator
@contextlib.contextmanager
def _RedirectStdout():
orig_stdout = sys.stdout
sio = StringIO.StringIO()
sys.stdout = sio
try:
yield sio
finally:
sys.stdout = orig_stdout
class XmlToIndexYamlTranslatorTest(unittest.TestCase):
def testSuccess(self):
with _RedirectStdout() as sio:
xml_to_index_yaml_translator.main(['test',
'python/'
'google/registry/scripts/testdata/'
'datastore-indexes.xml'])
actual = sio.getvalue()
expectedfile = open('python/google/registry/'
'scripts/testdata/index.yaml')
expected = expectedfile.read()
self.assertEqual(actual, expected)
if __name__ == '__main__':
unittest.main()