mirror of https://github.com/apache/jclouds.git
Issue 191: added preliminary support for search
This commit is contained in:
parent
81ac28e9db
commit
96178f5647
|
@ -50,9 +50,14 @@ import org.jclouds.chef.domain.DatabagItem;
|
||||||
import org.jclouds.chef.domain.Node;
|
import org.jclouds.chef.domain.Node;
|
||||||
import org.jclouds.chef.domain.Role;
|
import org.jclouds.chef.domain.Role;
|
||||||
import org.jclouds.chef.domain.Sandbox;
|
import org.jclouds.chef.domain.Sandbox;
|
||||||
|
import org.jclouds.chef.domain.SearchResult;
|
||||||
import org.jclouds.chef.domain.UploadSandbox;
|
import org.jclouds.chef.domain.UploadSandbox;
|
||||||
import org.jclouds.chef.filters.SignedHeaderAuth;
|
import org.jclouds.chef.filters.SignedHeaderAuth;
|
||||||
import org.jclouds.chef.functions.ParseKeySetFromJson;
|
import org.jclouds.chef.functions.ParseKeySetFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchClientsFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchDatabagFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchNodesFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchRolesFromJson;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
import org.jclouds.rest.annotations.ExceptionParser;
|
||||||
import org.jclouds.rest.annotations.Headers;
|
import org.jclouds.rest.annotations.Headers;
|
||||||
|
@ -290,7 +295,7 @@ public interface ChefAsyncClient {
|
||||||
ListenableFuture<Set<String>> listRoles();
|
ListenableFuture<Set<String>> listRoles();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#listDatabags
|
* @see ChefClient#listDatabags
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("data")
|
@Path("data")
|
||||||
|
@ -306,7 +311,7 @@ public interface ChefAsyncClient {
|
||||||
ListenableFuture<Void> createDatabag(@BinderParam(BindNameToJsonPayload.class) String databagName);
|
ListenableFuture<Void> createDatabag(@BinderParam(BindNameToJsonPayload.class) String databagName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#databagExists
|
* @see ChefClient#databagExists
|
||||||
*/
|
*/
|
||||||
@HEAD
|
@HEAD
|
||||||
@Path("data/{name}")
|
@Path("data/{name}")
|
||||||
|
@ -314,7 +319,7 @@ public interface ChefAsyncClient {
|
||||||
ListenableFuture<Boolean> databagExists(@PathParam("name") String databagName);
|
ListenableFuture<Boolean> databagExists(@PathParam("name") String databagName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#deleteDatabag
|
* @see ChefClient#deleteDatabag
|
||||||
*/
|
*/
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("data/{name}")
|
@Path("data/{name}")
|
||||||
|
@ -322,7 +327,7 @@ public interface ChefAsyncClient {
|
||||||
ListenableFuture<Void> deleteDatabag(@PathParam("name") String databagName);
|
ListenableFuture<Void> deleteDatabag(@PathParam("name") String databagName);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#listDatabagItems
|
* @see ChefClient#listDatabagItems
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("data/{name}")
|
@Path("data/{name}")
|
||||||
|
@ -348,7 +353,7 @@ public interface ChefAsyncClient {
|
||||||
@PathParam("databagItemId") @ParamParser(DatabagItemId.class) @BinderParam(BindToJsonPayload.class) DatabagItem item);
|
@PathParam("databagItemId") @ParamParser(DatabagItemId.class) @BinderParam(BindToJsonPayload.class) DatabagItem item);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#databagItemExists
|
* @see ChefClient#databagItemExists
|
||||||
*/
|
*/
|
||||||
@HEAD
|
@HEAD
|
||||||
@Path("data/{databagName}/{databagItemId}")
|
@Path("data/{databagName}/{databagItemId}")
|
||||||
|
@ -357,7 +362,7 @@ public interface ChefAsyncClient {
|
||||||
@PathParam("databagItemId") String databagItemId);
|
@PathParam("databagItemId") String databagItemId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#getDatabagItem
|
* @see ChefClient#getDatabagItem
|
||||||
*/
|
*/
|
||||||
@GET
|
@GET
|
||||||
@Path("data/{databagName}/{databagItemId}")
|
@Path("data/{databagName}/{databagItemId}")
|
||||||
|
@ -366,7 +371,7 @@ public interface ChefAsyncClient {
|
||||||
@PathParam("databagItemId") String databagItemId);
|
@PathParam("databagItemId") String databagItemId);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see ChefDatabag#deleteDatabagItem
|
* @see ChefClient#deleteDatabagItem
|
||||||
*/
|
*/
|
||||||
@DELETE
|
@DELETE
|
||||||
@Path("data/{databagName}/{databagItemId}")
|
@Path("data/{databagName}/{databagItemId}")
|
||||||
|
@ -374,4 +379,45 @@ public interface ChefAsyncClient {
|
||||||
ListenableFuture<DatabagItem> deleteDatabagItem(@PathParam("databagName") String databagName,
|
ListenableFuture<DatabagItem> deleteDatabagItem(@PathParam("databagName") String databagName,
|
||||||
@PathParam("databagItemId") String databagItemId);
|
@PathParam("databagItemId") String databagItemId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ChefClient#listSearchIndexes
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("search")
|
||||||
|
@ResponseParser(ParseKeySetFromJson.class)
|
||||||
|
@ExceptionParser(ReturnEmptySetOnNotFoundOr404.class)
|
||||||
|
ListenableFuture<Set<String>> listSearchIndexes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ChefClient#searchRoles
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("search/role")
|
||||||
|
@ResponseParser(ParseSearchRolesFromJson.class)
|
||||||
|
ListenableFuture<? extends SearchResult<? extends Role>> searchRoles();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ChefClient#searchClients
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("search/client")
|
||||||
|
@ResponseParser(ParseSearchClientsFromJson.class)
|
||||||
|
ListenableFuture<? extends SearchResult<? extends Client>> searchClients();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ChefClient#searchNodes
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("search/node")
|
||||||
|
@ResponseParser(ParseSearchNodesFromJson.class)
|
||||||
|
ListenableFuture<? extends SearchResult<? extends Node>> searchNodes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @see ChefClient#searchDatabag
|
||||||
|
*/
|
||||||
|
@GET
|
||||||
|
@Path("search/{databagName}")
|
||||||
|
@ResponseParser(ParseSearchDatabagFromJson.class)
|
||||||
|
ListenableFuture<? extends SearchResult<? extends DatabagItem>> searchDatabag(
|
||||||
|
@PathParam("databagName") String databagName);
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,7 @@ import org.jclouds.chef.domain.DatabagItem;
|
||||||
import org.jclouds.chef.domain.Node;
|
import org.jclouds.chef.domain.Node;
|
||||||
import org.jclouds.chef.domain.Role;
|
import org.jclouds.chef.domain.Role;
|
||||||
import org.jclouds.chef.domain.Sandbox;
|
import org.jclouds.chef.domain.Sandbox;
|
||||||
|
import org.jclouds.chef.domain.SearchResult;
|
||||||
import org.jclouds.chef.domain.UploadSandbox;
|
import org.jclouds.chef.domain.UploadSandbox;
|
||||||
import org.jclouds.concurrent.Timeout;
|
import org.jclouds.concurrent.Timeout;
|
||||||
import org.jclouds.http.HttpResponseException;
|
import org.jclouds.http.HttpResponseException;
|
||||||
|
@ -484,4 +485,71 @@ public interface ChefClient {
|
||||||
*/
|
*/
|
||||||
DatabagItem deleteDatabagItem(String databagName, String databagItemId);
|
DatabagItem deleteDatabagItem(String databagName, String databagItemId);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show indexes you can search on
|
||||||
|
* <p/>
|
||||||
|
* By default, the "role", "node" and "client" indexes will always be
|
||||||
|
* available.
|
||||||
|
* <p/>
|
||||||
|
* Note that the search indexes may lag behind the most current data by at
|
||||||
|
* least 10 seconds at any given time - so if you need to write data and
|
||||||
|
* immediately query it, you likely need to produce an artificial delay (or
|
||||||
|
* simply retry until the data is available.)
|
||||||
|
*
|
||||||
|
* @throws AuthorizationException
|
||||||
|
* <p/>
|
||||||
|
* "401 Unauthorized" if you are not a recognized user.
|
||||||
|
* <p/>
|
||||||
|
* "403 Forbidden" if you do not have view rights on the databag.
|
||||||
|
*/
|
||||||
|
Set<String> listSearchIndexes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* search all roles.
|
||||||
|
* <p/>
|
||||||
|
* Note that without any request parameters this will return all of the data
|
||||||
|
* within the index.
|
||||||
|
*
|
||||||
|
* @return The response contains the total number of rows that matched your
|
||||||
|
* request, the position this result set returns (useful for paging)
|
||||||
|
* and the rows themselves.
|
||||||
|
*/
|
||||||
|
SearchResult<? extends Role> searchRoles();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* search all clients.
|
||||||
|
* <p/>
|
||||||
|
* Note that without any request parameters this will return all of the data
|
||||||
|
* within the index.
|
||||||
|
*
|
||||||
|
* @return The response contains the total number of rows that matched your
|
||||||
|
* request, the position this result set returns (useful for paging)
|
||||||
|
* and the rows themselves.
|
||||||
|
*/
|
||||||
|
SearchResult<? extends Client> searchClients();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* search all nodes.
|
||||||
|
* <p/>
|
||||||
|
* Note that without any request parameters this will return all of the data
|
||||||
|
* within the index.
|
||||||
|
*
|
||||||
|
* @return The response contains the total number of rows that matched your
|
||||||
|
* request, the position this result set returns (useful for paging)
|
||||||
|
* and the rows themselves.
|
||||||
|
*/
|
||||||
|
SearchResult<? extends Node> searchNodes();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* search all items in a databag.
|
||||||
|
* <p/>
|
||||||
|
* Note that without any request parameters this will return all of the data
|
||||||
|
* within the index.
|
||||||
|
*
|
||||||
|
* @return The response contains the total number of rows that matched your
|
||||||
|
* request, the position this result set returns (useful for paging)
|
||||||
|
* and the rows themselves.
|
||||||
|
*/
|
||||||
|
SearchResult<? extends DatabagItem> searchDatabag(String databagName);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,51 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.jclouds.chef.domain;
|
||||||
|
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
|
|
||||||
|
import com.google.common.collect.Iterables;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
public class SearchResult<T> extends LinkedHashSet<T> {
|
||||||
|
private long start;
|
||||||
|
|
||||||
|
SearchResult() {
|
||||||
|
}
|
||||||
|
|
||||||
|
public SearchResult(long start, Iterable<T> results) {
|
||||||
|
this.start = start;
|
||||||
|
Iterables.addAll(this, results);
|
||||||
|
}
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 4000610660948065287L;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @return the result position this started from from
|
||||||
|
*/
|
||||||
|
long getStart() {
|
||||||
|
return start;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.jclouds.chef.functions;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.chef.domain.Client;
|
||||||
|
import org.jclouds.http.functions.ParseJson;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ParseSearchClientsFromJson extends ParseSearchResultFromJson<Client> {
|
||||||
|
|
||||||
|
// TODO add generic json parser detector
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ParseSearchClientsFromJson(ParseJson<Response<Client>> json) {
|
||||||
|
super(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.jclouds.chef.functions;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.chef.domain.DatabagItem;
|
||||||
|
import org.jclouds.http.functions.ParseJson;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ParseSearchDatabagFromJson extends ParseSearchResultFromJson<DatabagItem> {
|
||||||
|
|
||||||
|
// TODO add generic json parser detector
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ParseSearchDatabagFromJson(ParseJson<Response<DatabagItem>> json) {
|
||||||
|
super(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.jclouds.chef.functions;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.chef.domain.Node;
|
||||||
|
import org.jclouds.http.functions.ParseJson;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ParseSearchNodesFromJson extends ParseSearchResultFromJson<Node> {
|
||||||
|
|
||||||
|
// TODO add generic json parser detector
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ParseSearchNodesFromJson(ParseJson<Response<Node>> json) {
|
||||||
|
super(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,78 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.jclouds.chef.functions;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.chef.domain.SearchResult;
|
||||||
|
import org.jclouds.http.HttpResponse;
|
||||||
|
import org.jclouds.http.functions.ParseJson;
|
||||||
|
|
||||||
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ParseSearchResultFromJson<T> implements Function<HttpResponse, SearchResult<T>> {
|
||||||
|
|
||||||
|
private final ParseJson<Response<T>> json;
|
||||||
|
|
||||||
|
static class Response<T> {
|
||||||
|
long start;
|
||||||
|
List<T> rows;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ParseSearchResultFromJson(ParseJson<Response<T>> json) {
|
||||||
|
this.json = json;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public SearchResult<T> apply(HttpResponse arg0) {
|
||||||
|
Response<T> returnVal = json.apply(arg0);
|
||||||
|
return new SearchResult<T>(returnVal.start, returnVal.rows);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,64 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* 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.
|
||||||
|
* ====================================================================
|
||||||
|
*/
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* Copyright (C) 2010 Cloud Conscious, LLC. <info@cloudconscious.com>
|
||||||
|
*
|
||||||
|
* ====================================================================
|
||||||
|
* Licensed to the Apache Software Foundation (ASF) under one
|
||||||
|
* or more contributor license agreements. See the NOTICE file
|
||||||
|
* distributed with this work for additional information
|
||||||
|
* regarding copyright ownership. The ASF licenses this file
|
||||||
|
* to you 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.jclouds.chef.functions;
|
||||||
|
|
||||||
|
import javax.inject.Inject;
|
||||||
|
import javax.inject.Singleton;
|
||||||
|
|
||||||
|
import org.jclouds.chef.domain.Role;
|
||||||
|
import org.jclouds.http.functions.ParseJson;
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
* @author Adrian Cole
|
||||||
|
*/
|
||||||
|
@Singleton
|
||||||
|
public class ParseSearchRolesFromJson extends ParseSearchResultFromJson<Role> {
|
||||||
|
|
||||||
|
// TODO add generic json parser detector
|
||||||
|
|
||||||
|
@Inject
|
||||||
|
ParseSearchRolesFromJson(ParseJson<Response<Role>> json) {
|
||||||
|
super(json);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -59,11 +59,13 @@ import java.util.Properties;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.jclouds.chef.domain.ChecksumStatus;
|
import org.jclouds.chef.domain.ChecksumStatus;
|
||||||
|
import org.jclouds.chef.domain.Client;
|
||||||
import org.jclouds.chef.domain.CookbookVersion;
|
import org.jclouds.chef.domain.CookbookVersion;
|
||||||
import org.jclouds.chef.domain.DatabagItem;
|
import org.jclouds.chef.domain.DatabagItem;
|
||||||
import org.jclouds.chef.domain.Node;
|
import org.jclouds.chef.domain.Node;
|
||||||
import org.jclouds.chef.domain.Resource;
|
import org.jclouds.chef.domain.Resource;
|
||||||
import org.jclouds.chef.domain.Role;
|
import org.jclouds.chef.domain.Role;
|
||||||
|
import org.jclouds.chef.domain.SearchResult;
|
||||||
import org.jclouds.chef.domain.UploadSandbox;
|
import org.jclouds.chef.domain.UploadSandbox;
|
||||||
import org.jclouds.crypto.CryptoStreams;
|
import org.jclouds.crypto.CryptoStreams;
|
||||||
import org.jclouds.crypto.Pems;
|
import org.jclouds.crypto.Pems;
|
||||||
|
@ -72,6 +74,7 @@ import org.jclouds.io.Payloads;
|
||||||
import org.jclouds.io.payloads.FilePayload;
|
import org.jclouds.io.payloads.FilePayload;
|
||||||
import org.jclouds.json.Json;
|
import org.jclouds.json.Json;
|
||||||
import org.jclouds.rest.HttpClient;
|
import org.jclouds.rest.HttpClient;
|
||||||
|
import org.jclouds.rest.ResourceNotFoundException;
|
||||||
import org.testng.annotations.AfterClass;
|
import org.testng.annotations.AfterClass;
|
||||||
import org.testng.annotations.Test;
|
import org.testng.annotations.Test;
|
||||||
|
|
||||||
|
@ -337,6 +340,45 @@ public abstract class BaseChefClientLiveTest {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testListSearchIndexes() throws Exception {
|
||||||
|
Set<String> indexes = getAdminConnection().listSearchIndexes();
|
||||||
|
assertNotNull(indexes);
|
||||||
|
assert indexes.contains("node") : indexes;
|
||||||
|
assert indexes.contains("client") : indexes;
|
||||||
|
assert indexes.contains("role") : indexes;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchNodes() throws Exception {
|
||||||
|
SearchResult<? extends Node> results = getAdminConnection().searchNodes();
|
||||||
|
assertNotNull(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchClients() throws Exception {
|
||||||
|
SearchResult<? extends Client> results = getAdminConnection().searchClients();
|
||||||
|
assertNotNull(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSearchRoles() throws Exception {
|
||||||
|
SearchResult<? extends Role> results = getAdminConnection().searchRoles();
|
||||||
|
assertNotNull(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(dependsOnMethods = "testDatabagItemExists")
|
||||||
|
public void testSearchDatabag() throws Exception {
|
||||||
|
SearchResult<? extends DatabagItem> results = getAdminConnection().searchDatabag(PREFIX);
|
||||||
|
assertNotNull(results);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test(expectedExceptions = ResourceNotFoundException.class)
|
||||||
|
public void testSearchDatabagNotFound() throws Exception {
|
||||||
|
SearchResult<? extends DatabagItem> results = getAdminConnection().searchDatabag("whoopie");
|
||||||
|
assertNotNull(results);
|
||||||
|
}
|
||||||
|
|
||||||
@AfterClass(groups = { "live" })
|
@AfterClass(groups = { "live" })
|
||||||
public void teardownClient() throws IOException {
|
public void teardownClient() throws IOException {
|
||||||
if (getValidatorConnection().clientExists(PREFIX))
|
if (getValidatorConnection().clientExists(PREFIX))
|
||||||
|
|
|
@ -38,6 +38,10 @@ import org.jclouds.chef.domain.Role;
|
||||||
import org.jclouds.chef.filters.SignedHeaderAuth;
|
import org.jclouds.chef.filters.SignedHeaderAuth;
|
||||||
import org.jclouds.chef.filters.SignedHeaderAuthTest;
|
import org.jclouds.chef.filters.SignedHeaderAuthTest;
|
||||||
import org.jclouds.chef.functions.ParseKeySetFromJson;
|
import org.jclouds.chef.functions.ParseKeySetFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchClientsFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchDatabagFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchNodesFromJson;
|
||||||
|
import org.jclouds.chef.functions.ParseSearchRolesFromJson;
|
||||||
import org.jclouds.crypto.CryptoStreams;
|
import org.jclouds.crypto.CryptoStreams;
|
||||||
import org.jclouds.date.TimeStamp;
|
import org.jclouds.date.TimeStamp;
|
||||||
import org.jclouds.http.HttpRequest;
|
import org.jclouds.http.HttpRequest;
|
||||||
|
@ -49,6 +53,7 @@ import org.jclouds.rest.ConfiguresRestClient;
|
||||||
import org.jclouds.rest.RestClientTest;
|
import org.jclouds.rest.RestClientTest;
|
||||||
import org.jclouds.rest.RestContextFactory;
|
import org.jclouds.rest.RestContextFactory;
|
||||||
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
import org.jclouds.rest.RestContextFactory.ContextSpec;
|
||||||
|
import org.jclouds.rest.functions.MapHttp4xxCodesToExceptions;
|
||||||
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
import org.jclouds.rest.functions.ReturnEmptySetOnNotFoundOr404;
|
||||||
import org.jclouds.rest.functions.ReturnFalseOnNotFoundOr404;
|
import org.jclouds.rest.functions.ReturnFalseOnNotFoundOr404;
|
||||||
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
import org.jclouds.rest.functions.ReturnNullOnNotFoundOr404;
|
||||||
|
@ -629,6 +634,86 @@ public class ChefAsyncClientTest extends RestClientTest<ChefAsyncClient> {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void testListSearchIndexes() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = ChefAsyncClient.class.getMethod("listSearchIndexes");
|
||||||
|
GeneratedHttpRequest<ChefAsyncClient> httpRequest = processor.createRequest(method);
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpRequest, "GET http://localhost:4000/search HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\nX-Chef-Version: 0.9.8\n");
|
||||||
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpRequest, ParseKeySetFromJson.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, ReturnEmptySetOnNotFoundOr404.class);
|
||||||
|
|
||||||
|
checkFilters(httpRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSearchRoles() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = ChefAsyncClient.class.getMethod("searchRoles");
|
||||||
|
GeneratedHttpRequest<ChefAsyncClient> httpRequest = processor.createRequest(method);
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpRequest, "GET http://localhost:4000/search/role HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\nX-Chef-Version: 0.9.8\n");
|
||||||
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpRequest, ParseSearchRolesFromJson.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
|
||||||
|
|
||||||
|
checkFilters(httpRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSearchClients() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = ChefAsyncClient.class.getMethod("searchClients");
|
||||||
|
GeneratedHttpRequest<ChefAsyncClient> httpRequest = processor.createRequest(method);
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpRequest, "GET http://localhost:4000/search/client HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\nX-Chef-Version: 0.9.8\n");
|
||||||
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpRequest, ParseSearchClientsFromJson.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
|
||||||
|
|
||||||
|
checkFilters(httpRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSearchNodes() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = ChefAsyncClient.class.getMethod("searchNodes");
|
||||||
|
GeneratedHttpRequest<ChefAsyncClient> httpRequest = processor.createRequest(method);
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpRequest, "GET http://localhost:4000/search/node HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\nX-Chef-Version: 0.9.8\n");
|
||||||
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpRequest, ParseSearchNodesFromJson.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
|
||||||
|
|
||||||
|
checkFilters(httpRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSearchDatabag() throws SecurityException, NoSuchMethodException, IOException {
|
||||||
|
Method method = ChefAsyncClient.class.getMethod("searchDatabag", String.class);
|
||||||
|
GeneratedHttpRequest<ChefAsyncClient> httpRequest = processor.createRequest(method, "foo");
|
||||||
|
|
||||||
|
assertRequestLineEquals(httpRequest, "GET http://localhost:4000/search/foo HTTP/1.1");
|
||||||
|
assertNonPayloadHeadersEqual(httpRequest, "Accept: application/json\nX-Chef-Version: 0.9.8\n");
|
||||||
|
assertPayloadEquals(httpRequest, null, null, false);
|
||||||
|
|
||||||
|
assertResponseParserClassEquals(method, httpRequest, ParseSearchDatabagFromJson.class);
|
||||||
|
assertSaxResponseParserClassEquals(method, null);
|
||||||
|
assertExceptionParserClassEquals(method, MapHttp4xxCodesToExceptions.class);
|
||||||
|
|
||||||
|
checkFilters(httpRequest);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void checkFilters(HttpRequest request) {
|
protected void checkFilters(HttpRequest request) {
|
||||||
assertEquals(request.getFilters().size(), 1);
|
assertEquals(request.getFilters().size(), 1);
|
||||||
|
|
Loading…
Reference in New Issue