def build_instances(self, global_config, metadata=None): """ Build a set of instances on Openstack using the given list of configurations. Each configuration is expected to contain the following keywords: DISTRIBUTION, INSTANCE_NAME, SECURITY_GROUP, FLAVOR, OS1_KEY, and CLOUD_CONFIG, al defined in config_utils. The configurations will have the 'user', 'host_string' and 'server' keys added, which will contain the user to SSH in as, the host string for Fabric, and the novaclient.v1_1.server.Server created. :param global_config: The structure dictionary produced by the configuration parser :type global_config: dict :param metadata: The metadata to attach to the instances. Limit to 5 keys, 255 character values :type metadata: dict """ for instance in config_utils.config_generator(global_config): # Build the base instance image = self.get_distribution_image( instance[config_utils.DISTRIBUTION]) cloud_config = instance.get(config_utils.CLOUD_CONFIG) instance_name = instance[config_utils.INSTANCE_NAME] security_group = instance[config_utils.SECURITY_GROUP] flavor = instance[config_utils.FLAVOR] os1_key = instance[config_utils.OS1_KEY] server = self.create_instance(image.id, instance_name, security_group, flavor, os1_key, metadata, cloud_config) instance[config_utils.SYSTEM_USER] = image.metadata.get( config_utils.SYSTEM_USER, 'cloud-user').encode('ascii') instance[config_utils.NOVA_SERVER] = server.id # Wait until all the instances are active, then set necessary configs flattened_list = config_utils.flatten_structure(global_config) servers = [ instance[config_utils.NOVA_SERVER] for instance in flattened_list ] self.wait_for_active_instances(servers) for instance_config in config_utils.config_generator(global_config): instance_ip = self.get_instance_floating_ip( instance_config[config_utils.NOVA_SERVER]) user = global_config.get('username', instance_config[config_utils.SYSTEM_USER]) instance_config[ config_utils.HOST_STRING] = user + '@' + instance_ip
def configure_instances(global_config): """ Configure the root instance and each decedent. Any configuration results are written to the given dictionary :param global_config: The instance structure dictionary from the configuration parser :type global_config: dict """ # This should eventually use multi-threading to configure independent machines concurrently for instance in config_generator(global_config): # Configure the instance config_function = CONFIGURATION_FUNCTIONS[instance[ROLE]] config_function(instance[INSTANCE_NAME], global_config)
def build_instances(self, global_config, metadata=None): """ Build a set of instances on Openstack using the given list of configurations. Each configuration is expected to contain the following keywords: DISTRIBUTION, INSTANCE_NAME, SECURITY_GROUP, FLAVOR, OS1_KEY, and CLOUD_CONFIG, al defined in config_utils. The configurations will have the 'user', 'host_string' and 'server' keys added, which will contain the user to SSH in as, the host string for Fabric, and the novaclient.v1_1.server.Server created. :param global_config: The structure dictionary produced by the configuration parser :type global_config: dict :param metadata: The metadata to attach to the instances. Limit to 5 keys, 255 character values :type metadata: dict """ for instance in config_utils.config_generator(global_config): # Build the base instance image = self.get_distribution_image(instance[config_utils.DISTRIBUTION]) cloud_config = instance.get(config_utils.CLOUD_CONFIG) instance_name = instance[config_utils.INSTANCE_NAME] security_group = instance[config_utils.SECURITY_GROUP] flavor = instance[config_utils.FLAVOR] os1_key = instance[config_utils.OS1_KEY] server = self.create_instance(image.id, instance_name, security_group, flavor, os1_key, metadata, cloud_config) instance[config_utils.SYSTEM_USER] = image.metadata.get(config_utils.SYSTEM_USER, 'cloud-user').encode('ascii') instance[config_utils.NOVA_SERVER] = server.id # Wait until all the instances are active, then set necessary configs flattened_list = config_utils.flatten_structure(global_config) servers = [instance[config_utils.NOVA_SERVER] for instance in flattened_list] self.wait_for_active_instances(servers) for instance_config in config_utils.config_generator(global_config): instance_ip = self.get_instance_floating_ip(instance_config[config_utils.NOVA_SERVER]) user = global_config.get('username', instance_config[config_utils.SYSTEM_USER]) instance_config[config_utils.HOST_STRING] = user + '@' + instance_ip
def teardown_instances(self, configuration): """ Delete all instances in the given configuration dictionary :param configuration: A dictionary parsed by config_utils :type configuration: dict """ self._authenticate() for instance in config_utils.config_generator(configuration): if config_utils.NOVA_SERVER in instance: try: server = self.nova.servers.get(instance[config_utils.NOVA_SERVER]) self.nova.servers.delete(server) except NotFound: print 'Failed to find server [%s]' % instance[config_utils.NOVA_SERVER]