/* * 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.brooklyn.location.jclouds; import java.util.Collection; import java.util.List; import java.util.Map; import java.util.concurrent.Semaphore; import org.apache.brooklyn.config.ConfigKey; import org.apache.brooklyn.core.config.BasicConfigKey; import org.apache.brooklyn.core.config.ConfigKeys; import org.apache.brooklyn.core.location.LocationConfigKeys; import org.apache.brooklyn.core.location.access.BrooklynAccessUtils; import org.apache.brooklyn.core.location.access.PortForwardManager; import org.apache.brooklyn.core.location.cloud.CloudLocationConfig; import org.apache.brooklyn.location.jclouds.networking.JcloudsPortForwarderExtension; import org.jclouds.Constants; import org.jclouds.compute.domain.Image; import org.jclouds.compute.domain.OsFamily; import org.jclouds.compute.domain.TemplateBuilder; import org.jclouds.domain.LoginCredentials; import org.apache.brooklyn.util.core.internal.ssh.SshTool; import com.google.common.annotations.Beta; import com.google.common.base.Function; import com.google.common.reflect.TypeToken; public interface JcloudsLocationConfig extends CloudLocationConfig { public static final ConfigKey<String> CLOUD_PROVIDER = LocationConfigKeys.CLOUD_PROVIDER; public static final ConfigKey<Boolean> RUN_AS_ROOT = ConfigKeys.newBooleanConfigKey("runAsRoot", "Whether to run initial setup as root (default true)", null); public static final ConfigKey<String> LOGIN_USER = ConfigKeys.newStringConfigKey("loginUser", "Override the user who logs in initially to perform setup " + "(otherwise it is detected from the cloud or known defaults in cloud or VM OS)", null); public static final ConfigKey<String> LOGIN_USER_PASSWORD = ConfigKeys.newStringConfigKey("loginUser.password", "Custom password for the user who logs in initially", null); public static final ConfigKey<String> LOGIN_USER_PRIVATE_KEY_DATA = ConfigKeys.newStringConfigKey("loginUser.privateKeyData", "Custom private key for the user who logs in initially", null); public static final ConfigKey<String> KEY_PAIR = ConfigKeys.newStringConfigKey("keyPair", "Custom keypair name to be re-used", null); public static final ConfigKey<Boolean> AUTO_GENERATE_KEYPAIRS = ConfigKeys.newBooleanConfigKey("jclouds.openstack-nova.auto-generate-keypairs", "Whether to generate keypairs for Nova"); /** * @deprecated since 0.7.0 Use {@link #AUTO_ASSIGN_FLOATING_IP} instead */ public static final ConfigKey<Boolean> AUTO_CREATE_FLOATING_IPS = ConfigKeys.newBooleanConfigKey("jclouds.openstack-nova.auto-create-floating-ips", "Whether to generate floating ips for Nova"); public static final ConfigKey<Boolean> AUTO_ASSIGN_FLOATING_IP = ConfigKeys.newBooleanConfigKey("autoAssignFloatingIp", "Whether to generate floating ips (in Nova paralance), or elastic IPs (in CloudStack parlance)"); // not supported in jclouds // public static final ConfigKey<String> LOGIN_USER_PRIVATE_KEY_PASSPHRASE = ConfigKeys.newStringKey("loginUser.privateKeyPassphrase", // "Passphrase for the custom private key for the user who logs in initially", null); public static final ConfigKey<String> LOGIN_USER_PRIVATE_KEY_FILE = ConfigKeys.newStringConfigKey("loginUser.privateKeyFile", "Custom private key for the user who logs in initially", null); public static final ConfigKey<String> EXTRA_PUBLIC_KEY_DATA_TO_AUTH = ConfigKeys.newStringConfigKey("extraSshPublicKeyData", "Additional public key data to add to authorized_keys, on supported clouds (not GCE)", null); @SuppressWarnings("serial") public static final ConfigKey<List<String>> EXTRA_PUBLIC_KEY_URLS_TO_AUTH = ConfigKeys.newConfigKey(new TypeToken<List<String>>() {}, "extraSshPublicKeyUrls", "Additional public keys (files or URLs, in SSH2/RFC4716/id_rsa.pub format) to add to authorized_keys", null); public static final ConfigKey<Boolean> DONT_CREATE_USER = ConfigKeys.newBooleanConfigKey("dontCreateUser", "Whether to skip creation of 'user' when provisioning machines (default false)", false); public static final ConfigKey<Boolean> GRANT_USER_SUDO = ConfigKeys.newBooleanConfigKey("grantUserSudo", "Whether to grant the created user sudo privileges. Irrelevant if dontCreateUser is true. Default: true.", true); public static final ConfigKey<Boolean> DISABLE_ROOT_AND_PASSWORD_SSH = ConfigKeys.newBooleanConfigKey("disableRootAndPasswordSsh", "Whether to disable direct SSH access for root and disable password-based SSH, " + "if creating a user with a key-based login; " + "defaults to true (set false to leave root users alone)", true); public static final ConfigKey<String> CUSTOM_TEMPLATE_OPTIONS_SCRIPT_CONTENTS = ConfigKeys.newStringConfigKey("customTemplateOptionsScriptContents", "A custom script to pass to jclouds as part of template options, run after AdminAccess, " + "for use primarily where a command which must run as root on first login before switching to the admin user, " + "e.g. to customize sudoers; may start in an odd location (e.g. /tmp/bootstrap); " + "NB: most commands should be run by entities, or if VM-specific but sudo is okay, then via setup.script, not via this"); public static final ConfigKey<LoginCredentials> CUSTOM_CREDENTIALS = new BasicConfigKey<LoginCredentials>(LoginCredentials.class, "customCredentials", "Custom jclouds LoginCredentials object to be used to connect to the VM", null); public static final ConfigKey<String> GROUP_ID = ConfigKeys.newStringConfigKey("groupId", "The Jclouds group provisioned machines should be members of. " + "Users of this config key are also responsible for configuring security groups."); // jclouds compatibility public static final ConfigKey<String> JCLOUDS_KEY_USERNAME = ConfigKeys.newStringConfigKey( "userName", "Equivalent to 'user'; provided for jclouds compatibility", null); public static final ConfigKey<String> JCLOUDS_KEY_ENDPOINT = ConfigKeys.newStringConfigKey( Constants.PROPERTY_ENDPOINT, "Equivalent to 'endpoint'; provided for jclouds compatibility", null); // note causing problems on centos due to use of `sudo -n`; but required for default RHEL VM /** * @deprecated since 0.8.0; instead configure this on the entity. See SoftwareProcess.OPEN_IPTABLES. */ @Deprecated public static final ConfigKey<Boolean> OPEN_IPTABLES = ConfigKeys.newBooleanConfigKey("openIptables", "[DEPRECATED - use openIptables on SoftwareProcess entity] Whether to open the INBOUND_PORTS via iptables rules; " + "if true then ssh in to run iptables commands, as part of machine provisioning", false); /** * @deprecated since 0.8.0; instead configure this on the entity. See SoftwareProcess.STOP_IPTABLES. */ @Deprecated public static final ConfigKey<Boolean> STOP_IPTABLES = ConfigKeys.newBooleanConfigKey("stopIptables", "[DEPRECATED - use stopIptables on SoftwareProcess entity] Whether to stop iptables entirely; " + "if true then ssh in to stop the iptables service, as part of machine provisioning", false); public static final ConfigKey<String> HARDWARE_ID = ConfigKeys.newStringConfigKey("hardwareId", "A system-specific identifier for the hardware profile or machine type to be used when creating a VM", null); public static final ConfigKey<String> IMAGE_ID = ConfigKeys.newStringConfigKey("imageId", "A system-specific identifier for the VM image to be used when creating a VM", null); public static final ConfigKey<String> IMAGE_NAME_REGEX = ConfigKeys.newStringConfigKey("imageNameRegex", "A regular expression to be compared against the 'name' when selecting the VM image to be used when creating a VM", null); public static final ConfigKey<String> IMAGE_DESCRIPTION_REGEX = ConfigKeys.newStringConfigKey("imageDescriptionRegex", "A regular expression to be compared against the 'description' when selecting the VM image to be used when creating a VM", null); public static final ConfigKey<String> TEMPLATE_SPEC = ConfigKeys.newStringConfigKey("templateSpec", "A jclouds 'spec' string consisting of properties and values to be used when creating a VM " + "(in most cases the properties can, and should, be specified individually using other Brooklyn location config keys)", null); public static final ConfigKey<String> DEFAULT_IMAGE_ID = ConfigKeys.newStringConfigKey("defaultImageId", "A system-specific identifier for the VM image to be used by default when creating a VM " + "(if no other VM image selection criteria are supplied)", null); public static final ConfigKey<TemplateBuilder> TEMPLATE_BUILDER = ConfigKeys.newConfigKey(TemplateBuilder.class, "templateBuilder", "A TemplateBuilder instance provided programmatically, to be used when creating a VM"); public static final ConfigKey<Object> SECURITY_GROUPS = new BasicConfigKey<Object>(Object.class, "securityGroups", "Security groups to be applied when creating a VM, on supported clouds " + "(either a single group identifier as a String, or an Iterable<String> or String[])", null); public static final ConfigKey<String> USER_METADATA_STRING = ConfigKeys.newStringConfigKey("userMetadataString", "Arbitrary user data, as a single string, on supported clouds (AWS)", null); @Deprecated /** @deprecated since 0.7.0 even AWS (the only one where this was supported) does not seem to want this uuencoded; use #USER_METADATA_STRING */ public static final ConfigKey<String> USER_DATA_UUENCODED = ConfigKeys.newStringConfigKey("userData", "Arbitrary user data, as a single string in uuencoded format, on supported clouds (AWS)", null); public static final ConfigKey<Object> STRING_TAGS = new BasicConfigKey<Object>(Object.class, "tags", "Tags to be applied when creating a VM, on supported clouds " + "(either a single tag as a String, or an Iterable<String> or String[];" + "note this is not key-value pairs (e.g. what AWS calls 'tags'), for that see userMetadata)", null); @Deprecated /** @deprecated since 0.7.0 use #STRING_TAGS */ public static final ConfigKey<Object> TAGS = STRING_TAGS; public static final ConfigKey<Object> USER_METADATA_MAP = new BasicConfigKey<Object>(Object.class, "userMetadata", "Arbitrary user metadata, as a map (or String of comma-separated key=value pairs), on supported clouds; " + "note often values cannot be null", null); @Deprecated /** @deprecated since 0.7.0 use #USER_METADATA_MAP */ public static final ConfigKey<Object> USER_METADATA = USER_METADATA_MAP; public static final ConfigKey<Boolean> INCLUDE_BROOKLYN_USER_METADATA = ConfigKeys.newBooleanConfigKey("includeBrooklynUserMetadata", "Whether to set metadata about the context of a machine, e.g. brooklyn-entity-id, brooklyn-app-name (default true)", true); public static final ConfigKey<Boolean> MAP_DEV_RANDOM_TO_DEV_URANDOM = ConfigKeys.newBooleanConfigKey( "installDevUrandom", "Map /dev/random to /dev/urandom to prevent halting on insufficient entropy", true); /** @deprecated since 0.7.0; use {@link #JCLOUDS_LOCATION_CUSTOMIZERS} instead */ @Deprecated public static final ConfigKey<JcloudsLocationCustomizer> JCLOUDS_LOCATION_CUSTOMIZER = ConfigKeys.newConfigKey(JcloudsLocationCustomizer.class, "customizer", "Optional location customizer"); @SuppressWarnings("serial") public static final ConfigKey<Collection<JcloudsLocationCustomizer>> JCLOUDS_LOCATION_CUSTOMIZERS = ConfigKeys.newConfigKey( new TypeToken<Collection<JcloudsLocationCustomizer>>() {}, "customizers", "Optional location customizers"); /** @deprecated since 0.7.0; use {@link #JCLOUDS_LOCATION_CUSTOMIZERS} instead */ @Deprecated public static final ConfigKey<String> JCLOUDS_LOCATION_CUSTOMIZER_TYPE = ConfigKeys.newStringConfigKey( "customizerType", "Optional location customizer type (to be class-loaded and constructed with no-arg constructor)"); /** @deprecated since 0.7.0; use {@link #JCLOUDS_LOCATION_CUSTOMIZERS} instead */ @Deprecated public static final ConfigKey<String> JCLOUDS_LOCATION_CUSTOMIZERS_SUPPLIER_TYPE = ConfigKeys.newStringConfigKey( "customizersSupplierType", "Optional type of a Supplier<Collection<JcloudsLocationCustomizer>> " + "(to be class-loaded and constructed with ConfigBag or no-arg constructor)"); public static final ConfigKey<String> LOCAL_TEMP_DIR = SshTool.PROP_LOCAL_TEMP_DIR; public static final ConfigKey<Integer> OVERRIDE_RAM = ConfigKeys.newIntegerConfigKey("overrideRam", "Custom ram value"); public static final ConfigKey<String> NETWORK_NAME = ConfigKeys.newStringConfigKey( "networkName", "Network name or ID where the instance should be created (e.g. the subnet ID in AWS"); /** * CUSTOM_MACHINE_SETUP_SCRIPT_URL accepts a URL location that points to a shell script. * Please have a look at locations/jclouds/src/main/resources/org/apache/brooklyn/location/jclouds/sample/setup-server.sh as an example */ public static final ConfigKey<String> CUSTOM_MACHINE_SETUP_SCRIPT_URL = ConfigKeys.newStringConfigKey( "setup.script", "Custom script to customize a node"); @SuppressWarnings("serial") public static final ConfigKey<List<String>> CUSTOM_MACHINE_SETUP_SCRIPT_URL_LIST = ConfigKeys.newConfigKey(new TypeToken<List<String>>() {}, "setup.scripts", "A list of scripts to customize a node"); public static final ConfigKey<String> CUSTOM_MACHINE_SETUP_SCRIPT_VARS = ConfigKeys.newStringConfigKey( "setup.script.vars", "vars to customize a setup.script i.e.: key1:value1,key2:value2"); public static final ConfigKey<Boolean> GENERATE_HOSTNAME = ConfigKeys.newBooleanConfigKey( "generate.hostname", "Use the nodename generated by jclouds", false); public static final ConfigKey<Boolean> USE_PORT_FORWARDING = ConfigKeys.newBooleanConfigKey( "portforwarding.enabled", "Whether to setup port-forwarding to subsequently access the VM (over the ssh port)", false); @Beta public static final ConfigKey<Boolean> USE_JCLOUDS_SSH_INIT = ConfigKeys.newBooleanConfigKey( "useJcloudsSshInit", "Whether to use jclouds for initial ssh-based setup (i.e. as part of the 'TemplateOptions'); " + "if false will use core brooklyn ssh utilities. " + "This config is beta; its default could be changed and/or the option removed in an upcoming release.", true); public static final ConfigKey<JcloudsPortForwarderExtension> PORT_FORWARDER = ConfigKeys.newConfigKey( JcloudsPortForwarderExtension.class, "portforwarding.forwarder", "The port-forwarder to use"); public static final ConfigKey<PortForwardManager> PORT_FORWARDING_MANAGER = BrooklynAccessUtils .PORT_FORWARDING_MANAGER; public static final ConfigKey<Integer> MACHINE_CREATE_ATTEMPTS = ConfigKeys.newIntegerConfigKey( "machineCreateAttempts", "Number of times to retry if jclouds fails to create a VM", 1); public static final ConfigKey<Integer> MAX_CONCURRENT_MACHINE_CREATIONS = ConfigKeys.newIntegerConfigKey( "maxConcurrentMachineCreations", "Maximum number of concurrent machine-creations", Integer.MAX_VALUE); public static final ConfigKey<Semaphore> MACHINE_CREATION_SEMAPHORE = ConfigKeys.newConfigKey( Semaphore.class, "machineCreationSemaphore", "Semaphore for controlling concurrent machine creation", null); @SuppressWarnings("serial") public static final ConfigKey<Function<Iterable<? extends Image>,Image>> IMAGE_CHOOSER = ConfigKeys.newConfigKey( new TypeToken<Function<Iterable<? extends Image>,Image>>() {}, "imageChooser", "An image chooser function to control which images are preferred", new BrooklynImageChooser().chooser()); public static final ConfigKey<OsFamily> OS_FAMILY = ConfigKeys.newConfigKey(OsFamily.class, "osFamily", "OS family, e.g. CentOS, Debian, RHEL, Ubuntu"); public static final ConfigKey<String> OS_VERSION_REGEX = ConfigKeys.newStringConfigKey("osVersionRegex", "Regular expression for the OS version to load"); public static final ConfigKey<OsFamily> OS_FAMILY_OVERRIDE = ConfigKeys.newConfigKey(OsFamily.class, "osFamilyOverride", "OS family of VMs (ignores VM metadata from jclouds, and assumes this value)"); public static final ConfigKey<ComputeServiceRegistry> COMPUTE_SERVICE_REGISTRY = ConfigKeys.newConfigKey( ComputeServiceRegistry.class, "jclouds.computeServiceRegistry", "Registry/Factory for creating jclouds ComputeService; default is almost always fine, except where tests want to customize behaviour", ComputeServiceRegistryImpl.INSTANCE); @SuppressWarnings("serial") public static final ConfigKey<Map<String,Object>> TEMPLATE_OPTIONS = ConfigKeys.newConfigKey( new TypeToken<Map<String, Object>>() {}, "templateOptions", "Additional jclouds template options"); // TODO // "noDefaultSshKeys" - hints that local ssh keys should not be read as defaults // this would be useful when we need to indicate a password }