changed to group naming conventions and updated runScript syntax

This commit is contained in:
Adrian Cole 2012-07-16 23:30:00 -04:00
parent 4c1f8f8414
commit 4113cadb24
10 changed files with 59 additions and 64 deletions

View File

@ -26,7 +26,7 @@ import org.jclouds.chef.domain.Client;
import org.jclouds.chef.domain.CookbookVersion;
import org.jclouds.chef.domain.Node;
import org.jclouds.chef.internal.BaseChefService;
import org.jclouds.io.Payload;
import org.jclouds.scriptbuilder.domain.Statement;
import com.google.common.base.Predicate;
import com.google.common.io.InputSupplier;
@ -61,39 +61,39 @@ public interface ChefService {
/**
* Creates all steps necessary to bootstrap and run the chef api.
*
* @param tag
* @param group
* corresponds to a configured
* {@link org.jclouds.chef.reference.ChefConstants#CHEF_BOOTSTRAP_DATABAG databag}
* where run_list and other information are stored
* @return boot script
* @see #updateRunListForTag
*/
Payload createClientAndBootstrapScriptForTag(String tag);
Statement createClientAndBootstrapScriptForGroup(String group);
/**
* assigns a run list to all nodes bootstrapped with a certain tag
* assigns a run list to all nodes bootstrapped with a certain group
*
* @param runList
* list of recipes or roles to assign. syntax is {@code recipe[name]} and {@code
* role[name]}
*
* @param tag
* @param group
* corresponds to a configured
* {@link org.jclouds.chef.reference.ChefConstants#CHEF_BOOTSTRAP_DATABAG databag}
* where run_list and other information are stored
* @see #makeChefApiBootstrapScriptForTag
*/
void updateRunListForTag(Iterable<String> runList, String tag);
void updateRunListForGroup(Iterable<String> runList, String group);
/**
* @param tag
* @param group
* corresponds to a configured
* {@link org.jclouds.chef.reference.ChefConstants#CHEF_BOOTSTRAP_DATABAG databag}
* where run_list and other information are stored
* @return run list for all nodes bootstrapped with a certain tag
* @return run list for all nodes bootstrapped with a certain group
* @see #updateRunListForTag
*/
List<String> getRunListForTag(String tag);
List<String> getRunListForGroup(String group);
void deleteAllNodesInList(Iterable<String> names);

View File

@ -26,8 +26,8 @@ import javax.inject.Singleton;
import org.jclouds.chef.ChefApi;
import org.jclouds.chef.ChefAsyncApi;
import org.jclouds.chef.domain.Client;
import org.jclouds.chef.functions.ClientForTag;
import org.jclouds.chef.functions.RunListForTag;
import org.jclouds.chef.functions.ClientForGroup;
import org.jclouds.chef.functions.RunListForGroup;
import org.jclouds.chef.statements.InstallChefGems;
import org.jclouds.rest.ConfiguresRestClient;
import org.jclouds.scriptbuilder.domain.Statement;
@ -51,14 +51,14 @@ public class ChefRestClientModule extends BaseChefRestClientModule<ChefApi, Chef
@Provides
@Singleton
Map<String, List<String>> runListForTag(RunListForTag runListForTag) {
return new MapMaker().makeComputingMap(runListForTag);
Map<String, List<String>> runListForGroup(RunListForGroup runListForGroup) {
return new MapMaker().makeComputingMap(runListForGroup);
}
@Provides
@Singleton
Map<String, Client> tagToClient(ClientForTag tagToClient) {
return new MapMaker().makeComputingMap(tagToClient);
Map<String, Client> tagToClient(ClientForGroup groupToClient) {
return new MapMaker().makeComputingMap(groupToClient);
}
@Override

View File

@ -33,16 +33,16 @@ import com.google.common.base.Function;
/**
*
* Generates a client relevant for a particular tag
* Generates a client relevant for a particular group
*
* @author Adrian Cole
*/
@Singleton
public class ClientForTag implements Function<String, Client> {
public class ClientForGroup implements Function<String, Client> {
private final ChefApi chefApi;
@Inject
public ClientForTag(ChefApi chefApi) {
public ClientForGroup(ChefApi chefApi) {
this.chefApi = checkNotNull(chefApi, "chefApi");
}

View File

@ -20,7 +20,6 @@ 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.io.Payloads.newStringPayload;
import static org.jclouds.scriptbuilder.domain.Statements.appendFile;
import static org.jclouds.scriptbuilder.domain.Statements.exec;
import static org.jclouds.scriptbuilder.domain.Statements.newStatementList;
@ -37,10 +36,8 @@ import javax.inject.Singleton;
import org.jclouds.chef.domain.Client;
import org.jclouds.crypto.Pems;
import org.jclouds.io.Payload;
import org.jclouds.json.Json;
import org.jclouds.location.Provider;
import org.jclouds.scriptbuilder.domain.OsFamily;
import org.jclouds.scriptbuilder.domain.Statement;
import com.google.common.annotations.VisibleForTesting;
@ -58,7 +55,7 @@ import com.google.inject.TypeLiteral;
* @author Adrian Cole
*/
@Singleton
public class GroupToBootScript implements Function<String, Payload> {
public class GroupToBootScript implements Function<String, Statement> {
@VisibleForTesting
static final Type RUN_LIST_TYPE = new TypeLiteral<Map<String, List<String>>>() {
}.getType();
@ -78,7 +75,7 @@ public class GroupToBootScript implements Function<String, Payload> {
this.installChefGems = checkNotNull(installChefGems, "installChefGems");
}
public Payload apply(String tag) {
public Statement apply(String tag) {
checkNotNull(tag, "tag");
Client client = tagToClient.get(tag);
@ -108,11 +105,8 @@ public class GroupToBootScript implements Function<String, Payload> {
Statement runChef = exec("chef-client -j " + chefBootFile);
Statement bootstrapAndRunChef = newStatementList(installChefGems, createChefConfigDir, createClientRb,
return newStatementList(installChefGems, createChefConfigDir, createClientRb,
createValidationPem, createFirstBoot, runChef);
String runScript = bootstrapAndRunChef.render(OsFamily.UNIX);
return newStringPayload(runScript);
}
}

View File

@ -39,13 +39,13 @@ import com.google.inject.TypeLiteral;
/**
*
* Retrieves the run-list for a specific tag
* Retrieves the run-list for a specific group
*
*
* @author Adrian Cole
*/
@Singleton
public class RunListForTag implements Function<String, List<String>> {
public class RunListForGroup implements Function<String, List<String>> {
public static final Type RUN_LIST_TYPE = new TypeLiteral<Map<String, List<String>>>() {
}.getType();
private final ChefApi api;
@ -53,7 +53,7 @@ public class RunListForTag implements Function<String, List<String>> {
private final String databag;
@Inject
public RunListForTag(@Named(CHEF_BOOTSTRAP_DATABAG) String databag, ChefApi api, Json json) {
public RunListForGroup(@Named(CHEF_BOOTSTRAP_DATABAG) String databag, ChefApi api, Json json) {
this.databag = checkNotNull(databag, "databag");
this.api = checkNotNull(api, "api");
this.json = checkNotNull(json, "json");

View File

@ -39,7 +39,7 @@ import org.jclouds.chef.domain.CookbookVersion;
import org.jclouds.chef.domain.DatabagItem;
import org.jclouds.chef.domain.Node;
import org.jclouds.chef.functions.GroupToBootScript;
import org.jclouds.chef.functions.RunListForTag;
import org.jclouds.chef.functions.RunListForGroup;
import org.jclouds.chef.reference.ChefConstants;
import org.jclouds.chef.strategy.CleanupStaleNodesAndClients;
import org.jclouds.chef.strategy.CreateNodeAndPopulateAutomaticAttributes;
@ -49,11 +49,11 @@ import org.jclouds.chef.strategy.ListClients;
import org.jclouds.chef.strategy.ListCookbookVersions;
import org.jclouds.chef.strategy.ListNodes;
import org.jclouds.chef.strategy.UpdateAutomaticAttributesOnNode;
import org.jclouds.io.Payload;
import org.jclouds.io.Payloads;
import org.jclouds.io.payloads.RSADecryptingPayload;
import org.jclouds.io.payloads.RSAEncryptingPayload;
import org.jclouds.logging.Logger;
import org.jclouds.scriptbuilder.domain.Statement;
import com.google.common.base.Predicate;
import com.google.common.collect.ImmutableMap;
@ -81,9 +81,9 @@ public class BaseChefService implements ChefService {
private final ListClients listClients;
private final UpdateAutomaticAttributesOnNode updateAutomaticAttributesOnNode;
private final Provider<PrivateKey> privateKey;
private final GroupToBootScript tagToBootScript;
private final GroupToBootScript groupToBootScript;
private final String databag;
private final RunListForTag runListForTag;
private final RunListForGroup runListForGroup;
private final ListCookbookVersions listCookbookVersions;
@Inject
@ -93,7 +93,7 @@ public class BaseChefService implements ChefService {
DeleteAllClientsInList deleteAllClientsInList, ListClients listClients,
ListCookbookVersions listCookbookVersions, UpdateAutomaticAttributesOnNode updateAutomaticAttributesOnNode,
Provider<PrivateKey> privateKey, @Named(CHEF_BOOTSTRAP_DATABAG) String databag,
GroupToBootScript tagToBootScript, RunListForTag runListForTag) {
GroupToBootScript groupToBootScript, RunListForGroup runListForGroup) {
this.chefContext = checkNotNull(chefContext, "chefContext");
this.cleanupStaleNodesAndClients = checkNotNull(cleanupStaleNodesAndClients, "cleanupStaleNodesAndClients");
this.createNodeAndPopulateAutomaticAttributes = checkNotNull(createNodeAndPopulateAutomaticAttributes,
@ -106,9 +106,9 @@ public class BaseChefService implements ChefService {
this.updateAutomaticAttributesOnNode = checkNotNull(updateAutomaticAttributesOnNode,
"updateAutomaticAttributesOnNode");
this.privateKey = checkNotNull(privateKey, "privateKey");
this.tagToBootScript = checkNotNull(tagToBootScript, "tagToBootScript");
this.groupToBootScript = checkNotNull(groupToBootScript, "groupToBootScript");
this.databag = checkNotNull(databag, "databag");
this.runListForTag = checkNotNull(runListForTag, "runListForTag");
this.runListForGroup = checkNotNull(runListForGroup, "runListForGroup");
}
@Override
@ -188,12 +188,12 @@ public class BaseChefService implements ChefService {
}
@Override
public Payload createClientAndBootstrapScriptForTag(String tag) {
return tagToBootScript.apply(tag);
public Statement createClientAndBootstrapScriptForGroup(String group) {
return groupToBootScript.apply(group);
}
@Override
public void updateRunListForTag(Iterable<String> runList, String tag) {
public void updateRunListForGroup(Iterable<String> runList, String group) {
try {
chefContext.getApi().createDatabag(databag);
} catch (IllegalStateException e) {
@ -201,14 +201,14 @@ public class BaseChefService implements ChefService {
}
chefContext.getApi().updateDatabagItem(
databag,
new DatabagItem(tag, chefContext.utils().json().toJson(
new DatabagItem(group, chefContext.utils().json().toJson(
ImmutableMap.<String, List<String>> of("run_list", Lists.newArrayList(runList)),
RunListForTag.RUN_LIST_TYPE)));
RunListForGroup.RUN_LIST_TYPE)));
}
@Override
public List<String> getRunListForTag(String tag) {
return runListForTag.apply(tag);
public List<String> getRunListForGroup(String group) {
return runListForGroup.apply(group);
}
@Override

View File

@ -32,8 +32,8 @@ import org.jclouds.blobstore.TransientAsyncBlobStore;
import org.jclouds.chef.ChefApi;
import org.jclouds.chef.ChefAsyncApi;
import org.jclouds.chef.domain.Client;
import org.jclouds.chef.functions.ClientForTag;
import org.jclouds.chef.functions.RunListForTag;
import org.jclouds.chef.functions.ClientForGroup;
import org.jclouds.chef.functions.RunListForGroup;
import org.jclouds.chef.statements.InstallChefGems;
import org.jclouds.chef.test.TransientChefApi;
import org.jclouds.chef.test.TransientChefAsyncApi;
@ -89,13 +89,13 @@ public class TransientChefApiModule extends AbstractModule {
@Provides
@Singleton
Map<String, List<String>> runListForTag(RunListForTag runListForTag) {
Map<String, List<String>> runListForTag(RunListForGroup runListForTag) {
return new MapMaker().makeComputingMap(runListForTag);
}
@Provides
@Singleton
Map<String, Client> tagToClient(ClientForTag tagToClient) {
Map<String, Client> tagToClient(ClientForGroup tagToClient) {
return new MapMaker().makeComputingMap(tagToClient);
}

View File

@ -36,15 +36,15 @@ import com.google.common.collect.ImmutableSet;
/**
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class ClientForTagTest {
@Test(groups = "unit", testName = "ClientForGroupTest")
public class ClientForGroupTest {
public void testWhenNoClientsInList() throws IOException {
ChefApi chefApi = createMock(ChefApi.class);
Client client = createMock(Client.class);
PrivateKey privateKey = createMock(PrivateKey.class);
ClientForTag fn = new ClientForTag(chefApi);
ClientForGroup fn = new ClientForGroup(chefApi);
expect(chefApi.listClients()).andReturn(ImmutableSet.<String> of());
expect(chefApi.createClient("foo-validator-00")).andReturn(client);
@ -67,7 +67,7 @@ public class ClientForTagTest {
Client client = createMock(Client.class);
PrivateKey privateKey = createMock(PrivateKey.class);
ClientForTag fn = new ClientForTag(chefApi);
ClientForGroup fn = new ClientForGroup(chefApi);
expect(chefApi.listClients()).andReturn(
ImmutableSet.<String> of("foo-validator-00", "foo-validator-01", "foo-validator-02"));
@ -91,7 +91,7 @@ public class ClientForTagTest {
Client client = createMock(Client.class);
PrivateKey privateKey = createMock(PrivateKey.class);
ClientForTag fn = new ClientForTag(chefApi);
ClientForGroup fn = new ClientForGroup(chefApi);
expect(chefApi.listClients()).andReturn(ImmutableSet.<String> of("foo-validator-00", "foo-validator-02"));
expect(chefApi.createClient("foo-validator-01")).andReturn(client);

View File

@ -18,10 +18,10 @@
*/
package org.jclouds.chef.functions;
import static org.easymock.EasyMock.createMock;
import static org.easymock.EasyMock.expect;
import static org.easymock.classextension.EasyMock.createMock;
import static org.easymock.classextension.EasyMock.replay;
import static org.easymock.classextension.EasyMock.verify;
import static org.easymock.EasyMock.replay;
import static org.easymock.EasyMock.verify;
import static org.testng.Assert.assertEquals;
import java.io.IOException;
@ -37,6 +37,7 @@ import org.jclouds.crypto.PemsTest;
import org.jclouds.json.Json;
import org.jclouds.json.config.GsonModule;
import org.jclouds.rest.annotations.ApiVersion;
import org.jclouds.scriptbuilder.domain.OsFamily;
import org.jclouds.scriptbuilder.domain.Statement;
import org.testng.annotations.Test;
@ -53,8 +54,8 @@ import com.google.inject.Injector;
/**
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class TagToBootScriptTest {
@Test(groups = "unit", testName = "GroupToBootScriptTest")
public class GroupToBootScriptTest {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
@ -105,7 +106,7 @@ public class TagToBootScriptTest {
replay(client);
replay(privateKey);
assertEquals(fn.apply("foo").getRawContent(), CharStreams.toString(Resources.newReaderSupplier(Resources
assertEquals(fn.apply("foo").render(OsFamily.UNIX), CharStreams.toString(Resources.newReaderSupplier(Resources
.getResource("one-recipe.sh"), Charsets.UTF_8)));
verify(client);

View File

@ -45,8 +45,8 @@ import com.google.inject.Injector;
/**
* @author Adrian Cole
*/
@Test(groups = { "unit" })
public class RunListForTagTest {
@Test(groups = "unit", testName = "RunListForGroupTest")
public class RunListForGroupTest {
Injector injector = Guice.createInjector(new AbstractModule() {
@Override
protected void configure()
@ -62,7 +62,7 @@ public class RunListForTagTest {
ChefApi chefApi = createMock(ChefApi.class);
Client client = createMock(Client.class);
RunListForTag fn = new RunListForTag("jclouds", chefApi, json);
RunListForGroup fn = new RunListForGroup("jclouds", chefApi, json);
expect(chefApi.getDatabagItem("jclouds", "foo")).andReturn(null);
@ -80,7 +80,7 @@ public class RunListForTagTest {
ChefApi chefApi = createMock(ChefApi.class);
Api api = createMock(Api.class);
RunListForTag fn = new RunListForTag("jclouds", chefApi, json);
RunListForGroup fn = new RunListForGroup("jclouds", chefApi, json);
expect(chefApi.getDatabagItem("jclouds", "foo")).andReturn(
new DatabagItem("foo", "{\"run_list\":[\"recipe[apache2]\"]}"));
@ -99,7 +99,7 @@ public class RunListForTagTest {
ChefApi chefApi = createMock(ChefApi.class);
Api api = createMock(Api.class);
RunListForTag fn = new RunListForTag("jclouds", chefApi, json);
RunListForGroup fn = new RunListForGroup("jclouds", chefApi, json);
expect(chefApi.getDatabagItem("jclouds", "foo")).andReturn(
new DatabagItem("foo", "{\"run_list\":[\"recipe[apache2]\",\"recipe[mysql]\"]}"));