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

Reply via email to