http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/filters/SignedHeaderAuth.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/filters/SignedHeaderAuth.java b/core/src/main/java/org/jclouds/chef/filters/SignedHeaderAuth.java deleted file mode 100644 index 50d26a1..0000000 --- a/core/src/main/java/org/jclouds/chef/filters/SignedHeaderAuth.java +++ /dev/null @@ -1,199 +0,0 @@ -/* - * 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.filters; - -import static com.google.common.base.Charsets.UTF_8; -import static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.hash.Hashing.sha1; -import static com.google.common.io.BaseEncoding.base64; - -import java.io.IOException; -import java.security.PrivateKey; -import java.util.NoSuchElementException; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Provider; -import javax.inject.Singleton; - -import org.jclouds.Constants; -import org.jclouds.crypto.Crypto; -import org.jclouds.date.TimeStamp; -import org.jclouds.domain.Credentials; -import org.jclouds.http.HttpException; -import org.jclouds.http.HttpRequest; -import org.jclouds.http.HttpRequestFilter; -import org.jclouds.http.HttpUtils; -import org.jclouds.http.internal.SignatureWire; -import org.jclouds.io.ByteStreams2; -import org.jclouds.io.Payload; -import org.jclouds.io.Payloads; -import org.jclouds.io.payloads.MultipartForm; -import org.jclouds.io.payloads.Part; -import org.jclouds.io.payloads.RSAEncryptingPayload; -import org.jclouds.logging.Logger; -import org.jclouds.util.Strings2; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Predicate; -import com.google.common.base.Splitter; -import com.google.common.base.Supplier; -import com.google.common.base.Throwables; -import com.google.common.collect.ArrayListMultimap; -import com.google.common.collect.Iterables; -import com.google.common.collect.Multimap; -import com.google.common.io.ByteSource; - -/** - * Ported from mixlib-authentication in order to sign Chef requests. - * - * @see <a href= "http://github.com/opscode/mixlib-authentication" /> - */ -@Singleton -public class SignedHeaderAuth implements HttpRequestFilter { - public static final String SIGNING_DESCRIPTION = "version=1.0"; - - private final SignatureWire signatureWire; - private final Supplier<Credentials> creds; - private final Supplier<PrivateKey> supplyKey; - private final Provider<String> timeStampProvider; - private final String emptyStringHash; - private final HttpUtils utils; - private final Crypto crypto; - - @Resource - @Named(Constants.LOGGER_SIGNATURE) - Logger signatureLog = Logger.NULL; - - @Inject - public SignedHeaderAuth(SignatureWire signatureWire, @org.jclouds.location.Provider Supplier<Credentials> creds, - Supplier<PrivateKey> supplyKey, @TimeStamp Provider<String> timeStampProvider, HttpUtils utils, Crypto crypto) { - this.signatureWire = checkNotNull(signatureWire, "signatureWire"); - this.creds = checkNotNull(creds, "creds"); - this.supplyKey = checkNotNull(supplyKey, "supplyKey"); - this.timeStampProvider = checkNotNull(timeStampProvider, "timeStampProvider"); - this.emptyStringHash = hashBody(Payloads.newStringPayload("")); - this.utils = checkNotNull(utils, "utils"); - this.crypto = checkNotNull(crypto, "crypto"); - } - - public HttpRequest filter(HttpRequest input) throws HttpException { - HttpRequest request = input.toBuilder().endpoint(input.getEndpoint().toString().replace("%3F", "?")).build(); - String contentHash = hashBody(request.getPayload()); - Multimap<String, String> headers = ArrayListMultimap.create(); - headers.put("X-Ops-Content-Hash", contentHash); - String timestamp = timeStampProvider.get(); - String toSign = createStringToSign(request.getMethod(), hashPath(request.getEndpoint().getPath()), contentHash, - timestamp); - headers.put("X-Ops-Userid", creds.get().identity); - headers.put("X-Ops-Sign", SIGNING_DESCRIPTION); - request = calculateAndReplaceAuthorizationHeaders(request, toSign); - headers.put("X-Ops-Timestamp", timestamp); - utils.logRequest(signatureLog, request, "<<"); - - return request.toBuilder().replaceHeaders(headers).build(); - } - - @VisibleForTesting - HttpRequest calculateAndReplaceAuthorizationHeaders(HttpRequest request, String toSign) throws HttpException { - String signature = sign(toSign); - if (signatureWire.enabled()) - signatureWire.input(Strings2.toInputStream(signature)); - String[] signatureLines = Iterables.toArray(Splitter.fixedLength(60).split(signature), String.class); - - Multimap<String, String> headers = ArrayListMultimap.create(); - for (int i = 0; i < signatureLines.length; i++) { - headers.put("X-Ops-Authorization-" + (i + 1), signatureLines[i]); - } - return request.toBuilder().replaceHeaders(headers).build(); - } - - public String createStringToSign(String request, String hashedPath, String contentHash, String timestamp) { - - return new StringBuilder().append("Method:").append(request).append("\n").append("Hashed Path:") - .append(hashedPath).append("\n").append("X-Ops-Content-Hash:").append(contentHash).append("\n") - .append("X-Ops-Timestamp:").append(timestamp).append("\n").append("X-Ops-UserId:") - .append(creds.get().identity).toString(); - - } - - @VisibleForTesting - String hashPath(String path) { - try { - return base64().encode(ByteSource.wrap(canonicalPath(path).getBytes(UTF_8)).hash(sha1()).asBytes()); - } catch (Exception e) { - Throwables.propagateIfPossible(e); - throw new HttpException("error creating sigature for path: " + path, e); - } - } - - /** - * Build the canonicalized path, which collapses multiple slashes (/) and - * removes a trailing slash unless the path is only "/" - */ - @VisibleForTesting - String canonicalPath(String path) { - path = path.replaceAll("\\/+", "/"); - return path.endsWith("/") && path.length() > 1 ? path.substring(0, path.length() - 1) : path; - } - - @VisibleForTesting - String hashBody(Payload payload) { - if (payload == null) - return emptyStringHash; - payload = useTheFilePartIfForm(payload); - checkArgument(payload != null, "payload was null"); - checkArgument(payload.isRepeatable(), "payload must be repeatable: " + payload); - try { - return base64().encode(ByteStreams2.hashAndClose(payload.getInput(), sha1()).asBytes()); - } catch (Exception e) { - Throwables.propagateIfPossible(e); - throw new HttpException("error creating sigature for payload: " + payload, e); - } - } - - private Payload useTheFilePartIfForm(Payload payload) { - if (payload instanceof MultipartForm) { - Iterable<? extends Part> parts = MultipartForm.class.cast(payload).getRawContent(); - try { - payload = Iterables.find(parts, new Predicate<Part>() { - - @Override - public boolean apply(Part input) { - return "file".equals(input.getName()); - } - - }); - } catch (NoSuchElementException e) { - - } - } - return payload; - } - - public String sign(String toSign) { - try { - byte[] encrypted = ByteStreams2.toByteArrayAndClose(new RSAEncryptingPayload(crypto, Payloads.newStringPayload(toSign), supplyKey.get()).openStream()); - return base64().encode(encrypted); - } catch (IOException e) { - throw new HttpException("error signing request", e); - } - } - -}
http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/BootstrapConfigForGroup.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/BootstrapConfigForGroup.java b/core/src/main/java/org/jclouds/chef/functions/BootstrapConfigForGroup.java deleted file mode 100644 index ec75e47..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/BootstrapConfigForGroup.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Preconditions.checkState; -import static org.jclouds.chef.config.ChefProperties.CHEF_BOOTSTRAP_DATABAG; - -import java.lang.reflect.Type; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.chef.ChefApi; -import org.jclouds.chef.domain.DatabagItem; -import org.jclouds.domain.JsonBall; - -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; - -/** - * - * Retrieves the bootstrap configuration for a specific group - */ -@Singleton -public class BootstrapConfigForGroup implements Function<String, DatabagItem> { - public static final Type BOOTSTRAP_CONFIG_TYPE = new TypeLiteral<Map<String, JsonBall>>() { - }.getType(); - private final ChefApi api; - private final String databag; - - @Inject - public BootstrapConfigForGroup(@Named(CHEF_BOOTSTRAP_DATABAG) String databag, ChefApi api) { - this.databag = checkNotNull(databag, "databag"); - this.api = checkNotNull(api, "api"); - } - - @Override - public DatabagItem apply(String from) { - DatabagItem bootstrapConfig = api.getDatabagItem(databag, from); - checkState(bootstrapConfig != null, "databag item %s/%s not found", databag, from); - return bootstrapConfig; - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ClientForGroup.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ClientForGroup.java b/core/src/main/java/org/jclouds/chef/functions/ClientForGroup.java deleted file mode 100644 index d1a9250..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ClientForGroup.java +++ /dev/null @@ -1,69 +0,0 @@ -/* - * 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 static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.collect.Sets.newHashSet; - -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.ChefApi; -import org.jclouds.chef.domain.Client; - -import com.google.common.base.Function; - -/** - * - * Generates a client relevant for a particular group - */ -@Singleton -public class ClientForGroup implements Function<String, Client> { - private final ChefApi chefApi; - - @Inject - public ClientForGroup(ChefApi chefApi) { - this.chefApi = checkNotNull(chefApi, "chefApi"); - } - - @Override - public Client apply(String from) { - String clientName = findNextClientName(chefApi.listClients(), from + "-client-%02d"); - Client client = chefApi.createClient(clientName); - // response from create only includes the key - return Client.builder() // - .clientname(clientName) // - .name(clientName) // - .isValidator(false) // - .privateKey(client.getPrivateKey()) // - .build(); - } - - private static String findNextClientName(Set<String> clients, String pattern) { - String clientName; - Set<String> names = newHashSet(clients); - int index = 0; - while (true) { - clientName = String.format(pattern, index++); - if (!names.contains(clientName)) - break; - } - return clientName; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/GroupToBootScript.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/GroupToBootScript.java b/core/src/main/java/org/jclouds/chef/functions/GroupToBootScript.java deleted file mode 100644 index 516d9f9..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/GroupToBootScript.java +++ /dev/null @@ -1,130 +0,0 @@ -/* - * 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 static com.google.common.base.Preconditions.checkNotNull; -import static com.google.common.base.Throwables.propagate; -import static org.jclouds.scriptbuilder.domain.Statements.appendFile; -import static org.jclouds.scriptbuilder.domain.Statements.exec; -import static org.jclouds.scriptbuilder.domain.Statements.newStatementList; - -import java.lang.reflect.Type; -import java.net.URI; -import java.security.PrivateKey; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.config.InstallChef; -import org.jclouds.chef.config.Validator; -import org.jclouds.crypto.Pems; -import org.jclouds.domain.JsonBall; -import org.jclouds.json.Json; -import org.jclouds.location.Provider; -import org.jclouds.scriptbuilder.ExitInsteadOfReturn; -import org.jclouds.scriptbuilder.domain.Statement; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; -import com.google.common.base.Joiner; -import com.google.common.base.Optional; -import com.google.common.base.Splitter; -import com.google.common.base.Supplier; -import com.google.common.cache.CacheLoader; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.inject.TypeLiteral; - -/** - * - * Generates a bootstrap script relevant for a particular group - */ -@Singleton -public class GroupToBootScript implements Function<String, Statement> { - private static final Pattern newLinePattern = Pattern.compile("(\\r\\n)|(\\n)"); - - @VisibleForTesting - static final Type RUN_LIST_TYPE = new TypeLiteral<Map<String, List<String>>>() { - }.getType(); - private final Supplier<URI> endpoint; - private final Json json; - private final CacheLoader<String, ? extends JsonBall> bootstrapConfigForGroup; - private final Statement installChef; - private final Optional<String> validatorName; - private final Optional<PrivateKey> validatorCredential; - - @Inject - public GroupToBootScript(@Provider Supplier<URI> endpoint, Json json, - CacheLoader<String, ? extends JsonBall> bootstrapConfigForGroup, - @InstallChef Statement installChef, @Validator Optional<String> validatorName, - @Validator Optional<PrivateKey> validatorCredential) { - this.endpoint = checkNotNull(endpoint, "endpoint"); - this.json = checkNotNull(json, "json"); - this.bootstrapConfigForGroup = checkNotNull(bootstrapConfigForGroup, "bootstrapConfigForGroup"); - this.installChef = checkNotNull(installChef, "installChef"); - this.validatorName = checkNotNull(validatorName, "validatorName"); - this.validatorCredential = checkNotNull(validatorCredential, validatorCredential); - } - - @Override - public Statement apply(String group) { - checkNotNull(group, "group"); - String validatorClientName = validatorName.get(); - PrivateKey validatorKey = validatorCredential.get(); - - JsonBall bootstrapConfig = null; - try { - bootstrapConfig = bootstrapConfigForGroup.load(group); - } catch (Exception e) { - throw propagate(e); - } - - Map<String, JsonBall> config = json.fromJson(bootstrapConfig.toString(), - BootstrapConfigForGroup.BOOTSTRAP_CONFIG_TYPE); - Optional<JsonBall> environment = Optional.fromNullable(config.get("environment")); - - String chefConfigDir = "{root}etc{fs}chef"; - Statement createChefConfigDir = exec("{md} " + chefConfigDir); - Statement createClientRb = appendFile(chefConfigDir + "{fs}client.rb", ImmutableList.of("require 'rubygems'", - "require 'ohai'", "o = Ohai::System.new", "o.all_plugins", - String.format("node_name \"%s-\" + o[:ipaddress]", group), "log_level :info", "log_location STDOUT", - String.format("validation_client_name \"%s\"", validatorClientName), - String.format("chef_server_url \"%s\"", endpoint.get()))); - - Statement createValidationPem = appendFile(chefConfigDir + "{fs}validation.pem", - Splitter.on(newLinePattern).split(Pems.pem(validatorKey))); - - String chefBootFile = chefConfigDir + "{fs}first-boot.json"; - Statement createFirstBoot = appendFile(chefBootFile, Collections.singleton(json.toJson(bootstrapConfig))); - - ImmutableMap.Builder<String, String> options = ImmutableMap.builder(); - options.put("-j", chefBootFile); - if (environment.isPresent()) { - options.put("-E", environment.get().toString()); - } - String strOptions = Joiner.on(' ').withKeyValueSeparator(" ").join(options.build()); - Statement runChef = exec("chef-client " + strOptions); - - return newStatementList(new ExitInsteadOfReturn(installChef), createChefConfigDir, createClientRb, createValidationPem, - createFirstBoot, runChef); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionCheckingChefVersion.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionCheckingChefVersion.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionCheckingChefVersion.java deleted file mode 100644 index ffb4201..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionCheckingChefVersion.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.config.CookbookParser; -import org.jclouds.http.HttpResponse; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; - -/** - * Parses a cookbook definition from a Json response, taking care of using the - * appropriate parser. - */ -@Singleton -public class ParseCookbookDefinitionCheckingChefVersion implements Function<HttpResponse, Set<String>> { - - @VisibleForTesting - final Function<HttpResponse, Set<String>> parser; - - @Inject - ParseCookbookDefinitionCheckingChefVersion(@CookbookParser Function<HttpResponse, Set<String>> parser) { - this.parser = parser; - } - - @Override - public Set<String> apply(HttpResponse response) { - return parser.apply(response); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJson.java deleted file mode 100644 index 3e172e4..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJson.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.domain.CookbookDefinition; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import com.google.common.base.Function; - -/** - * Parses a cookbook definition from a Json response, assuming a Chef Server >= - * 0.10.8. - */ -@Singleton -public class ParseCookbookDefinitionFromJson implements Function<HttpResponse, Set<String>> { - - /** Parser for responses from chef server >= 0.10.8 */ - private final ParseJson<Map<String, CookbookDefinition>> parser; - - @Inject - ParseCookbookDefinitionFromJson(ParseJson<Map<String, CookbookDefinition>> parser) { - this.parser = parser; - } - - @Override - public Set<String> apply(HttpResponse response) { - return parser.apply(response).keySet(); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJsonv10.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJsonv10.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJsonv10.java deleted file mode 100644 index 692d969..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionFromJsonv10.java +++ /dev/null @@ -1,52 +0,0 @@ -/* - * 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 com.google.common.base.Function; -import org.jclouds.chef.domain.CookbookDefinition; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.Map; - -/** - * Parses the cookbook versions in a Chef Server >= 0.10.8. - */ -@Singleton -public class ParseCookbookDefinitionFromJsonv10 implements Function<HttpResponse, CookbookDefinition> { - - /** Parser for responses from chef server >= 0.10.8 */ - private final ParseJson<Map<String, CookbookDefinition>> parser; - - @Inject - ParseCookbookDefinitionFromJsonv10(ParseJson<Map<String, CookbookDefinition>> parser) { - this.parser = parser; - } - - @Override - public CookbookDefinition apply(HttpResponse response) { - Map<String, CookbookDefinition> result = parser.apply(response); - String cookbookName = result.keySet().iterator().next(); - CookbookDefinition def = result.values().iterator().next(); - return CookbookDefinition.builder() // - .from(def) // - .name(cookbookName) // - .build(); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionListFromJsonv10.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionListFromJsonv10.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionListFromJsonv10.java deleted file mode 100644 index 5da0797..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookDefinitionListFromJsonv10.java +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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 com.google.common.base.Function; -import org.jclouds.chef.domain.CookbookDefinition; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import javax.inject.Inject; -import javax.inject.Singleton; -import java.util.Map; -import java.util.Set; - -import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Sets.newLinkedHashSet; - -/** - * Parses the cookbook versions in a Chef Server >= 0.10.8. - */ -@Singleton -public class ParseCookbookDefinitionListFromJsonv10 implements Function<HttpResponse, Set<CookbookDefinition>> { - - /** - * Parser for responses from chef server >= 0.10.8 - */ - private final ParseJson<Map<String, CookbookDefinition>> parser; - - @Inject - ParseCookbookDefinitionListFromJsonv10(ParseJson<Map<String, CookbookDefinition>> parser) { - this.parser = parser; - } - - @Override - public Set<CookbookDefinition> apply(HttpResponse response) { - Set<Map.Entry<String, CookbookDefinition>> result = parser.apply(response).entrySet(); - return newLinkedHashSet(transform(result, new Function<Map.Entry<String, CookbookDefinition>, CookbookDefinition>() { - @Override - public CookbookDefinition apply(Map.Entry<String, CookbookDefinition> input) { - String cookbookName = input.getKey(); - CookbookDefinition def = input.getValue(); - return CookbookDefinition.builder() // - .from(def) // - .name(cookbookName) // - .build(); - } - })); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsCheckingChefVersion.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsCheckingChefVersion.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsCheckingChefVersion.java deleted file mode 100644 index f82a900..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsCheckingChefVersion.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.config.CookbookVersionsParser; -import org.jclouds.http.HttpResponse; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Function; - -/** - * Parses a cookbook versions from a Json response, taking care of using the - * appropriate parser. - */ -@Singleton -public class ParseCookbookVersionsCheckingChefVersion implements Function<HttpResponse, Set<String>> { - - @VisibleForTesting - final Function<HttpResponse, Set<String>> parser; - - @Inject - ParseCookbookVersionsCheckingChefVersion(@CookbookVersionsParser Function<HttpResponse, Set<String>> parser) { - this.parser = parser; - } - - @Override - public Set<String> apply(HttpResponse response) { - return parser.apply(response); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV09FromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV09FromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV09FromJson.java deleted file mode 100644 index 4421b3e..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV09FromJson.java +++ /dev/null @@ -1,49 +0,0 @@ -/* - * 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.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import com.google.common.base.Function; -import static com.google.common.collect.Iterables.getFirst; - -/** - * Parses the cookbook versions in a Chef Server <= 0.9.8. - */ -@Singleton -public class ParseCookbookVersionsV09FromJson implements Function<HttpResponse, Set<String>> { - - private final ParseJson<Map<String, Set<String>>> json; - - @Inject - ParseCookbookVersionsV09FromJson(ParseJson<Map<String, Set<String>>> json) { - this.json = json; - } - - @Override - public Set<String> apply(HttpResponse response) { - return getFirst(json.apply(response).values(), null); - - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV10FromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV10FromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV10FromJson.java deleted file mode 100644 index 1a25ac0..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseCookbookVersionsV10FromJson.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.domain.CookbookDefinition; -import org.jclouds.chef.domain.CookbookDefinition.Version; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import com.google.common.base.Function; -import static com.google.common.collect.Iterables.getFirst; -import static com.google.common.collect.Iterables.transform; -import static com.google.common.collect.Sets.newLinkedHashSet; - -/** - * Parses the cookbook versions in a Chef Server >= 0.10.8. - */ -@Singleton -public class ParseCookbookVersionsV10FromJson implements Function<HttpResponse, Set<String>> { - - /** Parser for responses from chef server >= 0.10.8 */ - private final ParseJson<Map<String, CookbookDefinition>> parser; - - @Inject - ParseCookbookVersionsV10FromJson(ParseJson<Map<String, CookbookDefinition>> parser) { - this.parser = parser; - } - - @Override - public Set<String> apply(HttpResponse response) { - CookbookDefinition def = getFirst(parser.apply(response).values(), null); - return newLinkedHashSet(transform(def.getVersions(), new Function<Version, String>() { - @Override - public String apply(Version input) { - return input.getVersion(); - } - })); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseErrorFromJsonOrReturnBody.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseErrorFromJsonOrReturnBody.java b/core/src/main/java/org/jclouds/chef/functions/ParseErrorFromJsonOrReturnBody.java deleted file mode 100644 index 6440409..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseErrorFromJsonOrReturnBody.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.regex.Matcher; -import java.util.regex.Pattern; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ReturnStringIf2xx; - -import com.google.common.base.Function; - -@Singleton -public class ParseErrorFromJsonOrReturnBody implements Function<HttpResponse, String> { - Pattern pattern = Pattern.compile(".*\\[\"([^\"]+)\"\\].*"); - private final ReturnStringIf2xx returnStringIf200; - - @Inject - ParseErrorFromJsonOrReturnBody(ReturnStringIf2xx returnStringIf200) { - this.returnStringIf200 = returnStringIf200; - } - - @Override - public String apply(HttpResponse response) { - String content = returnStringIf200.apply(response); - if (content == null) - return null; - return parse(content); - } - - public String parse(String in) { - Matcher matcher = pattern.matcher(in); - if (matcher.find()) { - return matcher.group(1); - } - return in; - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseKeySetFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseKeySetFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseKeySetFromJson.java deleted file mode 100644 index 963c19b..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseKeySetFromJson.java +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.Map; -import java.util.Set; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; - -import com.google.common.base.Function; - -@Singleton -public class ParseKeySetFromJson implements Function<HttpResponse, Set<String>> { - - private final ParseJson<Map<String, String>> json; - - @Inject - ParseKeySetFromJson(ParseJson<Map<String, String>> json) { - this.json = json; - } - - @Override - public Set<String> apply(HttpResponse response) { - return json.apply(response).keySet(); - - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchClientsFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchClientsFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchClientsFromJson.java deleted file mode 100644 index 18ecbfa..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchClientsFromJson.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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; - -@Singleton -public class ParseSearchClientsFromJson extends ParseSearchResultFromJson<Client> { - - // TODO add generic json parser detector - - @Inject - ParseSearchClientsFromJson(ParseJson<Response<Client>> json) { - super(json); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchDatabagFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchDatabagFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchDatabagFromJson.java deleted file mode 100644 index c2c58ef..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchDatabagFromJson.java +++ /dev/null @@ -1,77 +0,0 @@ -/* - * 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.DatabagItem; -import org.jclouds.chef.domain.SearchResult; -import org.jclouds.domain.JsonBall; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.functions.ParseJson; -import org.jclouds.json.Json; - -import com.google.common.base.Function; -import com.google.gson.annotations.SerializedName; -import static com.google.common.collect.Iterables.transform; - -/** - * Parses the search result into a {@link DatabagItem} object. - * <p> - * When searching databags, the items are contained inside the - * <code>raw_data</code> list. - */ -@Singleton -public class ParseSearchDatabagFromJson implements Function<HttpResponse, SearchResult<DatabagItem>> { - - private final ParseJson<Response> responseParser; - - private final Json json; - - static class Row { - @SerializedName("raw_data") - JsonBall rawData; - } - - static class Response { - long start; - List<Row> rows; - } - - @Inject - ParseSearchDatabagFromJson(ParseJson<Response> responseParser, Json json) { - this.responseParser = responseParser; - this.json = json; - } - - @Override - public SearchResult<DatabagItem> apply(HttpResponse response) { - Response returnVal = responseParser.apply(response); - Iterable<DatabagItem> items = transform(returnVal.rows, new Function<Row, DatabagItem>() { - @Override - public DatabagItem apply(Row input) { - return json.fromJson(input.rawData.toString(), DatabagItem.class); - } - }); - - return new SearchResult<DatabagItem>(returnVal.start, items); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchEnvironmentsFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchEnvironmentsFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchEnvironmentsFromJson.java deleted file mode 100644 index 852e0f3..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchEnvironmentsFromJson.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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 org.jclouds.chef.domain.Environment; -import org.jclouds.http.functions.ParseJson; - -import javax.inject.Inject; -import javax.inject.Singleton; - -@Singleton -public class ParseSearchEnvironmentsFromJson extends ParseSearchResultFromJson<Environment> { - - // TODO add generic json parser detector - - @Inject - ParseSearchEnvironmentsFromJson(ParseJson<Response<Environment>> json) { - super(json); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchNodesFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchNodesFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchNodesFromJson.java deleted file mode 100644 index 6d34575..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchNodesFromJson.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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; - -@Singleton -public class ParseSearchNodesFromJson extends ParseSearchResultFromJson<Node> { - - // TODO add generic json parser detector - - @Inject - ParseSearchNodesFromJson(ParseJson<Response<Node>> json) { - super(json); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchResultFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchResultFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchResultFromJson.java deleted file mode 100644 index 6c9bd84..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchResultFromJson.java +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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; - -@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 response) { - Response<T> returnVal = json.apply(response); - return new SearchResult<T>(returnVal.start, returnVal.rows); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/ParseSearchRolesFromJson.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/ParseSearchRolesFromJson.java b/core/src/main/java/org/jclouds/chef/functions/ParseSearchRolesFromJson.java deleted file mode 100644 index 42ba797..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/ParseSearchRolesFromJson.java +++ /dev/null @@ -1,35 +0,0 @@ -/* - * 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; - -@Singleton -public class ParseSearchRolesFromJson extends ParseSearchResultFromJson<Role> { - - // TODO add generic json parser detector - - @Inject - ParseSearchRolesFromJson(ParseJson<Response<Role>> json) { - super(json); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/RunListForGroup.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/RunListForGroup.java b/core/src/main/java/org/jclouds/chef/functions/RunListForGroup.java deleted file mode 100644 index b14ae71..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/RunListForGroup.java +++ /dev/null @@ -1,61 +0,0 @@ -/* - * 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 static com.google.common.base.Preconditions.checkNotNull; - -import java.lang.reflect.Type; -import java.util.List; -import java.util.Map; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.domain.DatabagItem; -import org.jclouds.domain.JsonBall; -import org.jclouds.json.Json; - -import com.google.common.base.Function; -import com.google.inject.TypeLiteral; - -/** - * Retrieves the run-list for a specific group - */ -@Singleton -public class RunListForGroup implements Function<String, List<String>> { - public static final Type RUN_LIST_TYPE = new TypeLiteral<List<String>>() { - }.getType(); - private final BootstrapConfigForGroup bootstrapConfigForGroup; - - private final Json json; - - @Inject - public RunListForGroup(BootstrapConfigForGroup bootstrapConfigForGroup, Json json) { - this.bootstrapConfigForGroup = checkNotNull(bootstrapConfigForGroup, "bootstrapConfigForGroup"); - this.json = checkNotNull(json, "json"); - } - - @Override - public List<String> apply(String from) { - DatabagItem bootstrapConfig = bootstrapConfigForGroup.apply(from); - Map<String, JsonBall> config = json.fromJson(bootstrapConfig.toString(), - BootstrapConfigForGroup.BOOTSTRAP_CONFIG_TYPE); - JsonBall runlist = config.get("run_list"); - return json.fromJson(runlist.toString(), RUN_LIST_TYPE); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/functions/UriForResource.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/functions/UriForResource.java b/core/src/main/java/org/jclouds/chef/functions/UriForResource.java deleted file mode 100644 index d5d0810..0000000 --- a/core/src/main/java/org/jclouds/chef/functions/UriForResource.java +++ /dev/null @@ -1,42 +0,0 @@ -/* - * 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 static com.google.common.base.Preconditions.checkArgument; -import static com.google.common.base.Preconditions.checkNotNull; - -import java.net.URI; - -import javax.inject.Singleton; - -import org.jclouds.chef.domain.Resource; - -import com.google.common.base.Function; - -/** - * Extracts the uri field of the given {@link Resource}. - */ -@Singleton -public class UriForResource implements Function<Object, URI> { - - @Override - public URI apply(Object input) { - checkArgument(checkNotNull(input, "input") instanceof Resource, - "This function can only be applied to Resource objects"); - return ((Resource) input).getUrl(); - } -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/handlers/ChefApiErrorRetryHandler.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/handlers/ChefApiErrorRetryHandler.java b/core/src/main/java/org/jclouds/chef/handlers/ChefApiErrorRetryHandler.java deleted file mode 100644 index 3b4da4a..0000000 --- a/core/src/main/java/org/jclouds/chef/handlers/ChefApiErrorRetryHandler.java +++ /dev/null @@ -1,67 +0,0 @@ -/* - * 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.handlers; - -import static org.jclouds.http.HttpUtils.closeClientButKeepContentStream; - -import javax.annotation.Resource; -import javax.inject.Named; - -import org.jclouds.Constants; -import org.jclouds.http.HttpCommand; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.HttpRetryHandler; -import org.jclouds.http.handlers.BackoffLimitedRetryHandler; -import org.jclouds.logging.Logger; - -import com.google.inject.Inject; - -/** - * Allow for eventual consistency on sandbox requests. - */ -public class ChefApiErrorRetryHandler implements HttpRetryHandler { - - @Inject(optional = true) - @Named(Constants.PROPERTY_MAX_RETRIES) - private int retryCountLimit = 5; - - @Resource - protected Logger logger = Logger.NULL; - - private final BackoffLimitedRetryHandler backoffLimitedRetryHandler; - - @Inject - ChefApiErrorRetryHandler(BackoffLimitedRetryHandler backoffLimitedRetryHandler) { - this.backoffLimitedRetryHandler = backoffLimitedRetryHandler; - } - - public boolean shouldRetryRequest(HttpCommand command, HttpResponse response) { - if (command.getFailureCount() > retryCountLimit) - return false; - if (response.getStatusCode() == 400 && command.getCurrentRequest().getMethod().equals("PUT") - && command.getCurrentRequest().getEndpoint().getPath().indexOf("sandboxes") != -1) { - if (response.getPayload() != null) { - String error = new String(closeClientButKeepContentStream(response)); - if (error != null && error.indexOf("was not uploaded") != -1) { - return backoffLimitedRetryHandler.shouldRetryRequest(command, response); - } - } - } - return false; - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/handlers/ChefErrorHandler.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/handlers/ChefErrorHandler.java b/core/src/main/java/org/jclouds/chef/handlers/ChefErrorHandler.java deleted file mode 100644 index 85f9129..0000000 --- a/core/src/main/java/org/jclouds/chef/handlers/ChefErrorHandler.java +++ /dev/null @@ -1,71 +0,0 @@ -/* - * 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.handlers; - -import static org.jclouds.util.Closeables2.closeQuietly; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.chef.functions.ParseErrorFromJsonOrReturnBody; -import org.jclouds.http.HttpCommand; -import org.jclouds.http.HttpErrorHandler; -import org.jclouds.http.HttpResponse; -import org.jclouds.http.HttpResponseException; -import org.jclouds.logging.Logger; -import org.jclouds.rest.AuthorizationException; -import org.jclouds.rest.ResourceNotFoundException; - -/** - * This will parse and set an appropriate exception on the command object. - */ -@Singleton -public class ChefErrorHandler implements HttpErrorHandler { - @Resource - protected Logger logger = Logger.NULL; - private final ParseErrorFromJsonOrReturnBody errorParser; - - @Inject - ChefErrorHandler(ParseErrorFromJsonOrReturnBody errorParser) { - this.errorParser = errorParser; - } - - public void handleError(HttpCommand command, HttpResponse response) { - String message = errorParser.apply(response); - Exception exception = new HttpResponseException(command, response, message); - try { - message = message != null ? message : String.format("%s -> %s", command.getCurrentRequest().getRequestLine(), - response.getStatusLine()); - switch (response.getStatusCode()) { - case 401: - case 403: - exception = new AuthorizationException(message, exception); - break; - case 404: - if (!command.getCurrentRequest().getMethod().equals("DELETE")) { - exception = new ResourceNotFoundException(message, exception); - } - break; - } - } finally { - closeQuietly(response.getPayload()); - command.setException(exception); - } - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java b/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java deleted file mode 100644 index 1b6fcfe..0000000 --- a/core/src/main/java/org/jclouds/chef/internal/BaseChefService.java +++ /dev/null @@ -1,299 +0,0 @@ -/* - * 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.internal; - -import static com.google.common.base.Preconditions.checkNotNull; -import static org.jclouds.chef.config.ChefProperties.CHEF_BOOTSTRAP_DATABAG; - -import java.io.IOException; -import java.io.InputStream; -import java.security.PrivateKey; -import java.util.List; -import java.util.Map; -import java.util.concurrent.ExecutorService; - -import javax.annotation.Resource; -import javax.inject.Inject; -import javax.inject.Named; -import javax.inject.Singleton; - -import org.jclouds.chef.ChefApi; -import org.jclouds.chef.ChefContext; -import org.jclouds.chef.ChefService; -import org.jclouds.chef.config.ChefProperties; -import org.jclouds.chef.domain.BootstrapConfig; -import org.jclouds.chef.domain.Client; -import org.jclouds.chef.domain.CookbookVersion; -import org.jclouds.chef.domain.DatabagItem; -import org.jclouds.chef.domain.Environment; -import org.jclouds.chef.domain.Node; -import org.jclouds.chef.functions.BootstrapConfigForGroup; -import org.jclouds.chef.functions.GroupToBootScript; -import org.jclouds.chef.functions.RunListForGroup; -import org.jclouds.chef.strategy.CleanupStaleNodesAndClients; -import org.jclouds.chef.strategy.CreateNodeAndPopulateAutomaticAttributes; -import org.jclouds.chef.strategy.DeleteAllClientsInList; -import org.jclouds.chef.strategy.DeleteAllNodesInList; -import org.jclouds.chef.strategy.ListClients; -import org.jclouds.chef.strategy.ListCookbookVersions; -import org.jclouds.chef.strategy.ListCookbookVersionsInEnvironment; -import org.jclouds.chef.strategy.ListEnvironments; -import org.jclouds.chef.strategy.ListNodes; -import org.jclouds.chef.strategy.ListNodesInEnvironment; -import org.jclouds.chef.strategy.UpdateAutomaticAttributesOnNode; -import org.jclouds.crypto.Crypto; -import org.jclouds.domain.JsonBall; -import org.jclouds.io.ByteStreams2; -import org.jclouds.io.Payloads; -import org.jclouds.io.payloads.RSADecryptingPayload; -import org.jclouds.io.payloads.RSAEncryptingPayload; -import org.jclouds.json.Json; -import org.jclouds.logging.Logger; -import org.jclouds.scriptbuilder.domain.Statement; - -import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Supplier; -import com.google.common.collect.Maps; -import com.google.common.io.InputSupplier; - -@Singleton -public class BaseChefService implements ChefService { - - private final ChefContext chefContext; - private final ChefApi api; - private final CleanupStaleNodesAndClients cleanupStaleNodesAndClients; - private final CreateNodeAndPopulateAutomaticAttributes createNodeAndPopulateAutomaticAttributes; - private final DeleteAllNodesInList deleteAllNodesInList; - private final ListNodes listNodes; - private final DeleteAllClientsInList deleteAllClientsInList; - private final ListClients listClients; - private final UpdateAutomaticAttributesOnNode updateAutomaticAttributesOnNode; - private final Supplier<PrivateKey> privateKey; - private final GroupToBootScript groupToBootScript; - private final String databag; - private final BootstrapConfigForGroup bootstrapConfigForGroup; - private final RunListForGroup runListForGroup; - private final ListCookbookVersions listCookbookVersions; - private final ListCookbookVersionsInEnvironment listCookbookVersionsInEnvironment; - private final ListEnvironments listEnvironments; - private final ListNodesInEnvironment listNodesInEnvironment; - private final Json json; - private final Crypto crypto; - - @Resource - @Named(ChefProperties.CHEF_LOGGER) - protected Logger logger = Logger.NULL; - - @Inject - protected BaseChefService(ChefContext chefContext, ChefApi api, - CleanupStaleNodesAndClients cleanupStaleNodesAndClients, - CreateNodeAndPopulateAutomaticAttributes createNodeAndPopulateAutomaticAttributes, - DeleteAllNodesInList deleteAllNodesInList, ListNodes listNodes, DeleteAllClientsInList deleteAllClientsInList, - ListClients listClients, ListCookbookVersions listCookbookVersions, - UpdateAutomaticAttributesOnNode updateAutomaticAttributesOnNode, Supplier<PrivateKey> privateKey, - @Named(CHEF_BOOTSTRAP_DATABAG) String databag, GroupToBootScript groupToBootScript, - BootstrapConfigForGroup bootstrapConfigForGroup, RunListForGroup runListForGroup, - ListEnvironments listEnvironments, ListNodesInEnvironment listNodesInEnvironment, - ListCookbookVersionsInEnvironment listCookbookVersionsInEnvironment, Json json, Crypto crypto) { - this.chefContext = checkNotNull(chefContext, "chefContext"); - this.api = checkNotNull(api, "api"); - this.cleanupStaleNodesAndClients = checkNotNull(cleanupStaleNodesAndClients, "cleanupStaleNodesAndClients"); - this.createNodeAndPopulateAutomaticAttributes = checkNotNull(createNodeAndPopulateAutomaticAttributes, - "createNodeAndPopulateAutomaticAttributes"); - this.deleteAllNodesInList = checkNotNull(deleteAllNodesInList, "deleteAllNodesInList"); - this.listNodes = checkNotNull(listNodes, "listNodes"); - this.deleteAllClientsInList = checkNotNull(deleteAllClientsInList, "deleteAllClientsInList"); - this.listClients = checkNotNull(listClients, "listClients"); - this.listCookbookVersions = checkNotNull(listCookbookVersions, "listCookbookVersions"); - this.updateAutomaticAttributesOnNode = checkNotNull(updateAutomaticAttributesOnNode, - "updateAutomaticAttributesOnNode"); - this.privateKey = checkNotNull(privateKey, "privateKey"); - this.groupToBootScript = checkNotNull(groupToBootScript, "groupToBootScript"); - this.databag = checkNotNull(databag, "databag"); - this.bootstrapConfigForGroup = checkNotNull(bootstrapConfigForGroup, "bootstrapConfigForGroup"); - this.runListForGroup = checkNotNull(runListForGroup, "runListForGroup"); - this.listEnvironments = checkNotNull(listEnvironments, "listEnvironments"); - this.listNodesInEnvironment = checkNotNull(listNodesInEnvironment, "listNodesInEnvironment"); - this.listCookbookVersionsInEnvironment = checkNotNull(listCookbookVersionsInEnvironment, "listCookbookVersionsInEnvironment"); - this.json = checkNotNull(json, "json"); - this.crypto = checkNotNull(crypto, "crypto"); - } - - @Override - public ChefContext getContext() { - return chefContext; - } - - @Override - public byte[] encrypt(InputSupplier<? extends InputStream> supplier) throws IOException { - return ByteStreams2.toByteArrayAndClose(new RSAEncryptingPayload(crypto, Payloads.newPayload(supplier.getInput()), privateKey - .get()).openStream()); - } - - @Override - public byte[] decrypt(InputSupplier<? extends InputStream> supplier) throws IOException { - return ByteStreams2.toByteArrayAndClose(new RSADecryptingPayload(crypto, Payloads.newPayload(supplier.getInput()), privateKey - .get()).openStream()); - } - - @VisibleForTesting - String buildBootstrapConfiguration(BootstrapConfig bootstrapConfig) { - checkNotNull(bootstrapConfig, "bootstrapConfig must not be null"); - - Map<String, Object> configMap = Maps.newHashMap(); - configMap.put("run_list", bootstrapConfig.getRunList()); - - if (bootstrapConfig.getEnvironment().isPresent()) { - configMap.put("environment", bootstrapConfig.getEnvironment().get()); - } - - if (bootstrapConfig.getAttribtues().isPresent()) { - Map<String, Object> attributes = json.fromJson(bootstrapConfig.getAttribtues().get().toString(), - BootstrapConfigForGroup.BOOTSTRAP_CONFIG_TYPE); - configMap.putAll(attributes); - } - - return json.toJson(configMap); - } - - @Override - public Statement createBootstrapScriptForGroup(String group) { - return groupToBootScript.apply(group); - } - - @Override - public void updateBootstrapConfigForGroup(String group, BootstrapConfig bootstrapConfig) { - try { - api.createDatabag(databag); - } catch (IllegalStateException e) { - - } - - String jsonConfig = buildBootstrapConfiguration(bootstrapConfig); - DatabagItem runlist = new DatabagItem(group, jsonConfig); - - if (api.getDatabagItem(databag, group) == null) { - api.createDatabagItem(databag, runlist); - } else { - api.updateDatabagItem(databag, runlist); - } - } - - @Override - public List<String> getRunListForGroup(String group) { - return runListForGroup.apply(group); - } - - @Override - public JsonBall getBootstrapConfigForGroup(String group) { - return bootstrapConfigForGroup.apply(group); - } - - @Override - public void cleanupStaleNodesAndClients(String prefix, int secondsStale) { - cleanupStaleNodesAndClients.execute(prefix, secondsStale); - } - - @Override - public Node createNodeAndPopulateAutomaticAttributes(String nodeName, Iterable<String> runList) { - return createNodeAndPopulateAutomaticAttributes.execute(nodeName, runList); - } - - @Override - public void updateAutomaticAttributesOnNode(String nodeName) { - updateAutomaticAttributesOnNode.execute(nodeName); - } - - @Override - public void deleteAllNodesInList(Iterable<String> names) { - deleteAllNodesInList.execute(names); - } - - @Override - public void deleteAllClientsInList(Iterable<String> names) { - deleteAllClientsInList.execute(names); - } - - @Override - public Iterable<? extends Node> listNodes() { - return listNodes.execute(); - } - - @Override - public Iterable<? extends Node> listNodes(ExecutorService executorService) { - return listNodes.execute(executorService); - } - - @Override - public Iterable<? extends Client> listClients() { - return listClients.execute(); - } - - @Override - public Iterable<? extends Client> listClients(ExecutorService executorService) { - return listClients.execute(executorService); - } - - @Override - public Iterable<? extends CookbookVersion> listCookbookVersions() { - return listCookbookVersions.execute(); - } - - @Override public Iterable<? extends CookbookVersion> listCookbookVersions( - ExecutorService executorService) { - return listCookbookVersions.execute(executorService); - } - - @Override - public Iterable<? extends CookbookVersion> listCookbookVersionsInEnvironment(String environmentName) { - return listCookbookVersionsInEnvironment.execute(environmentName); - } - - @Override - public Iterable<? extends CookbookVersion> listCookbookVersionsInEnvironment(String environmentName, - ExecutorService executorService) { - return listCookbookVersionsInEnvironment.execute(executorService, environmentName); - } - - @Override - public Iterable<? extends CookbookVersion> listCookbookVersionsInEnvironment(String environmentName, - String numVersions) { - return listCookbookVersionsInEnvironment.execute(environmentName, numVersions); - } - - @Override - public Iterable<? extends CookbookVersion> listCookbookVersionsInEnvironment(String environmentName, - String numVersions, ExecutorService executorService) { - return listCookbookVersionsInEnvironment.execute(executorService, environmentName, numVersions); - } - - @Override - public Iterable<? extends Environment> listEnvironments() { - return listEnvironments.execute(); - } - - @Override - public Iterable<? extends Node> listNodesInEnvironment(String environmentName) { - return listNodesInEnvironment.execute(environmentName); - } - - @Override - public Iterable<? extends Node> listNodesInEnvironment(String environmentName, ExecutorService executorService) { - return listNodesInEnvironment.execute(executorService, environmentName); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/internal/ChefContextImpl.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/internal/ChefContextImpl.java b/core/src/main/java/org/jclouds/chef/internal/ChefContextImpl.java deleted file mode 100644 index 8aef880..0000000 --- a/core/src/main/java/org/jclouds/chef/internal/ChefContextImpl.java +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.internal; - -import static com.google.common.base.Preconditions.checkNotNull; - -import java.io.IOException; - -import javax.inject.Inject; -import javax.inject.Singleton; - -import org.jclouds.Context; -import org.jclouds.chef.ChefContext; -import org.jclouds.chef.ChefService; -import org.jclouds.internal.BaseView; -import org.jclouds.location.Provider; - -import com.google.common.reflect.TypeToken; - -@Singleton -public class ChefContextImpl extends BaseView implements ChefContext { - private final ChefService chefService; - - @Inject - protected ChefContextImpl(@Provider Context backend, @Provider TypeToken<? extends Context> backendType, - ChefService chefService) { - super(backend, backendType); - this.chefService = checkNotNull(chefService, "chefService"); - } - - @Override - public ChefService getChefService() { - return chefService; - } - - @Override - public void close() throws IOException { - delegate().close(); - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/options/CreateClientOptions.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/options/CreateClientOptions.java b/core/src/main/java/org/jclouds/chef/options/CreateClientOptions.java deleted file mode 100644 index 776d7bb..0000000 --- a/core/src/main/java/org/jclouds/chef/options/CreateClientOptions.java +++ /dev/null @@ -1,64 +0,0 @@ -/* - * 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.options; - -/** - * Options for the create client method. - */ -public class CreateClientOptions implements Cloneable { - /** Administrator flag. This flag will be ignored in Opscode Hosted Chef. */ - private boolean admin; - - public CreateClientOptions() { - } - - CreateClientOptions(final boolean admin) { - super(); - this.admin = admin; - } - - public boolean isAdmin() { - return admin; - } - - public CreateClientOptions admin() { - this.admin = true; - return this; - } - - @Override - protected Object clone() throws CloneNotSupportedException { - return new CreateClientOptions(admin); - } - - @Override - public String toString() { - return "[admin=" + admin + "]"; - } - - public static class Builder { - /** - * @see CreateClientOptions#admin() - */ - public static CreateClientOptions admin() { - CreateClientOptions options = new CreateClientOptions(); - return options.admin(); - } - - } - -} http://git-wip-us.apache.org/repos/asf/jclouds-chef/blob/cffeede4/core/src/main/java/org/jclouds/chef/options/SearchOptions.java ---------------------------------------------------------------------- diff --git a/core/src/main/java/org/jclouds/chef/options/SearchOptions.java b/core/src/main/java/org/jclouds/chef/options/SearchOptions.java deleted file mode 100644 index cbc1d54..0000000 --- a/core/src/main/java/org/jclouds/chef/options/SearchOptions.java +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.options; - -import static com.google.common.base.Preconditions.checkNotNull; - -import org.jclouds.http.options.BaseHttpRequestOptions; - -/** - * Options for the search api. - */ -public class SearchOptions extends BaseHttpRequestOptions { - - /** - * A valid search string. - */ - public SearchOptions query(String query) { - this.queryParameters.put("q", checkNotNull(query, "query")); - return this; - } - - /** - * A sort string, such as 'name DESC'. - */ - public SearchOptions sort(String sort) { - this.queryParameters.put("sort", checkNotNull(sort, "sort")); - return this; - } - - /** - * The number of rows to return. - */ - public SearchOptions rows(int rows) { - this.queryParameters.put("rows", String.valueOf(rows)); - return this; - } - - /** - * The result number to start from. - */ - public SearchOptions start(int start) { - this.queryParameters.put("start", String.valueOf(start)); - return this; - } - - public static class Builder { - - /** - * @see SearchOptions#query(String) - */ - public static SearchOptions query(String query) { - SearchOptions options = new SearchOptions(); - return options.query(query); - } - - /** - * @see SearchOptions#sort(String) - */ - public static SearchOptions start(String start) { - SearchOptions options = new SearchOptions(); - return options.sort(start); - } - - /** - * @see SearchOptions#rows(int) - */ - public static SearchOptions rows(int rows) { - SearchOptions options = new SearchOptions(); - return options.rows(rows); - } - - /** - * @see SearchOptions#start(int) - */ - public static SearchOptions start(int start) { - SearchOptions options = new SearchOptions(); - return options.start(start); - } - } - -}
