Eli Mesika has uploaded a new change for review. Change subject: API: Adding support for external events ......................................................................
API: Adding support for external events This patch introduces all API changes made to support External Events from API on top of the heavy API refactoring in the former patch. Change-Id: Ibdaf39df28c5f87db4c1bf9b5807c45a0a8ea9a8 Signed-off-by: Eli Mesika <[email protected]> Bug-Url: https://bugzilla.redhat.com/866123 --- M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/EventsResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd M backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendEventsResource.java M backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/EventMapper.java 5 files changed, 139 insertions(+), 5 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/97/10097/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/EventsResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/EventsResource.java index 952480f..41fa4e3 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/EventsResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/EventsResource.java @@ -16,12 +16,18 @@ package org.ovirt.engine.api.resource; +import javax.ws.rs.Consumes; +import javax.ws.rs.DELETE; import javax.ws.rs.GET; -import javax.ws.rs.Produces; +import javax.ws.rs.POST; import javax.ws.rs.Path; -import org.jboss.resteasy.annotations.providers.jaxb.Formatted; -import org.ovirt.engine.api.model.Events; import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; +import javax.ws.rs.core.Response; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.Event; +import org.ovirt.engine.api.model.Events; @Path("/events") @Produces( { MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) @@ -31,6 +37,15 @@ @Formatted public Events list(); + @POST + @Formatted + @Consumes({MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML}) + public Response add(Event event); + + @DELETE + @Path("{id}") + public Response remove(@PathParam("id") String id); + /** * Sub-resource locator method, returns individual EventResource on which the remainder of the URI is dispatched. * diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd index 6a9d2e7..a7730bf 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd @@ -1458,6 +1458,10 @@ <xs:element ref="template" minOccurs="0" /> <xs:element ref="cluster" minOccurs="0" /> <xs:element ref="data_center" minOccurs="0" /> + <xs:element name="origin" type="xs:string" minOccurs="0" maxOccurs="1" /> + <xs:element name="custom_event_id" type="xs:int" minOccurs="0" maxOccurs="1" /> + <xs:element name="event_flood_in_sec" type="xs:int" minOccurs="0" maxOccurs="1" /> + <xs:element name="custom_data" type="xs:string" minOccurs="0" maxOccurs="1" /> </xs:sequence> </xs:extension> </xs:complexContent> diff --git a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml index f131acb..a317431 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml +++ b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata_v-3.1.yaml @@ -1246,6 +1246,26 @@ case_sensitive: {context: matrix, type: 'xs:boolean', value: true|false, required: false} max: {context: matrix, type: 'xs:int', value: 'max results', required: false} headers: {} +- name: /api/events/{event:id}|rel=delete + request: + body: + parameterType: null + signatures: [] + urlparams: {} + headers: {} + +- name: /api/events|rel=add + request: + body: + parameterType: Event + signatures: + - mandatoryArguments: {event.description: 'xs:string', event.severity: 'xs:string', event.origin: 'xs:string', event.customEventId: 'xs:int'} + optionalArguments:{event.host.id: 'xs:string',event.user.id: 'xs:string',event.vm.id: 'xs:string',event.storageDomain.id: 'xs:string',event.template.id: 'xs:string',event.cluster.id: 'xs:string',event.dataCenter.id: 'xs:string',} + urlparams: {} + headers: + Content-Type: {value: application/xml|json, required: true} + Expect: {value: 201-created, required: false} + Correlation-Id: {value: 'any string', required: false} - name: /api/groups/{group:id}|rel=get request: body: diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendEventsResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendEventsResource.java index 133abde..68ea5dd 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendEventsResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendEventsResource.java @@ -8,8 +8,13 @@ import org.ovirt.engine.api.model.Events; import org.ovirt.engine.api.resource.EventResource; import org.ovirt.engine.api.resource.EventsResource; +import org.ovirt.engine.core.common.action.AddExternalEventParameters; +import org.ovirt.engine.core.common.action.RemoveExternalEventParameters; +import org.ovirt.engine.core.common.action.VdcActionType; import org.ovirt.engine.core.common.businessentities.AuditLog; import org.ovirt.engine.core.common.interfaces.SearchType; +import org.ovirt.engine.core.common.queries.GetAuditLogByIdParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; public class BackendEventsResource extends AbstractBackendCollectionResource<Event, AuditLog> implements @@ -55,7 +60,16 @@ } @Override + public Response add(Event event) { + validateParameters(event, "origin", "severity", "eventFloodInSec", "description"); + AuditLog entity = map(event); + return performCreation(VdcActionType.AddExternalEvent, + new AddExternalEventParameters(entity), + new QueryIdResolver<Long>(VdcQueryType.GetAuditLogById, GetAuditLogByIdParameters.class)); + } + + @Override protected Response performRemove(String id) { - throw new UnsupportedOperationException(); + return performAction(VdcActionType.RemoveExternalEvent, new RemoveExternalEventParameters(Long.valueOf(id))); } } diff --git a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/EventMapper.java b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/EventMapper.java index ccace9f..f71229a 100644 --- a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/EventMapper.java +++ b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/EventMapper.java @@ -1,5 +1,8 @@ package org.ovirt.engine.api.restapi.types; +import java.sql.Date; +import java.util.Calendar; + import org.apache.commons.lang.StringUtils; import org.ovirt.engine.api.model.Cluster; import org.ovirt.engine.api.model.DataCenter; @@ -10,10 +13,10 @@ import org.ovirt.engine.api.model.Template; import org.ovirt.engine.api.model.User; import org.ovirt.engine.api.model.VM; +import org.ovirt.engine.api.restapi.utils.TypeConversionHelper; import org.ovirt.engine.core.common.AuditLogSeverity; import org.ovirt.engine.core.common.businessentities.AuditLog; import org.ovirt.engine.core.compat.NGuid; -import org.ovirt.engine.api.restapi.utils.TypeConversionHelper; public class EventMapper { @@ -71,9 +74,68 @@ if (StringUtils.isNotEmpty(entity.getCorrelationId())) { model.setCorrelationId(entity.getCorrelationId()); } + if (StringUtils.isNotEmpty(entity.getOrigin())) { + model.setOrigin(entity.getOrigin()); + } + model.setCustomEventId(entity.getCustomEventId()); + model.setEventFloodInSec(entity.getEventFloodInSec()); + if (StringUtils.isNotEmpty(entity.getCustomData())) { + model.setCustomData(entity.getCustomData()); + } return model; } + @Mapping(from = Event.class, to = AuditLog.class) + public static AuditLog map(Event event, AuditLog entity) { + AuditLog auditLog = (entity != null) ? entity : new AuditLog(); + auditLog.setseverity(map(event.getSeverity(), null)); + auditLog.setlog_time(event.getTime() == null ? new Date((Calendar.getInstance().getTimeInMillis())) + : event.getTime().toGregorianCalendar().getTime()); + auditLog.setmessage(event.getDescription()); + NGuid guid = (event.getUser() != null) ? new NGuid(event.getUser().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setuser_id(guid); + } + guid = (event.getVm() != null) ? new NGuid(event.getVm().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setvm_id(guid); + } + guid = (event.getStorageDomain() != null) ? new NGuid(event.getStorageDomain().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setstorage_domain_id(guid); + } + guid = (event.getHost() != null) ? new NGuid(event.getHost().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setvds_id(guid); + } + guid = (event.getTemplate() != null) ? new NGuid(event.getTemplate().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setvm_template_id(guid); + } + guid = (event.getCluster() != null) ? new NGuid(event.getCluster().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setvds_group_id(guid); + } + guid = (event.getDataCenter() != null) ? new NGuid(event.getDataCenter().getId()) : NGuid.Empty; + if (!guid.equals(NGuid.Empty)) { + auditLog.setstorage_pool_id(guid); + } + if (StringUtils.isNotEmpty(event.getCorrelationId())) { + auditLog.setCorrelationId(event.getCorrelationId()); + } + if (StringUtils.isNotEmpty(event.getCorrelationId())) { + auditLog.setCorrelationId(event.getCorrelationId()); + } + if (StringUtils.isNotEmpty(event.getOrigin())) { + auditLog.setOrigin(event.getOrigin()); + } + auditLog.setCustomEventId(event.getCustomEventId()); + auditLog.setEventFloodInSec(event.getEventFloodInSec()); + if (StringUtils.isNotEmpty(event.getCustomData())) { + auditLog.setCustomData(event.getCustomData()); + } + return auditLog; + } @Mapping(from = AuditLogSeverity.class, to = LogSeverity.class) public static LogSeverity map(AuditLogSeverity entityStatus, LogSeverity template) { @@ -90,4 +152,23 @@ return null; } } + + @Mapping(from = String.class, to = AuditLogSeverity.class) + public static AuditLogSeverity map(String template, AuditLogSeverity entityStatus) { + if (AuditLogSeverity.NORMAL.name().equalsIgnoreCase(template)) { + return AuditLogSeverity.NORMAL; + } + else if (AuditLogSeverity.WARNING.name().equalsIgnoreCase(template)) { + return AuditLogSeverity.WARNING; + } + else if (AuditLogSeverity.ERROR.name().equalsIgnoreCase(template)) { + return AuditLogSeverity.ERROR; + } + else if (AuditLogSeverity.ALERT.name().equalsIgnoreCase(template)) { + return AuditLogSeverity.ALERT; + } + else { + return null; + } + } } -- To view, visit http://gerrit.ovirt.org/10097 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: Ibdaf39df28c5f87db4c1bf9b5807c45a0a8ea9a8 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Eli Mesika <[email protected]> _______________________________________________ Engine-patches mailing list [email protected] http://lists.ovirt.org/mailman/listinfo/engine-patches
