Start line:  
End line:  

Snippet Preview

Snippet HTML Code

Stack Overflow Questions
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.apache.whirr;
 
 import static com.google.common.base.Preconditions.checkArgument;
 import static com.google.common.base.Preconditions.checkNotNull;
 import static org.apache.whirr.util.KeyPair.sameKeyPair;
 
 
 import java.io.File;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
This class represents the specification of a cluster. It is used to describe the properties of a cluster before it is launched.
 
 public class ClusterSpec {
   
   private static final Logger LOG = LoggerFactory.getLogger(ClusterSpec.class);
   
   static {
     // Environment variable interpolation (e.g. {env:MY_VAR}) is supported
     // natively in Commons Configuration 1.7, but until it's released we
     // do it ourselves here
     ConfigurationInterpolator.registerGlobalLookup("env"new StrLookup() {
       @Override
       public String lookup(String key) {
         return System.getenv(key);
       }
     });
   }
   
   public enum Property {
     CLUSTER_NAME(String.classfalse,  "The name of the cluster " +
       "to operate on. E.g. hadoopcluster."),
 
     SERVICE_NAME(String.classfalse"(optional) The name of the " +
       "service to use. E.g. hadoop."),
 
     LOGIN_USER(String.classfalse,  "Override the default login user "+
       "used to bootstrap whirr. E.g. ubuntu or myuser:mypass."),
 
     CLUSTER_USER(String.classfalse"The name of the user that Whirr " +
             "will create on all the cluster instances. You have to use " +
             "this user to login to nodes."),
 
     INSTANCE_TEMPLATES(String.classfalse"The number of instances " +
       "to launch for each set of roles. E.g. 1 hadoop-namenode+" +
       "hadoop-jobtracker, 10 hadoop-datanode+hadoop-tasktracker"),
       
     INSTANCE_TEMPLATES_MAX_PERCENT_FAILURES(String.classfalse"The percentage " +
       "of successfully started instances for each set of roles. E.g. " + 
       "100 hadoop-namenode+hadoop-jobtracker,60 hadoop-datanode+hadoop-tasktracker means " + 
       "all instances with the roles hadoop-namenode and hadoop-jobtracker " + 
       "has to be successfully started, and 60% of instances has to be succcessfully " + 
       "started each with the roles hadoop-datanode and hadoop-tasktracker."),
 
     INSTANCE_TEMPLATES_MINIMUM_NUMBER_OF_INSTANCES(String.classfalse"The minimum number" +
      "of successfully started instances for each set of roles. E.g. " +
      "1 hadoop-namenode+hadoop-jobtracker,6 hadoop-datanode+hadoop-tasktracker means " + 
      "1 instance with the roles hadoop-namenode and hadoop-jobtracker has to be successfully started," +
      " and 6 instances has to be successfully started each with the roles hadoop-datanode and hadoop-tasktracker."),
    MAX_STARTUP_RETRIES(Integer.classfalse"The number of retries in case of insufficient " + 
        "successfully started instances. Default value is 1."),
    
    PROVIDER(String.classfalse"The name of the cloud provider. " + 
      "E.g. aws-ec2, cloudservers-uk"),
      
    CREDENTIAL(String.classfalse"The cloud credential."),
    
    IDENTITY(String.classfalse"The cloud identity."),
    PUBLIC_KEY_FILE(String.classfalse"The filename of the public " +
      "key used to connect to instances."),
      
    PRIVATE_KEY_FILE(String.classfalse"The filename of the " + 
      "private RSA key used to connect to instances."),
    BLOBSTORE_PROVIDER(String.classfalse"The blob store provider. " +
      "E.g. aws-s3, cloudfiles-us, cloudfiles-uk"),
    BLOBSTORE_IDENTITY(String.classfalse"The blob store identity"),
    BLOBSTORE_CREDENTIAL(String.classfalse"The blob store credential"),
    BLOBSTORE_LOCATION_ID(String.classfalse"The blob store location ID"),
    BLOBSTORE_CACHE_CONTAINER(String.classfalse"The name of the " +
        "container to be used for caching local files. If not specified Whirr will " +
        "create a random one and remove it at the end of the session."),
    STATE_STORE(String.classfalse"What kind of store to use for state " +
      "(local, blob or none). Defaults to local."),
    STATE_STORE_CONTAINER(String.classfalse"Container where to store state. " +
      "Valid only for the blob state store."),
    STATE_STORE_BLOB(String.classfalse"Blob name for state storage. " +
      "Valid only for the blob state store. Defaults to whirr-<cluster-name>"),
    AWS_EC2_SPOT_PRICE(Float.classfalse"Spot instance price (aws-ec2 specific option)"),
      
    IMAGE_ID(String.classfalse"The ID of the image to use for " + 
      "instances. If not specified then a vanilla Linux image is " + 
      "chosen."),
      
    HARDWARE_ID(String.classfalse"The type of hardware to use for" + 
      " the instance. This must be compatible with the image ID."),
    HARDWARE_MIN_RAM(Integer.classfalse"The minimum amount of " +
      "instance memory. E.g. 1024"),
      
    LOCATION_ID(String.classfalse"The location to launch " + 
      "instances in. If not specified then an arbitrary location " + 
      "will be chosen."),
    CLIENT_CIDRS(String.classtrue"A comma-separated list of CIDR" +
      " blocks. E.g. 208.128.0.0/11,108.128.0.0/11"),
      
    VERSION(String.classfalse""),
    
    RUN_URL_BASE(String.classfalse"The base URL for forming run " + 
      "urls from. Change this to host your own set of launch scripts.");
    
    private Class<?> type;
    private boolean multipleArguments;
    private String description;
    
    Property(Class<?> typeboolean multipleArgumentsString description) {
      this. = type;
      this. = multipleArguments;
      this. = description;
    }
    
    public String getSimpleName() {
      return name().toLowerCase().replace('_''-');
    }
    public String getConfigName() {
      return "whirr." + getSimpleName();
    }
    
    public Class<?> getType() {
      return ;
    }
    
    public boolean hasMultipleArguments() {
      return ;
    }
    
    public String getDescription() {
      return ;
    }
  }
  private static final String DEFAULT_PROPERTIES = "whirr-default.properties";

  
Create an instance that uses a temporary RSA key pair.
  public static ClusterSpec withTemporaryKeys()
  }
  public static ClusterSpec withTemporaryKeys(Configuration conf
      Map<StringFilekeys = org.apache.whirr.util.KeyPair.generateTemporaryFiles();
      LoggerFactory.getLogger(ClusterSpec.class).debug("ssh keys: " +
            keys.toString());
      
        keys.get("private").getAbsolutePath());
        keys.get("public").getAbsolutePath());
    }
    
    return new ClusterSpec(conf);
  }

  
