Juan Hernandez has uploaded a new change for review.

Change subject: [WIP] Add support for external providers
......................................................................

[WIP] Add support for external providers

Change-Id: I0ff73ad3dfc3c220716cd6ec8ca635f5c3bb348d
Bug-Url: https://bugzilla.redhat.com/1132259
Signed-off-by: Juan Hernandez <juan.hernan...@redhat.com>
---
M 
backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
M 
backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/QueryHelper.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/ExternalProviderType.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/pdf/FOPMessageBodyWriter.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProviderResource.java
A 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProvidersResource.java
M 
backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.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/BackendApplication.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProviderResource.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProvidersResource.java
M 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/utils/FeaturesHelper.java
A 
backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/validation/ExternalProviderValidator.java
A 
backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ExternalProviderMapper.java
17 files changed, 700 insertions(+), 0 deletions(-)


  git pull ssh://gerrit.ovirt.org:29418/ovirt-engine refs/changes/87/33087/1

diff --git 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
index 3a26d5d..b238ed4 100644
--- 
a/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
+++ 
b/backend/manager/modules/common/src/main/java/org/ovirt/engine/core/common/queries/VdcQueryType.java
@@ -338,6 +338,7 @@
 
     // Providers
     GetAllProviders,
+    GetProviderById,
     GetAllNetworksForProvider,
 
     //Network QoS
diff --git 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/QueryHelper.java
 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/QueryHelper.java
index b3fa5c5..30f0c4c 100644
--- 
a/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/QueryHelper.java
+++ 
b/backend/manager/modules/restapi/interface/common/jaxrs/src/main/java/org/ovirt/engine/api/common/util/QueryHelper.java
@@ -29,6 +29,7 @@
 import org.ovirt.engine.api.model.DataCenter;
 import org.ovirt.engine.api.model.Disk;
 import org.ovirt.engine.api.model.Event;
+import org.ovirt.engine.api.model.ExternalProvider;
 import org.ovirt.engine.api.model.GlusterVolume;
 import org.ovirt.engine.api.model.Group;
 import org.ovirt.engine.api.model.Host;
@@ -78,6 +79,8 @@
         map.put(GlusterVolume.class, getName("Volumes"));
         map.put(Disk.class, getName("Disks"));
         map.put(Network.class, getName("Networks"));
