Search in sources :

Example 1 with NamespaceIsolationDataImpl

use of org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl in project pulsar by apache.

the class ClustersBase method filterAndUnloadMatchedNameSpaces.

// get matched namespaces; call unload for each namespaces;
private void filterAndUnloadMatchedNameSpaces(AsyncResponse asyncResponse, NamespaceIsolationDataImpl policyData) throws Exception {
    Namespaces namespaces = pulsar().getAdminClient().namespaces();
    List<String> nssToUnload = Lists.newArrayList();
    pulsar().getAdminClient().tenants().getTenantsAsync().whenComplete((tenants, ex) -> {
        if (ex != null) {
            log.error("[{}] Failed to get tenants when setNamespaceIsolationPolicy.", clientAppId(), ex);
            return;
        }
        AtomicInteger tenantsNumber = new AtomicInteger(tenants.size());
        // get all tenants now, for each tenants, get its namespaces
        tenants.forEach(tenant -> namespaces.getNamespacesAsync(tenant).whenComplete((nss, e) -> {
            int leftTenantsToHandle = tenantsNumber.decrementAndGet();
            if (e != null) {
                log.error("[{}] Failed to get namespaces for tenant {} when setNamespaceIsolationPolicy.", clientAppId(), tenant, e);
                if (leftTenantsToHandle == 0) {
                    unloadMatchedNamespacesList(asyncResponse, nssToUnload, namespaces);
                }
                return;
            }
            AtomicInteger nssNumber = new AtomicInteger(nss.size());
            // get all namespaces for this tenant now.
            nss.forEach(namespaceName -> {
                int leftNssToHandle = nssNumber.decrementAndGet();
                // if namespace match any policy regex, add it to ns list to be unload.
                if (policyData.getNamespaces().stream().anyMatch(nsnameRegex -> namespaceName.matches(nsnameRegex))) {
                    nssToUnload.add(namespaceName);
                }
                // all the tenants & namespaces get filtered.
                if (leftNssToHandle == 0 && leftTenantsToHandle == 0) {
                    unloadMatchedNamespacesList(asyncResponse, nssToUnload, namespaces);
                }
            });
        }));
    });
}
Also used : Constants(org.apache.pulsar.common.naming.Constants) ClusterDataImpl(org.apache.pulsar.common.policies.data.ClusterDataImpl) ObjectMapperFactory(org.apache.pulsar.common.util.ObjectMapperFactory) Path(javax.ws.rs.Path) LoggerFactory(org.slf4j.LoggerFactory) ApiParam(io.swagger.annotations.ApiParam) ClusterData(org.apache.pulsar.common.policies.data.ClusterData) ApiOperation(io.swagger.annotations.ApiOperation) NamespaceIsolationPolicies(org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicies) MediaType(javax.ws.rs.core.MediaType) AtomicInteger(java.util.concurrent.atomic.AtomicInteger) Example(io.swagger.annotations.Example) Map(java.util.Map) RestException(org.apache.pulsar.broker.web.RestException) NamedEntity(org.apache.pulsar.common.naming.NamedEntity) DELETE(javax.ws.rs.DELETE) BrokerNamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationDataImpl) AsyncResponse(javax.ws.rs.container.AsyncResponse) Set(java.util.Set) Collectors(java.util.stream.Collectors) Suspended(javax.ws.rs.container.Suspended) List(java.util.List) FutureUtil(org.apache.pulsar.common.util.FutureUtil) Response(javax.ws.rs.core.Response) NotFoundException(org.apache.pulsar.metadata.api.MetadataStoreException.NotFoundException) Optional(java.util.Optional) PathParam(javax.ws.rs.PathParam) NamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl) GET(javax.ws.rs.GET) FailureDomainResources(org.apache.pulsar.broker.resources.ClusterResources.FailureDomainResources) CompletableFuture(java.util.concurrent.CompletableFuture) ApiResponses(io.swagger.annotations.ApiResponses) ArrayList(java.util.ArrayList) Lists(com.google.common.collect.Lists) Namespaces(org.apache.pulsar.client.admin.Namespaces) NamespaceIsolationPolicyImpl(org.apache.pulsar.common.policies.impl.NamespaceIsolationPolicyImpl) Status(javax.ws.rs.core.Response.Status) LinkedHashSet(java.util.LinkedHashSet) BrokerNamespaceIsolationData(org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationData) POST(javax.ws.rs.POST) Logger(org.slf4j.Logger) PulsarWebResource(org.apache.pulsar.broker.web.PulsarWebResource) Maps(com.google.common.collect.Maps) ApiResponse(io.swagger.annotations.ApiResponse) ExampleProperty(io.swagger.annotations.ExampleProperty) PUT(javax.ws.rs.PUT) FailureDomainImpl(org.apache.pulsar.common.policies.data.FailureDomainImpl) Collections(java.util.Collections) NamespaceIsolationData(org.apache.pulsar.common.policies.data.NamespaceIsolationData) Namespaces(org.apache.pulsar.client.admin.Namespaces) AtomicInteger(java.util.concurrent.atomic.AtomicInteger)

