diff --git a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java index f2aad41ed54eae6589ba5100b7e8f51ddd0663c8..423322381bf00729f97c81cf108710e307eff8da 100755 --- a/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java +++ b/plugin/kvm/src/main/java/org/zstack/kvm/KVMAgentCommands.java @@ -868,6 +868,7 @@ public class KVMAgentCommands { public static class NicTO extends BaseVirtualDeviceTO { private String mac; private List ips; + private String ipForTf; private String bridgeName; // run `bridge fdb add NicTO.mac dev NicTO.physicalInterface` on vnics to allow vf <-> vnic communication private String physicalInterface; @@ -897,6 +898,14 @@ public class KVMAgentCommands { this.ips = ips; } + public String getIpForTf() { + return ipForTf; + } + + public void setIpForTf(String ipForTf) { + this.ipForTf = ipForTf; + } + public String getUuid() { return uuid; } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiBuilder.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiBuilder.java index e7e1ea41bab853f959adb6e59b95a191447a27dc..1d11c3ea8b5d1a9217bc6b6984568f6631947530 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiBuilder.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiBuilder.java @@ -93,7 +93,7 @@ class ApiBuilder { return element.getAsString(); } - public List jsonToApiObjects(String data, Class cls, List parent) throws IOException { + public List jsonToApiObjects(String data, Class cls, boolean isList) throws IOException { if (data == null) { return null; } @@ -112,7 +112,13 @@ class ApiBuilder { } Gson json = ApiSerializer.getDeserializer(); for (JsonElement element : array) { - ApiObjectBase obj = json.fromJson(element.toString(), cls); + ApiObjectBase obj; + if (isList) { + obj = jsonToApiObject(element.toString(), cls); + } else { + obj = json.fromJson(element.toString(), cls); + } + if (obj == null) { s_logger.warn("Unable to decode list element"); continue; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnector.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnector.java index d4bb5247162d00be4058987d4136816c47656716..4c72dffb1147eb9a409f26ec3ae705e7a2f0887b 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnector.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnector.java @@ -42,6 +42,9 @@ public interface ApiConnector { ApiObjectBase find(Class cls, ApiObjectBase parent, String name) throws IOException; ApiObjectBase findByFQN(Class cls, String fullName) throws IOException; List list(Class cls, List parent) throws IOException; + + List listWithDetail(Class cls, String fields, String filters) throws IOException; + List getObjects(Class cls, List> refList) throws IOException; diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java index e04fede1f764468eb8717f05f917d845d4e0f80b..d8971f0dd0d1865335ed2d93f774467a11bfbdfb 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorImpl.java @@ -45,11 +45,6 @@ import org.apache.http.protocol.RequestExpectContinue; import org.apache.http.protocol.RequestTargetHost; import org.apache.http.protocol.RequestUserAgent; import org.apache.http.util.EntityUtils; -/* -import org.openstack4j.api.OSClient; -import org.openstack4j.openstack.OSFactory; -import org.openstack4j.api.exceptions.AuthenticationException; - */ import com.google.common.base.Throwables; import com.google.common.collect.ImmutableList; import org.zstack.utils.Utils; @@ -608,11 +603,7 @@ class ApiConnectorImpl implements ApiConnector { return uuid; } - @Override - public synchronized List list(Class cls, List parent) throws IOException { - final String typename = _apiBuilder.getTypename(cls); - final HttpResponse response = execute(HttpGet.METHOD_NAME, '/' + typename + "s?detail=true", null); - + private synchronized List listResult(Class cls, HttpResponse response, boolean withDetail) throws IOException { if (response == null || response.getStatusLine() == null) { return null; } @@ -629,7 +620,7 @@ class ApiConnectorImpl implements ApiConnector { checkResponseKeepAliveStatus(response); return null; } - List list = _apiBuilder.jsonToApiObjects(data, cls, parent); + List list = _apiBuilder.jsonToApiObjects(data, cls, withDetail); if (list == null) { s_logger.warn("Unable to parse/deserialize response: " + data); } @@ -637,6 +628,30 @@ class ApiConnectorImpl implements ApiConnector { return list; } + @Override + public synchronized List list(Class cls, List parent) throws IOException { + final String typename = _apiBuilder.getTypename(cls); + final HttpResponse response = execute(HttpGet.METHOD_NAME, '/' + typename + 's', null); + return listResult(cls, response, false); + } + + @Override + public synchronized List listWithDetail(Class cls, + String fields, + String filters) throws IOException { + final String typename = _apiBuilder.getTypename(cls); + String uri = '/' + typename + "s?detail=true"; + if (fields != null) { + uri = uri + "&fields=" + fields; + } + if (filters != null) { + uri = uri + "&filters=" + filters; + } + final HttpResponse response = execute(HttpGet.METHOD_NAME, uri, null); + + return listResult(cls, response, true); + } + @Override public List diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java index eb0b03bbbcddef79896a2f37ab95caa4d14d735c..8278226c4c9b753d1801d29a41ca246d1fcaa3bf 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/api/ApiConnectorMock.java @@ -505,6 +505,11 @@ public class ApiConnectorMock implements ApiConnector { return list; } + @Override + public List listWithDetail(Class cls, String fields, String filters) throws IOException { + return null; + } + private boolean isChildrenExists(ApiObjectBase parent) { String fqnParent = getFqnString(parent.getQualifiedName()); ArrayList>> clsDataList = new ArrayList>>(_map.values()); diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java index 29bf9efe896690e65a268128c92a14486cf23a65..4b923786a5fa6fe1abaa9ee9bd7681785631a620 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/controller/neutronClient/TfPortClient.java @@ -63,8 +63,8 @@ public class TfPortClient { //if mac-address is specified, check against the exisitng ports //to see if there exists a port with the same mac-address if (!Objects.isNull(mac)) { - List ports = (List) apiConnector.list( - VirtualMachineInterface.class, Arrays.asList("default-domain", tenantId)); + List ports = (List) apiConnector.listWithDetail( + VirtualMachineInterface.class, null, null); for (VirtualMachineInterface port : ports) { MacAddressesType macAddressesType = null; @@ -303,19 +303,9 @@ public class TfPortClient { public List getVirtualMachineInterfaceDetail() { try { - List result = new ArrayList<>(); - List ports = (List) apiConnector.list( - VirtualMachineInterface.class, Arrays.asList("default-domain", tenantId)); - - for (VirtualMachineInterface port : ports) { - VirtualMachineInterface detail = (VirtualMachineInterface) apiConnector.findById( - VirtualMachineInterface.class, port.getUuid()); - if (detail == null) { - continue; - } - result.add(detail); - } - return result; + List ports = (List) apiConnector.listWithDetail( + VirtualMachineInterface.class, null, null); + return ports; } catch (IOException e) { throw new RuntimeException(e); } diff --git a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfCompleteNicInformationExtensionPointImpl.java b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfCompleteNicInformationExtensionPointImpl.java index a812bc53851bdb10255d8cdd96de3aa98b5a5fd0..140a72f5844516b93c60568879049aa9bf9a56db 100644 --- a/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfCompleteNicInformationExtensionPointImpl.java +++ b/plugin/sugonSdnController/src/main/java/org/zstack/sugonSdnController/network/TfCompleteNicInformationExtensionPointImpl.java @@ -21,8 +21,7 @@ public class TfCompleteNicInformationExtensionPointImpl implements KVMCompleteNi @Override public NicTO completeNicInformation(L2NetworkInventory l2Network, L3NetworkInventory l3Network, VmNicInventory nic) { NicTO to = KVMAgentCommands.NicTO.fromVmNicInventory(nic); - to.setIps(new ArrayList(Arrays.asList(nic.getIp()))); - VmGlobalConfig.VM_CLEAN_TRAFFIC.updateValue(true); + to.setIpForTf(nic.getIp()); to.setMtu(new MtuGetter().getMtu(l3Network.getUuid())); to.setL2NetworkUuid(l2Network.getUuid()); logger.debug("Complete nic information for TfL2Network");