+        map.put(ExternalProvider.class, getName("Providers"));
+
 
         return Collections.unmodifiableMap(map);
     }
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/ExternalProviderType.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/ExternalProviderType.java
new file mode 100644
index 0000000..1f57cf8
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/model/ExternalProviderType.java
@@ -0,0 +1,31 @@
+/*
+* Copyright (c) 2014 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.model;
+
+public enum ExternalProviderType {
+    FOREMAN,
+    OPENSTACK_IMAGE,
+    OPENSTACK_NETWORK;
+
+    public String value() {
+        return name().toLowerCase();
+    }
+
+    public static ExternalProviderType fromValue(String value) {
+        return valueOf(value.toUpperCase());
+    }
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/pdf/FOPMessageBodyWriter.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/pdf/FOPMessageBodyWriter.java
index ea9f599..73c6cb3 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/pdf/FOPMessageBodyWriter.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/pdf/FOPMessageBodyWriter.java
@@ -37,6 +37,7 @@
 public class FOPMessageBodyWriter implements MessageBodyWriter<Object> {
 
     private static final Logger log = 
LoggerFactory.getLogger(FOPMessageBodyWriter.class);
+
     private JAXBContext jaxbContext;
     private TransformerFactory transfact;
     private FopFactory fopFactory;
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProviderResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProviderResource.java
new file mode 100644
index 0000000..b6d374f
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProviderResource.java
@@ -0,0 +1,38 @@
+/*
+* Copyright (c) 2014 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;
+
+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;
+
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.Actionable;
+import org.ovirt.engine.api.model.ExternalProvider;
+
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface ExternalProviderResource extends 
UpdatableResource<ExternalProvider> {
+    @Path("{action: (test)}/{id}")
+    public ActionResource getActionSubresource(@PathParam("action") String 
action, @PathParam("oid") String id);
+
+    @POST
+    @Actionable
+    @Path("test")
+    public Response test(Action action);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProvidersResource.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProvidersResource.java
new file mode 100644
index 0000000..34b42af
--- /dev/null
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/resource/ExternalProvidersResource.java
@@ -0,0 +1,48 @@
+/*
+* Copyright (c) 2014 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;
+
+import javax.ws.rs.Consumes;
+import javax.ws.rs.DELETE;
+import javax.ws.rs.GET;
+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;
+
+import org.ovirt.engine.api.model.ExternalProvider;
+import org.ovirt.engine.api.model.ExternalProviders;
+
+@Path("/externalproviders")
+@Produces({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+public interface ExternalProvidersResource {
+
+    @GET
+    public ExternalProviders list();
+
+    @POST
+    @Consumes({ApiMediaType.APPLICATION_XML, ApiMediaType.APPLICATION_JSON, 
ApiMediaType.APPLICATION_X_YAML})
+    public Response add(ExternalProvider externalProvider);
+
+    @DELETE
+    @Path("{id}")
+    public Response remove(@PathParam("id") String id);
+
+    @Path("{id}")
+    public ExternalProviderResource 
getExternalProviderSubResource(@PathParam("id") String id);
+}
diff --git 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java
 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java
index 0f4fb66..212f679 100644
--- 
a/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java
+++ 
b/backend/manager/modules/restapi/interface/definition/src/main/java/org/ovirt/engine/api/utils/ApiRootLinksCreator.java
@@ -58,6 +58,8 @@
         links.add(createLink("schedulingpolicies", baseUri));
         links.add(createLink("permissions", baseUri));
         links.add(createLink("macpools", baseUri));
+        links.add(createLink("externalproviders", baseUri));
+
         return links;
     }
 
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 2c8b925..74fc35c 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.DiskSnapshot;
 import org.ovirt.engine.api.model.Domain;
 import org.ovirt.engine.api.model.Event;
+import org.ovirt.engine.api.model.ExternalProvider;
 import org.ovirt.engine.api.model.File;
 import org.ovirt.engine.api.model.Filter;
 import org.ovirt.engine.api.model.GlusterBrick;
@@ -127,6 +128,8 @@
 import org.ovirt.engine.api.resource.DisksResource;
 import org.ovirt.engine.api.resource.EventResource;
 import org.ovirt.engine.api.resource.EventsResource;
+import org.ovirt.engine.api.resource.ExternalProviderResource;
+import org.ovirt.engine.api.resource.ExternalProvidersResource;
 import org.ovirt.engine.api.resource.FileResource;
 import org.ovirt.engine.api.resource.FilesResource;
 import org.ovirt.engine.api.resource.FilterResource;
@@ -479,6 +482,8 @@
         map = new ParentToCollectionMap(CpuProfileResource.class, 
CpuProfilesResource.class);
         TYPES.put(CpuProfile.class, map);
 
+        map = new ParentToCollectionMap(ExternalProviderResource.class, 
ExternalProvidersResource.class);
+        TYPES.put(ExternalProvider.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 045839e..21d7cea 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
@@ -656,6 +656,7 @@
           <xs:element ref="rng_sources" minOccurs="0" />
           <xs:element ref="scheduling_policy_unit_types" minOccurs="0" />
           <xs:element ref="qos_types" minOccurs="0" />
+          <xs:element ref="external_provider_types" minOccurs="0" />
         </xs:sequence>
       </xs:extension>
     </xs:complexContent>
@@ -1098,6 +1099,20 @@
         <xs:annotation>
           <xs:appinfo>
             <jaxb:property name="SpmStates"/>
+          </xs:appinfo>
+        </xs:annotation>
+      </xs:element>
+    </xs:sequence>
+  </xs:complexType>
+
+  <xs:element name="external_provider_types" type="ExternalProviderTypes"/>
+
+  <xs:complexType name="ExternalProviderTypes">
+    <xs:sequence>
+      <xs:element name="external_provider_type" type="xs:string" minOccurs="0" 
maxOccurs="unbounded">
+        <xs:annotation>
+          <xs:appinfo>
+            <jaxb:property name="ExternalProviderTypes"/>
           </xs:appinfo>
         </xs:annotation>
       </xs:element>
@@ -4873,4 +4888,47 @@
       </xs:extension>
     </xs:complexContent>
   </xs:complexType>
+
+  <!-- External providers: -->
+  <xs:element name="external_provider" type="ExternalProvider"/>
+
+  <xs:complexType name="ExternalProvider">
+    <xs:complexContent>
+      <xs:extension base="BaseResource">
+        <xs:sequence>
+          <!-- Used by all external providers: -->
+          <xs:element name="type" type="xs:string" minOccurs="1" 
maxOccurs="1"/>
+          <xs:element name="url" type="xs:string" minOccurs="0" maxOccurs="1"/>
+          <xs:element name="requires_authentication" type="xs:boolean" 
minOccurs="0" maxOccurs="1"/>
+          <xs:element name="username" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+          <xs:element name="password" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+          <xs:element ref="properties" minOccurs="0" maxOccurs="1"/>
+
+          <!-- Used only by OpenStack providers: -->
+          <xs:element name="tenant_name" type="xs:string" minOccurs="0" 
maxOccurs="1"/>
+
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </xs:complexType>
+
+  <xs:element name="external_providers" type="ExternalProviders"/>
+
+  <xs:complexType name="ExternalProviders">
+    <xs:complexContent>
+      <xs:extension base="BaseResources">
+        <xs:sequence>
+          <xs:element ref="external_provider" minOccurs="0" 
maxOccurs="unbounded">
+            <xs:annotation>
+              <xs:appinfo>
+                <jaxb:property name="ExternalProviders"/>
+              </xs:appinfo>
+            </xs:annotation>
+          </xs:element>
+        </xs:sequence>
+      </xs:extension>
+    </xs:complexContent>
+  </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 afa8a19..4c3e8ae 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
@@ -6129,3 +6129,64 @@
       Content-Type: {value: application/xml|json, required: true}
       Expect: {value: 201-created, required: false}
       Correlation-Id: {value: 'any string', required: false}
+
+- name: /externalproviders|rel=get
+  description: get the list of all external providers in the system
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams:
+      max: {context: matrix, type: 'xs:int', value: 'max results', required: 
false}
+    headers: {}
+- name: /externalproviders/{externalprovider:id}|rel=get
+  description: get the details of the specified external provider in the system
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams: {}
+    headers: {}
+- name: /externalproviders/{externalprovider:id}|rel=delete
+  description: delete the specified external provider in the system
+  request:
+    body:
+      parameterType: null
+      signatures: []
+    urlparams:
+      async: {context: matrix, type: 'xs:boolean', value: true|false, 
required: false}
+    headers:
+      Correlation-Id: {value: 'any string', required: false}
+- name: /externalproviders/{externalprovider:id}|rel=update
+  description: update the specified external provider in the system
+  request:
+    body:
+      parameterType: ExternalProvider
+      signatures:
+      - mandatoryArguments: {}
+        optionalArguments:
+          external_provider.name: xs:string
+          external_provider.description: xs:string
+          external_provider.type: xs:string
+        description: update the specified external provilder in the system
+    urlparams: {}
+    headers:
+      Content-Type: {value: application/xml|json, required: true}
+      Correlation-Id: {value: 'any string', required: false}
+- name: /externalproviders|rel=add
+  description: add a new external provider to the system
+  request:
+    body:
+      parameterType: ExternalProvider
+      signatures:
+      - mandatoryArguments:
+          external_provider.name: xs:string
+          external_provider.type: xs:string
+        optionalArguments:
+          external_provider.url: xs:string
+        description: add a new cpu profile to the system
+    urlparams: {}
+    headers:
+      Content-Type: {value: application/xml|json, required: true}
+      Expect: {value: 201-created, required: false}
+      Correlation-Id: {value: 'any string', required: false}
\ No newline at end of file
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java
index 9ec8c77..50ba4de 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/BackendApplication.java
@@ -37,6 +37,7 @@
 import org.ovirt.engine.api.restapi.resource.BackendDiskProfilesResource;
 import org.ovirt.engine.api.restapi.resource.BackendDisksResource;
 import org.ovirt.engine.api.restapi.resource.BackendEventsResource;
+import org.ovirt.engine.api.restapi.resource.BackendExternalProvidersResource;
 import org.ovirt.engine.api.restapi.resource.BackendHostsResource;
 import org.ovirt.engine.api.restapi.resource.BackendInstanceTypesResource;
 import org.ovirt.engine.api.restapi.resource.BackendJobsResource;
@@ -145,6 +146,7 @@
         addResource(new BackendSystemPermissionsResource());
         addResource(new BackendDiskProfilesResource());
         addResource(new BackendCpuProfilesResource());
+        addResource(new BackendExternalProvidersResource());
 
         final SessionProcessor processor = new SessionProcessor();
         processor.setBackend(backend);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
index 13d091e..2990c5b 100644
--- 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendCapabilitiesResource.java
@@ -32,6 +32,8 @@
 import org.ovirt.engine.api.model.DiskStatus;
 import org.ovirt.engine.api.model.DisplayType;
 import org.ovirt.engine.api.model.DisplayTypes;
+import org.ovirt.engine.api.model.ExternalProviderType;
+import org.ovirt.engine.api.model.ExternalProviderTypes;
 import org.ovirt.engine.api.model.FenceType;
 import org.ovirt.engine.api.model.FenceTypes;
 import org.ovirt.engine.api.model.GlusterState;
@@ -183,6 +185,12 @@
             minor = 5;
         }
     };
+    public static final Version VERSION_3_6 = new Version() {
+        {
+            major = 3;
+            minor = 6;
+        }
+    };
     private static Version currentVersion = null;
 
     @Override
@@ -273,6 +281,7 @@
         addRngSources(version, RngSource.values());
         addPolicyUnitTypes(version, PolicyUnitType.values());
         addSpmStates(version, SpmState.values());
+        addExternalProviderTypes(version, ExternalProviderType.values());
         // External tasks types
         addStepEnumTypes(version, StepEnum.values());
 
@@ -904,6 +913,16 @@
         }
     }
 
+    private void addExternalProviderTypes(VersionCaps version, 
ExternalProviderType[] values) {
+        if (VersionUtils.greaterOrEqual(version, VERSION_3_6)) {
+            ExternalProviderTypes types = new ExternalProviderTypes();
+            for (ExternalProviderType type : values) {
+                
types.getExternalProviderTypes().add(type.name().toLowerCase());
+            }
+            version.setExternalProviderTypes(types);
+        }
+    }
+
     @Override
     public CapabiliyResource getCapabilitiesSubResource(String id) {
         return new BackendCapabilityResource(id, this);
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProviderResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProviderResource.java
new file mode 100644
index 0000000..cffb671
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProviderResource.java
@@ -0,0 +1,80 @@
+/*
+* Copyright (c) 2014 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.restapi.resource;
+
+import javax.ws.rs.core.Response;
+
+import org.ovirt.engine.api.model.Action;
+import org.ovirt.engine.api.model.ExternalProvider;
+import org.ovirt.engine.api.resource.ExternalProviderResource;
+import org.ovirt.engine.core.common.action.ProviderParameters;
+import org.ovirt.engine.core.common.action.VdcActionParametersBase;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+public class BackendExternalProviderResource extends
+        AbstractBackendActionableResource<ExternalProvider, Provider> 
implements
+        ExternalProviderResource {
+
+    public BackendExternalProviderResource(String id) {
+        super(id, ExternalProvider.class, Provider.class);
+    }
+
+    @Override
+    public ExternalProvider get() {
+        return performGet(VdcQueryType.GetProviderById, new 
IdQueryParameters(guid));
+    }
+
+    @Override
+    public ExternalProvider update(ExternalProvider incoming) {
+        validateEnums(ExternalProvider.class, incoming);
+        return performUpdate(
+            incoming,
+            new QueryIdResolver<Guid>(VdcQueryType.GetProviderById, 
IdQueryParameters.class),
+            VdcActionType.UpdateProvider,
+            new UpdateParametersProvider()
+        );
+    }
+
+    protected class UpdateParametersProvider implements 
ParametersProvider<ExternalProvider, Provider> {
+        @Override
+        public VdcActionParametersBase getParameters(ExternalProvider 
incoming, Provider entity) {
+            return new ProviderParameters(map(incoming, entity));
+        }
+    }
+
+    @Override
+    protected ExternalProvider doPopulate(ExternalProvider model, Provider 
entity) {
+        return model;
+    }
+
+    @Override
+    public Response test(Action action) {
+        Provider provider = getEntity(
+            Provider.class,
+            VdcQueryType.GetProviderById,
+            new IdQueryParameters(guid),
+            id,
+            true
+        );
+        ProviderParameters parameters = new ProviderParameters(provider);
+        return performAction(VdcActionType.TestProviderConnectivity, 
parameters);
+    }
+}
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProvidersResource.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProvidersResource.java
new file mode 100644
index 0000000..7d86a9b
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/BackendExternalProvidersResource.java
@@ -0,0 +1,101 @@
+/*
+* Copyright (c) 2014 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.restapi.resource;
+
+import javax.ws.rs.PathParam;
+import javax.ws.rs.core.Response;
+
+import java.util.List;
+
+import org.ovirt.engine.api.model.ExternalProvider;
+import org.ovirt.engine.api.model.ExternalProviders;
+import org.ovirt.engine.api.resource.ExternalProviderResource;
+import org.ovirt.engine.api.resource.ExternalProvidersResource;
+import org.ovirt.engine.core.common.action.ProviderParameters;
+import org.ovirt.engine.core.common.action.VdcActionType;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.interfaces.SearchType;
+import org.ovirt.engine.core.common.queries.GetAllProvidersParameters;
+import org.ovirt.engine.core.common.queries.IdQueryParameters;
+import org.ovirt.engine.core.common.queries.VdcQueryType;
+import org.ovirt.engine.core.compat.Guid;
+
+public class BackendExternalProvidersResource
+        extends AbstractBackendCollectionResource<ExternalProvider, Provider>
+        implements ExternalProvidersResource {
+
+    public BackendExternalProvidersResource() {
+        super(ExternalProvider.class, Provider.class);
+    }
+
+    @Override
+    public ExternalProviders list() {
+        return mapCollection(getBackendCollection());
+    }
+
+    private ExternalProviders mapCollection(List<Provider> entities) {
+        ExternalProviders collection = new ExternalProviders();
+        for (Provider entity : entities) {
+            collection.getExternalProviders().add(addLinks(map(entity)));
+        }
+        return collection;
+    }
+
+    private List<Provider> getBackendCollection() {
+        if (isFiltered()) {
+            return getBackendCollection(VdcQueryType.GetAllProviders, new 
GetAllProvidersParameters());
+        }
+        else {
+            return getBackendCollection(SearchType.Provider);
+        }
+    }
+
+    @Override
+    public Response add(ExternalProvider externalProvider) {
+        validateParameters(externalProvider, "name", "type");
+        validateEnums(ExternalProvider.class, externalProvider);
+        return performCreate(
+            VdcActionType.AddProvider,
+            new ProviderParameters(map(externalProvider)),
+            new QueryIdResolver<Guid>(VdcQueryType.GetProviderById, 
IdQueryParameters.class)
+        );
+    }
+
+    @Override
+    protected Response performRemove(String id) {
+        Provider provider = getEntity(
+            Provider.class,
+            VdcQueryType.GetProviderById,
+            new IdQueryParameters(asGuid(id)),
+            id,
+            true
+        );
+        ProviderParameters parameters = new ProviderParameters(provider);
+        return performAction(VdcActionType.RemoveProvider, parameters);
+    }
+
+    @Override
+    protected ExternalProvider doPopulate(ExternalProvider model, Provider 
entity) {
+        return model;
+    }
+
+    @Override
+    @SingleEntityResource
+    public ExternalProviderResource 
getExternalProviderSubResource(@PathParam("id") String id) {
+        return inject(new BackendExternalProviderResource(id));
+    }
+}
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 8d9233c..0052fd8 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
@@ -92,6 +92,9 @@
             addDiskProfilesFeature(features);
             addCpuProfilesFeature(features);
         }
+        if (VersionUtils.greaterOrEqual(version, 
BackendCapabilitiesResource.VERSION_3_6)) {
+            addExternalProvidersFeature(features);
+        }
         return features;
     }
 
@@ -518,4 +521,11 @@
         feature.setDescription("Add/modify/remove iSCSI Bonds.");
         features.getFeature().add(feature);
     }
+
+    private void addExternalProvidersFeature(Features features) {
+        Feature feature = new Feature();
+        feature.setName("External Providers");
+        feature.setDescription("Add/modify/remove external providers.");
+        features.getFeature().add(feature);
+    }
 }
diff --git 
a/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/validation/ExternalProviderValidator.java
 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/validation/ExternalProviderValidator.java
new file mode 100644
index 0000000..6456640
--- /dev/null
+++ 
b/backend/manager/modules/restapi/jaxrs/src/main/java/org/ovirt/engine/api/restapi/resource/validation/ExternalProviderValidator.java
@@ -0,0 +1,34 @@
+/*
+* Copyright (c) 2014 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.restapi.resource.validation;
+
+import static org.ovirt.engine.api.common.util.EnumValidator.validateEnum;
+
+import org.ovirt.engine.api.model.ExternalProvider;
+import org.ovirt.engine.api.model.ExternalProviderType;
+
+@ValidatedClass(clazz = ExternalProvider.class)
+public class ExternalProviderValidator implements Validator<ExternalProvider> {
+    @Override
+    public void validateEnums(ExternalProvider externalProvider) {
+        if (externalProvider != null) {
+            if (externalProvider.isSetType()) {
+                validateEnum(ExternalProviderType.class, 
externalProvider.getType(), true);
+            }
+        }
+    }
+}
diff --git 
a/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ExternalProviderMapper.java
 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ExternalProviderMapper.java
new file mode 100644
index 0000000..7182e21
--- /dev/null
+++ 
b/backend/manager/modules/restapi/types/src/main/java/org/ovirt/engine/api/restapi/types/ExternalProviderMapper.java
@@ -0,0 +1,206 @@
+/*
+* Copyright (c) 2014 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.restapi.types;
+
+import java.util.HashMap;
+import java.util.Map;
+
+import org.ovirt.engine.api.model.ExternalProvider;
+import org.ovirt.engine.api.model.ExternalProviderType;
+import org.ovirt.engine.api.model.Properties;
+import org.ovirt.engine.api.model.Property;
+import org.ovirt.engine.api.restapi.utils.GuidUtils;
+import 
org.ovirt.engine.core.common.businessentities.OpenStackImageProviderProperties;
+import 
org.ovirt.engine.core.common.businessentities.OpenstackNetworkProviderProperties;
+import org.ovirt.engine.core.common.businessentities.Provider;
+import org.ovirt.engine.core.common.businessentities.ProviderType;
+
+@SuppressWarnings("unused")
+public class ExternalProviderMapper {
+
+    @Mapping(from = ExternalProvider.class, to = Provider.class)
+    public static Provider map(ExternalProvider model, Provider template) {
+        Provider entity = template != null? template: new Provider();
+        if (model.isSetId()) {
+            entity.setId(GuidUtils.asGuid(model.getId()));
+        }
+        if (model.isSetName()) {
+            entity.setName(model.getName());
+        }
+        if (model.isSetDescription()) {
+            entity.setDescription(model.getDescription());
+        }
+        if (model.isSetType()) {
+            
entity.setType(mapToProviderType(ExternalProviderType.fromValue(model.getType())));
+        }
+        if (model.isSetUrl()) {
+            entity.setUrl(model.getUrl());
+        }
+        if (model.isSetRequiresAuthentication()) {
+            
entity.setRequiringAuthentication(model.isRequiresAuthentication());
+        }
+        if (model.isSetUsername()) {
+            entity.setUsername(model.getUsername());
+        }
+        if (model.isSetPassword()) {
+            entity.setPassword(model.getPassword());
+        }
+        if (model.isSetProperties()) {
+            Map<String, String> map = new HashMap<>();
+            for (Property property : model.getProperties().getProperties()) {
+                map.put(property.getName(), property.getValue());
+            }
+            entity.setCustomProperties(map);
+        }
+        entity.setAdditionalProperties(mapToAdditionalProperties(model));
+        return entity;
+    }
+
+    private static Provider.AdditionalProperties 
mapToAdditionalProperties(ExternalProvider model) {
+        if (model.isSetType()) {
+            ExternalProviderType type = 
ExternalProviderType.fromValue(model.getType());
+            switch (type) {
+            case FOREMAN:
+                return mapToForemanProperties(model);
+            case OPENSTACK_IMAGE:
+                return mapToOpenStackImageProviderProperties(model);
+            case OPENSTACK_NETWORK:
+                return mapToOpenStackNetworkProviderProperties(model);
+            }
+        }
+        return null;
+    }
+
+    private static Provider.AdditionalProperties 
mapToForemanProperties(ExternalProvider model) {
+        return null;
+    }
+
+    private static OpenStackImageProviderProperties 
mapToOpenStackImageProviderProperties(ExternalProvider model) {
+        OpenStackImageProviderProperties properties = new 
OpenStackImageProviderProperties();
+        if (model.isSetTenantName()) {
+            properties.setTenantName(model.getTenantName());
+        }
+        return properties;
+    }
+
+    private static OpenstackNetworkProviderProperties 
mapToOpenStackNetworkProviderProperties(ExternalProvider model) {
+        OpenstackNetworkProviderProperties properties = new 
OpenstackNetworkProviderProperties();
+        if (model.isSetTenantName()) {
+            properties.setTenantName(model.getTenantName());
+        }
+        return properties;
+    }
+
+    @Mapping(from = Provider.class, to = ExternalProvider.class)
+    public static ExternalProvider map(Provider entity, ExternalProvider 
template) {
+        ExternalProvider model = template != null? template: new 
ExternalProvider();
+        if (entity.getId() != null) {
+            model.setId(entity.getId().toString());
+        }
+        if (entity.getName() != null) {
+            model.setName(entity.getName());
+        }
+        if (entity.getDescription() != null) {
+            model.setDescription(entity.getDescription());
+        }
+        if (entity.getType() != null) {
+            model.setType(mapFromProviderType(entity.getType()).value());
+        }
+        if (entity.getUrl() != null) {
+            model.setUrl(entity.getUrl());
+        }
+        model.setRequiresAuthentication(entity.isRequiringAuthentication());
+        if (entity.getUsername() != null) {
+            model.setUsername(entity.getUsername());
+        }
+        // The password isn't mapped for security reasons.
+        // if (entity.getPassword() != null) {
+        //     model.setPassword(entity.getPassword());
+        // }
+        Map<String, String> customProperties = entity.getCustomProperties();
+        if (customProperties != null) {
+            Properties properties = new Properties();
+            for (Map.Entry<String, String> entry : 
customProperties.entrySet()) {
+                Property property = new Property();
+                property.setName(entry.getKey());
+                property.setValue(entry.getValue());
+                properties.getProperties().add(property);
+            }
+            model.setProperties(properties);
+        }
+        Provider.AdditionalProperties additionalProperties = 
entity.getAdditionalProperties();
+        if (additionalProperties != null) {
+            mapFromAdditionalProperties(additionalProperties, model);
+        }
+        return model;
+    }
+
+    private static void 
mapFromAdditionalProperties(Provider.AdditionalProperties additionalProperties,
+            ExternalProvider model) {
+        if (additionalProperties instanceof OpenStackImageProviderProperties) {
+            
mapFromOpenStackImageProviderProperties((OpenStackImageProviderProperties) 
additionalProperties, model);
+        }
+        if (additionalProperties instanceof 
OpenstackNetworkProviderProperties) {
+            
mapFromOpenStackNetworkProviderProperties((OpenstackNetworkProviderProperties) 
additionalProperties, model);
+        }
+        throw new IllegalArgumentException("Unknown additional properties 
class \"" +
+                additionalProperties.getClass().getName() + "\"");
+    }
+
+    private static void 
mapFromOpenStackImageProviderProperties(OpenStackImageProviderProperties 
properties,
+            ExternalProvider model) {
+        String tenantName = properties.getTenantName();
+        if (tenantName != null) {
+            model.setTenantName(tenantName);
+        }
+    }
+
+    private static void 
mapFromOpenStackNetworkProviderProperties(OpenstackNetworkProviderProperties 
properties,
+            ExternalProvider model) {
+        String tenantName = properties.getTenantName();
+        if (tenantName != null) {
+            model.setTenantName(tenantName);
+        }
+        String pluginType = properties.getPluginType();
+    }
+
+    private static ExternalProviderType mapFromProviderType(ProviderType 
entity) {
+        switch (entity) {
+        case FOREMAN:
+            return ExternalProviderType.FOREMAN;
+        case OPENSTACK_IMAGE:
+            return ExternalProviderType.OPENSTACK_IMAGE;
+        case OPENSTACK_NETWORK:
+            return ExternalProviderType.OPENSTACK_NETWORK;
+        default:
+            throw new IllegalArgumentException("Unknown provider type \"" + 
entity + "\"");
+        }
+    }
+
+    private static ProviderType mapToProviderType(ExternalProviderType model) {
+        switch (model) {
+        case FOREMAN:
+            return ProviderType.FOREMAN;
+        case OPENSTACK_IMAGE:
+            return ProviderType.OPENSTACK_IMAGE;
+        case OPENSTACK_NETWORK:
+            return ProviderType.OPENSTACK_NETWORK;
+        default:
+            throw new IllegalArgumentException("Unknown provider type \"" + 
model + "\"");
+        }
+    }
+}


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

Gerrit-MessageType: newchange
Gerrit-Change-Id: I0ff73ad3dfc3c220716cd6ec8ca635f5c3bb348d
Gerrit-PatchSet: 1
Gerrit-Project: ovirt-engine
Gerrit-Branch: master
Gerrit-Owner: Juan Hernandez <juan.hernan...@redhat.com>
_______________________________________________
Engine-patches mailing list
Engine-patches@ovirt.org
http://lists.ovirt.org/mailman/listinfo/engine-patches

Reply via email to