Example 2 with NamespaceIsolationDataImpl

use of org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl in project pulsar by apache.

the class AdminApiTest method clusterNamespaceIsolationPolicies.

@Test
public void clusterNamespaceIsolationPolicies() throws PulsarAdminException {
    try {
        // create
        String policyName1 = "policy-1";
        Map<String, String> parameters1 = new HashMap<>();
        parameters1.put("min_limit", "1");
        parameters1.put("usage_threshold", "100");
        NamespaceIsolationData nsPolicyData1 = NamespaceIsolationData.builder().namespaces(Collections.singletonList("other/use/other.*")).primary(Lists.newArrayList("prod1-broker[4-6].messaging.use.example.com")).secondary(Lists.newArrayList("prod1-broker.*.messaging.use.example.com")).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters1).build()).build();
        admin.clusters().createNamespaceIsolationPolicy("test", policyName1, nsPolicyData1);
        String policyName2 = "policy-2";
        Map<String, String> parameters2 = new HashMap<>();
        parameters2.put("min_limit", "1");
        parameters2.put("usage_threshold", "100");
        NamespaceIsolationData nsPolicyData2 = NamespaceIsolationData.builder().namespaces(Collections.singletonList("other/use/other.*")).primary(Collections.singletonList("prod1-broker[4-6].messaging.use.example.com")).secondary(Collections.singletonList("prod1-broker.*.messaging.use.example.com")).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters1).build()).build();
        admin.clusters().createNamespaceIsolationPolicy("test", policyName2, nsPolicyData2);
        // verify create indirectly with get
        Map<String, ? extends NamespaceIsolationData> policiesMap = admin.clusters().getNamespaceIsolationPolicies("test");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        assertEquals(policiesMap.get(policyName2), nsPolicyData2);
        // verify update of primary
        nsPolicyData1.getPrimary().remove(0);
        nsPolicyData1.getPrimary().add("prod1-broker[1-2].messaging.use.example.com");
        admin.clusters().updateNamespaceIsolationPolicy("test", policyName1, nsPolicyData1);
        // verify primary change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("test");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of secondary
        nsPolicyData1.getSecondary().remove(0);
        nsPolicyData1.getSecondary().add("prod1-broker[3-4].messaging.use.example.com");
        admin.clusters().updateNamespaceIsolationPolicy("test", policyName1, nsPolicyData1);
        // verify secondary change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("test");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of failover policy limit
        nsPolicyData1.getAutoFailoverPolicy().getParameters().put("min_limit", "10");
        admin.clusters().updateNamespaceIsolationPolicy("test", policyName1, nsPolicyData1);
        // verify min_limit change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("test");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of failover usage_threshold limit
        nsPolicyData1.getAutoFailoverPolicy().getParameters().put("usage_threshold", "80");
        admin.clusters().updateNamespaceIsolationPolicy("test", policyName1, nsPolicyData1);
        // verify usage_threshold change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("test");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify single get
        NamespaceIsolationDataImpl policy1Data = (NamespaceIsolationDataImpl) admin.clusters().getNamespaceIsolationPolicy("test", policyName1);
        assertEquals(policy1Data, nsPolicyData1);
        // verify creation of more than one policy
        admin.clusters().createNamespaceIsolationPolicy("test", policyName2, nsPolicyData1);
        try {
            admin.clusters().getNamespaceIsolationPolicy("test", "no-such-policy");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        // verify delete cluster failed
        try {
            admin.clusters().deleteCluster("test");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        // verify delete
        admin.clusters().deleteNamespaceIsolationPolicy("test", policyName1);
        admin.clusters().deleteNamespaceIsolationPolicy("test", policyName2);
        try {
            admin.clusters().getNamespaceIsolationPolicy("test", policyName1);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicy("test", policyName2);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicies("usc");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicy("usc", "no-such-cluster");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        try {
            admin.clusters().createNamespaceIsolationPolicy("usc", "no-such-cluster", nsPolicyData1);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        try {
            admin.clusters().updateNamespaceIsolationPolicy("usc", "no-such-cluster", policy1Data);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
    } catch (PulsarAdminException e) {
        LOG.warn("TEST FAILED [{}]", e.getMessage());
        throw e;
    }
    // validate regex: invlid regex for primary and seconday
    Map<String, String> parameters = new HashMap<>();
    parameters.put("min_limit", "1");
    parameters.put("usage_threshold", "100");
    NamespaceIsolationData.Builder nsRegexPolicy = NamespaceIsolationData.builder().namespaces(Collections.singletonList("other/use/other.*")).primary(Lists.newArrayList("prod1-broker[45-46].messaging.use.example.com")).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters).build());
    try {
        admin.clusters().createNamespaceIsolationPolicy("test", "invalid_primary", nsRegexPolicy.build());
        fail("should have failed with invalid regex");
    } catch (PulsarAdminException e) {
    // Ok
    }
    nsRegexPolicy.primary(Lists.newArrayList("prod1-broker[45-46].messaging.use.example.com", "prod1-broker[4-5].messaging.use.example.com")).secondary(Collections.singletonList("prod1-broker[45-46].messaging.use.example.com"));
    try {
        admin.clusters().createNamespaceIsolationPolicy("test", "invalid_primary", nsRegexPolicy.build());
        fail("should have failed with invalid regex");
    } catch (PulsarAdminException e) {
    // Ok
    }
}
Also used : HashMap(java.util.HashMap) NamespaceIsolationData(org.apache.pulsar.common.policies.data.NamespaceIsolationData) NotFoundException(org.apache.pulsar.client.admin.PulsarAdminException.NotFoundException) NamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl) PreconditionFailedException(org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedException) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test) MockedPulsarServiceBaseTest(org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest)

