blob: 7a348de680369a38292a62f5fc78b1738389ddbc [file] [log] [blame]
/*
*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*
*/
package org.apache.qpid.systest.rest;
import static org.apache.qpid.server.management.plugin.servlet.rest.AbstractServlet.SC_UNPROCESSABLE_ENTITY;
import java.io.File;
import java.io.FileOutputStream;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.UUID;
import javax.servlet.http.HttpServletResponse;
import org.apache.qpid.server.model.BrokerModel;
import org.apache.qpid.server.model.ConfiguredObject;
import org.apache.qpid.server.model.Group;
import org.apache.qpid.server.model.GroupProvider;
import org.apache.qpid.server.model.LifetimePolicy;
import org.apache.qpid.server.model.State;
import org.apache.qpid.server.model.SystemConfig;
import org.apache.qpid.server.model.adapter.FileBasedGroupProvider;
import org.apache.qpid.server.model.adapter.FileBasedGroupProviderImpl;
import org.apache.qpid.test.utils.TestBrokerConfiguration;
import org.apache.qpid.test.utils.TestFileUtils;
public class GroupProviderRestTest extends QpidRestTestCase
{
private static final String FILE_GROUP_MANAGER = TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE;
private File _groupFile;
@Override
public void setUp() throws Exception
{
_groupFile = createTemporaryGroupFile();
getDefaultBrokerConfiguration().addGroupFileConfiguration(_groupFile.getAbsolutePath());
super.setUp();
}
@Override
public void tearDown() throws Exception
{
super.tearDown();
if (_groupFile != null)
{
if (_groupFile.exists())
{
_groupFile.delete();
}
}
}
public void testGet() throws Exception
{
List<Map<String, Object>> providerDetails = getRestTestHelper().getJsonAsList("groupprovider");
assertNotNull("Providers details cannot be null", providerDetails);
assertEquals("Unexpected number of providers", 1, providerDetails.size());
for (Map<String, Object> provider : providerDetails)
{
assertProvider(FILE_GROUP_MANAGER, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE, provider);
Map<String, Object> data = getRestTestHelper().getJsonAsSingletonList("groupprovider/"
+ provider.get(GroupProvider.NAME));
assertNotNull("Cannot load data for " + provider.get(GroupProvider.NAME), data);
assertProvider(FILE_GROUP_MANAGER, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE, data);
}
}
public void testCreateNewGroup() throws Exception
{
String groupName = "newGroup";
Map<String, Object> data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + FILE_GROUP_MANAGER);
assertNotNull("Cannot load data for provider", data);
getRestTestHelper().assertNumberOfGroups(data, 1);
getRestTestHelper().createGroup(groupName, FILE_GROUP_MANAGER);
data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + FILE_GROUP_MANAGER);
assertNotNull("Cannot load data for provider", data);
getRestTestHelper().assertNumberOfGroups(data, 2);
}
public void testRemoveGroup() throws Exception
{
String groupName = "myGroup";
Map<String, Object> data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + FILE_GROUP_MANAGER);
assertNotNull("Cannot load data for provider", data);
getRestTestHelper().assertNumberOfGroups(data, 1);
getRestTestHelper().removeGroup(groupName, FILE_GROUP_MANAGER);
data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + FILE_GROUP_MANAGER);
assertNotNull("Cannot load data for provider", data);
getRestTestHelper().assertNumberOfGroups(data, 0);
}
public void testCreateNewFileGroupProviderFromExistingGroupFile() throws Exception
{
String[] groupMemberNames = {"test1","test2"};
File groupFile = TestFileUtils.createTempFile(this, ".groups", "testusers.users=" + groupMemberNames[0] + "," + groupMemberNames[1]);
try
{
String providerName = getTestName();
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
attributes.put(FileBasedGroupProvider.PATH, groupFile.getAbsolutePath());
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Group provider was not created", 201, responseCode);
Map<String, Object> data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + providerName + "?depth=2");
assertProvider(providerName, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE, data);
assertEquals("Unexpected name", providerName, data.get(GroupProvider.NAME));
assertEquals("Unexpected path", groupFile.getAbsolutePath(), data.get(FileBasedGroupProvider.PATH));
@SuppressWarnings("unchecked")
List<Map<String, Object>> groups = (List<Map<String, Object>>) data.get("groups");
assertEquals("Unexpected group size", 1, groups.size());
Map<String, Object> group = groups.get(0);
assertEquals("Unexpected group name", "testusers",group.get("name"));
@SuppressWarnings("unchecked")
List<Map<String, Object>> groupMemberList = (List<Map<String, Object>>) group.get("groupmembers");
assertEquals("Unexpected group members size", 2, groupMemberList.size());
for (String memberName : groupMemberNames)
{
boolean found = false;
for (Map<String, Object> memberData : groupMemberList)
{
Object name = memberData.get("name");
if (memberName.equals(name))
{
found = true;
break;
}
}
assertTrue("Cannot find group member " + memberName + " in " + groupMemberList , found);
}
}
finally
{
groupFile.delete();
}
}
public void testCreationOfNewFileGroupProviderFailsWhenPathIsMissed() throws Exception
{
String providerName = getTestName();
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Group provider was created", SC_UNPROCESSABLE_ENTITY, responseCode);
}
public void testCreateNewFileGroupProviderFromNonExistingGroupFile() throws Exception
{
File groupFile = new File(TMP_FOLDER + File.separator + getTestName() + File.separator + "groups");
assertFalse("Group file should not exist", groupFile.exists());
try
{
String providerName = getTestName();
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
attributes.put(FileBasedGroupProvider.PATH, groupFile.getAbsolutePath());
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Group provider was not created", 201, responseCode);
Map<String, Object> data = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + providerName);
assertEquals("Unexpected name", providerName, data.get(GroupProvider.NAME));
assertEquals("Unexpected path", groupFile.getAbsolutePath(), data.get(FileBasedGroupProvider.PATH));
@SuppressWarnings("unchecked")
List<Map<String, Object>> groups = (List<Map<String, Object>>) data.get("groups");
assertNull("Unexpected groups", groups);
assertTrue("Group file has not been created", groupFile.exists());
}
finally
{
groupFile.delete();
groupFile.getParentFile().delete();
}
}
public void testCreateNewFileGroupProviderForTheSameGroupFileFails() throws Exception
{
File groupFile = TestFileUtils.createTempFile(this, ".groups", "testusers.users=test1,test2");
String providerName = getTestName();
try
{
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
attributes.put(FileBasedGroupProvider.PATH, groupFile.getAbsolutePath());
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Group provider was not created", 201, responseCode);
attributes.put(GroupProvider.NAME, providerName + 2);
responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName + 2, "PUT", attributes);
assertEquals("Group provider for the same group file was created", SC_UNPROCESSABLE_ENTITY, responseCode);
}
finally
{
groupFile.delete();
}
}
public void testDeleteGroupProvider() throws Exception
{
File groupFile = TestFileUtils.createTempFile(this, ".groups", "testusers.users=test1,test2");
String providerName = getTestName();
try
{
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
attributes.put(FileBasedGroupProvider.PATH, groupFile.getAbsolutePath());
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Expected to fail because we can have only one password provider", 201, responseCode);
responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName , "DELETE");
assertEquals("Group provider was not deleted", 200, responseCode);
getRestTestHelper().submitRequest("groupprovider/" + providerName, "GET", HttpServletResponse.SC_NOT_FOUND);
}
finally
{
groupFile.delete();
}
}
public void testUpdateGroupProviderAttributesFails() throws Exception
{
File groupFile = TestFileUtils.createTempFile(this, ".groups", "testusers.users=test1,test2");
String providerName = getTestName();
try
{
Map<String, Object> attributes = new HashMap<String, Object>();
attributes.put(GroupProvider.NAME, providerName);
attributes.put(GroupProvider.TYPE, FileBasedGroupProviderImpl.GROUP_FILE_PROVIDER_TYPE);
attributes.put(FileBasedGroupProvider.PATH, groupFile.getAbsolutePath());
int responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Password provider should be created successfully", 201, responseCode);
File newGroupFile = TestFileUtils.createTempFile(this, ".groups");
try
{
attributes.put(FileBasedGroupProvider.PATH, newGroupFile.getAbsolutePath());
responseCode = getRestTestHelper().submitRequest("groupprovider/" + providerName, "PUT", attributes);
assertEquals("Changing of group file is unsupported at the moment", SC_UNPROCESSABLE_ENTITY, responseCode);
}
finally
{
newGroupFile.delete();
}
}
finally
{
groupFile.delete();
}
}
public void testRemovalOfGroupProviderInErrorStateUsingManagementMode() throws Exception
{
stopDefaultBroker();
File file = new File(TMP_FOLDER, getTestName());
if (file.exists())
{
file.delete();
}
assertFalse("Group file should not exist", file.exists());
TestBrokerConfiguration config = getDefaultBrokerConfiguration();
config.removeObjectConfiguration(GroupProvider.class, TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE);
UUID id = config.addGroupFileConfiguration(file.getAbsolutePath());
config.setSaved(false);
startDefaultBroker(true);
getRestTestHelper().setUsernameAndPassword(SystemConfig.MANAGEMENT_MODE_USER_NAME, MANAGEMENT_MODE_PASSWORD);
Map<String, Object> groupProvider = getRestTestHelper().getJsonAsSingletonList("groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE);
assertEquals("Unexpected id", id.toString(), groupProvider.get(GroupProvider.ID));
assertEquals("Unexpected path", file.getAbsolutePath() , groupProvider.get(FileBasedGroupProvider.PATH));
assertEquals("Unexpected state", State.ERRORED.name() , groupProvider.get(GroupProvider.STATE));
int status = getRestTestHelper().submitRequest("groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE, "DELETE");
assertEquals("ACL was not deleted", 200, status);
getRestTestHelper().submitRequest("groupprovider/" + TestBrokerConfiguration.ENTRY_NAME_GROUP_FILE,
"GET", HttpServletResponse.SC_NOT_FOUND);
}
private void assertProvider(String name, String type, Map<String, Object> provider)
{
Asserts.assertAttributesPresent(provider, BrokerModel.getInstance().getTypeRegistry().getAttributeNames(
GroupProvider.class),
ConfiguredObject.TYPE,
ConfiguredObject.CREATED_BY,
ConfiguredObject.CREATED_TIME,
ConfiguredObject.LAST_UPDATED_BY,
ConfiguredObject.LAST_UPDATED_TIME,
ConfiguredObject.DESCRIPTION,
ConfiguredObject.CONTEXT,
ConfiguredObject.DESIRED_STATE);
assertEquals("Unexpected value of provider attribute " + GroupProvider.STATE, State.ACTIVE.name(),
provider.get(GroupProvider.STATE));
assertEquals("Unexpected value of provider attribute " + GroupProvider.LIFETIME_POLICY,
LifetimePolicy.PERMANENT.name(), provider.get(GroupProvider.LIFETIME_POLICY));
assertEquals("Unexpected value of provider attribute " + GroupProvider.DURABLE, Boolean.TRUE,
provider.get(GroupProvider.DURABLE));
assertEquals("Unexpected value of provider attribute " + GroupProvider.TYPE, type,
provider.get(GroupProvider.TYPE));
assertEquals("Unexpected value of provider attribute " + GroupProvider.NAME, name,
(String) provider.get(GroupProvider.NAME));
@SuppressWarnings("unchecked")
List<Map<String, Object>> groups = (List<Map<String, Object>>) provider.get("groups");
assertNotNull("Groups were not found", groups);
assertEquals("Unexpected number of groups", 1, groups.size());
for (Map<String, Object> group : groups)
{
final String groupName = (String) group.get(Group.NAME);
assertNotNull("Attribute " + Group.NAME, groupName);
assertNotNull("Attribute " + Group.ID, group.get(Group.ID));
}
}
private File createTemporaryGroupFile() throws Exception
{
File groupFile = File.createTempFile("group", "grp");
groupFile.deleteOnExit();
Properties props = new Properties();
props.put("myGroup.users", "guest");
try(final FileOutputStream out = new FileOutputStream(groupFile))
{
props.store(out, "test group file");
}
return groupFile;
}
}