Пример #1
0
    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
Пример #2
0
    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")