Create new empty instance for testing.
  public static ClusterSpec withNoDefaults() throws ConfigurationException {
  }
  public static ClusterSpec withNoDefaults(Configuration conf)
    return new ClusterSpec(conffalse);
  }
  private String clusterName;
  private String serviceName;
  private String clusterUser;
  private String loginUser;
  private int maxStartupRetries;
  private String provider;
  private String identity;
  private String credential;
  private String stateStore;
  private String stateStoreBlob;
  private float awsEc2SpotPrice;
  private String privateKey;
  private File privateKeyFile;
  private String publicKey;
  private String locationId;
  private String imageId;
  private String hardwareId;
  private int hardwareMinRam;
  private List<StringclientCidrs;
  private String version;
  private String runUrlBase;
  private Configuration config;
  
  public ClusterSpec() throws ConfigurationException {
    this(new PropertiesConfiguration());
  }
  public ClusterSpec(Configuration configthrows ConfigurationException {
      this(configtrue); // load default configs
  }

  
  public ClusterSpec(Configuration userConfigboolean loadDefaults)
      throws ConfigurationException {
    if (loadDefaults) {
       = composeWithDefaults(userConfig);
    } else {
       = ConfigurationUtils.cloneConfiguration(userConfig);
    }
    setInstanceTemplates(InstanceTemplate.parse());
  }

  
Create a deep object copy. It's not enough to just copy the configuration because the object can also be modified using the setters and the changes are not reflected in the configuration object.
  public ClusterSpec copy() throws ConfigurationException {
    ClusterSpec r = new ClusterSpec(getConfiguration(), true);
    return r;
  }
  private String getString(Property key) {
    return .getString(key.getConfigName(), null);
  }
  private int getInt(Property keyint defaultValue) {
    return .getInt(key.getConfigName(), defaultValue);
  }
  private float getFloat(Property keyfloat defaultValue) {
    return .getFloat(key.getConfigName(), defaultValue);
  }
  private List<StringgetList(Property key) {
    return .getList(key.getConfigName());
  }
      throws ConfigurationException {
    composed.addConfiguration(userConfig);
    composed.addConfiguration(
    return composed;
  }
  private void checkAndSetKeyPair() throws ConfigurationException {
    String pairRepresentation = "";
    try {
      String privateKeyPath = getString(.);
      String publicKeyPath = getString(.);
      publicKeyPath = (publicKeyPath == null && privateKeyPath != null) ?
                privateKeyPath + ".pub" : publicKeyPath;
      if(privateKeyPath != null && publicKeyPath != null) {
        pairRepresentation = "(" + privateKeyPath + ", " +
            publicKeyPath + ")";
        KeyPair pair = KeyPair.load(new JSch(), privateKeyPathpublicKeyPath);
        if (pair.isEncrypted()) {
          throw new ConfigurationException("Key pair " + pairRepresentation +
              " is encrypted. Try generating a new passwordless SSH keypair " +
              "(e.g. with ssh-keygen).");
        }
        if (!sameKeyPair(new File(privateKeyPath), new File(publicKeyPath))) {
          throw new ConfigurationException("Both keys should belong " +
              "to the same key pair: " + pairRepresentation);
        }
        setPrivateKey(new File(privateKeyPath));
        setPublicKey(new File(publicKeyPath));
      }
    } catch (JSchException e) {
      throw new ConfigurationException("Invalid key pair: " +
          pairRepresentatione);
    } catch (IllegalArgumentException e) {
      throw new ConfigurationException("Invalid key: " +
          pairRepresentatione);
    } catch (IOException e) {
      throw new ConfigurationException("Error reading one of key file: " +
          pairRepresentatione);
    }
  }
    return ;
  }
  public InstanceTemplate getInstanceTemplate(final Set<Stringroles) {
    for (InstanceTemplate template : ) {
      if (roles.equals(template.getRoles())) {
        return template;
      }
    }
    return null;
  }
    return getInstanceTemplate(Sets.newLinkedHashSet(Lists.newArrayList(roles)));
  }
  public int getMaxStartupRetries() {
    return ;
  }
  public String getProvider() {
    return ;
  }
  public String getIdentity() {
    return ;
  }
  public String getCredential() {
    return ;
  }
  public String getClusterName() {
    return ;
  }
    if ( == null) {
    }
    return ;
  }

  