Example 3 with NamespaceIsolationDataImpl

use of org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl in project pulsar by apache.

the class AdminTest method clusters.

@Test
public void clusters() throws Exception {
    assertEquals(clusters.getClusters(), Lists.newArrayList());
    verify(clusters, never()).validateSuperUserAccess();
    clusters.createCluster("use", ClusterDataImpl.builder().serviceUrl("http://broker.messaging.use.example.com:8080").build());
    verify(clusters, times(1)).validateSuperUserAccess();
    // ensure to read from ZooKeeper directly
    // clusters.clustersListCache().clear();
    assertEquals(clusters.getClusters(), Lists.newArrayList("use"));
    // Check creating existing cluster
    try {
        clusters.createCluster("use", ClusterDataImpl.builder().serviceUrl("http://broker.messaging.use.example.com:8080").build());
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.CONFLICT.getStatusCode());
    }
    // Check deleting non-existing cluster
    try {
        clusters.deleteCluster("usc");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.NOT_FOUND.getStatusCode());
    }
    assertEquals(clusters.getCluster("use"), ClusterDataImpl.builder().serviceUrl("http://broker.messaging.use.example.com:8080").build());
    verify(clusters, times(4)).validateSuperUserAccess();
    clusters.updateCluster("use", ClusterDataImpl.builder().serviceUrl("http://new-broker.messaging.use.example.com:8080").build());
    verify(clusters, times(5)).validateSuperUserAccess();
    assertEquals(clusters.getCluster("use"), ClusterData.builder().serviceUrl("http://new-broker.messaging.use.example.com:8080").build());
    verify(clusters, times(6)).validateSuperUserAccess();
    try {
        clusters.getNamespaceIsolationPolicies("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), 404);
    }
    Map<String, String> parameters1 = new HashMap<>();
    parameters1.put("min_limit", "1");
    parameters1.put("usage_threshold", "90");
    NamespaceIsolationDataImpl policyData = NamespaceIsolationDataImpl.builder().namespaces(Collections.singletonList("dummy/colo/ns")).primary(Collections.singletonList("localhost" + ":" + pulsar.getListenPortHTTP())).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters1).build()).build();
    AsyncResponse response = mock(AsyncResponse.class);
    clusters.setNamespaceIsolationPolicy(response, "use", "policy1", policyData);
    clusters.getNamespaceIsolationPolicies("use");
    try {
        clusters.deleteCluster("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), 412);
    }
    clusters.deleteNamespaceIsolationPolicy("use", "policy1");
    assertTrue(clusters.getNamespaceIsolationPolicies("use").isEmpty());
    clusters.deleteCluster("use");
    verify(clusters, times(13)).validateSuperUserAccess();
    assertEquals(clusters.getClusters(), Lists.newArrayList());
    try {
        clusters.getCluster("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), 404);
    }
    try {
        clusters.updateCluster("use", ClusterDataImpl.builder().build());
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), 404);
    }
    try {
        clusters.getNamespaceIsolationPolicies("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), 404);
    }
    // Test zk failures
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.GET_CHILDREN && path.equals("/admin/clusters");
    });
    // clear caches to load data from metadata-store again
    MetadataCacheImpl<ClusterData> clusterCache = (MetadataCacheImpl<ClusterData>) pulsar.getPulsarResources().getClusterResources().getCache();
    MetadataCacheImpl isolationPolicyCache = (MetadataCacheImpl) pulsar.getPulsarResources().getNamespaceResources().getIsolationPolicies().getCache();
    AbstractMetadataStore store = (AbstractMetadataStore) clusterCache.getStore();
    clusterCache.invalidateAll();
    store.invalidateAll();
    try {
        clusters.getClusters();
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.CREATE && path.equals("/admin/clusters/test");
    });
    try {
        clusters.createCluster("test", ClusterDataImpl.builder().serviceUrl("http://broker.messaging.test.example.com:8080").build());
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.GET && path.equals("/admin/clusters/test");
    });
    clusterCache.invalidateAll();
    store.invalidateAll();
    try {
        clusters.updateCluster("test", ClusterDataImpl.builder().serviceUrl("http://broker.messaging.test.example.com").build());
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.GET && path.equals("/admin/clusters/test");
    });
    try {
        clusters.getCluster("test");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.GET_CHILDREN && path.equals("/admin/policies");
    });
    try {
        clusters.deleteCluster("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    mockZooKeeperGlobal.failConditional(Code.SESSIONEXPIRED, (op, path) -> {
        return op == MockZooKeeper.Op.GET && path.equals("/admin/clusters/use/namespaceIsolationPolicies");
    });
    clusterCache.invalidateAll();
    isolationPolicyCache.invalidateAll();
    store.invalidateAll();
    try {
        clusters.deleteCluster("use");
        fail("should have failed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.INTERNAL_SERVER_ERROR.getStatusCode());
    }
    // Check name validations
    try {
        clusters.createCluster("bf@", ClusterDataImpl.builder().serviceUrl("http://dummy.messaging.example.com").build());
        fail("should have filed");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
    }
    // Check authentication and listener name
    try {
        clusters.createCluster("auth", ClusterDataImpl.builder().serviceUrl("http://dummy.web.example.com").serviceUrlTls("").brokerServiceUrl("http://dummy.messaging.example.com").brokerServiceUrlTls("").authenticationPlugin("authenticationPlugin").authenticationParameters("authenticationParameters").listenerName("listenerName").build());
        ClusterData cluster = clusters.getCluster("auth");
        assertEquals(cluster.getAuthenticationPlugin(), "authenticationPlugin");
        assertEquals(cluster.getAuthenticationParameters(), "authenticationParameters");
        assertEquals(cluster.getListenerName(), "listenerName");
    } catch (RestException e) {
        assertEquals(e.getResponse().getStatus(), Status.PRECONDITION_FAILED.getStatusCode());
    }
}
Also used : ClusterData(org.apache.pulsar.common.policies.data.ClusterData) AbstractMetadataStore(org.apache.pulsar.metadata.impl.AbstractMetadataStore) HashMap(java.util.HashMap) RestException(org.apache.pulsar.broker.web.RestException) MetadataCacheImpl(org.apache.pulsar.metadata.cache.impl.MetadataCacheImpl) NamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl) AsyncResponse(javax.ws.rs.container.AsyncResponse) Test(org.testng.annotations.Test) MockedPulsarServiceBaseTest(org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest)

