View Javadoc

1   /**
2    *
3    * Copyright (C) 2011 Cloud Conscious, LLC. <info@cloudconscious.com>
4    *
5    * ====================================================================
6    * Licensed under the Apache License, Version 2.0 (the "License");
7    * you may not use this file except in compliance with the License.
8    * You may obtain a copy of the License at
9    *
10   * http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing, software
13   * distributed under the License is distributed on an "AS IS" BASIS,
14   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15   * See the License for the specific language governing permissions and
16   * limitations under the License.
17   * ====================================================================
18   */
19  package org.jclouds.vcloud.terremark;
20  
21  import static org.jclouds.vcloud.VCloudMediaType.CATALOGITEM_XML;
22  import static org.jclouds.vcloud.VCloudMediaType.CATALOG_XML;
23  import static org.jclouds.vcloud.VCloudMediaType.ORG_XML;
24  import static org.jclouds.vcloud.VCloudMediaType.VAPP_XML;
25  import static org.jclouds.vcloud.VCloudMediaType.VDC_XML;
26  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.CATALOGITEMCUSTOMIZATIONPARAMETERS_XML;
27  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICESLIST_XML;
28  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.INTERNETSERVICE_XML;
29  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.NODESERVICE_XML;
30  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.PUBLICIPSLIST_XML;
31  import static org.jclouds.vcloud.terremark.TerremarkVCloudMediaType.PUBLICIP_XML;
32  
33  import java.net.URI;
34  import java.util.Set;
35  
36  import javax.annotation.Nullable;
37  import javax.ws.rs.Consumes;
38  import javax.ws.rs.DELETE;
39  import javax.ws.rs.GET;
40  import javax.ws.rs.POST;
41  import javax.ws.rs.PUT;
42  import javax.ws.rs.Path;
43  import javax.ws.rs.Produces;
44  
45  import org.jclouds.predicates.validators.DnsNameValidator;
46  import org.jclouds.rest.annotations.EndpointParam;
47  import org.jclouds.rest.annotations.ExceptionParser;
48  import org.jclouds.rest.annotations.MapBinder;
49  import org.jclouds.rest.annotations.ParamValidators;
50  import org.jclouds.rest.annotations.PayloadParam;
51  import org.jclouds.rest.annotations.RequestFilters;
52  import org.jclouds.rest.annotations.ResponseParser;
53  import org.jclouds.rest.annotations.XMLResponseParser;
54  import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
55  import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
56  import org.jclouds.rest.functions.ReturnVoidOnNotFoundOr404;
57  import org.jclouds.vcloud.VCloudExpressAsyncClient;
58  import org.jclouds.vcloud.VCloudExpressClient;
59  import org.jclouds.vcloud.domain.Catalog;
60  import org.jclouds.vcloud.domain.Task;
61  import org.jclouds.vcloud.domain.VCloudExpressVApp;
62  import org.jclouds.vcloud.domain.VDC;
63  import org.jclouds.vcloud.filters.SetVCloudTokenCookie;
64  import org.jclouds.vcloud.functions.OrgNameAndVDCNameToEndpoint;
65  import org.jclouds.vcloud.functions.OrgNameCatalogNameItemNameToEndpoint;
66  import org.jclouds.vcloud.functions.OrgNameToEndpoint;
67  import org.jclouds.vcloud.functions.ParseTaskFromLocationHeader;
68  import org.jclouds.vcloud.options.InstantiateVAppTemplateOptions;
69  import org.jclouds.vcloud.terremark.binders.BindNodeConfigurationToXmlPayload;
70  import org.jclouds.vcloud.terremark.binders.BindVAppConfigurationToXmlPayload;
71  import org.jclouds.vcloud.terremark.binders.TerremarkBindInstantiateVAppTemplateParamsToXmlPayload;
72  import org.jclouds.vcloud.terremark.domain.CustomizationParameters;
73  import org.jclouds.vcloud.terremark.domain.InternetService;
74  import org.jclouds.vcloud.terremark.domain.Node;
75  import org.jclouds.vcloud.terremark.domain.Protocol;
76  import org.jclouds.vcloud.terremark.domain.PublicIpAddress;
77  import org.jclouds.vcloud.terremark.domain.TerremarkCatalogItem;
78  import org.jclouds.vcloud.terremark.domain.TerremarkOrg;
79  import org.jclouds.vcloud.terremark.domain.TerremarkVDC;
80  import org.jclouds.vcloud.terremark.domain.VAppConfiguration;
81  import org.jclouds.vcloud.terremark.functions.ReturnVoidOnDeleteDefaultIp;
82  import org.jclouds.vcloud.terremark.functions.VDCURIToInternetServicesEndpoint;
83  import org.jclouds.vcloud.terremark.functions.VDCURIToPublicIPsEndpoint;
84  import org.jclouds.vcloud.terremark.options.AddInternetServiceOptions;
85  import org.jclouds.vcloud.terremark.options.AddNodeOptions;
86  import org.jclouds.vcloud.terremark.xml.CustomizationParametersHandler;
87  import org.jclouds.vcloud.terremark.xml.InternetServiceHandler;
88  import org.jclouds.vcloud.terremark.xml.InternetServicesHandler;
89  import org.jclouds.vcloud.terremark.xml.NodeHandler;
90  import org.jclouds.vcloud.terremark.xml.NodesHandler;
91  import org.jclouds.vcloud.terremark.xml.PublicIpAddressesHandler;
92  import org.jclouds.vcloud.terremark.xml.TerremarkCatalogItemHandler;
93  import org.jclouds.vcloud.terremark.xml.TerremarkOrgHandler;
94  import org.jclouds.vcloud.terremark.xml.TerremarkVDCHandler;
95  import org.jclouds.vcloud.xml.VCloudExpressCatalogHandler;
96  import org.jclouds.vcloud.xml.VCloudExpressVAppHandler;
97  
98  import com.google.common.util.concurrent.ListenableFuture;
99  
100 /**
101  * Provides access to VCloud resources via their REST API.
102  * <p/>
103  * 
104  * @see <a href="https://community.vcloudexpress.terremark.com/en-us/discussion_forums/f/60.aspx" />
105  * @author Adrian Cole
106  */
107 @RequestFilters(SetVCloudTokenCookie.class)
108 public interface TerremarkVCloudAsyncClient extends VCloudExpressAsyncClient {
109    /**
110     * @see VCloudExpressClient#getCatalogItemInOrg
111     */
112    @Override
113    @GET
114    @Consumes(CATALOGITEM_XML)
115    @XMLResponseParser(TerremarkCatalogItemHandler.class)
116    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
117    ListenableFuture<? extends TerremarkCatalogItem> findCatalogItemInOrgCatalogNamed(
118             @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String orgName,
119             @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String catalogName,
120             @Nullable @EndpointParam(parser = OrgNameCatalogNameItemNameToEndpoint.class) String itemName);
121 
122    /**
123     * @see VCloudExpressClient#getCatalogItem
124     */
125    @Override
126    @GET
127    @Consumes(CATALOGITEM_XML)
128    @XMLResponseParser(TerremarkCatalogItemHandler.class)
129    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
130    ListenableFuture<? extends TerremarkCatalogItem> getCatalogItem(@EndpointParam URI catalogItem);
131 
132    @Override
133    @GET
134    @XMLResponseParser(TerremarkOrgHandler.class)
135    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
136    @Consumes(ORG_XML)
137    ListenableFuture<? extends TerremarkOrg> getOrg(@EndpointParam URI orgId);
138 
139    /**
140     * @see VCloudExpressClient#findOrgNamed
141     */
142    @Override
143    @GET
144    @XMLResponseParser(TerremarkOrgHandler.class)
145    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
146    @Consumes(ORG_XML)
147    ListenableFuture<? extends TerremarkOrg> findOrgNamed(
148             @Nullable @EndpointParam(parser = OrgNameToEndpoint.class) String orgName);
149 
150    /**
151     * Terremark does not have multiple catalogs, so we ignore this parameter.
152     */
153    @GET
154    @Override
155    @XMLResponseParser(VCloudExpressCatalogHandler.class)
156    @Consumes(CATALOG_XML)
157    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
158    ListenableFuture<? extends Catalog> getCatalog(@EndpointParam URI catalogId);
159 
160    /**
161     * @see TerremarkVCloudExpressClient#getVDC
162     */
163    @Override
164    @GET
165    @XMLResponseParser(TerremarkVDCHandler.class)
166    @Consumes(VDC_XML)
167    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
168    ListenableFuture<? extends TerremarkVDC> getVDC(@EndpointParam URI vdc);
169 
170    /**
171     * @see VCloudExpressClient#findVDCInOrgNamed
172     */
173    @GET
174    @Override
175    @XMLResponseParser(TerremarkVDCHandler.class)
176    @Consumes(VDC_XML)
177    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
178    ListenableFuture<? extends VDC> findVDCInOrgNamed(
179             @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String orgName,
180             @Nullable @EndpointParam(parser = OrgNameAndVDCNameToEndpoint.class) String vdcName);
181 
182    /**
183     * @see VCloudExpressClient#instantiateVAppTemplateInVDC
184     */
185    @Override
186    @POST
187    @Path("/action/instantiateVAppTemplate")
188    @Produces("application/vnd.vmware.vcloud.instantiateVAppTemplateParams+xml")
189    @Consumes(VAPP_XML)
190    @XMLResponseParser(VCloudExpressVAppHandler.class)
191    @MapBinder(TerremarkBindInstantiateVAppTemplateParamsToXmlPayload.class)
192    ListenableFuture<? extends VCloudExpressVApp> instantiateVAppTemplateInVDC(@EndpointParam URI vdc,
193             @PayloadParam("template") URI template,
194             @PayloadParam("name") @ParamValidators(DnsNameValidator.class) String appName,
195             InstantiateVAppTemplateOptions... options);
196 
197    /**
198     * @see TerremarkVCloudExpressClient#getAllInternetServicesInVDC
199     */
200    @GET
201    @Consumes(INTERNETSERVICESLIST_XML)
202    @XMLResponseParser(InternetServicesHandler.class)
203    @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
204    ListenableFuture<? extends Set<InternetService>> getAllInternetServicesInVDC(
205             @EndpointParam(parser = VDCURIToInternetServicesEndpoint.class) URI vDCId);
206 
207    /**
208     * @see TerremarkVCloudExpressClient#addInternetServiceToExistingIp
209     */
210    @POST
211    @Path("/internetServices")
212    @Produces(INTERNETSERVICE_XML)
213    @Consumes(INTERNETSERVICE_XML)
214    @XMLResponseParser(InternetServiceHandler.class)
215    @MapBinder(AddInternetServiceOptions.class)
216    ListenableFuture<? extends InternetService> addInternetServiceToExistingIp(@EndpointParam URI publicIpId,
217             @PayloadParam("name") String serviceName, @PayloadParam("protocol") Protocol protocol,
218             @PayloadParam("port") int port, AddInternetServiceOptions... options);
219 
220    /**
221     * @see TerremarkVCloudExpressClient#deletePublicIp
222     */
223    @DELETE
224    @ExceptionParser(ReturnVoidOnDeleteDefaultIp.class)
225    ListenableFuture<Void> deletePublicIp(@EndpointParam URI ipId);
226 
227    /**
228     * @see TerremarkVCloudExpressClient#getInternetServicesOnPublicIP
229     */
230    @GET
231    @Path("/internetServices")
232    @Consumes(INTERNETSERVICESLIST_XML)
233    @XMLResponseParser(InternetServicesHandler.class)
234    @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
235    ListenableFuture<? extends Set<InternetService>> getInternetServicesOnPublicIp(@EndpointParam URI ipId);
236 
237    /**
238     * @see TerremarkVCloudExpressClient#getPublicIp
239     */
240    @GET
241    @Consumes(PUBLICIP_XML)
242    @XMLResponseParser(InternetServicesHandler.class)
243    @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
244    ListenableFuture<? extends Set<InternetService>> getPublicIp(@EndpointParam URI ipId);
245 
246    /**
247     * @see TerremarkVCloudExpressClient#getPublicIpsAssociatedWithVDC
248     */
249    @GET
250    @Consumes(PUBLICIPSLIST_XML)
251    @XMLResponseParser(PublicIpAddressesHandler.class)
252    @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
253    ListenableFuture<? extends Set<PublicIpAddress>> getPublicIpsAssociatedWithVDC(
254             @EndpointParam(parser = VDCURIToPublicIPsEndpoint.class) URI vDCId);
255 
256    /**
257     * @see TerremarkVCloudExpressClient#deleteInternetService
258     */
259    @DELETE
260    @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
261    ListenableFuture<Void> deleteInternetService(@EndpointParam URI internetServiceId);
262 
263    /**
264     * @see TerremarkVCloudExpressClient#getInternetService
265     */
266    @GET
267    @Consumes(INTERNETSERVICESLIST_XML)
268    @XMLResponseParser(InternetServiceHandler.class)
269    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
270    ListenableFuture<? extends InternetService> getInternetService(@EndpointParam URI internetServiceId);
271 
272    /**
273     * @see TerremarkVCloudExpressClient#addNode
274     */
275    @POST
276    @Path("/nodeServices")
277    @Produces(NODESERVICE_XML)
278    @Consumes(NODESERVICE_XML)
279    @XMLResponseParser(NodeHandler.class)
280    @MapBinder(AddNodeOptions.class)
281    ListenableFuture<? extends Node> addNode(@EndpointParam URI internetServiceId,
282             @PayloadParam("ipAddress") String ipAddress, @PayloadParam("name") String name,
283             @PayloadParam("port") int port, AddNodeOptions... options);
284 
285    /**
286     * @see TerremarkVCloudExpressClient#getNodes
287     */
288    @GET
289    @Path("/nodeServices")
290    @XMLResponseParser(NodesHandler.class)
291    @ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
292    @Consumes(NODESERVICE_XML)
293    ListenableFuture<? extends Set<Node>> getNodes(@EndpointParam URI internetServiceId);
294 
295    /**
296     * @see TerremarkVCloudExpressClient#getNode
297     */
298    @GET
299    @XMLResponseParser(NodeHandler.class)
300    @Consumes(NODESERVICE_XML)
301    @ExceptionParser(ReturnNullOnNotFoundOr404.class)
302    ListenableFuture<? extends Node> getNode(@EndpointParam URI nodeId);
303 
304    /**
305     * @see TerremarkVCloudExpressClient#configureNode
306     */
307    @PUT
308    @Produces(NODESERVICE_XML)
309    @Consumes(NODESERVICE_XML)
310    @XMLResponseParser(NodeHandler.class)
311    @MapBinder(BindNodeConfigurationToXmlPayload.class)
312    ListenableFuture<? extends Node> configureNode(@EndpointParam URI nodeId, @PayloadParam("name") String name,
313             @PayloadParam("enabled") boolean enabled, @Nullable @PayloadParam("description") String description);
314 
315    /**
316     * @see TerremarkVCloudExpressClient#deleteNode
317     */
318    @DELETE
319    @ExceptionParser(ReturnVoidOnNotFoundOr404.class)
320    ListenableFuture<Void> deleteNode(@EndpointParam URI nodeId);
321 
322    /**
323     * @see TerremarkVCloudExpressClient#configureVApp
324     */
325    @PUT
326    @Produces(VAPP_XML)
327    @Consumes(VAPP_XML)
328    @MapBinder(BindVAppConfigurationToXmlPayload.class)
329    @ResponseParser(ParseTaskFromLocationHeader.class)
330    ListenableFuture<? extends Task> configureVApp(
331             @EndpointParam(parser = BindVAppConfigurationToXmlPayload.class) VCloudExpressVApp vApp,
332             VAppConfiguration configuration);
333 
334    /**
335     * @see TerremarkVCloudClient#getCustomizationOptions
336     */
337    @GET
338    @XMLResponseParser(CustomizationParametersHandler.class)
339    @Consumes(CATALOGITEMCUSTOMIZATIONPARAMETERS_XML)
340    ListenableFuture<? extends CustomizationParameters> getCustomizationOptions(@EndpointParam URI customization);
341 
342 }