Probably jclouds should provide a similar mechanism
    Map<StringStringmappings = Maps.newHashMap();
    mappings.put("ec2","aws-s3");
    mappings.put("aws-ec2""aws-s3");
    mappings.put("cloudservers""cloudfiles-us");
    mappings.put("cloudservers-us""cloudfiles-us");
    mappings.put("cloudservers-uk""cloudfiles-uk");
    if (!mappings.containsKey()) {
      return null;
    }
    return mappings.get();
  }
    if ( == null) {
      return ;
    }
    return ;
  }
    if ( == null) {
      return ;
    }
    return ;
  }
    return ;
  }
  }
  public String getStateStore() {
    if ( == null) {
      return "local";
    }
    return ;
  }
    return ;
  }
  public String getStateStoreBlob() {
    if ( == null && "blob".equals()) {
      return "whirr-" + getClusterName();
    }
    return ;
  }
  public float getAwsEc2SpotPrice() {
    return ;
  }
  public String getServiceName() {
    return ;
  }
  public String getPrivateKey() {
    return ;
  }
  public File getPrivateKeyFile() {
     return ;
  }
  public String getPublicKey() {
    return ;
  }
  public String getImageId() {
    return ;
  }
  public String getHardwareId() {
    return ;
  }
  public int getHardwareMinRam() {
    return ;
  }
  public String getLocationId() {
    return ;
  }
  public List<StringgetClientCidrs() {
    return ;
  }
  public String getVersion() {
    return ;
  }
  public String getRunUrlBase() {
    return ;
  }
  public String getClusterUser() {
    return ;
  }
  public String getLoginUser() {
    return ;
  }
  public void setInstanceTemplates(List<InstanceTemplateinstanceTemplates) {
    this. = instanceTemplates;
  }
  public void setMaxStartupRetries(int maxStartupRetries) {
    this. = maxStartupRetries;
  }
  public void setProvider(String provider) {
    if ("ec2".equals(provider)) {
      .warn("Please use provider \"aws-ec2\" instead of \"ec2\"");
      provider = "aws-ec2";
    }
    if ("cloudservers".equals(provider)) {
      .warn("Please use provider \"cloudservers-us\" instead of \"cloudservers\"");
      provider = "cloudservers-us";
    }
    this. = provider;
  }
  public void setIdentity(String identity) {
    this. = identity;
  }
  public void setCredential(String credential) {
    this. = credential;
  }
  public void setBlobStoreProvider(String provider) {
     = provider;
  }
  public void setBlobStoreIdentity(String identity) {
     = identity;
  }
  public void setBlobStoreCredential(String credential) {
     = credential;
  }
  public void setBlobStoreLocationId(String locationId) {
     = locationId;
  }
  public void setBlobStoreCacheContainer(String container) {
     = container;
  }
  public void setStateStore(String type) {
    if (type != null) {
      checkArgument(Sets.newHashSet("local""blob""none").contains(type),
        "Invalid state store. Valid values are local, blob or none.");
    }
    this. = type;
  }
  public void setStateStoreContainer(String container) {
    checkContainerName(container);
    this. = container;
  }
  private void checkContainerName(String name) {
    if (name != null) {
      checkArgument((new DnsNameValidator(3, 63){}).apply(name));
    }
  }
  public void setStateStoreBlob(String blob) {
    this. = blob;
  }
  public void setAwsEc2SpotPrice(float value) {
    this. = value;
  }
  public void setClusterName(String clusterName) {
    this. = clusterName;
  }
  public void setServiceName(String serviceName) {
    this. = serviceName;
  }

  
