Moti Asayag has uploaded a new change for review. Change subject: engine: Adding VmGuestInfoInterface ......................................................................
engine: Adding VmGuestInfoInterface As part of the Reporting Internal Vnic Information feature, this patch adds a new table, Dao and entity called vm_guest_agent_interface, VmGuestAgentInterfaceDao and VmGuestAgentInterface respectively. Each row in this table is related to a specific VM, and will be presented through REST API under that VM. Also, it will be associated with Vm Interfaces according to Mac address. Change-Id: I0d25018f94c2b4d29c01be85a222460335603569 Signed-off-by: Moti Asayag <[email protected]> --- M backend/manager/dbscripts/network_sp.sql A backend/manager/dbscripts/upgrade/03_02_0050_add_vm_guest_agent_interfaces_table.sql A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmGuestAgentInterface.java M backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoDbFacadeImpl.java M backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties A backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoTest.java M backend/manager/modules/dal/src/test/resources/fixtures.xml M frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml 10 files changed, 397 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/98/10098/1 diff --git a/backend/manager/dbscripts/network_sp.sql b/backend/manager/dbscripts/network_sp.sql index 5f0c893..b968a76 100644 --- a/backend/manager/dbscripts/network_sp.sql +++ b/backend/manager/dbscripts/network_sp.sql @@ -600,6 +600,44 @@ ---------------------------------------------------------------- +-- [network_cluster] Table +-- +Create or replace FUNCTION GetVmGuestAgentInterfacesByVmId(v_vm_id UUID) +RETURNS SETOF vm_guest_agent_interfaces + AS $procedure$ +BEGIN +RETURN QUERY SELECT * + FROM vm_guest_agent_interfaces + WHERE vm_id = v_vm_id; +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION DeleteVmGuestAgentInterfacesByVmId(v_vm_id UUID) +RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM vm_guest_agent_interfaces + WHERE vm_id = v_vm_id; +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION InsertVmGuestAgentInterface(v_vm_id UUID, + v_interface_name VARCHAR(50), + v_mac_address VARCHAR(59), + v_ipv4_addresses text, + v_ipv6_addresses text) +RETURNS VOID + AS $procedure$ +BEGIN +INSERT INTO vm_guest_agent_interfaces(vm_id, interface_name, mac_address, ipv4_addresses, ipv6_addresses) + VALUES(v_vm_id, v_interface_name, v_mac_address, v_ipv4_addresses, v_ipv6_addresses); +END; $procedure$ +LANGUAGE plpgsql; + + +---------------------------------------------------------------- -- [vds_interface_statistics] Table -- diff --git a/backend/manager/dbscripts/upgrade/03_02_0050_add_vm_guest_agent_interfaces_table.sql b/backend/manager/dbscripts/upgrade/03_02_0050_add_vm_guest_agent_interfaces_table.sql new file mode 100644 index 0000000..874f9c7 --- /dev/null +++ b/backend/manager/dbscripts/upgrade/03_02_0050_add_vm_guest_agent_interfaces_table.sql @@ -0,0 +1,26 @@ +CREATE OR REPLACE FUNCTION __tmp_03_02_0050_add_vm_guest_agent_interfaces_table() +RETURNS void +AS $function$ +BEGIN + IF NOT EXISTS (SELECT * FROM information_schema.tables WHERE table_name ILIKE 'vm_guest_agent_interfaces') THEN + +-- Add the vm_guest_agent_interfaces table. +CREATE TABLE vm_guest_agent_interfaces +( + vm_id UUID NOT NULL, + interface_name VARCHAR (50), + mac_address VARCHAR(59), + ipv4_addresses text, + ipv6_addresses text, + CONSTRAINT FK_vm_guest_agent_interfaces FOREIGN KEY(vm_id) REFERENCES vm_static(vm_guid) ON UPDATE NO ACTION ON DELETE CASCADE +) WITH OIDS; + + END IF; +END; $function$ +LANGUAGE plpgsql; + + +SELECT __tmp_03_02_0050_add_vm_guest_agent_interfaces_table(); + +DROP FUNCTION __tmp_03_02_0050_add_vm_guest_agent_interfaces_table(); + diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmGuestAgentInterface.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmGuestAgentInterface.java new file mode 100644 index 0000000..bc251e7 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/VmGuestAgentInterface.java @@ -0,0 +1,137 @@ +package org.ovirt.engine.core.common.businessentities; + +import java.util.List; + +import org.ovirt.engine.core.compat.Guid; + +public class VmGuestAgentInterface extends IVdcQueryable { + + private static final long serialVersionUID = -9164680367965630250L; + + /** + * The Id of the VM this interface belongs to + */ + private Guid vmId; + + /** + * The internal nic's name as seen by the guest agent + */ + private String interfaceName; + + /** + * The internal nic's mac address as seen by the guest agent + */ + private String macAddress; + + /** + * The vNic's IPv4 addresses + */ + private List<String> ipv4Addresses; + + /** + * The vNic's IPv6 addresses + */ + private List<String> ipv6Addresses; + + public Guid getVmId() { + return vmId; + } + + public void setVmId(Guid vmId) { + this.vmId = vmId; + } + + public String getInterfaceName() { + return interfaceName; + } + + public void setInterfaceName(String interfaceName) { + this.interfaceName = interfaceName; + } + + public String getMacAddress() { + return macAddress; + } + + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } + + public List<String> getIpv4Addresses() { + return ipv4Addresses; + } + + public void setIpv4Addresses(List<String> ipv4Addresses) { + this.ipv4Addresses = ipv4Addresses; + } + + public List<String> getIpv6Addresses() { + return ipv6Addresses; + } + + public void setIpv6Addresses(List<String> ipv6Addresses) { + this.ipv6Addresses = ipv6Addresses; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((getInterfaceName() == null) ? 0 : getInterfaceName().hashCode()); + result = prime * result + ((getIpv4Addresses() == null) ? 0 : getIpv4Addresses().hashCode()); + result = prime * result + ((getIpv6Addresses() == null) ? 0 : getIpv6Addresses().hashCode()); + result = prime * result + ((getMacAddress() == null) ? 0 : getMacAddress().hashCode()); + result = prime * result + ((getVmId() == null) ? 0 : getVmId().hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + if (obj == null) { + return false; + } + if (getClass() != obj.getClass()) { + return false; + } + VmGuestAgentInterface other = (VmGuestAgentInterface) obj; + if (getInterfaceName() == null) { + if (other.getInterfaceName() != null) { + return false; + } + } else if (!getInterfaceName().equals(other.getInterfaceName())) { + return false; + } + if (getIpv4Addresses() == null) { + if (other.getIpv4Addresses() != null) { + return false; + } + } else if (!getIpv4Addresses().equals(other.getIpv4Addresses())) { + return false; + } + if (getIpv6Addresses() == null) { + if (other.getIpv6Addresses() != null) { + return false; + } + } else if (!getIpv6Addresses().equals(other.getIpv6Addresses())) { + return false; + } + if (getMacAddress() == null) { + if (other.getMacAddress() != null) { + return false; + } + } else if (!getMacAddress().equals(other.getMacAddress())) { + return false; + } + if (getVmId() == null) { + if (other.getVmId() != null) { + return false; + } + } else if (!getVmId().equals(other.getVmId())) { + return false; + } + return true; + } +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java index 787b238..1b17d24 100644 --- a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dal/dbbroker/DbFacade.java @@ -92,6 +92,7 @@ import org.ovirt.engine.core.dao.VmDAO; import org.ovirt.engine.core.dao.VmDeviceDAO; import org.ovirt.engine.core.dao.VmDynamicDAO; +import org.ovirt.engine.core.dao.VmGuestAgentInterfaceDao; import org.ovirt.engine.core.dao.VmNetworkInterfaceDAO; import org.ovirt.engine.core.dao.VmNetworkStatisticsDAO; import org.ovirt.engine.core.dao.VmPoolDAO; @@ -873,4 +874,13 @@ public int getConnectionCheckInterval() { return connectionCheckInterval; } + + /** + * Returns the singleton instance of {@link VmGuestAgentInterfaceDao}. + * + * @return the dao + */ + public VmGuestAgentInterfaceDao getVmGuestAgentInterfaceDao() { + return getDao(VmGuestAgentInterfaceDao.class); + } } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDao.java new file mode 100644 index 0000000..4da5207 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDao.java @@ -0,0 +1,35 @@ +package org.ovirt.engine.core.dao; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.compat.Guid; + +/** + * {@link VmGuestAgentInterfaceDao} defines a type for performing CRUD operations on instances of + * {@link VmGuestAgentInterface}. + */ +public interface VmGuestAgentInterfaceDao extends DAO { + + /** + * Returns a list of the VmGuestAgentInterfaces for the given VM Id + * @param vmId + * the VM's ID + * @return the list of VmGuestAgentInterfaces + */ + public List<VmGuestAgentInterface> getAllForVm(Guid vmId); + + /** + * Removes all the VmGuestAgentInterfaces of the given VM + * @param vmId + * the VM + */ + public void removeAllForVm(Guid vmId); + + /** + * Persists the given VmGuestAgentInterface + * @param vmGuestAgentInterface + * the VmGuestAgentInterface + */ + public void save(VmGuestAgentInterface vmGuestAgentInterface); +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoDbFacadeImpl.java new file mode 100644 index 0000000..7f25c64 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoDbFacadeImpl.java @@ -0,0 +1,70 @@ +package org.ovirt.engine.core.dao; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.apache.commons.lang.StringUtils; +import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.compat.Guid; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; + +public class VmGuestAgentInterfaceDaoDbFacadeImpl extends BaseDAODbFacade implements VmGuestAgentInterfaceDao{ + + private static final String DELIMITER = ","; + + public List<VmGuestAgentInterface> getAllForVm(Guid vmId) { + return getCallsHandler().executeReadList("GetVmGuestAgentInterfacesByVmId", + VmGuestAgentInterfaceRowMapper.instance, getCustomMapSqlParameterSource() + .addValue("vm_id", vmId)); + } + + public void save(VmGuestAgentInterface vmGuestAgentInterface) { + getCallsHandler().executeModification("InsertVmGuestAgentInterface", + createFullParametersMapper(vmGuestAgentInterface)); + } + + public void removeAllForVm(Guid vmId) { + getCallsHandler().executeModification("DeleteVmGuestAgentInterfacesByVmId", + getCustomMapSqlParameterSource().addValue("vm_id", vmId)); + } + + protected MapSqlParameterSource createFullParametersMapper(VmGuestAgentInterface entity) { + return getCustomMapSqlParameterSource() + .addValue("vm_id", entity.getVmId()) + .addValue("interface_name", entity.getInterfaceName()) + .addValue("mac_address", entity.getMacAddress()) + .addValue("ipv4_addresses", getIpAddressesAsString(entity.getIpv4Addresses())) + .addValue("ipv6_addresses", getIpAddressesAsString(entity.getIpv6Addresses())); + } + + private String getIpAddressesAsString(List<String> ipAddresses) { + return StringUtils.join(ipAddresses, DELIMITER); + } + + protected final static class VmGuestAgentInterfaceRowMapper implements ParameterizedRowMapper<VmGuestAgentInterface> { + public static VmGuestAgentInterfaceRowMapper instance = new VmGuestAgentInterfaceRowMapper(); + + @Override + public VmGuestAgentInterface mapRow(ResultSet rs, int rowNum) + throws SQLException { + VmGuestAgentInterface vmGuestAgentInterface = new VmGuestAgentInterface(); + vmGuestAgentInterface.setVmId(Guid.createGuidFromString(rs.getString("vm_id"))); + vmGuestAgentInterface.setInterfaceName(rs.getString("interface_name")); + vmGuestAgentInterface.setMacAddress(rs.getString("mac_address")); + vmGuestAgentInterface.setIpv4Addresses(getListOfIpAddresses(rs.getString("ipv4_addresses"))); + vmGuestAgentInterface.setIpv6Addresses(getListOfIpAddresses(rs.getString("ipv6_addresses"))); + return vmGuestAgentInterface; + } + + private List<String> getListOfIpAddresses(String ipAddressesAsString) { + if (ipAddressesAsString == null) { + return Collections.emptyList(); + } + return Arrays.asList(StringUtils.split(ipAddressesAsString,DELIMITER)); + } + } +} diff --git a/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties b/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties index bf00603..c5ee9d9 100644 --- a/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties +++ b/backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties @@ -56,3 +56,4 @@ GlusterOptionDao=org.ovirt.engine.core.dao.gluster.GlusterOptionDaoDbFacadeImpl ImageStorageDomainMapDao=org.ovirt.engine.core.dao.ImageStorageDomainMapDaoDbFacadeImpl NetworkViewDao=org.ovirt.engine.core.dao.NetworkViewDaoDbFacadeImpl +VmGuestAgentInterfaceDao=org.ovirt.engine.core.dao.VmGuestAgentInterfaceDaoDbFacadeImpl diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoTest.java new file mode 100644 index 0000000..e73da83 --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/VmGuestAgentInterfaceDaoTest.java @@ -0,0 +1,57 @@ +package org.ovirt.engine.core.dao; + +import static org.junit.Assert.*; + +import java.util.Arrays; +import java.util.Collections; +import java.util.List; + +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.VmGuestAgentInterface; +import org.ovirt.engine.core.compat.Guid; + +public class VmGuestAgentInterfaceDaoTest extends BaseDAOTestCase { + + static final private Guid EXISTING_VM_ID = new Guid("77296e00-0cad-4e5a-9299-008a7b6f4354"); + private static final int VM_GUEST_AGENT_INTERFACES_SIZE = 2; + private VmGuestAgentInterfaceDao dao; + + @Override + public void setUp() throws Exception { + super.setUp(); + dao = prepareDAO(dbFacade.getVmGuestAgentInterfaceDao()); + } + + @Test + public void getAllForVm() { + List<VmGuestAgentInterface> interfaces = dao.getAllForVm(EXISTING_VM_ID); + assertEquals(interfaces.size(), VM_GUEST_AGENT_INTERFACES_SIZE); + } + + @Test + public void removeAllForVm() { + List<VmGuestAgentInterface> interfaces = dao.getAllForVm(EXISTING_VM_ID); + assertFalse(interfaces.isEmpty()); + dao.removeAllForVm(EXISTING_VM_ID); + interfaces = dao.getAllForVm(EXISTING_VM_ID); + assertTrue(interfaces.isEmpty()); + } + + @Test + public void save() { + VmGuestAgentInterface guestAgentInterface = createVmGuestAgentInterface(); + assertFalse(dao.getAllForVm(EXISTING_VM_ID).contains(guestAgentInterface)); + dao.save(guestAgentInterface); + assertTrue(dao.getAllForVm(EXISTING_VM_ID).contains(guestAgentInterface)); + } + + private VmGuestAgentInterface createVmGuestAgentInterface() { + VmGuestAgentInterface guestAgentInterface = new VmGuestAgentInterface(); + guestAgentInterface.setVmId(EXISTING_VM_ID); + guestAgentInterface.setMacAddress("AA:AA:AA:AA:AA:AA"); + guestAgentInterface.setInterfaceName("p2p3"); + guestAgentInterface.setIpv4Addresses(Arrays.asList("1.1.1.1", "2.2.2.2", "3.3.3.3")); + guestAgentInterface.setIpv6Addresses(Collections.<String>emptyList()); + return guestAgentInterface; + } +} diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 78a9406..8b57cf0 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -2585,6 +2585,28 @@ </row> </table> + <table name="vm_guest_agent_interfaces"> + <column>vm_id</column> + <column>interface_name</column> + <column>mac_address</column> + <column>ipv4_addresses</column> + <column>ipv6_addresses</column> + <row> + <value>77296e00-0cad-4e5a-9299-008a7b6f4354</value> + <value>p1p2</value> + <value>BB:BB:BB:BB:BB:BB</value> + <value>12.12.12.12,23.23.23.23</value> + <value>AAAA:AAAA:AAAA:AAAA:AAAA:AAAA,AAAA:AAAA:AAAA:AAAA:AAAA:BBBB</value> + </row> + <row> + <value>77296e00-0cad-4e5a-9299-008a7b6f4354</value> + <value>p1p3</value> + <value>CC:BB:BB:BB:BB:BB</value> + <null/> + <null/> + </row> + </table> + <table name="vm_interface"> <column>id</column> <column>network_name</column> diff --git a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml index e29d8b6..9bac184 100644 --- a/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml +++ b/frontend/webadmin/modules/gwt-common/src/main/resources/org/ovirt/engine/core/Common.gwt.xml @@ -156,6 +156,7 @@ <include name="common/businessentities/BusinessEntityGuidComparator.java" /> <include name="common/businessentities/BusinessEntityComparator.java" /> <include name="common/businessentities/Identifiable.java" /> + <include name="common/businessentities/VmGuestAgentInterface.java" /> <include name="common/job/*.java" /> <!-- Quota --> -- To view, visit http://gerrit.ovirt.org/10098 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I0d25018f94c2b4d29c01be85a222460335603569 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Moti Asayag <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
