Ori Liel has uploaded a new change for review. Change subject: restapi: #839205 Display Host Hooks ......................................................................
restapi: #839205 Display Host Hooks https://bugzilla.redhat.com/839205 Change-Id: I38a3d38cc52d5ec77f55fe7db4d5e47b09568ca7 Signed-off-by: Ori Liel <ol...@redhat.com> --- A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHookResource.java A backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHooksResource.java M backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java M backend/manager/modules/restapi/interface/definition/src/main/resources/api.xsd A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHookResource.java A backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResource.java M backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java A backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResourceTest.java 8 files changed, 273 insertions(+), 0 deletions(-) git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/78/9478/1 diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHookResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHookResource.java new file mode 100644 index 0000000..aea734f --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHookResource.java @@ -0,0 +1,15 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Produces; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.Hook; + +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) +public interface HostHookResource { + + @GET + @Formatted + public Hook get(); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHooksResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHooksResource.java new file mode 100644 index 0000000..764d106 --- /dev/null +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostHooksResource.java @@ -0,0 +1,27 @@ +package org.ovirt.engine.api.resource; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.Produces; + +import org.jboss.resteasy.annotations.providers.jaxb.Formatted; +import org.ovirt.engine.api.model.Hooks; + +@Produces({ MediaType.APPLICATION_XML, MediaType.APPLICATION_JSON, MediaType.APPLICATION_X_YAML }) +public interface HostHooksResource { + + @GET + @Formatted + public Hooks list(); + + /** + * Sub-resource locator method, returns individual HostHookResource on which the remainder of the URI is dispatched. + * + * @param id + * the hook ID + * @return matching subresource if found + */ + @Path("{id}") + public HostHookResource getDomainSubResource(@PathParam("id") String id); +} diff --git a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java index 638a4ec..39f4088 100644 --- a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java +++ b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java @@ -91,6 +91,9 @@ @Path("tags") public AssignedTagsResource getTagsResource(); + @Path("hooks") + public HostHooksResource getHooksResource(); + @Path("permissions") public AssignedPermissionsResource getPermissionsResource(); } 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 a6a2b48..0ad7616 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 @@ -1153,6 +1153,7 @@ <xs:element name="override_iptables" type="xs:boolean" minOccurs="0" maxOccurs="1"/> <!-- when installing a host, optionally reboot the host --> <xs:element name="reboot_after_installation" type="xs:boolean" minOccurs="0"/> + <xs:element ref="hooks" minOccurs="0"/> </xs:sequence> </xs:extension> </xs:complexContent> @@ -1509,6 +1510,36 @@ </xs:complexContent> </xs:complexType> + <xs:element name="hook" type="Hook"/> + + <xs:element name="hooks" type="Hooks"/> + + <xs:complexType name="Hook"> + <xs:complexContent> + <xs:extension base="BaseResource"> + <xs:sequence> + <xs:element name="event_name" type="xs:string" minOccurs="0"/> + <xs:element name="md5" type="xs:string" minOccurs="0"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + + <xs:complexType name="Hooks"> + <xs:complexContent> + <xs:extension base="BaseResources"> + <xs:sequence> + <xs:annotation> + <xs:appinfo> + <jaxb:property name="Hooks"/> + </xs:appinfo> + </xs:annotation> + <xs:element ref="hook" minOccurs="0" maxOccurs="unbounded"/> + </xs:sequence> + </xs:extension> + </xs:complexContent> + </xs:complexType> + <!-- Networks --> <xs:element name="ip" type="IP"/> diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHookResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHookResource.java new file mode 100644 index 0000000..3465b25 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHookResource.java @@ -0,0 +1,33 @@ +package org.ovirt.engine.api.restapi.resource; + +import javax.ws.rs.GET; + +import org.ovirt.engine.api.model.Hook; +import org.ovirt.engine.api.model.Hooks; +import org.ovirt.engine.api.resource.HostHookResource; + +public class BackendHostHookResource extends AbstractBackendSubResource<Hook, Object> implements HostHookResource { + + private BackendHostHooksResource parent; + + public BackendHostHookResource(String id, BackendHostHooksResource parent) { + super(id, Hook.class, Object.class, new String[0]); + this.parent = parent; + } + + @Override + @GET + public Hook get() { + Hooks hooks = parent.list(); + return getHook(hooks); + } + + public Hook getHook(Hooks hooks) { + for (Hook hook : hooks.getHooks()) { + if (parent.generateHookId(hook.getEventName(), hook.getName(), hook.getMd5()).equals(guid)) { + return hook; + } + } + return null; + } +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResource.java new file mode 100644 index 0000000..2f2cdc7 --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResource.java @@ -0,0 +1,93 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.HashMap; +import java.util.Map; + +import javax.ws.rs.GET; +import javax.ws.rs.Path; +import javax.ws.rs.PathParam; +import javax.ws.rs.core.Response; + +import org.ovirt.engine.api.model.Hook; +import org.ovirt.engine.api.model.Hooks; +import org.ovirt.engine.api.resource.HostHookResource; +import org.ovirt.engine.api.resource.HostHooksResource; +import org.ovirt.engine.core.common.queries.GetVdsHooksByIdParameters; +import org.ovirt.engine.core.common.queries.VdcQueryReturnValue; +import org.ovirt.engine.core.common.queries.VdcQueryType; +import org.ovirt.engine.core.compat.NGuid; +import java.security.*; + +public class BackendHostHooksResource extends AbstractBackendCollectionResource<Hook, Object> implements HostHooksResource { + + private static final String MD5_FILE_SIGNATURE = "md5"; + private static final String MD5_SECURITY_ALGORITHM = "MD5"; + + public BackendHostHooksResource(String hostId) { + super(Hook.class, Object.class); + this.hostId = hostId; + } + + private String hostId; + + @Override + @GET + public Hooks list() { + VdcQueryReturnValue result = + runQuery(VdcQueryType.GetVdsHooksById2, + new GetVdsHooksByIdParameters(asGuid(hostId))); + HashMap<String, HashMap<String, HashMap<String, String>>> dictionary = + (HashMap<String, HashMap<String, HashMap<String, String>>>) result.getReturnValue(); + Hooks hooks = new Hooks(); + for (Map.Entry<String, HashMap<String, HashMap<String, String>>> keyValuePair : dictionary.entrySet()) { // events + for (Map.Entry<String, HashMap<String, String>> keyValuePair1 : keyValuePair.getValue() // hooks + .entrySet()) { + Hook hook = createHook(keyValuePair, keyValuePair1); + hooks.getHooks().add(hook); + } + } + return hooks; + } + + private Hook createHook(Map.Entry<String, HashMap<String, HashMap<String, String>>> keyValuePair, + Map.Entry<String, HashMap<String, String>> keyValuePair1) { + String hookName = keyValuePair1.getKey(); + String eventName = keyValuePair.getKey(); + String md5 = keyValuePair1.getValue().get(MD5_FILE_SIGNATURE); + Hook hook = new Hook(); + hook.setName(hookName); + hook.setEventName(eventName); + hook.setMd5(md5); + setHookId(hook, hookName, eventName, md5); + return hook; + } + + public NGuid generateHookId(String eventName, String hookName, String md5) { + String idString = eventName + hookName + md5; + try { + byte[] hash = MessageDigest.getInstance(MD5_SECURITY_ALGORITHM).digest(idString.getBytes()); + NGuid guid = new NGuid(hash, true); + return guid; + } catch (NoSuchAlgorithmException e) { + throw new IllegalStateException(e); // never happens, MD5 algorithm exists + } + } + + private void setHookId(Hook hook, String hookName, String eventName, String md5) { + NGuid guid = generateHookId(eventName, hookName, md5); + hook.setId(guid != null ? guid.toString() : null); + } + + @Override + @Path("{id}") + public HostHookResource getDomainSubResource(@PathParam("id") String id) { + return inject(new BackendHostHookResource(id, this)); + } + + @Override + protected Response performRemove(String id) { + // not in use + return null; + } + +} diff --git a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java index 60b34d7..d362e29 100644 --- a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java +++ b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java @@ -2,6 +2,7 @@ import java.util.List; +import javax.ws.rs.Path; import javax.ws.rs.WebApplicationException; import javax.ws.rs.core.Response; @@ -336,4 +337,10 @@ public BackendHostsResource getParent() { return this.parent; } + + @Override + @Path("hooks") + public BackendHostHooksResource getHooksResource() { + return inject(new BackendHostHooksResource(id)); + } } diff --git a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResourceTest.java b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResourceTest.java new file mode 100644 index 0000000..203528c --- /dev/null +++ b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/BackendHostHooksResourceTest.java @@ -0,0 +1,64 @@ +package org.ovirt.engine.api.restapi.resource; + +import java.util.HashMap; + +import org.junit.Test; +import org.ovirt.engine.api.model.Hook; +import org.ovirt.engine.api.model.Hooks; +import org.ovirt.engine.core.common.queries.GetVdsHooksByIdParameters; +import org.ovirt.engine.core.common.queries.VdcQueryType; + +public class BackendHostHooksResourceTest extends AbstractBackendResourceTest<Hook, HashMap<String, HashMap<String, HashMap<String, String>>>> { + + BackendHostHooksResource resource = new BackendHostHooksResource(GUIDS[0].toString()); + + static final String ON_VM_START_EVENT = "on_vm_start_event"; + static final String ON_VM_STOP_EVENT = "on_vm_stop_event"; + static final String NOTIFY_ADMIN_HOOK = "notify_admin_hook"; + static final String SPECIAL_LOG_HOOK = "special_log_hook"; + static final String RELEASE_RESOURCES_HOOK = "release_resources_hook"; + static final String MD5 = "md5"; + static final String MD5_1 = "aaa"; + static final String MD5_2 = "bbb"; + static final String MD5_3 = "ccc"; + + @Override + protected HashMap<String, HashMap<String, HashMap<String, String>>> getEntity(int index) { + HashMap<String, HashMap<String, HashMap<String, String>>> events = + new HashMap<String, HashMap<String, HashMap<String, String>>>(); + + events.put(ON_VM_START_EVENT, new HashMap<String, HashMap<String, String>>()); + events.put(ON_VM_STOP_EVENT, new HashMap<String, HashMap<String, String>>()); + events.get(ON_VM_START_EVENT).put(NOTIFY_ADMIN_HOOK, new HashMap<String, String>()); + events.get(ON_VM_START_EVENT).put(SPECIAL_LOG_HOOK, new HashMap<String, String>()); + events.get(ON_VM_STOP_EVENT).put(SPECIAL_LOG_HOOK, new HashMap<String, String>()); + events.get(ON_VM_STOP_EVENT).put(RELEASE_RESOURCES_HOOK, new HashMap<String, String>()); + events.get(ON_VM_START_EVENT).get(NOTIFY_ADMIN_HOOK).put(MD5, MD5_1); + events.get(ON_VM_START_EVENT).get(SPECIAL_LOG_HOOK).put(MD5, MD5_2); + events.get(ON_VM_STOP_EVENT).get(SPECIAL_LOG_HOOK).put(MD5, MD5_2); + events.get(ON_VM_STOP_EVENT).get(RELEASE_RESOURCES_HOOK).put(MD5, MD5_3); + return events; + } + + @Override + protected void init() { + resource.setBackend(backend); + resource.setMappingLocator(mapperLocator); + resource.setValidatorLocator(validatorLocator); + resource.setSessionHelper(sessionHelper); + resource.setMessageBundle(messageBundle); + resource.setHttpHeaders(httpHeaders); + } + + @Test + public void testList() throws Exception { + setUpGetEntityExpectations(VdcQueryType.GetVdsHooksById2, + GetVdsHooksByIdParameters.class, + new String[] { "VdsId" }, + new Object[] { GUIDS[0] }, getEntity(0)); + control.replay(); + Hooks hooks = resource.list(); + assertNotNull(hooks.getHooks()); + assertEquals(hooks.getHooks().size(), 4); + } +} -- To view, visit http://gerrit.ovirt.org/9478 To unsubscribe, visit http://gerrit.ovirt.org/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I38a3d38cc52d5ec77f55fe7db4d5e47b09568ca7 Gerrit-PatchSet: 1 Gerrit-Project: ovirt-engine Gerrit-Branch: master Gerrit-Owner: Ori Liel <ol...@redhat.com> _______________________________________________ Engine-patches mailing list Engine-patches@ovirt.org http://lists.ovirt.org/mailman/listinfo/engine-patches