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