Merge remote-tracking branch 'origin/feature_multi_tenant' into feature_multi_tenant

This commit is contained in:
nkorange 2019-01-09 20:36:21 +08:00
commit ec8117d7cd
2 changed files with 388 additions and 8 deletions

View File

@ -32,7 +32,7 @@ import static com.alibaba.nacos.test.naming.NamingBase.*;
@RunWith(SpringRunner.class)
@SpringBootTest(classes = NamingApp.class, properties = {"server.servlet.context-path=/nacos"},
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MultipleTenant_ITCase {
public class MultiTenant_ITCase {
private NamingService naming;
private NamingService naming1;
@ -45,19 +45,16 @@ public class MultipleTenant_ITCase {
@Before
public void init() throws Exception {
naming = NamingFactory.createNamingService("127.0.0.1" + ":" + port);
//naming = NamingFactory.createNamingService(serverList);
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "namespace-1");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1" + ":" + port);
//properties.put(PropertyKeyConst.SERVER_ADDR, serverList);
naming1 = NamingFactory.createNamingService(properties);
properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "namespace-2");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1" + ":" + port);
//properties.put(PropertyKeyConst.SERVER_ADDR, serverList);
naming2 = NamingFactory.createNamingService(properties);
}
@ -297,14 +294,12 @@ public class MultipleTenant_ITCase {
Assert.assertEquals(2, naming1.getAllInstances(serviceName).size());
Instance instance = naming1.selectOneHealthyInstance(serviceName, Arrays.asList("c1"));
Assert.assertEquals("11.11.11.11", instances.get(0).getIp());
instance = naming2.selectOneHealthyInstance(serviceName, Arrays.asList("c1"));
Assert.assertNull(instance);
Assert.assertEquals("11.11.11.11", instance.getIp());
naming1.deregisterInstance(serviceName, "11.11.11.11", TEST_PORT);
TimeUnit.SECONDS.sleep(2);
instance = naming1.selectOneHealthyInstance(serviceName);
Assert.assertEquals("22.22.22.22", instances.get(0).getIp());
Assert.assertEquals("22.22.22.22", instance.getIp());
}
private void verifyInstanceListForNaming(NamingService naming, int size, String serviceName) throws Exception {

View File

@ -0,0 +1,385 @@
package com.alibaba.nacos.test.naming;
import java.net.URL;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.TimeUnit;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.nacos.api.PropertyKeyConst;
import com.alibaba.nacos.api.naming.NamingFactory;
import com.alibaba.nacos.api.naming.NamingService;
import com.alibaba.nacos.api.naming.listener.Event;
import com.alibaba.nacos.api.naming.listener.EventListener;
import com.alibaba.nacos.api.naming.listener.NamingEvent;
import com.alibaba.nacos.api.naming.pojo.Instance;
import com.alibaba.nacos.api.naming.pojo.ListView;
import com.alibaba.nacos.naming.NamingApp;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.boot.test.web.client.TestRestTemplate;
import org.springframework.boot.web.server.LocalServerPort;
import org.springframework.http.HttpEntity;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpMethod;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.util.MultiValueMap;
import org.springframework.web.util.UriComponentsBuilder;
import static com.alibaba.nacos.test.naming.NamingBase.*;
/**
* @author <a href="mailto:zpf.073@gmail.com">nkorange</a>
*/
@RunWith(SpringRunner.class)
@SpringBootTest(classes = NamingApp.class, properties = {"server.servlet.context-path=/nacos"},
webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT)
public class MultiTenant_InstanceAPI_ITCase {
private NamingService naming;
private NamingService naming1;
private NamingService naming2;
@LocalServerPort
private int port;
@Autowired
private TestRestTemplate restTemplate;
private URL base;
private volatile List<Instance> instances = Collections.emptyList();
@Before
public void init() throws Exception {
String url = String.format("http://localhost:%d/", port);
this.base = new URL(url);
naming = NamingFactory.createNamingService("127.0.0.1" + ":" + port);
Properties properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "namespace-1");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1" + ":" + port);
naming1 = NamingFactory.createNamingService(properties);
properties = new Properties();
properties.put(PropertyKeyConst.NAMESPACE, "namespace-2");
properties.put(PropertyKeyConst.SERVER_ADDR, "127.0.0.1" + ":" + port);
naming2 = NamingFactory.createNamingService(properties);
}
/**
* @TCDescription : 多租户注册IPlistInstance接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_listInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
String url = "/nacos/v1/ns/instance/list";
ResponseEntity<String> response = request(url,
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("namespaceId", "namespace-1")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals("11.11.11.11", json.getJSONArray("hosts").getJSONObject(0).getString("ip"));
response = request(url,
Params.newParams()
.appendParam("serviceName", serviceName)
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
json = JSON.parseObject(response.getBody());
Assert.assertEquals(2, json.getJSONArray("hosts").size());
}
/**
* @TCDescription : 多租户注册IPgetInstance接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_getInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
ResponseEntity<String> response = request("/nacos/v1/ns/instance",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "33.33.33.33") //错误的IP隔离验证
.appendParam("port", "8888")
.appendParam("namespaceId", "namespace-2")
.done(),
String.class);
Assert.assertEquals(HttpStatus.INTERNAL_SERVER_ERROR, response.getStatusCode());
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "33.33.33.33")
.appendParam("port", "8888")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals(2, json.getJSONArray("hosts").size());
}
/**
* @TCDescription : 多租户注册IPdeleteInstance接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_deleteInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
ResponseEntity<String> response = request("/nacos/v1/ns/instance",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "33.33.33.33")
.appendParam("port", "8888")
.appendParam("namespaceId", "namespace-1") //删除namespace-1中没有的IP
.done(),
String.class,
HttpMethod.DELETE);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals(2, json.getJSONArray("hosts").size());
}
/**
* @TCDescription : 多租户注册IPputInstance接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_putInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
ResponseEntity<String> response = request("/nacos/v1/ns/instance",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "33.33.33.33")
.appendParam("port", "8888")
.appendParam("namespaceId", "namespace-1") //新增
.done(),
String.class,
HttpMethod.PUT);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-1")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals(2, json.getJSONArray("hosts").size());
//namespace-2个数
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-2")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
json = JSON.parseObject(response.getBody());
System.out.println(json);
Assert.assertEquals(1, json.getJSONArray("hosts").size());
}
/**
* @TCDescription : 多租户注册IPupdate一个没有的实例接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_updateInstance_notExsitInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
ResponseEntity<String> response = request("/nacos/v1/ns/instance",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "33.33.33.33")
.appendParam("port", "8888")
.appendParam("namespaceId", "namespace-1") //新增
.done(),
String.class,
HttpMethod.POST);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-1")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals(2, json.getJSONArray("hosts").size());
//namespace-2个数
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-2")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
json = JSON.parseObject(response.getBody());
System.out.println(json);
Assert.assertEquals(1, json.getJSONArray("hosts").size());
}
/**
* @TCDescription : 多租户注册IPupdate一个已有的实例接口
* @TestStep :
* @ExpectResult :
*/
@Test
public void multipleTenant_updateInstance() throws Exception {
String serviceName = randomDomainName();
naming1.registerInstance(serviceName, "11.11.11.11", 80);
naming2.registerInstance(serviceName, "22.22.22.22", 80);
naming.registerInstance(serviceName, "33.33.33.33", 8888);
naming.registerInstance(serviceName, "44.44.44.44", 8888);
TimeUnit.SECONDS.sleep(5L);
ResponseEntity<String> response = request("/nacos/v1/ns/instance",
Params.newParams()
.appendParam("serviceName", serviceName)
.appendParam("ip", "11.11.11.11")
.appendParam("port", "80")
.appendParam("namespaceId", "namespace-1") //新增
.done(),
String.class,
HttpMethod.POST);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-1")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
JSONObject json = JSON.parseObject(response.getBody());
Assert.assertEquals(1, json.getJSONArray("hosts").size());
//namespace-2个数
response = request("/nacos/v1/ns/instance/list",
Params.newParams()
.appendParam("serviceName", serviceName) //获取naming中的实例
.appendParam("namespaceId", "namespace-2")
.done(),
String.class);
Assert.assertTrue(response.getStatusCode().is2xxSuccessful());
json = JSON.parseObject(response.getBody());
Assert.assertEquals(1, json.getJSONArray("hosts").size());
}
private void verifyInstanceListForNaming(NamingService naming, int size, String serviceName) throws Exception {
int i = 0;
while ( i < 20 ) {
List<Instance> instances = naming.getAllInstances(serviceName);
if (instances.size() == size) {
break;
} else {
TimeUnit.SECONDS.sleep(3);
i++;
}
}
}
private <T> ResponseEntity<T> request(String path, MultiValueMap<String, String> params, Class<T> clazz) {
return request(path, params, clazz, HttpMethod.GET);
}
private <T> ResponseEntity<T> request(String path, MultiValueMap<String, String> params, Class<T> clazz, HttpMethod httpMethod) {
HttpHeaders headers = new HttpHeaders();
HttpEntity<?> entity = new HttpEntity<T>(headers);
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(this.base.toString() + path)
.queryParams(params);
return this.restTemplate.exchange(
builder.toUriString(), httpMethod, entity, clazz);
}
}