-
Notifications
You must be signed in to change notification settings - Fork 1.5k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Adding one-time RPC to find unaliased / true dataset ID. #528
Conversation
78bd1a2
to
e50b270
Compare
Pretty soon the datastore will normalize all types of keys, so you should never need to provide anything except the project id. Importantly, In the near-future we don't want anyone to have to deal with the "s~", it should be purely an implementation detail of the Datastore. I think the client libraries should probably be written pretending the "s~" doesn't exist since it is cleaner that way (with the caveat that it is slightly broken atm). |
Thanks for the quick followup. That is great news! It will certainly be much cleaner if we can ignore How do you mean normalize? Currently it seems some normalization is happening, but that means if I send no dataset ID in the request and |
I believe the goal is that everywhere you will specify @eddavisson can you confirm? |
That's correct. Note that if you want to do a one-time RPC in the mean time, you can do a Lookup request and check both the found and missing fields in the response for the resolved dataset id (basically what you're doing in this pull request but it's a read-only RPC). |
I didn't think to use UPDATE: DERP, no projection on lookup. |
I think we should go forward with @eddavisson suggestion while waiting for the API updates to land. |
@pcostell RE: foreign keys. I'm not sure why that's an issue if the application is managing those keys. I double checked and the backend does not change the foreign dataset ID after storing (seems it shouldn't, for privacy reasons). From 0525530: >>> from gcloud import datastore
>>> from gcloud.datastore import _implicit_environ
>>> from gcloud.datastore.entity import Entity
>>> from gcloud.datastore.key import Key
>>>
>>> datastore.set_default_connection()
>>> dataset_id = 'foo'
>>> datastore.set_default_dataset_id(dataset_id)
>>>
>>> e = Entity(key=Key('Foo', 1))
>>> e['bar'] = Key('Baz', 1, dataset_id='foreignappid')
>>> e.save()
>>>
>>> e_retrieved = datastore.get(e.key)
>>> e_retrieved['bar'].dataset_id
u'foreignappid'
>>>
>>> entity_pb, = _implicit_environ.CONNECTION.lookup(
... dataset_id=dataset_id,
... key_pbs=[e.key.to_protobuf()],
... )
>>> entity_pb.property
[<gcloud.datastore.datastore_v1_pb2.Property object at 0x7f4a5006d398>]
>>> print entity_pb.property[0].value.key_value
partition_id {
dataset_id: "foreignappid"
}
path_element {
kind: "Baz"
id: 1
}
>>> e.key.delete() FWIW I tried this both with a foreign dataset that my (user, not service account) OAuth 2.0 token had access to and one that the token did not. |
I believe we want to remove the notion of "s~" completely. So anywhere the user interacts with a dataset it should never have this extra prefix, including foreign keys. Note that this is not implemented, so it isn't finalized and definitely won't work yet. |
ab4c103
to
0cf4333
Compare
|
||
# Create the bogus Key protobuf to be looked up and remove | ||
# the dataset ID so the backend won't complain. | ||
bogus_key_pb = Key('__Foo', 1, dataset_id=dataset_id).to_protobuf() |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
0cf4333
to
31fd6fd
Compare
Changes Unknown when pulling 31fd6fd on dhermes:non-fuzzy-app-id into * on GoogleCloudPlatform:master*. |
@@ -299,7 +299,6 @@ def _assign_entity_to_mutation(mutation_pb, entity, auto_id_entities): | |||
auto_id = entity.key.is_partial | |||
|
|||
key_pb = entity.key.to_protobuf() | |||
key_pb = helpers._prepare_key_for_request(key_pb) |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
LGTM. |
31fd6fd
to
612a569
Compare
@tseaver We can't / shouldn't merge this until the discussion above is resolved. |
612a569
to
5d631a6
Compare
@@ -69,6 +69,50 @@ | |||
_DATASET_ENV_VAR_NAME = 'GCLOUD_DATASET_ID' | |||
|
|||
|
|||
def _find_true_dataset_id(dataset_id, connection=None): |
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
This comment was marked as spam.
This comment was marked as spam.
Sorry, something went wrong.
5d631a6
to
71a3dbe
Compare
Ping me if more review is needed. |
71a3dbe
to
0c4f4c6
Compare
Rebased and squashed into single commit (had to hack around after rebasing). |
Changes Unknown when pulling 0c4f4c6 on dhermes:non-fuzzy-app-id into * on GoogleCloudPlatform:master*. |
Also removing unnecessary functions that are no longer needed since there is no need to muck with the dataset ID.
0c4f4c6
to
9b0f87a
Compare
Done via: - Moving `_add_keys_to_request` definition to connection module - Removing only other use (in `batch`, was not a list of keys) - Copying `_prepare_key_for_request` from helpers (googleapis#528 would be nice, since we could just remove `_prepare_key_for_request` all together)
Done via: - Moving `_add_keys_to_request` definition to connection module - Removing only other use (in `batch`, was not a list of keys) - Copying `_prepare_key_for_request` from helpers (googleapis#528 would be nice, since we could just remove `_prepare_key_for_request` all together)
Source-Link: https://togithub.com/googleapis/synthtool/commit/cb960373d12d20f8dc38beee2bf884d49627165e Post-Processor: gcr.io/cloud-devrel-public-resources/owlbot-python:latest@sha256:2d816f26f728ac8b24248741e7d4c461c09764ef9f7be3684d557c9632e46dbd
* chore(deps): update all dependencies * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * revert Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com> Co-authored-by: Anthonios Partheniou <partheniou@google.com>
* chore: Update gapic-generator-python to v1.9.0 PiperOrigin-RevId: 517425588 Source-Link: googleapis/googleapis@33c93eb Source-Link: googleapis/googleapis-gen@d5f5978 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiZDVmNTk3ODlkMTlmYzQzMjcwZmYyMTI0OTY3ZDRlYzg5OTJiOGU4ZiJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * docs: Fix formatting of request arg in docstring chore: Update gapic-generator-python to v1.9.1 PiperOrigin-RevId: 518604533 Source-Link: googleapis/googleapis@8a085ae Source-Link: googleapis/googleapis-gen@b2ab4b0 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiYjJhYjRiMGEwYWUyOTA3ZTgxMmMyMDkxOThhNzRlMDg5OGFmY2IwNCJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md --------- Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com>
* feat: Add support for python 3.11 chore: Update gapic-generator-python to v1.8.0 PiperOrigin-RevId: 500768693 Source-Link: googleapis/googleapis@190b612 Source-Link: googleapis/googleapis-gen@7bf29a4 Copy-Tag: eyJwIjoiLmdpdGh1Yi8uT3dsQm90LnlhbWwiLCJoIjoiN2JmMjlhNDE0YjllY2FjMzE3MGYwYjY1YmRjMmE5NTcwNWMwZWYxYSJ9 * 🦉 Updates from OwlBot post-processor See https://github.com/googleapis/repo-automation-bots/blob/main/packages/owl-bot/README.md * update setup.py Co-authored-by: Owl Bot <gcf-owl-bot[bot]@users.noreply.github.com> Co-authored-by: Anthonios Partheniou <partheniou@google.com>
Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com>
Also removing unnecessary functions that are no longer
needed since there is no need to muck with the dataset ID.
@tseaver This is really an exploratory PR, no need to review just yet.
@pcostell Can you check out the
_find_true_dataset_id
method ingcloud/datastore/__init__.py
(feel free to ignore the rest).Is this a dumb idea? Is there an actual API available to convert from the "human friendly" ID
foo
to the unaliased / prefixeds~foo
?