Yair Zaslavsky has uploaded a new change for review.

Change subject: aaa: Fix group name issues for legacy provider
......................................................................

aaa: Fix group name issues for legacy provider

Chagning format from: authz/a/b/c/d to: a/b/c/d@authz
to conform to the users format.
Removed specific code at rest-api that handled old format.

Change-Id: I8c1feed08e33156c794b230fa04f33f2ebd82240
Topic: AAA
Signed-off-by: Yair Zaslavsky <yzasl...@redhat.com>
---
M 
backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/KerberosLdapAuthz.java
M 
backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/LdapBrokerUtils.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResource.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResourceTest.java
M 
backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResourceTest.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/utils/aaa/AuthzUtils.java
7 files changed, 125 insertions(+), 58 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/79/32779/1

diff --git 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/KerberosLdapAuthz.java
 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/KerberosLdapAuthz.java
index ea9cfa0..dae3df2 100644
--- 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/KerberosLdapAuthz.java
+++ 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/KerberosLdapAuthz.java
@@ -272,13 +272,13 @@
                         user.getSurName()
                 ).mput(
                         Authz.PrincipalRecord.NAME,
-                        removeUpnSuffix(user.getUserName())
+                        formatValue(user.getUserName(), 
Authz.PrincipalRecord.NAME)
                 ).mput(
                         Authz.PrincipalRecord.TITLE,
                         user.getTitle()
                 ).mput(
                         Authz.PrincipalRecord.PRINCIPAL,
-                        removeUpnSuffix(user.getUserName())
+                        formatValue(user.getUserName(), 
Authz.PrincipalRecord.PRINCIPAL)
                 );
         if (user.getGroups() != null) {
             List<ExtMap> groups = new ArrayList<>();
@@ -327,7 +327,7 @@
                     String.format(
                             "(%1$s%2$s%3$s)", keysToAttributes.get(key),
                             
operatorsToChars.get(queryFilterRecord.get(QueryFilterRecord.OPERATOR)),
-                            
removeUpnSuffix(queryFilterRecord.get(key).toString())
+                            formatValue(queryFilterRecord.get(key).toString(), 
key)
                             )
                     );
         } else {
@@ -346,8 +346,14 @@
         return query;
     }
 
-    private String removeUpnSuffix(String value) {
-        return value.contains("@") ? value.substring(0, value.indexOf("@")) : 
value;
+    private String formatValue(String value, ExtKey key) {
+        String result = value;
+        if (key.equals(Authz.PrincipalRecord.NAME) || 
key.equals(Authz.PrincipalRecord.PRINCIPAL)) {
+            result = value.contains("@") ? value.substring(0, 
value.indexOf("@")) : value;
+        } else if (key.equals(Authz.GroupRecord.NAME)) {
+            result = value.contains("/") ? 
value.substring(value.lastIndexOf('/') + 1) : value;
+        }
+        return result;
     }
 
 }
diff --git 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/LdapBrokerUtils.java
 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/LdapBrokerUtils.java
index eec7e24..ea7e32b 100644
--- 
a/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/LdapBrokerUtils.java
+++ 
b/backend/manager/modules/builtin-extensions/src/main/java/org/ovirt/engine/extensions/aaa/builtin/kerberosldap/LdapBrokerUtils.java
@@ -44,19 +44,25 @@
         }
 
         StringBuilder sb = new StringBuilder();
+        StringBuilder domainName = new StringBuilder();
 
         List<Rdn> rdns = name.getRdns();
         for (Rdn rdn : rdns) {
             String type = rdn.getType();
             String val = (String) rdn.getValue();
             if (type.equalsIgnoreCase("dc")) {
-                sb.insert(0, "." + val);
+                if (domainName.length() > 0) {
+                    domainName.insert(0, ".");
+                }
+                domainName.insert(0, val);
                 continue;
+            } else {
+                sb.append("/" + val);
             }
-            sb.append("/" + val);
         }
         // remove the first "." character.
         sb.delete(0, 1);
+        sb.append("@").append(domainName);
         return sb.toString();
     }
 
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResource.java
index d524491..cacf81e 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResource.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.api.restapi.resource.aaa;
 
 import java.text.MessageFormat;
+import java.util.Collection;
 import java.util.List;
 
 import javax.ws.rs.core.Response;
@@ -17,6 +18,7 @@
 import org.ovirt.engine.api.restapi.resource.ResourceConstants;
 import org.ovirt.engine.api.restapi.resource.SingleEntityResource;
 import org.ovirt.engine.api.restapi.utils.DirectoryEntryIdUtils;
+import org.ovirt.engine.api.restapi.utils.aaa.AuthzUtils;
 import org.ovirt.engine.core.aaa.DirectoryGroup;
 import org.ovirt.engine.core.common.action.AddGroupParameters;
 import org.ovirt.engine.core.common.action.IdParameters;
