use of com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity in project spring-boot-student by wyh-spring-ecosystem-student.
the class GatewayApiControllerTest method testQueryApis.
@Test
public void testQueryApis() throws Exception {
String path = "/gateway/api/list.json";
List<ApiDefinitionEntity> entities = new ArrayList<>();
// Mock two entities
ApiDefinitionEntity entity = new ApiDefinitionEntity();
entity.setId(1L);
entity.setApp(TEST_APP);
entity.setIp(TEST_IP);
entity.setPort(TEST_PORT);
entity.setApiName("foo");
Date date = new Date();
entity.setGmtCreate(date);
entity.setGmtModified(date);
Set<ApiPredicateItemEntity> itemEntities = new LinkedHashSet<>();
entity.setPredicateItems(itemEntities);
ApiPredicateItemEntity itemEntity = new ApiPredicateItemEntity();
itemEntity.setPattern("/aaa");
itemEntity.setMatchStrategy(URL_MATCH_STRATEGY_EXACT);
itemEntities.add(itemEntity);
entities.add(entity);
ApiDefinitionEntity entity2 = new ApiDefinitionEntity();
entity2.setId(2L);
entity2.setApp(TEST_APP);
entity2.setIp(TEST_IP);
entity2.setPort(TEST_PORT);
entity2.setApiName("biz");
entity.setGmtCreate(date);
entity.setGmtModified(date);
Set<ApiPredicateItemEntity> itemEntities2 = new LinkedHashSet<>();
entity2.setPredicateItems(itemEntities2);
ApiPredicateItemEntity itemEntity2 = new ApiPredicateItemEntity();
itemEntity2.setPattern("/bbb");
itemEntity2.setMatchStrategy(URL_MATCH_STRATEGY_PREFIX);
itemEntities2.add(itemEntity2);
entities.add(entity2);
CompletableFuture<List<ApiDefinitionEntity>> completableFuture = mock(CompletableFuture.class);
given(completableFuture.get()).willReturn(entities);
given(sentinelApiClient.fetchApis(TEST_APP, TEST_IP, TEST_PORT)).willReturn(completableFuture);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.get(path);
requestBuilder.param("app", TEST_APP);
requestBuilder.param("ip", TEST_IP);
requestBuilder.param("port", String.valueOf(TEST_PORT));
// Do controller logic
MvcResult mvcResult = mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
// Verify the fetchApis method has been called
verify(sentinelApiClient).fetchApis(TEST_APP, TEST_IP, TEST_PORT);
// Verify if two same entities are got
Result<List<ApiDefinitionEntity>> result = JSONObject.parseObject(mvcResult.getResponse().getContentAsString(), new TypeReference<Result<List<ApiDefinitionEntity>>>() {
});
assertTrue(result.isSuccess());
List<ApiDefinitionEntity> data = result.getData();
assertEquals(2, data.size());
assertEquals(entities, data);
// Verify the entities are add into memory repository
List<ApiDefinitionEntity> entitiesInMem = repository.findAllByApp(TEST_APP);
assertEquals(2, entitiesInMem.size());
assertEquals(entities, entitiesInMem);
}
use of com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity in project spring-boot-student by wyh-spring-ecosystem-student.
the class GatewayApiControllerTest method testDeleteApi.
@Test
public void testDeleteApi() throws Exception {
String path = "/gateway/api/delete.json";
// Add one entity into memory repository for delete
ApiDefinitionEntity addEntity = new ApiDefinitionEntity();
addEntity.setApp(TEST_APP);
addEntity.setIp(TEST_IP);
addEntity.setPort(TEST_PORT);
addEntity.setApiName("ccc");
Date date = new Date();
addEntity.setGmtCreate(date);
addEntity.setGmtModified(date);
Set<ApiPredicateItemEntity> addRedicateItemEntities = new HashSet<>();
addEntity.setPredicateItems(addRedicateItemEntities);
ApiPredicateItemEntity addPredicateItemEntity = new ApiPredicateItemEntity();
addPredicateItemEntity.setMatchStrategy(URL_MATCH_STRATEGY_EXACT);
addPredicateItemEntity.setPattern("/user/add");
addEntity = repository.save(addEntity);
given(sentinelApiClient.modifyApis(eq(TEST_APP), eq(TEST_IP), eq(TEST_PORT), any())).willReturn(true);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post(path);
requestBuilder.param("id", String.valueOf(addEntity.getId()));
// Do controller logic
MvcResult mvcResult = mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
// Verify the modifyApis method has been called
verify(sentinelApiClient).modifyApis(eq(TEST_APP), eq(TEST_IP), eq(TEST_PORT), any());
// Verify the result
Result<Long> result = JSONObject.parseObject(mvcResult.getResponse().getContentAsString(), new TypeReference<Result<Long>>() {
});
assertTrue(result.isSuccess());
assertEquals(addEntity.getId(), result.getData());
// Now no entities in memory
List<ApiDefinitionEntity> entitiesInMem = repository.findAllByApp(TEST_APP);
assertEquals(0, entitiesInMem.size());
}
use of com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity in project spring-boot-student by wyh-spring-ecosystem-student.
the class GatewayApiControllerTest method testAddApi.
@Test
public void testAddApi() throws Exception {
String path = "/gateway/api/new.json";
AddApiReqVo reqVo = new AddApiReqVo();
reqVo.setApp(TEST_APP);
reqVo.setIp(TEST_IP);
reqVo.setPort(TEST_PORT);
reqVo.setApiName("customized_api");
List<ApiPredicateItemVo> itemVos = new ArrayList<>();
ApiPredicateItemVo itemVo = new ApiPredicateItemVo();
itemVo.setMatchStrategy(URL_MATCH_STRATEGY_EXACT);
itemVo.setPattern("/product");
itemVos.add(itemVo);
reqVo.setPredicateItems(itemVos);
given(sentinelApiClient.modifyApis(eq(TEST_APP), eq(TEST_IP), eq(TEST_PORT), any())).willReturn(true);
MockHttpServletRequestBuilder requestBuilder = MockMvcRequestBuilders.post(path);
requestBuilder.content(JSON.toJSONString(reqVo)).contentType(MediaType.APPLICATION_JSON);
// Do controller logic
MvcResult mvcResult = mockMvc.perform(requestBuilder).andExpect(MockMvcResultMatchers.status().isOk()).andDo(MockMvcResultHandlers.print()).andReturn();
// Verify the modifyApis method has been called
verify(sentinelApiClient).modifyApis(eq(TEST_APP), eq(TEST_IP), eq(TEST_PORT), any());
Result<ApiDefinitionEntity> result = JSONObject.parseObject(mvcResult.getResponse().getContentAsString(), new TypeReference<Result<ApiDefinitionEntity>>() {
});
assertTrue(result.isSuccess());
// Verify the result
ApiDefinitionEntity entity = result.getData();
assertNotNull(entity);
assertEquals(TEST_APP, entity.getApp());
assertEquals(TEST_IP, entity.getIp());
assertEquals(TEST_PORT, entity.getPort());
assertEquals("customized_api", entity.getApiName());
assertNotNull(entity.getId());
assertNotNull(entity.getGmtCreate());
assertNotNull(entity.getGmtModified());
Set<ApiPredicateItemEntity> predicateItemEntities = entity.getPredicateItems();
assertEquals(1, predicateItemEntities.size());
ApiPredicateItemEntity predicateItemEntity = predicateItemEntities.iterator().next();
assertEquals(URL_MATCH_STRATEGY_EXACT, predicateItemEntity.getMatchStrategy().intValue());
assertEquals("/product", predicateItemEntity.getPattern());
// Verify the entity which is add in memory repository
List<ApiDefinitionEntity> entitiesInMem = repository.findAllByApp(TEST_APP);
assertEquals(1, entitiesInMem.size());
assertEquals(entity, entitiesInMem.get(0));
}
use of com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity in project spring-boot-student by wyh-spring-ecosystem-student.
the class GatewayApiController method updateApi.
@PostMapping("/save.json")
@AuthAction(AuthService.PrivilegeType.WRITE_RULE)
public Result<ApiDefinitionEntity> updateApi(@RequestBody UpdateApiReqVo reqVo) {
String app = reqVo.getApp();
if (StringUtil.isBlank(app)) {
return Result.ofFail(-1, "app can't be null or empty");
}
Long id = reqVo.getId();
if (id == null) {
return Result.ofFail(-1, "id can't be null");
}
ApiDefinitionEntity entity = repository.findById(id);
if (entity == null) {
return Result.ofFail(-1, "api does not exist, id=" + id);
}
// 匹配规则列表
List<ApiPredicateItemVo> predicateItems = reqVo.getPredicateItems();
if (CollectionUtils.isEmpty(predicateItems)) {
return Result.ofFail(-1, "predicateItems can't empty");
}
List<ApiPredicateItemEntity> predicateItemEntities = new ArrayList<>();
for (ApiPredicateItemVo predicateItem : predicateItems) {
ApiPredicateItemEntity predicateItemEntity = new ApiPredicateItemEntity();
// 匹配模式
int matchStrategy = predicateItem.getMatchStrategy();
if (!Arrays.asList(URL_MATCH_STRATEGY_EXACT, URL_MATCH_STRATEGY_PREFIX, URL_MATCH_STRATEGY_REGEX).contains(matchStrategy)) {
return Result.ofFail(-1, "Invalid matchStrategy: " + matchStrategy);
}
predicateItemEntity.setMatchStrategy(matchStrategy);
// 匹配串
String pattern = predicateItem.getPattern();
if (StringUtil.isBlank(pattern)) {
return Result.ofFail(-1, "pattern can't be null or empty");
}
predicateItemEntity.setPattern(pattern);
predicateItemEntities.add(predicateItemEntity);
}
entity.setPredicateItems(new LinkedHashSet<>(predicateItemEntities));
Date date = new Date();
entity.setGmtModified(date);
try {
entity = repository.save(entity);
} catch (Throwable throwable) {
logger.error("update gateway api error:", throwable);
return Result.ofThrowable(-1, throwable);
}
if (!publishApis(app, entity.getIp(), entity.getPort())) {
logger.warn("publish gateway apis fail after update");
}
return Result.ofSuccess(entity);
}
use of com.alibaba.csp.sentinel.dashboard.datasource.entity.gateway.ApiDefinitionEntity in project spring-boot-student by wyh-spring-ecosystem-student.
the class SentinelApiClient method fetchApis.
public CompletableFuture<List<ApiDefinitionEntity>> fetchApis(String app, String ip, int port) {
if (StringUtil.isBlank(ip) || port <= 0) {
return AsyncUtils.newFailedFuture(new IllegalArgumentException("Invalid parameter"));
}
try {
return executeCommand(ip, port, FETCH_GATEWAY_API_PATH, false).thenApply(r -> {
List<ApiDefinitionEntity> entities = JSON.parseArray(r, ApiDefinitionEntity.class);
if (entities != null) {
for (ApiDefinitionEntity entity : entities) {
entity.setApp(app);
entity.setIp(ip);
entity.setPort(port);
}
}
return entities;
});
} catch (Exception ex) {
logger.warn("Error when fetching gateway apis", ex);
return AsyncUtils.newFailedFuture(ex);
}
}
Aggregations