The rsa public key which is authorized to login to your on the cloud nodes.

Parameters:
publicKey
  public void setPublicKey(String publicKey) {
    checkPublicKey(publicKey);
    this. = publicKey;
  }
  
  

Throws:
java.io.IOException if there is a problem reading the file
See also:
setPublicKey(java.lang.String)
  public void setPublicKey(File publicKeythrows IOException {
    String key = IOUtils.toString(new FileReader(publicKey));
    checkPublicKey(key);
    this. = key;
  }
  private void checkPublicKey(String publicKey) {
    /*
     * http://stackoverflow.com/questions/2494645#2494645
     */
    checkArgument(checkNotNull(publicKey"publicKey")
            .startsWith("ssh-rsa AAAAB3NzaC1yc2EA"),
        "key should start with ssh-rsa AAAAB3NzaC1yc2EA");
  }
  
  
The rsa private key which is used as the login identity on the cloud nodes.

Parameters:
privateKey
  public void setPrivateKey(String privateKey) {
    checkPrivateKey(privateKey);
    this. = privateKey;
  }

  

Throws:
java.io.IOException if there is a problem reading the file
See also:
setPrivateKey(java.lang.String)
  public void setPrivateKey(File privateKeythrows IOException {
    this. = privateKey;
    String key = IOUtils.toString(new FileReader(privateKey));
    checkPrivateKey(key);
    this. = key;
  }
  
  private void checkPrivateKey(String privateKey) {
    checkArgument(checkNotNull(privateKey"privateKey")
        .startsWith("-----BEGIN RSA PRIVATE KEY-----"),
        "key should start with -----BEGIN RSA PRIVATE KEY-----");
  }
  public void setImageId(String imageId) {
    this. = imageId;
  }
  
  public void setHardwareId(String hardwareId) {
    this. = hardwareId;
  }
  public void setHardwareMinRam(int minRam) {
    this. = minRam;
  }
  
  public void setLocationId(String locationId) {
    this. = locationId;
  }
  
  public void setClientCidrs(List<StringclientCidrs) {
    this. = clientCidrs;
  }
  
  public void setVersion(String version) {
    this. = version;
  }
  public void setRunUrlBase(String runUrlBase) {
    this. = runUrlBase;
  }
  public void setClusterUser(String user) {
    this. = user;
  }
  public void setLoginUser(String user) {
    if ( != null) {
      // patch until jclouds 1.0-beta-10
      System.setProperty("whirr.login-user");
    }
  }
    return ;
  }
  
    for (@SuppressWarnings("unchecked")
        Iterator<Stringit = .getKeys(prefix); it.hasNext(); ) {
      String key = it.next();
      c.setProperty(key.getProperty(key));
    }
    return c;
  }
  
  

