Dhandapani Gopal has uploaded a new change for review. Change subject: engine: Get Service Status Query ......................................................................
engine: Get Service Status Query - New entity class for Service - New Service Dao - Query to fetch the services from the database. Change-Id: I7982faf180f8580838a962a5674e8e9e8982679b Signed-off-by: Dhandapani <[email protected]> --- A backend/manager/dbscripts/services_sp.sql A backend/manager/dbscripts/upgrade/03_02_0340_add_services_table.sql A backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetServicesQuery.java M backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java A backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetServicesQueryTest.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceConfigEntity.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceEntity.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceStatus.java M backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java A backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/ServicesQueryParameters.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/gluster/ServicesDao.java A backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDaoDbFacadeImpl.java M backend/manager/modules/dal/src/main/jdbc-resources/engine-daos.properties M backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties A backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/ServicesDaoTest.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 18 files changed, 991 insertions(+), 4 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/47/11147/1 diff --git a/backend/manager/dbscripts/services_sp.sql b/backend/manager/dbscripts/services_sp.sql new file mode 100644 index 0000000..7a2da8d --- /dev/null +++ b/backend/manager/dbscripts/services_sp.sql @@ -0,0 +1,114 @@ +/* ---------------------------------------------------------------- + Stored procedures for database operations on Services + related tables: + - services + - service_config +----------------------------------------------------------------*/ + +Create or replace FUNCTION InsertService(v_id UUID, + v_cluster_id UUID, + v_server_id UUID, + v_service_name VARCHAR(1000), + v_pid INTEGER, + v_status VARCHAR(100)) + RETURNS VOID + AS $procedure$ +BEGIN + INSERT INTO services(id, cluster_id, server_id, service_name, pid, status) + VALUES (v_id, v_cluster_id, v_server_id, v_service_name, v_pid, v_status); +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION InsertServiceConfig(v_service_id UUID, + v_section VARCHAR(1000), + v_option_key VARCHAR(1000), + v_option_value VARCHAR(1000)) + RETURNS VOID + AS $procedure$ +BEGIN + INSERT INTO service_config(service_id, section, option_key, option_value) + VALUES (v_service_id, v_section, v_option_key, v_option_value); +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetServicesByClusterId(v_cluster_id UUID) + RETURNS SETOF services + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM services + WHERE cluster_id = v_cluster_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetServicesByServerId(v_server_id UUID) + RETURNS SETOF services + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM services + WHERE server_id = v_server_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetServiceById(v_id UUID) + RETURNS SETOF services + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM services + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetServiceConfigById(v_service_id UUID) + RETURNS SETOF service_config + AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM service_config + WHERE service_id = v_service_id; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION GetServiceByName(v_server_id UUID, + v_service_name VARCHAR(1000)) +RETURNS SETOF services +AS $procedure$ +BEGIN + RETURN QUERY SELECT * + FROM services + WHERE server_id = v_server_id AND service_name = v_service_name; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION DeleteServiceByGuid(v_id UUID) + RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM services + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; + + +Create or replace FUNCTION DeleteServiceByName(v_server_id UUID, v_service_name VARCHAR(1000)) + RETURNS VOID + AS $procedure$ +BEGIN + DELETE FROM services + WHERE server_id = v_server_id AND service_name = v_service_name; +END; $procedure$ +LANGUAGE plpgsql; + +Create or replace FUNCTION UpdateServiceStatus(v_id UUID, + v_status VARCHAR(100)) + RETURNS VOID + AS $procedure$ +BEGIN + UPDATE services + SET status = v_status, + _update_date = LOCALTIMESTAMP + WHERE id = v_id; +END; $procedure$ +LANGUAGE plpgsql; diff --git a/backend/manager/dbscripts/upgrade/03_02_0340_add_services_table.sql b/backend/manager/dbscripts/upgrade/03_02_0340_add_services_table.sql new file mode 100644 index 0000000..911813c --- /dev/null +++ b/backend/manager/dbscripts/upgrade/03_02_0340_add_services_table.sql @@ -0,0 +1,49 @@ +Create or replace FUNCTION __temp_fn_db_add_services_tables() returns void +AS $procedure$ +BEGIN +-- Add services table +IF (NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE table_name='services')) THEN + BEGIN + CREATE TABLE services + ( + id UUID NOT NULL, + cluster_id UUID NOT NULL references vds_groups(vds_group_id) on delete cascade, + server_id UUID NOT NULL references vds_static(vds_id) on delete cascade, + service_name VARCHAR(1000) NOT NULL, + pid INTEGER NOT NULL default 0, + status VARCHAR(100), + _create_date TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT LOCALTIMESTAMP, + _update_date TIMESTAMP WITH TIME ZONE, + CONSTRAINT pk_services PRIMARY KEY(id) + ) WITH OIDS; + END; +END IF; + +DROP INDEX IF EXISTS IDX_services_server_id; +CREATE INDEX IDX_services_server_id ON services(server_id); +DROP INDEX IF EXISTS IDX_services_name_unique; +CREATE INDEX IDX_services_name_unique ON services(server_id, service_name); + +-- Add service config table +IF (NOT EXISTS (SELECT 1 FROM INFORMATION_SCHEMA.TABLES WHERE table_name='service_config')) THEN + BEGIN + CREATE TABLE service_config + ( + service_id UUID NOT NULL references services(id) on delete cascade, + section VARCHAR(1000) NOT NULL, + option_key VARCHAR(1000), + option_value VARCHAR(1000), + CONSTRAINT pk_service_config PRIMARY KEY(service_id, section) + ) WITH OIDS; + END; +END IF; + +-- Create partial index for fetching configs of a service +DROP INDEX if exists IDX_service_config_service_id; +CREATE INDEX IDX_service_config_service_id ON service_config(service_id); + +END; $procedure$ +LANGUAGE plpgsql; + +select __temp_fn_db_add_services_tables(); +drop function __temp_fn_db_add_services_tables(); \ No newline at end of file diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetServicesQuery.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetServicesQuery.java new file mode 100644 index 0000000..596a46d --- /dev/null +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GetServicesQuery.java @@ -0,0 +1,22 @@ +package org.ovirt.engine.core.bll.gluster; + +import org.ovirt.engine.core.common.queries.gluster.ServicesQueryParameters; + +/** + * Query to fetch all services + */ +public class GetServicesQuery<P extends ServicesQueryParameters> extends GlusterQueriesCommandBase<P> { + + public GetServicesQuery(P parameters) { + super(parameters); + } + + @Override + protected void executeQueryCommand() { + if (getParameters().getServerId() != null) { + getQueryReturnValue().setReturnValue(getServicesDao().getAllServicesByServerId(getParameters().getServerId())); + } else { + getQueryReturnValue().setReturnValue(getServicesDao().getAllServicesByClusterId(getParameters().getClusterId())); + } + } +} diff --git a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java index 4d31981..a89c9ec 100644 --- a/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java +++ b/backend/manager/modules/bll/src/main/java/org/ovirt/engine/core/bll/gluster/GlusterQueriesCommandBase.java @@ -6,6 +6,7 @@ import org.ovirt.engine.core.dal.dbbroker.DbFacade; import org.ovirt.engine.core.dao.gluster.GlusterBrickDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.gluster.ServicesDao; public abstract class GlusterQueriesCommandBase<P extends VdcQueryParametersBase> extends QueriesCommandBase<P> { protected GlusterQueriesCommandBase(P parameters) { @@ -24,4 +25,8 @@ protected String getGlusterVolumeName(Guid volumeId) { return getGlusterVolumeDao().getById(volumeId).getName(); } + + protected ServicesDao getServicesDao() { + return DbFacade.getInstance().getServicesDao(); + } } diff --git a/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetServicesQueryTest.java b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetServicesQueryTest.java new file mode 100644 index 0000000..cdc8268 --- /dev/null +++ b/backend/manager/modules/bll/src/test/java/org/ovirt/engine/core/bll/gluster/GetServicesQueryTest.java @@ -0,0 +1,78 @@ +package org.ovirt.engine.core.bll.gluster; + +import static org.junit.Assert.assertNotNull; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; + +import java.util.Collections; +import java.util.List; + +import org.junit.Before; +import org.junit.Test; +import org.ovirt.engine.core.bll.AbstractQueryTest; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceConfigEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceStatus; +import org.ovirt.engine.core.common.queries.gluster.ServicesQueryParameters; +import org.ovirt.engine.core.common.utils.ListUtils; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.gluster.ServicesDao; + +public class GetServicesQueryTest extends AbstractQueryTest<ServicesQueryParameters, GetServicesQuery<ServicesQueryParameters>> { + + private static final Guid SERVER_ID = new Guid("23f6d691-5dfb-472b-86dc-9e1d2d3c18f3"); + private static final Guid CLUSTER_ID = new Guid("ae956031-6be2-43d6-bb8f-5191c9253314"); + ServiceEntity expectedService; + ServicesDao servicesDaoMock; + + @Before + @Override + public void setUp() throws Exception { + super.setUp(); + expectedService = getTestService(); + setupMock(); + } + + private ServiceEntity getTestService() { + Guid serviceId = Guid.NewGuid(); + ServiceEntity service = new ServiceEntity(); + service.setServiceName("proxy-server"); + service.setClusterId(CLUSTER_ID); + service.setServerId(SERVER_ID); + service.setId(serviceId); + service.setPid(23491); + service.setStatus(ServiceStatus.RUNNING); + service.setServiceConfig(getServiceConfig(serviceId)); + return service; + } + + private ServiceConfigEntity getServiceConfig(Guid serviceId) { + ServiceConfigEntity serviceConfig = new ServiceConfigEntity(); + serviceConfig.setServiceId(serviceId); + serviceConfig.setSection("section1"); + serviceConfig.setKey("memcache_servers"); + serviceConfig.setValue("localhost:11211"); + return serviceConfig; + } + + private void setupMock() { + // Mock the query's parameters + when(getQueryParameters().getServerId()).thenReturn(SERVER_ID); + when(getQueryParameters().getClusterId()).thenReturn(CLUSTER_ID); + + servicesDaoMock = mock(ServicesDao.class); + when(servicesDaoMock.getAllServicesByClusterId(CLUSTER_ID)).thenReturn(Collections.singletonList(expectedService)); + when(servicesDaoMock.getAllServicesByServerId(SERVER_ID)).thenReturn(Collections.singletonList(expectedService)) ; + doReturn(servicesDaoMock).when(getQuery()).getServicesDao(); + } + + @Test + public void testExecuteQueryCommnad() { + getQuery().executeQueryCommand(); + List<ServiceEntity> services = (List<ServiceEntity>) getQuery().getQueryReturnValue().getReturnValue(); + + assertNotNull(services); + ListUtils.listsEqual(Collections.singletonList(expectedService), services); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceConfigEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceConfigEntity.java new file mode 100644 index 0000000..bd67b37 --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceConfigEntity.java @@ -0,0 +1,90 @@ +package org.ovirt.engine.core.common.businessentities.gluster; + +import java.io.Serializable; + +import javax.validation.constraints.NotNull; + +import org.ovirt.engine.core.common.validation.group.RemoveEntity; +import org.ovirt.engine.core.compat.Guid; + +/** + * The service config entity. + * + * @see ServiceEntity + */ +public class ServiceConfigEntity implements Serializable { + + private static final long serialVersionUID = -585458847720355956L; + + @NotNull(message = "VALIDATION.GLUSTER.SERVICE.ID.NOT_NULL", groups = { RemoveEntity.class }) + private Guid serviceId; + + private String section; + + private String key; + + private String value; + + public ServiceConfigEntity() { + } + + public Guid getServiceId() { + return serviceId; + } + + public void setServiceId(Guid serviceId) { + this.serviceId = serviceId; + } + + public String getSection() { + return section; + } + + public void setSection(String section) { + this.section = section; + } + + public String getKey() { + return key; + } + + public void setKey(String key) { + this.key = key; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((serviceId == null) ? 0 : serviceId.hashCode()); + result = prime * result + ((section == null) ? 0 : section.hashCode()); + result = prime * result + ((key == null) ? 0 : key.hashCode()); + result = prime * result + ((value == null) ? 0 : value.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ServiceConfigEntity)) { + return false; + } + + ServiceConfigEntity config = (ServiceConfigEntity) obj; + + if (!(serviceId.equals(config.getServiceId()) + && section.equals(config.getSection()) + && key.equals(config.getKey()) + && value.equals(config.getValue()))) { + return false; + } + return true; + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceEntity.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceEntity.java new file mode 100644 index 0000000..bdfcd6f --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceEntity.java @@ -0,0 +1,152 @@ +package org.ovirt.engine.core.common.businessentities.gluster; + +import javax.validation.constraints.NotNull; + +import org.ovirt.engine.core.common.businessentities.BusinessEntity; +import org.ovirt.engine.core.common.businessentities.IVdcQueryable; +import org.ovirt.engine.core.common.utils.ObjectUtils; +import org.ovirt.engine.core.common.validation.group.CreateEntity; +import org.ovirt.engine.core.common.validation.group.RemoveEntity; +import org.ovirt.engine.core.compat.Guid; + +/** + * The service entity. + * + * @see ServiceStatus + * @see ServiceConfigEntity + */ +public class ServiceEntity extends IVdcQueryable implements BusinessEntity<Guid> { + private static final long serialVersionUID = 2355384696827317277L; + + @NotNull(message = "VALIDATION.SERVICE.ID.NOT_NULL", groups = { RemoveEntity.class }) + private Guid id; + + @NotNull(message = "VALIDATION.CLUSTER_ID.NOT_NULL", groups = {CreateEntity.class}) + private Guid clusterId; + + @NotNull(message = "VALIDATION.SERVICE.SERVER_ID.NOT_NULL", groups = { CreateEntity.class }) + private Guid serverId; + + private String serviceName; + + private Integer pid; + + private ServiceStatus status; + + private ServiceConfigEntity serviceConfig; + + public ServiceEntity() { + } + + @Override + public Guid getId() { + return id; + } + + @Override + public void setId(Guid id) { + this.id = id; + } + + public Guid getClusterId() { + return clusterId; + } + + public void setClusterId(Guid clusterId) { + this.clusterId = clusterId; + } + + public Guid getServerId() { + return serverId; + } + + public void setServerId(Guid serverId) { + this.serverId = serverId; + } + + public String getServiceName() { + return serviceName; + } + + public void setServiceName(String serviceName) { + this.serviceName = serviceName; + } + + public Integer getPid() { + return pid; + } + + public void setPid(Integer pid) { + this.pid = pid; + } + + public ServiceStatus getStatus() { + return status; + } + + public void setStatus(ServiceStatus status) { + this.status = status; + } + + public ServiceConfigEntity getServiceConfig() { + return serviceConfig; + } + + public void setServiceConfig(ServiceConfigEntity serviceConfig) { + this.serviceConfig = serviceConfig; + } + + public boolean isRunning() { + return this.status == ServiceStatus.RUNNING; + } + + public boolean isStopped() { + return this.status == ServiceStatus.STOPPED; + } + + public boolean isFailed() { + return this.status == ServiceStatus.FAILED; + } + + + @Override + public int hashCode() { + final int prime = 31; + int result = 1; + result = prime * result + ((serviceName == null) ? 0 : serviceName.hashCode()); + result = prime * result + ((clusterId == null) ? 0 : clusterId.hashCode()); + result = prime * result + ((serverId == null) ? 0 : serverId.hashCode()); + result = prime * result + ((pid == 0) ? 0 : pid.hashCode()); + result = prime * result + ((status == null) ? 0 : status.hashCode()); + result = prime * result + ((serviceConfig == null) ? 0 : serviceConfig.hashCode()); + return result; + } + + @Override + public boolean equals(Object obj) { + if (!(obj instanceof ServiceEntity)) { + return false; + } + + ServiceEntity service = (ServiceEntity) obj; + + if (!(clusterId.equals(service.getClusterId()))) { + return false; + } + + if (!(id.equals(service.getId()) + && serviceName.equals(service.getServiceName()) + && serverId.equals(service.getServerId()) + && ObjectUtils.objectsEqual(pid, service.getPid()) + && status == service.getStatus())) { + return false; + } + + return true; + } + + @Override + public Object getQueryableId() { + return getId(); + } +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceStatus.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceStatus.java new file mode 100644 index 0000000..7dae94b --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/businessentities/gluster/ServiceStatus.java @@ -0,0 +1,11 @@ +package org.ovirt.engine.core.common.businessentities.gluster; + +/** + * Enum for the Service Status. + * @see ServiceEntity + */ +public enum ServiceStatus { + RUNNING, + STOPPED, + FAILED; +} diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java index e23bf8a..6250e14 100644 --- a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java @@ -292,6 +292,8 @@ GetGlusterVolumeAdvancedDetails, GetGlusterVolumeProfileInfo, GetDefaultConfigurationVersion(VdcQueryAuthType.User), + GetServices, + // Default type instead of having to null check Unknown(VdcQueryAuthType.User); diff --git a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/ServicesQueryParameters.java b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/ServicesQueryParameters.java new file mode 100644 index 0000000..3c1e76f --- /dev/null +++ b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/gluster/ServicesQueryParameters.java @@ -0,0 +1,25 @@ +package org.ovirt.engine.core.common.queries.gluster; + +import org.ovirt.engine.core.compat.Guid; + +/** + * Parameter class with cluster Id and serverId as parameters. <br> + * This will be used by services query command. <br> + */ +public class ServicesQueryParameters extends GlusterParameters { + + private Guid serverId; + + public ServicesQueryParameters(Guid clusterId, Guid serverId) { + super(clusterId); + setServerId(serverId); + } + + public Guid getServerId() { + return serverId; + } + + public void setServerId(Guid serverId) { + this.serverId = serverId; + } +} 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 83b915f..dfa1e4b 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 @@ -18,8 +18,11 @@ import org.ovirt.engine.core.common.businessentities.Image; import org.ovirt.engine.core.common.businessentities.Role; import org.ovirt.engine.core.common.businessentities.Snapshot; +import org.ovirt.engine.core.common.businessentities.StorageDomainDynamic; +import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.StorageDomainStatus; import org.ovirt.engine.core.common.businessentities.StorageDomainType; +import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; import org.ovirt.engine.core.common.businessentities.VdsDynamic; import org.ovirt.engine.core.common.businessentities.VdsStatic; import org.ovirt.engine.core.common.businessentities.VdsStatistics; @@ -30,11 +33,8 @@ import org.ovirt.engine.core.common.businessentities.VmTemplate; import org.ovirt.engine.core.common.businessentities.image_storage_domain_map; import org.ovirt.engine.core.common.businessentities.permissions; -import org.ovirt.engine.core.common.businessentities.StorageDomainDynamic; -import org.ovirt.engine.core.common.businessentities.StorageDomainStatic; import org.ovirt.engine.core.common.businessentities.storage_domains; import org.ovirt.engine.core.common.businessentities.storage_pool; -import org.ovirt.engine.core.common.businessentities.StoragePoolIsoMap; import org.ovirt.engine.core.common.businessentities.vds_spm_id_map; import org.ovirt.engine.core.common.businessentities.network.Network; import org.ovirt.engine.core.common.businessentities.network.VmNetworkInterface; @@ -97,6 +97,7 @@ import org.ovirt.engine.core.dao.gluster.GlusterBrickDao; import org.ovirt.engine.core.dao.gluster.GlusterOptionDao; import org.ovirt.engine.core.dao.gluster.GlusterVolumeDao; +import org.ovirt.engine.core.dao.gluster.ServicesDao; import org.ovirt.engine.core.dao.network.InterfaceDao; import org.ovirt.engine.core.dao.network.NetworkClusterDao; import org.ovirt.engine.core.dao.network.NetworkDao; @@ -870,6 +871,15 @@ return getDao(GlusterOptionDao.class); } + /** + * Returns the singleton instance of {@link ServicesDao}. + * + * @return the dao + */ + public ServicesDao getServicesDao() { + return getDao(ServicesDao.class); + } + public void setOnStartConnectionTimeout(int onStartConnectionTimeout) { this.onStartConnectionTimeout = onStartConnectionTimeout; } diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDao.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDao.java new file mode 100644 index 0000000..40c5631 --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDao.java @@ -0,0 +1,36 @@ +package org.ovirt.engine.core.dao.gluster; + +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.ServiceEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.DAO; +import org.ovirt.engine.core.dao.MassOperationsDao; +import org.ovirt.engine.core.dao.SearchDAO; + +/** + * Interface for DB operations on Services. + */ +public interface ServicesDao extends DAO, SearchDAO<ServiceEntity>, MassOperationsDao<ServiceEntity, Guid> { + + public void save(ServiceEntity service); + + public List<ServiceEntity> getAllServicesByClusterId(Guid clusterId); + + public List<ServiceEntity> getAllServicesByServerId(Guid serverId); + + public ServiceEntity getById(Guid serviceId); + + public ServiceEntity getByName(Guid serviceId, String serviceName); + + @Override + public List<ServiceEntity> getAllWithQuery(String query); + + public void remove(Guid id); + + public void removeByName(Guid serverId, String serviceName); + + public void updateServiceStatus(Guid serviceId, ServiceStatus status); + +} diff --git a/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDaoDbFacadeImpl.java b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDaoDbFacadeImpl.java new file mode 100644 index 0000000..9c1534e --- /dev/null +++ b/backend/manager/modules/dal/src/main/java/org/ovirt/engine/core/dao/gluster/ServicesDaoDbFacadeImpl.java @@ -0,0 +1,185 @@ +package org.ovirt.engine.core.dao.gluster; + +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.List; + +import org.ovirt.engine.core.common.businessentities.gluster.ServiceConfigEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceStatus; +import org.ovirt.engine.core.common.utils.EnumUtils; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.MassOperationsGenericDaoDbFacade; +import org.springframework.jdbc.core.namedparam.MapSqlParameterSource; +import org.springframework.jdbc.core.simple.ParameterizedRowMapper; +import org.springframework.jdbc.core.simple.SimpleJdbcTemplate; + +/** + * Implementation of the DB Facade for Services. + */ +public class ServicesDaoDbFacadeImpl extends MassOperationsGenericDaoDbFacade<ServiceEntity, Guid> implements ServicesDao { + + private static final ParameterizedRowMapper<ServiceEntity> serviceRowMapper = new ServiceRowMapper(); + private static final ParameterizedRowMapper<ServiceConfigEntity> serviceConfigRowMapper = new ServiceConfigRowMapper(); + + public ServicesDaoDbFacadeImpl() { + super("Services"); + setProcedureNameForGet("GetById"); + } + + @Override + public void save(ServiceEntity service) { + insertService(service); + insertServiceConfing(service); + } + + private void insertService(ServiceEntity service) { + getCallsHandler().executeModification("InsertService", createFullParametersMapper(service)); + } + + private void insertServiceConfing(ServiceEntity service) { + getCallsHandler().executeModification("InsertServiceConfig", createServiceConfigParams(service.getServiceConfig())); + } + + @Override + public List<ServiceEntity> getAllServicesByClusterId(Guid clusterId) { + List<ServiceEntity> services = getCallsHandler().executeReadList("GetServicesByClusterId", + serviceRowMapper, + getCustomMapSqlParameterSource() + .addValue("cluster_id", clusterId)); + fetchServiceConfigEntitys(services); + return services; + } + + @Override + public List<ServiceEntity> getAllServicesByServerId(Guid serverId) { + List<ServiceEntity> services = getCallsHandler().executeReadList("GetServicesByServerId", + serviceRowMapper, + getCustomMapSqlParameterSource() + .addValue("server_id", serverId)); + fetchServiceConfigEntitys(services); + return services; + } + + @Override + public ServiceEntity getById(Guid serviceId) { + ServiceEntity service = + getCallsHandler().executeRead("GetServiceById", serviceRowMapper, createIdParameterMapper(serviceId)); + fetchServiceConfigEntity(service); + return service; + } + + private void fetchServiceConfigEntity(ServiceEntity service) { + if (service != null) { + service.setServiceConfig(getCallsHandler().executeRead("GetServiceConfigById", + serviceConfigRowMapper, + getCustomMapSqlParameterSource().addValue("service_id", service.getId()))); + } + } + + + private void fetchServiceConfigEntitys(List<ServiceEntity> services) { + for (ServiceEntity service : services) { + fetchServiceConfigEntity(service); + } + } + + @Override + public ServiceEntity getByName(Guid serverId, String serviceName) { + ServiceEntity service = + getCallsHandler().executeRead("GetServiceByName", + serviceRowMapper, + getCustomMapSqlParameterSource() + .addValue("server_id", serverId) + .addValue("service_name", serviceName)); + return service; + } + + @Override + public List<ServiceEntity> getAllWithQuery(String query) { + List<ServiceEntity> services = new SimpleJdbcTemplate(jdbcTemplate).query(query, serviceRowMapper); + fetchServiceConfigEntitys(services); + return services; + } + + @Override + public void remove(Guid serviceId) { + getCallsHandler().executeModification("DeleteServiceByGuid", + createIdParameterMapper(serviceId)); + } + + @Override + public void removeByName(Guid serverId, String serviceName) { + getCallsHandler().executeModification("DeleteServiceByName", + getCustomMapSqlParameterSource() + .addValue("server_id", serverId) + .addValue("service_name", serviceName)); + } + + @Override + public void updateServiceStatus(Guid serviceId, ServiceStatus status) { + getCallsHandler().executeModification("UpdateServiceStatus", + createIdParameterMapper(serviceId).addValue("status", EnumUtils.nameOrNull(status))); + + } + + @Override + protected MapSqlParameterSource createFullParametersMapper(ServiceEntity service) { + return getCustomMapSqlParameterSource() + .addValue("id", service.getId()) + .addValue("cluster_id", service.getClusterId()) + .addValue("server_id", service.getServerId()) + .addValue("service_name", service.getServiceName()) + .addValue("pid", service.getPid()) + .addValue("status", EnumUtils.nameOrNull(service.getStatus())); + } + + private MapSqlParameterSource createServiceConfigParams(ServiceConfigEntity serviceConfig) { + return getCustomMapSqlParameterSource() + .addValue("service_id", serviceConfig.getServiceId()) + .addValue("section", serviceConfig.getSection()) + .addValue("option_key", serviceConfig.getKey()) + .addValue("option_value", serviceConfig.getValue()); + } + + + @Override + protected ParameterizedRowMapper<ServiceEntity> createEntityRowMapper() { + return serviceRowMapper; + } + + private static final class ServiceRowMapper implements ParameterizedRowMapper<ServiceEntity> { + @Override + public ServiceEntity mapRow(ResultSet rs, int rowNum) + throws SQLException { + ServiceEntity entity = new ServiceEntity(); + entity.setId(Guid.createGuidFromString(rs.getString("id"))); + entity.setClusterId(Guid.createGuidFromString(rs.getString("cluster_id"))); + entity.setServerId(Guid.createGuidFromString(rs + .getString("server_id"))); + entity.setServiceName(rs.getString("service_name")); + entity.setPid(rs.getInt("pid")); + entity.setStatus(ServiceStatus.valueOf(rs.getString("status"))); + return entity; + } + } + + private static final class ServiceConfigRowMapper implements ParameterizedRowMapper<ServiceConfigEntity> { + @Override + public ServiceConfigEntity mapRow(ResultSet rs, int rowNum) + throws SQLException { + ServiceConfigEntity entity = new ServiceConfigEntity(); + entity.setServiceId(Guid.createGuidFromString(rs.getString("service_id"))); + entity.setSection(rs.getString("section")); + entity.setKey(rs.getString("option_key")); + entity.setValue(rs.getString("option_value")); + return entity; + } + } + + @Override + protected MapSqlParameterSource createIdParameterMapper(Guid id) { + return getCustomMapSqlParameterSource().addValue("id", id); + } + +} 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 d39f7d4..b6581fc 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 @@ -57,3 +57,4 @@ VmAndTemplatesGenerationsDAO=org.ovirt.engine.core.dao.VmAndTemplatesGenerationsDbFacadeImpl NetworkViewDao=org.ovirt.engine.core.dao.network.NetworkViewDaoDbFacadeImpl VmGuestAgentInterfaceDao=org.ovirt.engine.core.dao.VmGuestAgentInterfaceDaoDbFacadeImpl +ServicesDao=org.ovirt.engine.core.dao.gluster.ServicesDaoDbFacadeImpl diff --git a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties index bf8c664..5696cff 100644 --- a/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties +++ b/backend/manager/modules/dal/src/main/resources/bundles/AppErrors.properties @@ -785,6 +785,9 @@ VALIDATION.GLUSTER.BRICK.ID.NOT_NULL=Brick ID is required. VALIDATION.GLUSTER.VOLUME.BRICK.SERVER_ID.NOT_NULL=Brick Server ID is required. VALIDATION.GLUSTER.VOLUME.BRICK.BRICK_DIR.NOT_NULL=Brick Directory is required. +VALIDATION.SERVICE.ID.NOT_NULL=Service ID is required. +VALIDATION.CLUSTER_ID.NOT_NULL=Cluster ID is required. +VALIDATION.SERVICE.SERVER_ID.NOT_NULL=Server ID is required. ACTION_TYPE_FAILED_CLUSTER_IS_NOT_VALID=Cannot ${action} ${type}. Cluster ID is not valid. ACTION_TYPE_FAILED_CLUSTER_DOES_NOT_SUPPORT_GLUSTER=Cannot ${action} ${type}. Cluster does not support Gluster service. ACTION_TYPE_FAILED_GLUSTER_VOLUME_NAME_ALREADY_EXISTS=Cannot ${action} ${type}. Volume name ${volumeName} already exists. @@ -832,7 +835,6 @@ ENGINE_IS_RUNNING_IN_PREPARE_MODE=This action is not allowed when Engine is preparing for maintenance. ACTION_TYPE_FAILED_SERVER_NAME_REQUIRED=Cannot ${action} ${type}. Server Name required. SERVER_ALREADY_EXISTS_IN_ANOTHER_CLUSTER=One or more servers are already part of an existing cluster. -======= # Exteral Events Errors Messages VAR__TYPE__EXTERNAL_EVENT=$type Exteral Event ACTION_TYPE_FAILED_EXTERNAL_EVENT_ILLEGAL_ORIGIN=Cannot ${action} ${type}. Illegal Origin for External Event : oVirt diff --git a/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/ServicesDaoTest.java b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/ServicesDaoTest.java new file mode 100644 index 0000000..95ee420 --- /dev/null +++ b/backend/manager/modules/dal/src/test/java/org/ovirt/engine/core/dao/gluster/ServicesDaoTest.java @@ -0,0 +1,143 @@ +package org.ovirt.engine.core.dao.gluster; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertNull; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceConfigEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceEntity; +import org.ovirt.engine.core.common.businessentities.gluster.ServiceStatus; +import org.ovirt.engine.core.compat.Guid; +import org.ovirt.engine.core.dao.BaseDAOTestCase; + +/** + * Tests for Services DAO + */ +public class ServicesDaoTest extends BaseDAOTestCase { + private static final Guid SERVER_ID = new Guid("23f6d691-5dfb-472b-86dc-9e1d2d3c18f3"); + private static final Guid CLUSTER_ID = new Guid("ae956031-6be2-43d6-bb8f-5191c9253314"); + private static final Guid EXISTING_SERVICE_ID = new Guid("b2cb2f73-fab3-4a42-93f0-d5e4c069a43a"); + private static final String EXISTING_SERVICE_NAME = "container-server"; + private static final String NEW_SERVICE_NAME = "account-server"; + private ServicesDao dao; + private ServiceEntity existingService; + private ServiceEntity newService; + + @Override + public void setUp() throws Exception { + super.setUp(); + dao = dbFacade.getServicesDao(); + existingService = dao.getById(EXISTING_SERVICE_ID); + } + + @Test + public void testSaveAndGetById() { + ServiceEntity service = dao.getByName(SERVER_ID, NEW_SERVICE_NAME); + assertNull(service); + + newService = getTestService(); + insertTestService(newService); + service = dao.getById(newService.getId()); + assertNotNull(service); + assertEquals(newService, service); + } + + @Test + public void testGetById() { + ServiceEntity service = dao.getById(EXISTING_SERVICE_ID); + + assertTrue(service != null); + assertEquals(existingService, service); + } + + @Test + public void testGetAllServicesByClusterId() { + List<ServiceEntity> services = dao.getAllServicesByClusterId(CLUSTER_ID); + assertNotNull(services); + assertTrue(services.size() == 3); + assertTrue(services.contains(existingService)); + } + + @Test + public void testGetByName() { + newService = getTestService(); + insertTestService(newService); + ServiceEntity service = dao.getByName(SERVER_ID, NEW_SERVICE_NAME); + + assertNotNull(service); + assertEquals(newService, service); + } + + + @Test + public void testGetAllWithQuery() { + List<ServiceEntity> services = + dao.getAllWithQuery("select * from services where server_id = '" + + SERVER_ID + "'"); + + assertTrue(services != null); + assertTrue(services.size() == 2); + assertTrue(services.contains(existingService)); + } + + @Test + public void testRemove() { + dao.remove(EXISTING_SERVICE_ID); + ServiceEntity service = dao.getById(EXISTING_SERVICE_ID); + assertNull(service); + } + + @Test + public void testRemoveByName() { + dao.removeByName(SERVER_ID, EXISTING_SERVICE_NAME); + List<ServiceEntity> services = dao.getAllServicesByServerId(SERVER_ID); + assertTrue(services.size() == 1); + assertFalse(services.contains(existingService)); + } + + @Test + public void testUpdateServiceStatus() { + assertTrue(existingService.getStatus() == ServiceStatus.RUNNING); + + dao.updateServiceStatus(EXISTING_SERVICE_ID, ServiceStatus.STOPPED); + ServiceEntity service = dao.getById(EXISTING_SERVICE_ID); + + assertNotNull(service); + assertFalse(service.getStatus() == ServiceStatus.RUNNING); + + assertFalse(service.equals(existingService)); + existingService.setStatus(ServiceStatus.STOPPED); + assertEquals(existingService, service); + } + + private void insertTestService(ServiceEntity service) { + dao.save(service); + } + + private ServiceEntity getTestService() { + Guid serviceId = Guid.NewGuid(); + ServiceEntity service = new ServiceEntity(); + service.setServiceName(NEW_SERVICE_NAME); + service.setClusterId(CLUSTER_ID); + service.setServerId(SERVER_ID); + service.setId(serviceId); + service.setPid(23491); + service.setStatus(ServiceStatus.RUNNING); + service.setServiceConfig(getServiceConfig(serviceId)); + return service; + } + + private ServiceConfigEntity getServiceConfig(Guid serviceId) { + ServiceConfigEntity serviceConfig = new ServiceConfigEntity(); + serviceConfig.setServiceId(serviceId); + serviceConfig.setSection("section1"); + serviceConfig.setKey("memcache_servers"); + serviceConfig.setValue("localhost:11211"); + return serviceConfig; + } +} diff --git a/backend/manager/modules/dal/src/test/resources/fixtures.xml b/backend/manager/modules/dal/src/test/resources/fixtures.xml index 898ed0d..f503210 100644 --- a/backend/manager/modules/dal/src/test/resources/fixtures.xml +++ b/backend/manager/modules/dal/src/test/resources/fixtures.xml @@ -4427,6 +4427,65 @@ <value>RDMA</value> </row> </table> + + <table name="services"> + <column>id</column> + <column>cluster_id</column> + <column>server_id</column> + <column>service_name</column> + <column>pid</column> + <column>status</column> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c069a43a</value> + <value>ae956031-6be2-43d6-bb8f-5191c9253314</value> + <value>23f6d691-5dfb-472b-86dc-9e1d2d3c18f3</value> + <value>container-server</value> + <value>32561</value> + <value>RUNNING</value> + </row> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c069a43c</value> + <value>ae956031-6be2-43d6-bb8f-5191c9253314</value> + <value>23f6d691-5dfb-472b-86dc-9e1d2d3c18f3</value> + <value>proxy-server</value> + <value>32531</value> + <value>RUNNING</value> + </row> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c068c65b</value> + <value>ae956031-6be2-43d6-bb8f-5191c9253314</value> + <value>2001751e-549b-4e7a-aff6-32d36856c125</value> + <value>proxy-server</value> + <value>39861</value> + <value>RUNNING</value> + </row> + </table> + + <table name="service_config"> + <column>service_id</column> + <column>section</column> + <column>option_key</column> + <column>option_value</column> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c069a43a</value> + <value>section2</value> + <value>use</value> + <value>egg:swift#memcache</value> + </row> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c069a43c</value> + <value>section1</value> + <value>use</value> + <value>egg:swift#proxy</value> + </row> + <row> + <value>b2cb2f73-fab3-4a42-93f0-d5e4c068c65b</value> + <value>section2</value> + <value>use</value> + <value>egg:swift#proxy</value> + </row> + </table> + <table name="object_column_white_list"> <column>object_name</column> <column>column_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 90808a6..642cbcd 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 @@ -305,6 +305,9 @@ <include name="common/businessentities/gluster/MemoryStatus.java"/> <include name="common/businessentities/gluster/Mempool.java"/> <include name="common/businessentities/gluster/ServiceType.java"/> + <include name="common/businessentities/gluster/ServiceEntity.java"/> + <include name="common/businessentities/gluster/ServiceConfigEntity.java"/> + <include name="common/businessentities/gluster/ServiceStatus.java"/> <include name="common/action/gluster/*.java"/> <include name="common/queries/gluster/*.java"/> <include name="common/constants/gluster/GlusterConstants.java"/> -- To view, visit http://gerrit.ovirt.org/11147 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I7982faf180f8580838a962a5674e8e9e8982679b Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Dhandapani Gopal <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
