Moti Asayag has uploaded a new change for review.

Change subject: restapi: Report available errata for host
......................................................................

restapi: Report available errata for host

The errata will be reported only on host level, as a
bulk (all of the errata) via:
  GET /api/hosts/{host:id}/errata

No other actions are supported for host errata via the
api.

Feature page:
http://www.ovirt.org/index.php?title=Home/Features/UpgradeManager

Change-Id: Iad98a8066bd0f002cd58129ce583bc932afee8bc
Bug-Url: https://bugzilla.redhat.com/1157377
Signed-off-by: Moti Asayag <[email protected]>
---
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/HostResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErrataResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErratumResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.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.yaml
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErrataResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErratumResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ErratumMapper.java
M 
backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ApplicationMapperTest.java
A 
backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ErratumMapperTest.java
14 files changed, 362 insertions(+), 8 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/36/37436/1

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 7de98a7..d7d75a2 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
@@ -16,8 +16,8 @@
 
 package org.ovirt.engine.api.resource;
 
-import javax.ws.rs.Path;
 import javax.ws.rs.POST;
+import javax.ws.rs.Path;
 import javax.ws.rs.PathParam;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Response;
@@ -25,6 +25,7 @@
 import org.ovirt.engine.api.model.Action;
 import org.ovirt.engine.api.model.Actionable;
 import org.ovirt.engine.api.model.Host;
+import org.ovirt.engine.api.resource.externalhostproviders.ErrataResource;
 
 @Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
 public interface HostResource extends UpdatableResource<Host>, 
MeasurableResource {
@@ -102,4 +103,7 @@
 
     @Path("fenceagents")
     public FenceAgentsResource getFenceAgentsResource();
+
+    @Path("errata")
+    public ErrataResource getErrataResource();
 }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErrataResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErrataResource.java
