RequestContext reqToAuthorize = new RequestContext.Builder() .resourcePath(childResourcePath) .requestType(RequestType.READ) .securityContext(securityContext); RequestAttributes attribs = new DefaultRequestAttributes(); attribs.setAttribute(AuthzConstants.ATTR_REQUEST_CONTEXT, reqToAuthorize); RequestContext authzRequest = new RequestContext.Builder().requestAttributes(attribs).build();
RequestContext authzRequest = new RequestContext.Builder().requestAttributes(attribs).build();
attribs.setAttribute(AuthzConstants.ATTR_REQUEST_CONTEXT, req.requestContext()); attribs.setAttribute(AuthzConstants.ATTR_REQUEST_RESOURCE_STATE, req.state()); RequestContext authzRequest = new RequestContext.Builder().requestAttributes(attribs).build();
ResourceState result = client.update(new RequestContext.Builder().build(), ADMIN_PATH, updatedConfig);
ResourceState bortResourceState = new DefaultResourceState("bort"); bortResourceState.putProperty("name", "Bort"); ResourceState createResponse = client.create(new RequestContext.Builder().build(), INSTANCES_CONFIG_PATH, bortResourceState); assertThat(createResponse.id()).isEqualTo("bort"); assertThat(createResponse.getProperty("name")).isEqualTo("Bort"); ResourceState readState = client.read(new RequestContext.Builder().returnFields(new DefaultReturnFields("*(*)")).build(), INSTANCES_CONFIG_PATH); assertThat(readState.members().size()).isEqualTo(5); assertThat(bortServer.getProperty("port")).isEqualTo(27017); client.delete(new RequestContext.Builder().returnFields(new DefaultReturnFields("*(*)")).build(), INSTANCES_CONFIG_PATH + "/bort");
ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("testConfigureCRDB");
@Test public void testDeleteDataStore() throws Exception { ResourceState deleteState = client.delete(new RequestContext.Builder().returnFields(new DefaultReturnFields("*(*)")).build(), INSTANCES_CONFIG_PATH + "/foo"); assertThat(deleteState.id()).isEqualTo("foo"); ResourceState readState = client.read(new RequestContext.Builder().returnFields(new DefaultReturnFields("*(*)")).build(), INSTANCES_CONFIG_PATH); servers.add(server); fooResourceState.putProperty("servers", servers); client.create(new RequestContext.Builder().build(), INSTANCES_CONFIG_PATH, fooResourceState);
if (member(new RequestContext.Builder().build(), state.id()) != null) { responder.resourceAlreadyExists(state.id()); return;
@Test public void configure() throws Exception { ResourceState config = new DefaultResourceState(); config.putProperty("db", "testConfigureDB"); config.putProperty("servers", new ArrayList()); ResourceState mongoClientConfigResourceState = new DefaultResourceState(); mongoClientConfigResourceState.putProperty(MongoClientOptionsState.DESCRIPTION, "my cool mbaas"); mongoClientConfigResourceState.putProperty(MongoClientOptionsState.MAX_AUTOCONNECT_RETRY_TIME, new Long(50)); mongoClientConfigResourceState.putProperty(MongoClientOptionsState.SOCKET_KEEP_ALIVE, true); config.putProperty(MongoClientOptionsState.ID, mongoClientConfigResourceState); setUpSystem(config); ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("testConfigureDB"); assertThat(result.getProperty("servers")).isNotNull(); assertThat(result.getProperty(MongoClientOptionsState.ID)).isNotNull(); ResourceState mongoClientOptionResource = (ResourceState) result.getProperty(MongoClientOptionsState.ID); // the default values assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.CONNECTIONS_PER_HOST)).isEqualTo(100); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.THREADS_ALLOWED_TO_BLOCK_FOR_CONNECTION_MULTIPLIER)).isEqualTo(5); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.MAX_WAIT_TIME)).isEqualTo(120000); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.CONNECT_TIMEOUT)).isEqualTo(10000); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.AUTOCONNECT_RETRY)).isEqualTo(false); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.CURSOR_FINALIZER_ENABLED)).isEqualTo(true); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.ALWAYS_USE_MBEANS)).isEqualTo(false); // the modified values assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.DESCRIPTION)).isEqualTo("my cool mbaas"); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.MAX_AUTOCONNECT_RETRY_TIME)).isEqualTo(new Long(50)); assertThat(mongoClientOptionResource.getProperty(MongoClientOptionsState.SOCKET_KEEP_ALIVE)).isEqualTo(true); }
@Test public void testGetStorageCollectionsQuery() throws Exception { DBCollection collection = db.getCollection("testQueryCollection"); if (collection != null) { collection.drop(); } collection = db.createCollection("testQueryCollection", new BasicDBObject("count", 0)); // insert data records for the test setupPeopleData(collection); assertThat(collection.count()).isEqualTo(6); // This should return 3 items // SimpleResourceParams resourceParams = new SimpleResourceParams(); resourceParams.put("q", "[{$group:{_id:{country:'$country'},numPeople:{$sum:1}}}]"); RequestContext requestContext = new RequestContext.Builder() .returnFields(new DefaultReturnFields("*(*)")) .resourceParams(resourceParams) .build(); ResourceState result = client.read(requestContext, "/testApp/" + BASEPATH + "/testQueryCollection/_aggregate"); // verify response assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo("_aggregate"); assertThat(result.getProperty("result")).isNotNull(); assertThat(result.getProperty("result")).isInstanceOf(List.class); List results = (List) result.getProperty("result"); assertThat(results.size()).isEqualTo(3); Set countries = checkAggregateItems(results); Set expected = new HashSet(Arrays.asList(new String[] { "DE", "FR", "US" })); assertThat(countries).isEqualTo(expected); }
@Test public void queryNonExistantIndex() throws Exception { DBCollection collection = db.getCollection("testQueryNonExistantIndex"); if (collection != null) { collection.drop(); } collection = db.createCollection("testQueryCollection", new BasicDBObject("count", 0)); // insert data records for the test setupPeopleData(collection); assertThat(collection.count()).isEqualTo(6); // This should return 2 items SimpleResourceParams resourceParams = new SimpleResourceParams(); resourceParams.put("q", "{lastName:{$gt:'E', $lt:'R'}}"); resourceParams.put("hint", "foobar"); // NOTE: foobar does not correspond to an index we can use RequestContext requestContext = new RequestContext.Builder().returnFields(new DefaultReturnFields("*(*)")).resourceParams(resourceParams).build(); try { client.read(requestContext, "/testApp/" + BASEPATH + "/testQueryCollection"); Fail.fail(); } catch (ResourceException iee) { // TODO fix me //assertThat(iee.message()).isEqualTo("Exception encountered trying to fetch data from the Mongo Database"); // Note: tying the test results to the internal mechanisms of Mongo is not a good idea, but // its the only way to make sure that the exception is because of the failure we want. //assertThat(iee.getCause().getClass().getName()).isEqualTo("com.mongodb.MongoException"); //assertThat(iee.getCause().getMessage()).isEqualTo("bad hint"); } // Rempve collection client.delete(requestContext, "/testApp/" + BASEPATH + "/testQueryCollection"); }
@Test public void updateServers() throws Exception { ResourceState config = new DefaultResourceState(); config.putProperty("db", "testUpdateServersDB"); List<ResourceState> servers = new ArrayList<>(); ResourceState serverA = new DefaultResourceState(); serverA.putProperty("host", "localhost"); servers.add(serverA); ResourceState serverB = new DefaultResourceState(); serverB.putProperty("host", "127.0.0.2"); serverB.putProperty("port", 65535); // max port number that is valid servers.add(serverB); servers.add(new DefaultResourceState()); //empty value, should use the default values in this case config.putProperty("servers", servers); setUpSystem(config); ResourceState updatedConfig = new DefaultResourceState(); List<ResourceState> updatedServers = new ArrayList<ResourceState>(); updatedConfig.putProperty("db", "testUpdateServersDB"); ResourceState updatedServerB = new DefaultResourceState(); updatedServerB.putProperty("host", RUNNING_MONGO_HOST); updatedServerB.putProperty("port", RUNNING_MONGO_PORT); // the port the test mongo instance is running on updatedServers.add(updatedServerB); updatedConfig.putProperty("servers", updatedServers); ResourceState result = client.update(new RequestContext.Builder().build(), ADMIN_PATH, updatedConfig); List<ResourceState> serversResourceState = (List) result.getProperty("servers"); assertThat(serversResourceState.size()).isEqualTo(1); assertThat(serversResourceState.get(0).getProperty("host")).isEqualTo(RUNNING_MONGO_HOST); assertThat(serversResourceState.get(0).getProperty("port")).isEqualTo(RUNNING_MONGO_PORT); }
@Test public void testClearCredentials() throws Exception { ResourceState config = createConfig("testClearCredentials", RUNNING_MONGO_HOST, RUNNING_MONGO_PORT); List<ResourceState> credentials = new ArrayList<>(); ResourceState credential = new DefaultResourceState(); credential.putProperty("mechanism", "MONGODB-CR"); credential.putProperty("username", "foo"); credential.putProperty("password", "bar"); credential.putProperty("database", "testDB1"); credentials.add(credential); config.putProperty("credentials", credentials); setUpSystem(config); ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("testClearCredentials"); assertThat(result.getProperty("credentials")).isNotNull(); assertThat(((List) result.getProperty("credentials")).size()).isEqualTo(1); ResourceState credentialResult = (ResourceState) ((List) result.getProperty("credentials")).get(0); assertThat(credentialResult.getPropertyNames().size()).isEqualTo(4); assertThat(credentialResult.getProperty("username")).isEqualTo("foo"); assertThat(credentialResult.getProperty("password")).isEqualTo("bar"); assertThat(credentialResult.getProperty("database")).isEqualTo("testDB1"); assertThat(credentialResult.getProperty("mechanism")).isEqualTo("MONGODB-CR"); result.putProperty("credentials", new ArrayList()); ResourceState updatedResult = client.update(new RequestContext.Builder().build(), ADMIN_PATH, result); assertThat(updatedResult.getProperty("db")).isEqualTo("testClearCredentials"); assertThat((List) updatedResult.getProperty("credentials")).isEmpty(); }
@Test public void sameServerTwice() throws Exception { //Note: the mongo client does support this for some reason, so it will work without error. ResourceState config = new DefaultResourceState(); config.putProperty("db", "testSameServerTwiceDB"); List<ResourceState> servers = new ArrayList<>(); ResourceState serverA = new DefaultResourceState(); serverA.putProperty("host", "localhost"); serverA.putProperty("port", 27018); servers.add(serverA); ResourceState serverB = new DefaultResourceState(); serverB.putProperty("host", "localhost"); serverB.putProperty("port", 27018); servers.add(serverB); config.putProperty("servers", servers); setUpSystem(config); ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("testSameServerTwiceDB"); assertThat(result.getProperty("servers")).isNotNull(); List<ResourceState> serversResult = (List) result.getProperty("servers"); assertThat(serversResult.size()).isEqualTo(2); assertThat(serversResult.get(0).getProperty("host")).isEqualTo("localhost"); assertThat(serversResult.get(0).getProperty("port")).isEqualTo(27018); assertThat(serversResult.get(1).getProperty("host")).isEqualTo("localhost"); assertThat(serversResult.get(1).getProperty("port")).isEqualTo(27018); client.read(new RequestContext.Builder().build(), ADMIN_PATH); }
@Test public void dbNameWithSpace() throws Exception { // check initial creation assertThat(mongoClient.getDatabaseNames().contains("foo bar")).isFalse(); assertThat(mongoClient.getDatabaseNames().contains("foo%20bar")).isFalse(); ResourceState config = new DefaultResourceState(); config.putProperty("db", "foo bar"); setUpSystem(config); // check via reading from LiveOak ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("foo bar"); // we need to write something to the database, otherwise its not created in the database server client.create(new RequestContext.Builder().build(), "/testApp/storage/", new DefaultResourceState()); // check via what is in mongo assertThat(mongoClient.getDatabaseNames().contains("foo%20bar")).isTrue(); assertThat(mongoClient.getDatabaseNames().contains("foo bar")).isFalse(); mongoClient.dropDatabase("foo%20bar"); // check on update result.putProperty("db", "hello <world>"); ResourceState updatedResult = client.update(new RequestContext.Builder().build(), ADMIN_PATH, result); assertThat(updatedResult.getProperty("db")).isEqualTo("hello <world>"); // check what is in mongo assertThat(mongoClient.getDatabaseNames().contains("hello%20%3Cworld%3E")).isTrue(); assertThat(mongoClient.getDatabaseNames().contains("foo <world>")).isFalse(); mongoClient.dropDatabase("hello%20%3Cworld%3E"); }
@Test public void simpleUpdate() throws Exception { String methodName = "testSimpleUpdate"; assertThat(db.getCollection(methodName).getCount()).isEqualTo(0); // create the object using the mongo driver directly BasicDBObject object = new BasicDBObject(); object.append("foo", "bar"); db.getCollection(methodName).insert(object); assertEquals(1, db.getCollection(methodName).getCount()); String id = "ObjectId(\"" + object.getObjectId("_id").toString() + "\")"; // update the resource using the client.update method ResourceState resourceState = new DefaultResourceState(); resourceState.putProperty("foo", "baz"); ResourceState result = client.update(new RequestContext.Builder().build(), "/testApp/" + BASEPATH + "/" + methodName + "/" + id, resourceState); // verify the result assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo(id); assertThat(result.getProperty("foo")).isEqualTo("baz"); // verify db content assertThat(db.getCollection(methodName).getCount()).isEqualTo(1); DBObject dbObject = db.getCollection(methodName).findOne(); assertEquals("baz", dbObject.get("foo")); assertEquals(new ObjectId(id.substring("ObjectId(\"".length(), id.length() - "\")".length())), dbObject.get("_id")); }
@Test public void writeCappedCollection() throws Exception { // check that we can create the resource ResourceState state = new DefaultResourceState("lastTwo"); state.putProperty("capped", "true"); state.putProperty("size", 1024); state.putProperty("max", 2); ResourceState createdResource = client.create(new RequestContext.Builder().build(), "/testApp/storage", state); assertThat(createdResource).isNotNull(); assertThat(createdResource.id()).isEqualTo("lastTwo"); client.create(new RequestContext.Builder().build(), "/testApp/storage/lastTwo", new DefaultResourceState("first")); client.create(new RequestContext.Builder().build(), "/testApp/storage/lastTwo", new DefaultResourceState("second")); // since the capped collection only holds 2 items, this should remove the first element: client.create(new RequestContext.Builder().build(), "/testApp/storage/lastTwo", new DefaultResourceState("third")); // test that we get this resource back on a read ResourceState lastTwo = client.read(new RequestContext.Builder().build(), "/testApp/storage/lastTwo"); assertThat(lastTwo).isNotNull(); assertThat(lastTwo.id()).isEqualTo("lastTwo"); assertThat(lastTwo.getProperty("capped")).isEqualTo(true); assertThat(lastTwo.getProperty("max")).isEqualTo(2); assertThat(lastTwo.members().size()).isEqualTo(2); assertThat(lastTwo.members().get(0).id()).isEqualTo("second"); assertThat(lastTwo.members().get(1).id()).isEqualTo("third"); }
@Test public void renameCollection() throws Exception { db.dropDatabase(); // TODO: create a new DB here instead of dropping the old one assertThat(db.getCollectionNames()).hasSize(0); // create a collection DBCollection collection = db.createCollection("foo", new BasicDBObject()); DBObject dbObject = new BasicDBObject("_id", "testObject"); dbObject.put("hello", "world"); collection.insert(dbObject); // check that the collection is there (Note: there is an internal index collection, so one more than expected) assertThat(db.getCollectionNames()).hasSize(2); assertThat(db.getCollection("foo").count() == 1); // set the update resource state to include a new id value ResourceState updateResourceState = new DefaultResourceState("bar"); ResourceState result = client.update(new RequestContext.Builder().build(), "/testApp/" + BASEPATH + "/foo", updateResourceState); // verify the result assertThat(result).isNotNull(); assertThat(result.id()).isEqualTo("bar"); assertThat(result.getProperty("count")).isEqualTo(1L); // check in mongo directly assertThat(db.collectionExists("bar")); assertThat(db.collectionExists("foo")).isFalse(); assertThat(db.getCollection("bar").count()).isEqualTo(1L); assertThat(db.getCollection("bar").findOne().get("hello")).isEqualTo("world"); }
@Test public void setWithTags() throws Exception { ResourceState config = new DefaultResourceState(); config.putProperty("db", "testConfigureWithTagsDB"); config.putProperty("servers", new ArrayList()); ResourceState configReadPref = new DefaultResourceState(); configReadPref.putProperty(ReadPreferenceState.TYPE, ReadPreferenceState.SECONDARY); ResourceState tagsResourceState = new DefaultResourceState(); tagsResourceState.putProperty("foo", "bar"); tagsResourceState.putProperty("hello", "world"); configReadPref.putProperty(ReadPreferenceState.TAGS, tagsResourceState); config.putProperty(ReadPreferenceState.ID, configReadPref); setUpSystem(config); ResourceState result = client.read(new RequestContext.Builder().build(), ADMIN_PATH); assertThat(result.getProperty("db")).isEqualTo("testConfigureWithTagsDB"); assertThat(result.getProperty("servers")).isNotNull(); assertThat(result.getProperty(ReadPreferenceState.ID)).isNotNull(); ResourceState readPreferenceResourceState = (ResourceState) result.getProperty(ReadPreferenceState.ID); assertThat(readPreferenceResourceState.getPropertyNames().size()).isEqualTo(2); assertThat(readPreferenceResourceState.getProperty(ReadPreferenceState.TYPE)).isEqualTo(ReadPreferenceState.SECONDARY); List<ResourceState> tagsStates = (List) readPreferenceResourceState.getProperty(ReadPreferenceState.TAGS); assertThat(tagsStates.size()).isEqualTo(2); assertThat(tagsStates.get(0).getProperty("foo")).isEqualTo("bar"); assertThat(tagsStates.get(1).getProperty("hello")).isEqualTo("world"); }
@Test public void updateProperty() throws Exception { db.dropDatabase(); // TODO: create a new DB here instead of dropping the old one assertThat(db.getCollectionNames()).hasSize(0); // create a collection DBCollection collection = db.createCollection("foo", new BasicDBObject()); DBObject dbObject = new BasicDBObject("_id", "testObject"); dbObject.put("hello", "world"); collection.insert(dbObject); // check that the collection is there (Note: there is an internal index collection, so one more than expected) assertThat(db.getCollectionNames()).hasSize(2); assertThat(db.getCollection("foo").count() == 1); // set the update resource state to include the same id value ResourceState updateResourceState = new DefaultResourceState(); updateResourceState.putProperty("count", 500L); try { client.update(new RequestContext.Builder().build(), "/testApp/" + BASEPATH + "/foo", updateResourceState); Fail.fail(); } catch (NotAcceptableException e) { //expected } } }