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

Reply via email to