Returns:
the directory for storing cluster-related files
  public File getClusterDirectory() {
    File clusterDir = new File(new File(System.getProperty("user.home")),
        ".whirr");
    clusterDir = new File(clusterDirgetClusterName());
    clusterDir.mkdirs();
    return clusterDir;
  }
    
  public boolean equals(Object o) {
    if (o instanceof ClusterSpec) {
      ClusterSpec that = (ClusterSpeco;
      return Objects.equal(getInstanceTemplates(), that.getInstanceTemplates())
        && Objects.equal(getMaxStartupRetries(), that.getMaxStartupRetries())
        && Objects.equal(getProvider(), that.getProvider())
        && Objects.equal(getIdentity(), that.getIdentity())
        && Objects.equal(getCredential(), that.getCredential())
        && Objects.equal(getBlobStoreProvider(), that.getBlobStoreProvider())
        && Objects.equal(getBlobStoreIdentity(), that.getBlobStoreIdentity())
        && Objects.equal(getBlobStoreCredential(), that.getBlobStoreCredential())
        && Objects.equal(getBlobStoreCacheContainer(), that.getBlobStoreCacheContainer())
        && Objects.equal(getClusterName(), that.getClusterName())
        && Objects.equal(getServiceName(), that.getServiceName())
        && Objects.equal(getClusterUser(), that.getClusterUser())
        && Objects.equal(getLoginUser(), that.getLoginUser())
        && Objects.equal(getPublicKey(), that.getPublicKey())
        && Objects.equal(getPrivateKey(), that.getPrivateKey())
        && Objects.equal(getImageId(), that.getImageId())
        && Objects.equal(getHardwareId(), that.getHardwareId())
        && Objects.equal(getHardwareMinRam(), that.getHardwareMinRam())
        && Objects.equal(getLocationId(), that.getLocationId())
        && Objects.equal(getBlobStoreLocationId(), that.getBlobStoreLocationId())
        && Objects.equal(getClientCidrs(), that.getClientCidrs())
        && Objects.equal(getVersion(), that.getVersion())
        && Objects.equal(getRunUrlBase(), that.getRunUrlBase())
        && Objects.equal(getStateStore(), that.getStateStore())
        && Objects.equal(getStateStoreContainer(), that.getStateStoreContainer())
        && Objects.equal(getStateStoreBlob(), that.getStateStoreBlob())
        && Objects.equal(getAwsEc2SpotPrice(), that.getAwsEc2SpotPrice())
        ;
    }
    return false;
  }
  
  public int hashCode() {
    return Objects.hashCode(
        getInstanceTemplates(),
        getMaxStartupRetries(),
        getProvider(),
        getIdentity(),
        getCredential(),
        getBlobStoreProvider(),
        getBlobStoreIdentity(),
        getBlobStoreCredential(),
        getClusterName(),
        getServiceName(),
        getClusterUser(),
        getLoginUser(),
        getPublicKey(),
        getPrivateKey(),
        getImageId(),
        getHardwareId(),
        getHardwareMinRam(),
        getLocationId(),
        getBlobStoreLocationId(),
        getClientCidrs(),
        getVersion(),
        getRunUrlBase(),
        getStateStore(),
        getStateStoreBlob(),
        getStateStoreContainer(),
        getAwsEc2SpotPrice()
    );
  }
  
  public String toString() {
    return Objects.toStringHelper(this)
      .add("instanceTemplates"getInstanceTemplates())
      .add("maxStartupRetries"getMaxStartupRetries())
      .add("provider"getProvider())
      .add("identity"getIdentity())
      .add("credential"getCredential())
      .add("blobStoreProvider"getBlobStoreProvider())
      .add("blobStoreCredential"getBlobStoreCredential())
      .add("blobStoreIdentity"getBlobStoreIdentity())
      .add("blobStoreCacheContainer"getBlobStoreCacheContainer())
      .add("clusterName"getClusterName())
      .add("serviceName"getServiceName())
      .add("clusterUser"getClusterUser())
      .add("loginUser"getLoginUser())
      .add("publicKey"getPublicKey())
      .add("privateKey"getPrivateKey())
      .add("imageId"getImageId())
      .add("hardwareId"getHardwareId())
      .add("hardwareMinRam"getHardwareMinRam())
      .add("locationId"getLocationId())
      .add("blobStoreLocationId"getBlobStoreLocationId())
      .add("clientCidrs"getClientCidrs())
      .add("version"getVersion())
      .add("runUrlBase"getRunUrlBase())
      .add("stateStore"getStateStore())
      .add("stateStoreContainer"getStateStoreContainer())
      .add("stateStoreBlob"getStateStoreBlob())
      .add("awsEc2SpotPrice"getAwsEc2SpotPrice())
      .toString();
  }
New to GrepCode? Check out our FAQ X