Example 4 with NamespaceIsolationDataImpl

use of org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl in project pulsar by apache.

the class V1_AdminApiTest method clusterNamespaceIsolationPolicies.

@Test
public void clusterNamespaceIsolationPolicies() throws PulsarAdminException {
    try {
        // create
        String policyName1 = "policy-1";
        Map<String, String> parameters1 = new HashMap<>();
        parameters1.put("min_limit", "1");
        parameters1.put("usage_threshold", "100");
        NamespaceIsolationData nsPolicyData1 = NamespaceIsolationData.builder().namespaces(Lists.newArrayList("other/use/other.*")).primary(// match all broker. make it easy to verify `getBrokersWithNamespaceIsolationPolicy` later
        Lists.newArrayList(".*")).secondary(Lists.newArrayList("prod1-broker.*.messaging.use.example.com")).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters1).build()).build();
        admin.clusters().createNamespaceIsolationPolicy("use", policyName1, nsPolicyData1);
        String policyName2 = "policy-2";
        Map<String, String> parameters2 = new HashMap<>();
        parameters2.put("min_limit", "1");
        parameters2.put("usage_threshold", "100");
        NamespaceIsolationData nsPolicyData2 = NamespaceIsolationData.builder().namespaces(Lists.newArrayList("other/use/other.*")).primary(Lists.newArrayList("prod1-broker[4-6].messaging.use.example.com")).secondary(Lists.newArrayList("prod1-broker.*.messaging.use.example.com")).autoFailoverPolicy(AutoFailoverPolicyData.builder().policyType(AutoFailoverPolicyType.min_available).parameters(parameters1).build()).build();
        admin.clusters().createNamespaceIsolationPolicy("use", policyName2, nsPolicyData2);
        // verify create indirectly with get
        Map<String, ? extends NamespaceIsolationData> policiesMap = admin.clusters().getNamespaceIsolationPolicies("use");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        assertEquals(policiesMap.get(policyName2), nsPolicyData2);
        // verify local broker get matched.
        List<BrokerNamespaceIsolationData> isoList = admin.clusters().getBrokersWithNamespaceIsolationPolicy("use");
        assertEquals(isoList.size(), 1);
        assertTrue(isoList.get(0).isPrimary());
        // verify update of primary
        nsPolicyData1.getPrimary().remove(0);
        nsPolicyData1.getPrimary().add("prod1-broker[1-2].messaging.use.example.com");
        admin.clusters().updateNamespaceIsolationPolicy("use", policyName1, nsPolicyData1);
        // verify primary change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("use");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of secondary
        nsPolicyData1.getSecondary().remove(0);
        nsPolicyData1.getSecondary().add("prod1-broker[3-4].messaging.use.example.com");
        admin.clusters().updateNamespaceIsolationPolicy("use", policyName1, nsPolicyData1);
        // verify secondary change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("use");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of failover policy limit
        nsPolicyData1.getAutoFailoverPolicy().getParameters().put("min_limit", "10");
        admin.clusters().updateNamespaceIsolationPolicy("use", policyName1, nsPolicyData1);
        // verify min_limit change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("use");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify update of failover usage_threshold limit
        nsPolicyData1.getAutoFailoverPolicy().getParameters().put("usage_threshold", "80");
        admin.clusters().updateNamespaceIsolationPolicy("use", policyName1, nsPolicyData1);
        // verify usage_threshold change
        policiesMap = admin.clusters().getNamespaceIsolationPolicies("use");
        assertEquals(policiesMap.get(policyName1), nsPolicyData1);
        // verify single get
        NamespaceIsolationDataImpl policy1Data = (NamespaceIsolationDataImpl) admin.clusters().getNamespaceIsolationPolicy("use", policyName1);
        assertEquals(policy1Data, nsPolicyData1);
        // verify creation of more than one policy
        admin.clusters().createNamespaceIsolationPolicy("use", policyName2, nsPolicyData1);
        try {
            admin.clusters().getNamespaceIsolationPolicy("use", "no-such-policy");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        // verify delete cluster failed
        try {
            admin.clusters().deleteCluster("use");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        // verify delete
        admin.clusters().deleteNamespaceIsolationPolicy("use", policyName1);
        admin.clusters().deleteNamespaceIsolationPolicy("use", policyName2);
        try {
            admin.clusters().getNamespaceIsolationPolicy("use", policyName1);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicy("use", policyName2);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicies("usc");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof NotFoundException);
        }
        try {
            admin.clusters().getNamespaceIsolationPolicy("usc", "no-such-cluster");
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        try {
            admin.clusters().createNamespaceIsolationPolicy("usc", "no-such-cluster", nsPolicyData1);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
        try {
            admin.clusters().updateNamespaceIsolationPolicy("usc", "no-such-cluster", policy1Data);
            fail("should have raised exception");
        } catch (PulsarAdminException e) {
            assertTrue(e instanceof PreconditionFailedException);
        }
    } catch (PulsarAdminException e) {
        LOG.warn("TEST FAILED [{}]", e.getMessage());
        throw e;
    }
}
Also used : BrokerNamespaceIsolationData(org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationData) HashMap(java.util.HashMap) BrokerNamespaceIsolationData(org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationData) NamespaceIsolationData(org.apache.pulsar.common.policies.data.NamespaceIsolationData) NotFoundException(org.apache.pulsar.client.admin.PulsarAdminException.NotFoundException) NamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl) PreconditionFailedException(org.apache.pulsar.client.admin.PulsarAdminException.PreconditionFailedException) PulsarAdminException(org.apache.pulsar.client.admin.PulsarAdminException) Test(org.testng.annotations.Test) MockedPulsarServiceBaseTest(org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest)

