blob: bdf1c3bdecbc9e0a940055858df9510863343952 [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.pulsar.broker.admin;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest;
import org.apache.pulsar.broker.web.RestException;
import org.apache.pulsar.client.admin.PulsarAdminException;
import org.apache.pulsar.broker.admin.v2.ResourceGroups;
import org.apache.pulsar.common.policies.data.ClusterData;
import org.apache.pulsar.common.policies.data.ResourceGroup;
import org.apache.pulsar.common.policies.data.TenantInfoImpl;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.spy;
import static org.testng.Assert.*;
public class ResourceGroupsTest extends MockedPulsarServiceBaseTest {
private ResourceGroups resourcegroups;
private List<String> expectedRgNames = Lists.newArrayList();
private final String testCluster = "test";
private final String testTenant = "test-tenant";
private final String testNameSpace = "test-tenant/test-namespace";
@BeforeClass
@Override
protected void setup() throws Exception {
super.internalSetup();
resourcegroups = spy(ResourceGroups.class);
resourcegroups.setServletContext(new MockServletContext());
resourcegroups.setPulsar(pulsar);
doReturn(false).when(resourcegroups).isRequestHttps();
doReturn("test").when(resourcegroups).clientAppId();
doReturn(null).when(resourcegroups).originalPrincipal();
doReturn(null).when(resourcegroups).clientAuthData();
prepareData();
}
@AfterClass(alwaysRun = true)
@Override
protected void cleanup() throws Exception {
super.internalCleanup();
}
@Test
public void testCrudResourceGroups() throws Exception {
// create with null resourcegroup should fail.
try {
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-invalid", null);
fail("should have failed");
} catch (RestException e){
//Ok.
}
// create resourcegroup with default values
ResourceGroup testResourceGroupOne = new ResourceGroup();
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-one", testResourceGroupOne);
expectedRgNames.add("test-resourcegroup-one");
// create resourcegroup with non default values.
ResourceGroup testResourceGroupTwo = new ResourceGroup();
testResourceGroupTwo.setDispatchRateInBytes(10000L);
testResourceGroupTwo.setDispatchRateInMsgs(100);
testResourceGroupTwo.setPublishRateInMsgs(100);
testResourceGroupTwo.setPublishRateInBytes(10000L);
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-two", testResourceGroupTwo);
expectedRgNames.add("test-resourcegroup-two");
// null resourcegroup update should fail.
try {
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-one", null);
fail("should have failed");
} catch (RestException e){
//Ok.
}
// update with some real values
ResourceGroup testResourceGroupOneUpdate = new ResourceGroup();
testResourceGroupOneUpdate.setDispatchRateInMsgs(50);
testResourceGroupOneUpdate.setDispatchRateInBytes(5000L);
testResourceGroupOneUpdate.setPublishRateInMsgs(10);
testResourceGroupOneUpdate.setPublishRateInBytes(1000L);
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-one", testResourceGroupOneUpdate);
// get a non existent resourcegroup
try {
resourcegroups.getResourceGroup("test-resourcegroup-invalid");
fail("should have failed");
} catch (RestException e) {
//Ok
}
// get list of all resourcegroups
List<String> gotRgNames = resourcegroups.getResourceGroups();
assertEquals(gotRgNames.size(), expectedRgNames.size());
Collections.sort(gotRgNames);
Collections.sort(expectedRgNames);
assertEquals(gotRgNames, expectedRgNames);
// delete a non existent resourcegroup
try {
resourcegroups.deleteResourceGroup("test-resourcegroup-invalid");
fail("should have failed");
} catch (RestException e) {
//Ok
}
// delete the ResourceGroups we created.
Iterator<String> rg_Iterator = expectedRgNames.iterator();
while (rg_Iterator.hasNext()) {
resourcegroups.deleteResourceGroup(rg_Iterator.next());
}
}
@Test
public void testNamespaceResourceGroup() throws Exception {
// create resourcegroup with non default values.
ResourceGroup testResourceGroupTwo = new ResourceGroup();
testResourceGroupTwo.setDispatchRateInBytes(10000L);
testResourceGroupTwo.setDispatchRateInMsgs(100);
testResourceGroupTwo.setPublishRateInMsgs(100);
testResourceGroupTwo.setPublishRateInBytes(10000L);
resourcegroups.createOrUpdateResourceGroup("test-resourcegroup-three", testResourceGroupTwo);
admin.namespaces().createNamespace(testNameSpace);
// set invalid ResourceGroup in namespace
try {
admin.namespaces().setNamespaceResourceGroup(testNameSpace, "test-resourcegroup-invalid");
fail("should have failed");
} catch (Exception e){
//Ok.
}
// set resourcegroup in namespace
admin.namespaces().setNamespaceResourceGroup(testNameSpace, "test-resourcegroup-three");
// try deleting the resourcegroup, should fail
try {
resourcegroups.deleteResourceGroup("test-resourcegroup-three");
} catch (RestException e) {
//Ok
}
// remove resourcegroup from namespace
admin.namespaces().removeNamespaceResourceGroup(testNameSpace);
resourcegroups.deleteResourceGroup("test-resourcegroup-three");
}
private void prepareData() throws PulsarAdminException {
admin.clusters().createCluster(testCluster, ClusterData.builder().serviceUrl(pulsar.getWebServiceAddress()).build());
admin.tenants().createTenant(testTenant,
new TenantInfoImpl(Sets.newHashSet("role1", "role2"), Sets.newHashSet(testCluster)));
}
}