new file mode 100644
index 0000000..615b9d0
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErrataResource.java
@@ -0,0 +1,16 @@
+package org.ovirt.engine.api.resource.externalhostproviders;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+
+import org.ovirt.engine.api.model.Errata;
+import org.ovirt.engine.api.resource.ApiMediaType;
+
+@Produces({ ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML })
+public interface ErrataResource {
+
+    @GET
+    Errata list();
+
+    ErratumResource getErratumSubResource(String id);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErratumResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErratumResource.java
new file mode 100644
index 0000000..a5a133a
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/externalhostproviders/ErratumResource.java
@@ -0,0 +1,30 @@
+/*
+* Copyright (c) 2010 Red Hat, Inc.
+*
+* Licensed under the Apache License, Version 2.0 (the "License");
+* you may not use this file except in compliance with the License.
+* You may obtain a copy of the License at
+*
+*           http://www.apache.org/licenses/LICENSE-2.0
+*
+* Unless required by applicable law or agreed to in writing, software
+* distributed under the License is distributed on an "AS IS" BASIS,
+* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+* See the License for the specific language governing permissions and
+* limitations under the License.
+*/
+
+package org.ovirt.engine.api.resource.externalhostproviders;
+
+import javax.ws.rs.GET;
+import javax.ws.rs.Produces;
+
+import org.ovirt.engine.api.model.Erratum;
+import org.ovirt.engine.api.resource.ApiMediaType;
+
+@Produces( { ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML })
+public interface ErratumResource {
+
+    @GET
+    public Erratum get();
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
index 28ddfda..01d846f 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/LinkHelper.java
@@ -45,6 +45,7 @@
 import org.ovirt.engine.api.model.DiskProfile;
 import org.ovirt.engine.api.model.DiskSnapshot;
 import org.ovirt.engine.api.model.Domain;
+import org.ovirt.engine.api.model.Erratum;
 import org.ovirt.engine.api.model.Event;
 import org.ovirt.engine.api.model.ExternalComputeResource;
 import org.ovirt.engine.api.model.ExternalDiscoveredHost;
@@ -72,18 +73,18 @@
 import org.ovirt.engine.api.model.NIC;
 import org.ovirt.engine.api.model.Network;
 import org.ovirt.engine.api.model.NumaNode;
-import org.ovirt.engine.api.model.OperatingSystemInfo;
 import org.ovirt.engine.api.model.OpenStackImage;
 import org.ovirt.engine.api.model.OpenStackImageProvider;
 import org.ovirt.engine.api.model.OpenStackNetwork;
 import org.ovirt.engine.api.model.OpenStackNetworkProvider;
 import org.ovirt.engine.api.model.OpenStackSubnet;
+import org.ovirt.engine.api.model.OperatingSystemInfo;
 import org.ovirt.engine.api.model.Parameter;
 import org.ovirt.engine.api.model.ParametersSet;
 import org.ovirt.engine.api.model.Permission;
 import org.ovirt.engine.api.model.Permit;
-import org.ovirt.engine.api.model.Quota;
 import org.ovirt.engine.api.model.QoS;
+import org.ovirt.engine.api.model.Quota;
 import org.ovirt.engine.api.model.ReportedDevice;
 import org.ovirt.engine.api.model.Request;
 import org.ovirt.engine.api.model.Role;
@@ -125,12 +126,12 @@
 import org.ovirt.engine.api.resource.CapabiliyResource;
 import org.ovirt.engine.api.resource.ClusterResource;
 import org.ovirt.engine.api.resource.ClustersResource;
+import org.ovirt.engine.api.resource.CpuProfileResource;
+import org.ovirt.engine.api.resource.CpuProfilesResource;
 import org.ovirt.engine.api.resource.DataCenterResource;
 import org.ovirt.engine.api.resource.DataCentersResource;
 import org.ovirt.engine.api.resource.DeviceResource;
 import org.ovirt.engine.api.resource.DevicesResource;
-import org.ovirt.engine.api.resource.CpuProfileResource;
-import org.ovirt.engine.api.resource.CpuProfilesResource;
 import org.ovirt.engine.api.resource.DiskProfileResource;
 import org.ovirt.engine.api.resource.DiskProfilesResource;
 import org.ovirt.engine.api.resource.DiskResource;
@@ -172,8 +173,8 @@
 import org.ovirt.engine.api.resource.PermissionResource;
 import org.ovirt.engine.api.resource.PermitResource;
 import org.ovirt.engine.api.resource.PermitsResource;
-import org.ovirt.engine.api.resource.QosResource;
 import org.ovirt.engine.api.resource.QoSsResource;
+import org.ovirt.engine.api.resource.QosResource;
 import org.ovirt.engine.api.resource.QuotaResource;
 import org.ovirt.engine.api.resource.QuotasResource;
 import org.ovirt.engine.api.resource.ReadOnlyDeviceResource;
@@ -234,6 +235,8 @@
 import org.ovirt.engine.api.resource.aaa.GroupsResource;
 import org.ovirt.engine.api.resource.aaa.UserResource;
 import org.ovirt.engine.api.resource.aaa.UsersResource;
+import org.ovirt.engine.api.resource.externalhostproviders.ErrataResource;
+import org.ovirt.engine.api.resource.externalhostproviders.ErratumResource;
 import 
org.ovirt.engine.api.resource.externalhostproviders.ExternalComputeResourceResource;
 import 
org.ovirt.engine.api.resource.externalhostproviders.ExternalComputeResourcesResource;
 import 
org.ovirt.engine.api.resource.externalhostproviders.ExternalDiscoveredHostResource;
@@ -559,6 +562,9 @@
 
         map = new ParentToCollectionMap(FenceAgentResource.class, 
FenceAgentsResource.class, Host.class);
         TYPES.put(Agent.class, map);
+
+        map = new ParentToCollectionMap(ErratumResource.class, 
ErrataResource.class, Host.class);
+        TYPES.put(Erratum.class, map);
     }
 
     /**
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 6e69ce6..9da7a80 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
@@ -1939,6 +1939,7 @@
          <xs:element name="auto_numa_status" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
           <xs:element name="numa_supported" type="xs:boolean" minOccurs="0" 
maxOccurs="1"/>
           <xs:element name="live_snapshot_support" type="xs:boolean" 
minOccurs="0" maxOccurs="1" />
+          <xs:element ref="errata"  minOccurs="0"/>
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
@@ -5441,4 +5442,61 @@
     </xs:complexContent>
   </xs:complexType>
 
+  <xs:element name="errata" type="Errata"/>
+
+  <xs:element name="erratum" type="Erratum"/>
+
+  <xs:complexType name="Erratum">
+    <xs:complexContent>
+      <xs:extension base="BaseResource">
+        <xs:sequence>
+            <xs:element name="title" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element name="type" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element name="issued" type="xs:dateTime" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element name="severity" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element name="solution" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element name="summary" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+            <xs:element ref="packages" minOccurs="0" maxOccurs="1"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:complexType name="Errata">
+    <xs:complexContent>
+      <xs:extension base="BaseResources">
+        <xs:sequence>
+          <xs:annotation>
+            <xs:appinfo>
+                <jaxb:property name="Errata"/>
+            </xs:appinfo>
+          </xs:annotation>
+          <xs:element ref="erratum" minOccurs="0" maxOccurs="unbounded"/>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+ <xs:element name="packages" type="Packages"/>
+
+ <xs:element name="package" type="Package"/>
+
+  <xs:complexType name="Packages">
+    <xs:sequence>
+      <xs:annotation>
+        <xs:appinfo>
+          <jaxb:property name="Packages"/>
+        </xs:appinfo>
+      </xs:annotation>
+      <xs:element ref="package" minOccurs="0" maxOccurs="unbounded"/>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:complexType name="Package">
+    <xs:sequence>
+      <xs:element name="name" type="xs:string" minOccurs="0" maxOccurs="1">
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+
 </xs:schema>
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
index 52e90a9..3ef3732 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/resources/rsdl_metadata.yaml
@@ -3054,6 +3054,15 @@
     headers:
       Content-Type: {value: application/xml|json, required: true}
       Correlation-Id: {value: 'any string', required: false}
+- name: /hosts/{host:id}/errata|rel=get
+  description: get the list of errata available for the host
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams:
+      max: {context: matrix, type: 'xs:int', value: 'max results', required: 
false}
+    headers: {}
 - name: /hosts/{host:id}/nics|rel=get
   description: get the list of network interfaces for the host
   request:
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 c7641bb..e9a8c90 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
@@ -30,16 +30,18 @@
 import org.ovirt.engine.api.resource.HostResource;
 import org.ovirt.engine.api.resource.HostStorageResource;
 import org.ovirt.engine.api.resource.StatisticsResource;
+import org.ovirt.engine.api.resource.externalhostproviders.ErrataResource;
 import org.ovirt.engine.api.restapi.model.AuthenticationMethod;
+import 
org.ovirt.engine.api.restapi.resource.externalhostproviders.BackendHostErrataResource;
 import org.ovirt.engine.api.restapi.types.DeprecatedPowerManagementMapper;
 import org.ovirt.engine.api.restapi.types.FenceAgentMapper;
 import org.ovirt.engine.api.utils.LinkHelper;
 import org.ovirt.engine.core.common.VdcObjectType;
 import org.ovirt.engine.core.common.action.ApproveVdsParameters;
 import org.ovirt.engine.core.common.action.ChangeVDSClusterParameters;
+import org.ovirt.engine.core.common.action.FenceAgentCommandParameterBase;
 import org.ovirt.engine.core.common.action.FenceVdsActionParameters;
 import org.ovirt.engine.core.common.action.FenceVdsManualyParameters;
-import org.ovirt.engine.core.common.action.FenceAgentCommandParameterBase;
 import org.ovirt.engine.core.common.action.ForceSelectSPMParameters;
 import org.ovirt.engine.core.common.action.MaintenanceNumberOfVdssParameters;
 import 
org.ovirt.engine.core.common.action.StorageServerConnectionParametersBase;
@@ -526,4 +528,9 @@
     public FenceAgentsResource getFenceAgentsResource() {
         return inject(new BackendFenceAgentsResource(id));
     }
+
+    @Override
+    public ErrataResource getErrataResource() {
+        return inject(new BackendHostErrataResource(id));
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
index c0520db..aa949a3 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendHostsResource.java
@@ -45,7 +45,7 @@
     private static final Logger log = 
LoggerFactory.getLogger(BackendHostsResource.class);
     private static final String DEFAULT_NAME = "Default";
     static final String[] SUB_COLLECTIONS = { "storage", "nics", "numanodes", 
"tags", "permissions", "statistics",
-            "hooks", "fenceagents" };
+            "hooks", "fenceagents", "errata" };
     static final String GLUSTERONLY_MODE_COLLECTIONS_TO_HIDE = "storage";
 
     public BackendHostsResource() {
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErrataResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErrataResource.java
new file mode 100644
index 0000000..9950347
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErrataResource.java
@@ -0,0 +1,56 @@
+package org.ovirt.engine.api.restapi.resource.externalhostproviders;
+
+import java.util.List;
+
+import javax.ws.rs.core.Response;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.ovirt.engine.api.model.Errata;
+import org.ovirt.engine.api.model.Erratum;
+import org.ovirt.engine.api.resource.externalhostproviders.ErrataResource;
+import org.ovirt.engine.api.resource.externalhostproviders.ErratumResource;
+import org.ovirt.engine.api.restapi.resource.AbstractBackendCollectionResource;
+import org.ovirt.engine.api.restapi.resource.SingleEntityResource;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+
+public class BackendHostErrataResource extends 
AbstractBackendCollectionResource<Erratum, 
org.ovirt.engine.core.common.businessentities.Erratum> implements 
ErrataResource {
+
+    private String hostId;
+
+    public BackendHostErrataResource(String hostId) {
+        super(Erratum.class, 
org.ovirt.engine.core.common.businessentities.Erratum.class);
+        this.hostId = hostId;
+    }
+
+    @Override
+    public Errata list() {
+        return 
mapCollection(getBackendCollection(VdcQueryType.GetErrataByHostId,
+                new IdQueryParameters(asGuid(hostId))));
+    }
+
+    protected Errata 
mapCollection(List<org.ovirt.engine.core.common.businessentities.Erratum> 
entities) {
+        Errata collection = new Errata();
+        for (org.ovirt.engine.core.common.businessentities.Erratum entity : 
entities) {
+            collection.getErrata().add(map(entity));
+        }
+
+        return collection;
+    }
+
+    @SingleEntityResource
+    @Override
+    public ErratumResource getErratumSubResource(String id) {
+        return inject(new BackendHostErratumResource(id, this));
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    protected Erratum doPopulate(Erratum model, 
org.ovirt.engine.core.common.businessentities.Erratum entity) {
+        throw new NotImplementedException();
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErratumResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErratumResource.java
new file mode 100644
index 0000000..d8d8b63
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/externalhostproviders/BackendHostErratumResource.java
@@ -0,0 +1,30 @@
+package org.ovirt.engine.api.restapi.resource.externalhostproviders;
+
+import org.apache.commons.lang.NotImplementedException;
+import org.ovirt.engine.api.model.Erratum;
+import org.ovirt.engine.api.resource.externalhostproviders.ErratumResource;
+import org.ovirt.engine.api.restapi.resource.AbstractBackendSubResource;
+
+public class BackendHostErratumResource extends 
AbstractBackendSubResource<Erratum, 
org.ovirt.engine.core.common.businessentities.Erratum> implements 
ErratumResource {
+
+    private BackendHostErrataResource parent;
+
+    public BackendHostErratumResource(String id, BackendHostErrataResource 
parent) {
+        super(id, Erratum.class, 
org.ovirt.engine.core.common.businessentities.Erratum.class);
+        this.parent = parent;
+    }
+
+    public BackendHostErrataResource getParent() {
+        return parent;
+    }
+
+    @Override
+    public Erratum get() {
+        throw new NotImplementedException();
+    }
+
+    @Override
+    protected Erratum doPopulate(Erratum model, 
org.ovirt.engine.core.common.businessentities.Erratum entity) {
+        return model;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
index cb99831..2e416c1 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
@@ -95,6 +95,7 @@
         if (VersionUtils.greaterOrEqual(version, 
BackendCapabilitiesResource.VERSION_3_6)) {
             addExternalHostProvidersFeature(features);
             addOpenStackImageProvidersFeature(features);
+            addErrataForHostsFeature(features);
         }
         return features;
     }
@@ -536,4 +537,11 @@
         feature.setDescription("Add/modify/remove OpenStack image providers.");
         features.getFeature().add(feature);
     }
+
+    private void addErrataForHostsFeature(Features features) {
+        Feature feature = new Feature();
+        feature.setName("Host Errata");
+        feature.setDescription("View available errata for hosts.");
+        features.getFeature().add(feature);
+    }
 }
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ErratumMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ErratumMapper.java
new file mode 100644
index 0000000..c359f65
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ErratumMapper.java
@@ -0,0 +1,85 @@
+package org.ovirt.engine.api.restapi.types;
+
+import java.util.ArrayList;
+
+import org.ovirt.engine.api.model.Erratum;
+import org.ovirt.engine.api.model.Package;
+import org.ovirt.engine.api.model.Packages;
+import org.ovirt.engine.core.common.businessentities.Erratum.ErrataSeverity;
+import org.ovirt.engine.core.common.businessentities.Erratum.ErrataType;
+
+public class ErratumMapper {
+
+    @Mapping(from = 
org.ovirt.engine.core.common.businessentities.Erratum.class, to = Erratum.class)
+    public static Erratum 
map(org.ovirt.engine.core.common.businessentities.Erratum entity, Erratum 
model) {
+        model = model == null ? new Erratum() : model;
+        model.setId(entity.getId());
+        model.setTitle(entity.getTitle());
+        model.setSummary(entity.getSummary());
+        model.setSolution(entity.getSolution());
+        model.setDescription(entity.getDescription());
+        model.setIssued(DateMapper.map(entity.getIssued(), null));
+        model.setSeverity(entity.getSeverity() == null ? null : 
entity.getSeverity().getDescription());
+        model.setType(entity.getType() == null ? null : 
entity.getType().getDescription());
+        if (entity.getPackages() != null && !entity.getPackages().isEmpty()) {
+            Packages packages = new Packages();
+            for (String packageName : entity.getPackages()) {
+                Package p = new Package();
+                p.setName(packageName);
+                packages.getPackages().add(p);
+            }
+
+            model.setPackages(packages);
+        }
+
+        return model;
+    }
+
+    @Mapping(from = Erratum.class, to = 
org.ovirt.engine.core.common.businessentities.Erratum.class)
+    public static org.ovirt.engine.core.common.businessentities.Erratum 
map(Erratum model,
+            org.ovirt.engine.core.common.businessentities.Erratum template) {
+        org.ovirt.engine.core.common.businessentities.Erratum entity =
+                template != null ? template : new 
org.ovirt.engine.core.common.businessentities.Erratum();
+
+        if (model.isSetId()) {
+            entity.setId(model.getId());
+        }
+
+        if (model.isSetTitle()) {
+            entity.setTitle(model.getTitle());
+        }
+
+        if (model.isSetSummary()) {
+            entity.setSummary(model.getSummary());
+        }
+
+        if (model.isSetSolution()) {
+            entity.setSolution(model.getSolution());
+        }
+
+        if (model.isSetDescription()) {
+            entity.setDescription(model.getDescription());
+        }
+
+        if (model.isSetIssued()) {
+            
entity.setIssued(model.getIssued().toGregorianCalendar().getTime());
+        }
+
+        if (model.isSetSeverity()) {
+            
entity.setSeverity(ErrataSeverity.byDescription(model.getSeverity()));
+        }
+
+        if (model.isSetType()) {
+            entity.setType(ErrataType.byDescription(model.getType()));
+        }
+
+        if (model.isSetPackages() && 
!model.getPackages().getPackages().isEmpty()) {
+            entity.setPackages(new 
ArrayList<String>(model.getPackages().getPackages().size()));
+            for (Package p : model.getPackages().getPackages()) {
+                entity.getPackages().add(p.getName());
+            }
+        }
+
+        return entity;
+    }
+}
diff --git 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ApplicationMapperTest.java
 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ApplicationMapperTest.java
index 71b5eca..f76a082 100644
--- 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ApplicationMapperTest.java
+++ 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ApplicationMapperTest.java
@@ -1,6 +1,7 @@
 package org.ovirt.engine.api.restapi.types;
 
 import static org.ovirt.engine.api.restapi.types.MappingTestHelper.populate;
+
 import org.junit.Test;
 import org.ovirt.engine.api.model.Application;
 import org.ovirt.engine.core.common.businessentities.VM;
diff --git 
a/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ErratumMapperTest.java
 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ErratumMapperTest.java
new file mode 100644
index 0000000..631d184
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/test/java/org/ovirt/engine/api/restapi/types/ErratumMapperTest.java
@@ -0,0 +1,44 @@
+package org.ovirt.engine.api.restapi.types;
+
+import java.util.Date;
+
+import org.ovirt.engine.api.model.Erratum;
+import org.ovirt.engine.core.common.businessentities.Erratum.ErrataSeverity;
+import org.ovirt.engine.core.common.businessentities.Erratum.ErrataType;
+
+public class ErratumMapperTest extends AbstractInvertibleMappingTest<Erratum, 
org.ovirt.engine.core.common.businessentities.Erratum, 
org.ovirt.engine.core.common.businessentities.Erratum> {
+
+    private static final Date DATE = new Date();
+
+    public ErratumMapperTest() {
+        super(Erratum.class,
+                org.ovirt.engine.core.common.businessentities.Erratum.class,
+                org.ovirt.engine.core.common.businessentities.Erratum.class);
+    }
+
+    @Override
+    protected void verify(Erratum model, Erratum transform) {
+        assertEquals(model.getId(), transform.getId());
+        assertEquals(model.getTitle(), transform.getTitle());
+        assertEquals(model.getSummary(), transform.getSummary());
+        assertEquals(model.getSolution(), transform.getSolution());
+        assertEquals(model.getDescription(), transform.getDescription());
+        assertEquals(model.getIssued(), transform.getIssued());
+        assertEquals(model.getSeverity(), transform.getSeverity());
+        assertEquals(model.getType(), transform.getType());
+        assertNotNull(model.getPackages());
+        assertNotNull(transform.getPackages());
+        assertEquals(model.getPackages().getPackages().size(), 
transform.getPackages().getPackages().size());
+        for (int i = 0; i < model.getPackages().getPackages().size(); i++) {
+            assertEquals(model.getPackages().getPackages().get(i).getName(),
+                    transform.getPackages().getPackages().get(i).getName());
+        }
+    }
+
+    protected Erratum postPopulate(Erratum model) {
+        model.setIssued(DateMapper.map(DATE, null));
+        model.setSeverity(ErrataSeverity.MODERATE.getDescription());
+        model.setType(ErrataType.ENHANCEMENT.getDescription());
+        return super.postPopulate(model);
+    }
+}


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: Iad98a8066bd0f002cd58129ce583bc932afee8bc
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Moti Asayag <[email protected]>
_______________________________________________
Engine-patches mailing list
[email protected]
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to