Example 5 with NamespaceIsolationDataImpl

use of org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl in project pulsar by apache.

the class ModularLoadManagerImplTest method testNamespaceIsolationPoliciesForPrimaryAndSecondaryBrokers.

/**
 * It verifies namespace-isolation policies with primary and secondary brokers.
 *
 * usecase:
 *
 * <pre>
 *  1. Namespace: primary=broker1, secondary=broker2, shared=broker3, min_limit = 1
 *     a. available-brokers: broker1, broker2, broker3 => result: broker1
 *     b. available-brokers: broker2, broker3          => result: broker2
 *     c. available-brokers: broker3                   => result: NULL
 *  2. Namespace: primary=broker1, secondary=broker2, shared=broker3, min_limit = 2
 *     a. available-brokers: broker1, broker2, broker3 => result: broker1, broker2
 *     b. available-brokers: broker2, broker3          => result: broker2
 *     c. available-brokers: broker3                   => result: NULL
 * </pre>
 *
 * @throws Exception
 */
@Test
public void testNamespaceIsolationPoliciesForPrimaryAndSecondaryBrokers() throws Exception {
    final String tenant = "my-property";
    final String cluster = "use";
    final String namespace = "my-ns";
    final String broker1Address = pulsar1.getAdvertisedAddress() + "0";
    final String broker2Address = pulsar2.getAdvertisedAddress() + "1";
    final String sharedBroker = "broker3";
    admin1.clusters().createCluster(cluster, ClusterData.builder().serviceUrl("http://" + pulsar1.getAdvertisedAddress()).build());
    admin1.tenants().createTenant(tenant, new TenantInfoImpl(Sets.newHashSet("appid1", "appid2"), Sets.newHashSet(cluster)));
    admin1.namespaces().createNamespace(tenant + "/" + cluster + "/" + namespace);
    // set a new policy
    String newPolicyJsonTemplate = "{\"namespaces\":[\"%s/%s/%s.*\"],\"primary\":[\"%s\"]," + "\"secondary\":[\"%s\"],\"auto_failover_policy\":{\"policy_type\":\"min_available\",\"parameters\":{\"min_limit\":%s,\"usage_threshold\":80}}}";
    String newPolicyJson = String.format(newPolicyJsonTemplate, tenant, cluster, namespace, broker1Address, broker2Address, 1);
    String newPolicyName = "my-ns-isolation-policies";
    ObjectMapper jsonMapper = ObjectMapperFactory.create();
    NamespaceIsolationDataImpl nsPolicyData = jsonMapper.readValue(newPolicyJson.getBytes(), NamespaceIsolationDataImpl.class);
    admin1.clusters().createNamespaceIsolationPolicy("use", newPolicyName, nsPolicyData);
    SimpleResourceAllocationPolicies simpleResourceAllocationPolicies = new SimpleResourceAllocationPolicies(pulsar1);
    ServiceUnitId serviceUnit = LoadBalancerTestingUtils.makeBundles(nsFactory, tenant, cluster, namespace, 1)[0];
    BrokerTopicLoadingPredicate brokerTopicLoadingPredicate = new BrokerTopicLoadingPredicate() {

        @Override
        public boolean isEnablePersistentTopics(String brokerUrl) {
            return true;
        }

        @Override
        public boolean isEnableNonPersistentTopics(String brokerUrl) {
            return true;
        }
    };
    // (1) now we have isolation policy : primary=broker1, secondary=broker2, minLimit=1
    // test1: shared=1, primary=1, secondary=1 => It should return 1 primary broker only
    Set<String> brokerCandidateCache = Sets.newHashSet();
    Set<String> availableBrokers = Sets.newHashSet(sharedBroker, broker1Address, broker2Address);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 1);
    assertTrue(brokerCandidateCache.contains(broker1Address));
    // test2: shared=1, primary=0, secondary=1 => It should return 1 secondary broker only
    brokerCandidateCache = Sets.newHashSet();
    availableBrokers = Sets.newHashSet(sharedBroker, broker2Address);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 1);
    assertTrue(brokerCandidateCache.contains(broker2Address));
    // test3: shared=1, primary=0, secondary=0 => It should return 0 broker
    brokerCandidateCache = Sets.newHashSet();
    availableBrokers = Sets.newHashSet(sharedBroker);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 0);
    // (2) now we will have isolation policy : primary=broker1, secondary=broker2, minLimit=2
    newPolicyJson = String.format(newPolicyJsonTemplate, tenant, cluster, namespace, broker1Address, broker2Address, 2);
    nsPolicyData = jsonMapper.readValue(newPolicyJson.getBytes(), NamespaceIsolationDataImpl.class);
    admin1.clusters().createNamespaceIsolationPolicy("use", newPolicyName, nsPolicyData);
    // test1: shared=1, primary=1, secondary=1 => It should return primary + secondary
    brokerCandidateCache = Sets.newHashSet();
    availableBrokers = Sets.newHashSet(sharedBroker, broker1Address, broker2Address);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 2);
    assertTrue(brokerCandidateCache.contains(broker1Address));
    assertTrue(brokerCandidateCache.contains(broker2Address));
    // test2: shared=1, secondary=1 => It should return secondary
    brokerCandidateCache = Sets.newHashSet();
    availableBrokers = Sets.newHashSet(sharedBroker, broker2Address);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 1);
    assertTrue(brokerCandidateCache.contains(broker2Address));
    // test3: shared=1, => It should return 0 broker
    brokerCandidateCache = Sets.newHashSet();
    availableBrokers = Sets.newHashSet(sharedBroker);
    LoadManagerShared.applyNamespacePolicies(serviceUnit, simpleResourceAllocationPolicies, brokerCandidateCache, availableBrokers, brokerTopicLoadingPredicate);
    assertEquals(brokerCandidateCache.size(), 0);
}
Also used : BrokerTopicLoadingPredicate(org.apache.pulsar.broker.loadbalance.impl.LoadManagerShared.BrokerTopicLoadingPredicate) SimpleResourceAllocationPolicies(org.apache.pulsar.broker.loadbalance.impl.SimpleResourceAllocationPolicies) NamespaceIsolationDataImpl(org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl) ServiceUnitId(org.apache.pulsar.common.naming.ServiceUnitId) TenantInfoImpl(org.apache.pulsar.common.policies.data.TenantInfoImpl) ObjectMapper(com.fasterxml.jackson.databind.ObjectMapper) Test(org.testng.annotations.Test)

