def _terminate_machines(self, machine_filter=None): status = self.env.status() machines = status.get('machines', {}) machine_filter = machine_filter or self._machine_filter # Using the api instance-id can be the provider id, but # else it defaults to ip, and we have to disambiguate. remove = [] for m in machines: if machine_filter(m, machines[m]): remove.append({ 'address': machines[m].get('dns-name'), 'instance_id': machines[m]['instance-id'], 'machine_id': m }) address_map = dict([(d.ip_address, d) for d in self.provider.get_instances()]) if not remove: return status, address_map log.info("Terminating machines %s", " ".join([m['machine_id'] for m in remove])) for m in remove: instance = None if m['address']: instance = address_map.get(m['address']) else: instances = [ i for i in address_map.values() if m['instance_id'] == i.name ] if len(instances) == 1: instance = instances[0] #instances['instance'] = env_only = False # Remove from only env or also provider. if instance is None: log.warning( "Couldn't resolve machine %s's address %s to instance" % (m['machine_id'], m['address'])) # We have a machine in juju state that we couldn't # find in provider. Remove it from state so destroy # can proceed. env_only = True instance_id = None else: instance_id = instance.id self.runner.queue_op( ops.MachineDestroy(self.provider, self.env, { 'machine_id': m['machine_id'], 'instance_id': instance_id }, env_only=env_only)) for result in self.runner.iter_results(): pass return status, address_map
def force_environment_destroy(self): env_name = self.config.get_env_name() env_machines = [ m for m in self.provider.get_instances() if m.name.startswith("%s-" % env_name) ] log.info("Destroying environment") for m in env_machines: self.runner.queue_op( ops.MachineDestroy(self.provider, self.env, {'instance_id': m.id}, iaas_only=True)) for result in self.runner.iter_results(): pass # Fast destroy the client cache by removing the jenv file. self.env.destroy_environment_jenv() log.info("Environment Destroyed")