@@ -64,18 +66,16 @@
      * model directly, or it can be embedded in the name.
      *
      * @param group the model of the group
+     * @param authzProvidersNames
+     *            list of existing authz provider names, including the 
returned provider name, if exists in the list
      * @return the name of the directory or {@code null} if the group can't be 
determined
      */
-    private String getDirectoryName(Group group) {
+    private String getAuthzProviderName(Group group, Collection<String> 
authzProvidersNames) {
         if (group.isSetDomain() && group.getDomain().isSetName()) {
             return group.getDomain().getName();
         }
         else if (group.isSetDomain() && group.getDomain().isSetId()) {
-            List<String> domains = getBackendCollection(
-                String.class,
-                VdcQueryType.GetDomainList,
-                new VdcQueryParametersBase());
-            for (String domain :domains) {
+            for (String domain : authzProvidersNames) {
                 Guid domainId = new Guid(domain.getBytes(), true);
                 if (domainId.toString().equals(group.getDomain().getId())) {
                    return domain;
@@ -84,13 +84,9 @@
             throw new WebFaultException(
                 null,
                 "Domain: '" + group.getDomain().getId().toString() + "' does 
not exist.",
-                Response.Status.BAD_REQUEST
-            );
+                Response.Status.BAD_REQUEST);
         }
-        else if (group.isSetName() && group.getName().contains("/")) {
-            return group.getName().substring(0, group.getName().indexOf("/"));
-        }
-        return null;
+        return AuthzUtils.getAuthzNameFromEntityName(group.getName(), 
authzProvidersNames);
     }
 
     /**
@@ -150,11 +146,15 @@
 
     @Override
     public Response add(Group group) {
+        List<String> authzProvidersNames = getBackendCollection(
+                String.class,
+                VdcQueryType.GetDomainList,
+                new VdcQueryParametersBase());
         validateParameters(group, "name");
-        if (!isNameContainsDomain(group)) {
+        if (AuthzUtils.getAuthzNameFromEntityName(group.getName(), 
authzProvidersNames) == null) {
             validateParameters(group, "domain.id|name");
         }
-        String directoryName = getDirectoryName(group);
+        String directoryName = getAuthzProviderName(group, 
authzProvidersNames);
         DirectoryGroup directoryGroup = findDirectoryGroup(directoryName, 
group);
         if (directoryGroup == null) {
             return Response.status(Status.BAD_REQUEST)
@@ -182,16 +182,11 @@
         } else if (groupModel.isSetDomainEntryId()) {
             return getGroupById(directoryName, namespace, 
groupModel.getDomainEntryId());
         } else if (groupModel.isSetName()) {
-            String groupName = groupModel.getName();
-            if (groupName.startsWith(directoryName + "/")) {
-                int lastSlash = groupName.lastIndexOf("/");
-                groupName = groupName.substring(lastSlash + 1);
-            }
             return getEntity(
-                DirectoryGroup.class,
-                SearchType.DirectoryGroup,
-                getDirectoryGroupSearchPattern(groupName, directoryName)
-            );
+                    DirectoryGroup.class,
+                    SearchType.DirectoryGroup,
+                    
getDirectoryGroupSearchPattern(AuthzUtils.getEntityNameWithoutAuthz(groupModel.getName(),
 directoryName), directoryName)
+                );
         }
 
         return null;
@@ -210,11 +205,6 @@
     @Override
     public Response performRemove(String id) {
         return performAction(VdcActionType.RemoveGroup, new 
IdParameters(asGuid(id)));
-    }
-
-    private boolean isNameContainsDomain(Group group) {
-        String name = group.getName();
-        return name.contains("/") && name.indexOf('/') != name.length() - 1;
     }
 
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResource.java
index fe0a8dd..c3d738e 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResource.java
@@ -4,6 +4,7 @@
 
 import java.nio.charset.Charset;
 import java.text.MessageFormat;
+import java.util.Collection;
 import java.util.List;
 
 import javax.ws.rs.core.Response;
@@ -19,6 +20,7 @@
 import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResource;
 import org.ovirt.engine.api.restapi.resource.ResourceConstants;
 import org.ovirt.engine.api.restapi.resource.SingleEntityResource;
+import org.ovirt.engine.api.restapi.utils.aaa.AuthzUtils;
 import org.ovirt.engine.api.restapi.utils.DirectoryEntryIdUtils;
 import org.ovirt.engine.core.aaa.DirectoryUser;
 import org.ovirt.engine.core.common.action.AddUserParameters;
@@ -76,16 +78,12 @@
                user_defined_pattern + AND_SEARCH_PATTERN + 
USERS_SEARCH_PATTERN;
     }
 
-    protected String getDomain(User user) {
+    protected String getAuthzProviderName(User user, Collection<String> 
authzProvidersNames) {
         if (user.isSetDomain() && user.getDomain().isSetName()) {
             return user.getDomain().getName();
         }
         else if (user.isSetDomain() && user.getDomain().isSetId()) {
-            List<String> domains = getBackendCollection(
-               String.class,
-               VdcQueryType.GetDomainList,
-               new VdcQueryParametersBase());
-            for (String domain :domains) {
+            for (String domain : authzProvidersNames) {
                 Guid domainId = 
asGuid(domain.getBytes(Charset.forName("UTF-8")), true);
                 if (domainId.toString().equals(user.getDomain().getId())) {
                    return domain;
@@ -93,10 +91,7 @@
             }
             throw new WebFaultException(null, "Domain: '" + 
user.getDomain().getId().toString() + "' does not exist.", 
Response.Status.BAD_REQUEST);
         }
-        else if (isNameContainsDomain(user)) {
-            return 
user.getUserName().substring(user.getUserName().lastIndexOf("@") + 1);
-        }
-        return null;
+        return AuthzUtils.getAuthzNameFromEntityName(user.getUserName(), 
authzProvidersNames);
     }
 
     /**
@@ -174,10 +169,14 @@
     @Override
     public Response add(User user) {
         validateParameters(user, "userName");
-        if (!isNameContainsDomain(user)) {// user-name may contain the domain 
(e.g: ol...@xxx.yyy)
+        List<String> authzProvidersNames = getBackendCollection(
+                String.class,
+                VdcQueryType.GetDomainList,
+                new VdcQueryParametersBase());
+        if (AuthzUtils.getAuthzNameFromEntityName(user.getUserName(), 
authzProvidersNames) == null) {// user-name may contain the domain (e.g: 
ol...@xxx.yyy)
             validateParameters(user, "domain.id|name");
         }
-        String domain = getDomain(user);
+        String domain = getAuthzProviderName(user, authzProvidersNames);
         DirectoryUser directoryUser = findDirectoryUser(domain, user);
         if (directoryUser == null) {
             return Response.status(Status.BAD_REQUEST)
@@ -187,11 +186,6 @@
         AddUserParameters parameters = new AddUserParameters(new 
DbUser(directoryUser));
         QueryIdResolver<Guid> resolver = new 
QueryIdResolver<>(VdcQueryType.GetDbUserByUserId, IdQueryParameters.class);
         return performCreate(VdcActionType.AddUser, parameters, resolver, 
BaseResource.class);
-    }
-
-    private boolean isNameContainsDomain(User user) {
-        return ((user.getUserName().contains("@")) && 
(user.getUserName().lastIndexOf('@') != user.getUserName()
-                .length() - 1));
     }
 
     /**
@@ -217,7 +211,7 @@
                         DirectoryUser.class,
                         SearchType.DirectoryUser,
                         getDirectoryUserSearchPattern(
-                                isNameContainsDomain(user) ? 
user.getUserName().substring(0, user.getUserName().lastIndexOf("@")) : 
user.getUserName(),
+                            
AuthzUtils.getEntityNameWithoutAuthz(user.getUserName(), directoryName),
                                 user.getNamespace(),
                                 directoryName)
                         );
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResourceTest.java
index 7999513..6435f10 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendGroupsResourceTest.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.api.restapi.resource.aaa;
 
 import java.nio.charset.Charset;
+import java.util.LinkedList;
 import java.util.List;
 
 import javax.ws.rs.WebApplicationException;
@@ -21,6 +22,7 @@
 import org.ovirt.engine.core.common.interfaces.SearchType;
 import org.ovirt.engine.core.common.queries.DirectoryIdQueryParameters;
 import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryParametersBase;
 import org.ovirt.engine.core.common.queries.VdcQueryType;
 import org.ovirt.engine.core.compat.Guid;
 
@@ -45,11 +47,14 @@
      * searches, thus then must have the same format that we generate when 
searching in directories.
      */
     private static final String[] GROUP_NAMES;
+    private static final String[] GROUP_NAMES_WITH_NO_DOMAIN;
 
     static {
         GROUP_NAMES = new String[NAMES.length];
+        GROUP_NAMES_WITH_NO_DOMAIN = new String[NAMES.length];
         for (int i = 0; i < NAMES.length; i++) {
-            GROUP_NAMES[i] = DOMAIN + "/Groups/" + NAMES[i];
+            GROUP_NAMES_WITH_NO_DOMAIN[i] = "Groups/" + NAMES[i];
+            GROUP_NAMES[i] = GROUP_NAMES_WITH_NO_DOMAIN[i] + "@" + DOMAIN;
         }
     }
 
@@ -204,8 +209,13 @@
     @Test
     public void testAddGroupWithExplicitDirectoryName() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpGetEntityExpectations(
-                "ADGROUP@" + DOMAIN + ":: name=" + NAMES[0],
+                "ADGROUP@" + DOMAIN + ":: name=" + 
GROUP_NAMES_WITH_NO_DOMAIN[0],
             SearchType.DirectoryGroup,
             getDirectoryGroup(0)
         );
@@ -227,13 +237,20 @@
         Domain domain = new Domain();
         domain.setName(DOMAIN);
         Group model = new Group();
-        model.setName(NAMES[0]);
+        model.setName(GROUP_NAMES_WITH_NO_DOMAIN[0]);
         model.setDomain(domain);
 
         Response response = collection.add(model);
         assertEquals(201, response.getStatus());
         assertTrue(response.getEntity() instanceof Group);
         verifyModel((Group) response.getEntity(), 0);
+    }
+
+    private List<String> setUpDomains() {
+        List<String> domains = new LinkedList<>();
+        domains.add("some.domain");
+        domains.add(DOMAIN);
+        return domains;
     }
 
     /**
@@ -243,8 +260,13 @@
     @Test
     public void testAddGroupWithImplicitDirectoryName() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpGetEntityExpectations(
-                "ADGROUP@" + DOMAIN + ":: name=" + NAMES[0],
+                "ADGROUP@" + DOMAIN + ":: name=" + 
GROUP_NAMES_WITH_NO_DOMAIN[0],
             SearchType.DirectoryGroup,
             getDirectoryGroup(0)
         );
@@ -278,10 +300,15 @@
     @Test
     public void testAddGroupWithoutDirectoryName() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         control.replay();
 
         Group model = new Group();
-        model.setName(NAMES[0]);
+        model.setName(GROUP_NAMES_WITH_NO_DOMAIN[0]);
 
         try {
            collection.add(model);
@@ -299,6 +326,11 @@
     @Test
     public void testAddGroupById() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpGetEntityExpectations(
             VdcQueryType.GetDirectoryGroupById,
             DirectoryIdQueryParameters.class,
@@ -338,6 +370,11 @@
     @Test
     public void testAddGroupByIdFailure() throws Exception {
         setUriInfo(setUpBasicUriExpectations());
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpGetEntityExpectations(
             VdcQueryType.GetDirectoryGroupById,
             DirectoryIdQueryParameters.class,
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResourceTest.java
 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResourceTest.java
index baa8a15..de6633c 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResourceTest.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/test/java/org/ovirt/engine/api/restapi/resource/aaa/BackendUsersResourceTest.java
@@ -129,6 +129,11 @@
 
     @Test
     public void testAddUser_2() throws Exception {
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpAddUserExpectations("ADUSER@" + DOMAIN + ":: username=" + 
NAMES[0]);
         User model = new User();
         Domain domain = new Domain();
@@ -141,6 +146,11 @@
 
     @Test
     public void testAddUser_3() throws Exception {
+        setUpEntityQueryExpectations(VdcQueryType.GetDomainList,
+                VdcQueryParametersBase.class,
+                new String[] {},
+                new Object[] {},
+                setUpDomains());
         setUpAddUserExpectations("ADUSER@" + DOMAIN + ":: username=" + 
NAMES[0]);
         User model = new User();
         model.setUserName(NAMES[0] + "@" + DOMAIN);
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/utils/aaa/AuthzUtils.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/utils/aaa/AuthzUtils.java
new file mode 100644
index 0000000..4b0c03e
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/utils/aaa/AuthzUtils.java
@@ -0,0 +1,24 @@
+package org.ovirt.engine.api.restapi.utils.aaa;
+
+import java.util.Collection;
+
+public class AuthzUtils {
+
+    public static String getAuthzNameFromEntityName(String entityName, 
Collection<String> authzProvidersNames) {
+        String result = null;
+        if (entityName != null && entityName.contains("@")) {
+            String lastPart = entityName.substring(entityName.lastIndexOf('@') 
+ 1);
+            result = authzProvidersNames.contains(lastPart) ? lastPart : null;
+        }
+        return result;
+    }
+
+
+    public static String getEntityNameWithoutAuthz(String entityName, String 
authzProviderName) {
+        String result = entityName;
+       if (entityName != null && entityName.contains("@") && 
entityName.lastIndexOf('@') < entityName.length() -1) {
+           result = 
entityName.substring(entityName.lastIndexOf('@')+1).equals(authzProviderName) ? 
entityName.substring(0,  entityName.lastIndexOf('@')) : entityName;
+       }
+       return result;
+    }
+}


-- 
To view, visit http://gerrit.ovirt.org/32779
To unsubscribe, visit http://gerrit.ovirt.org/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I8c1feed08e33156c794b230fa04f33f2ebd82240
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: ovirt-engine-3.5
Gerrit-Owner: Yair Zaslavsky <yzasl...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to