Aggregations

NamespaceIsolationDataImpl (org.apache.pulsar.common.policies.data.NamespaceIsolationDataImpl)27 Test (org.testng.annotations.Test)18 HashMap (java.util.HashMap)15 NamespaceIsolationData (org.apache.pulsar.common.policies.data.NamespaceIsolationData)13 Map (java.util.Map)11 CompletableFuture (java.util.concurrent.CompletableFuture)11 ObjectMapper (com.fasterxml.jackson.databind.ObjectMapper)9 MockedPulsarServiceBaseTest (org.apache.pulsar.broker.auth.MockedPulsarServiceBaseTest)9 BrokerNamespaceIsolationData (org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationData)9 BrokerNamespaceIsolationDataImpl (org.apache.pulsar.common.policies.data.BrokerNamespaceIsolationDataImpl)9 WebTarget (javax.ws.rs.client.WebTarget)6 AsyncResponse (javax.ws.rs.container.AsyncResponse)6 RestException (org.apache.pulsar.broker.web.RestException)6 ClusterData (org.apache.pulsar.common.policies.data.ClusterData)6 Collections (java.util.Collections)5 List (java.util.List)5 Response (javax.ws.rs.core.Response)5 Status (javax.ws.rs.core.Response.Status)5 ClusterDataImpl (org.apache.pulsar.common.policies.data.ClusterDataImpl)5 Lists (com.google.common.collect.Lists)3