I am using Google Cloud’s Datastore Client Library for Java to access the Cloud Datastore.
Note: I am not using App Engine to deploy my application; just running a local application for development purposes.
Following the example, I can read/write to the Cloud Datastore.
Datastore datastore = DatastoreOptions.defaultInstance().service();
KeyFactory keyFactory = datastore.newKeyFactory().setKind("MyKind");
Key key = keyFactory.newKey();
Entity entity = datastore.get(key);
I want to be able to write to a local Datastore emulator instance instead.
Following the guide here, I run gcloud beta emulators datastore start
.
This shows up in my terminal:
C:UsersUser>gcloud beta emulators datastore start
WARNING: Reusing existing data in [C:UsersUserAppDataRoaminggcloudemulatorsdatastore].
Executing: cmd /c C:UsersUserAppDataLocalGoogleCloud SDKgoogle-cloud-sdkplatformcloud-datastore-emulatorcloud_datastore_emulator.cmd start --host=localhost --port=8964 --store_on_disk=True --consistency=0.9 --allow_remote_shutdown C:UsersUserAppDataRoaminggcloudemulatorsdatastore
[datastore] Oct 31, 2016 11:37:27 AM com.google.cloud.datastore.emulator.CloudDatastore$FakeDatastoreAction$7 apply
[datastore] INFO: Provided --allow_remote_shutdown to start command which is no longer necessary.
[datastore] Oct 31, 2016 11:37:27 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub <init>
[datastore] INFO: Local Datastore initialized:
[datastore] Type: High Replication
[datastore] Storage: C:UsersUserAppDataRoaminggcloudemulatorsdatastoreWEB-INFappengine-generatedlocal_db.bin
[datastore] Oct 31, 2016 11:37:28 AM io.grpc.internal.ManagedChannelImpl <init>
[datastore] INFO: [ManagedChannelImpl@5e955596] Created with target localhost:8964
[datastore] Oct 31, 2016 11:37:28 AM com.google.cloud.datastore.emulator.impl.LocalDatastoreFileStub load
[datastore] INFO: The backing store, C:UsersUserAppDataRoaminggcloudemulatorsdatastoreWEB-INFappengine-generatedlocal_db.bin, does not exist. It will be created.
[datastore] Oct 31, 2016 11:37:28 AM io.gapi.emulators.netty.NettyUtil applyJava7LongHostnameWorkaround
[datastore] INFO: Unable to apply Java 7 long hostname workaround.
[datastore] API endpoint: http://localhost:8964
[datastore] If you are using a library that supports the DATASTORE_EMULATOR_HOST environment variable, run:
[datastore]
[datastore] export DATASTORE_EMULATOR_HOST=localhost:8964
[datastore]
[datastore] Dev App Server is now running.
[datastore]
I open another terminal and set the environment variables:
C:UsersUser>gcloud beta emulators datastore env-init > set_vars.cmd && set_vars.cmd
C:UsersUser>set DATASTORE_DATASET=my-project-id
C:UsersUser>set DATASTORE_EMULATOR_HOST=localhost:8964
C:UsersUser>set DATASTORE_EMULATOR_HOST_PATH=localhost:8964/datastore
C:UsersUser>set DATASTORE_HOST=http://localhost:8964
C:UsersUser>set DATASTORE_PROJECT_ID=my-project-id
I run my application and make a REST call to post or retrieve an Entity, but this only reads/writes against the Cloud Datastore. Heading to localhost:8964/datastore
gives me Not Found
. Although starting the emulator tells me that it created local_db.bin
file, the folder supposedly containing it is empty.
I also want to stay away from using LocalDatastoreHelper in order to access the local emulator. Is there any way to achieve using gcloud only ?
Answer
The line below always connects to the remote datastore
. Uses the default options (e.g. project, auth credentials) from gcloud
settings.
Datastore datastore = DatastoreOptions.defaultInstance().service();
To connect to the local datastore, try the below:
@Test
public void test1() throws IOException, InterruptedException {
Datastore ds = DatastoreOptions.builder().host("http://localhost:9999").projectId("my-project").build().service();
com.google.cloud.datastore.Key key = ds.newKeyFactory().kind("MyEntity").newKey("mykey");
com.google.cloud.datastore.Entity entity = com.google.cloud.datastore.Entity.builder(key).set("p1", "Hello World!").build();
entity = ds.put(entity);
entity = ds.get(key);
System.out.println(entity);
}
I started my Datastore Emulator on localhost:9999
. Set that as the host when building the DatastoreOptions.
I’ve confirmed that the Emulator console shows requests are received and entities are persisted. I’ve also checked the data file (local_db.bin
) and it shows the data (of course it is not a plain text file).
The one thing I don’t know is – if there is a way to manage the local datastore using a browser interface. I could not find much documentation on how to administer the local datastore just like how we do the remote one from Cloud Console. Perhaps someone else can help with this.