def get_run_vms_or_none(self, run_name):
        """Get list of VMs for a run name or return None"""

        if not self.cdb:
            raise ProgrammingError("cannot persist anything without setup/validation")
        cyvm_a = self.cdb.get_iaas_by_runname(run_name) 
        vm_a = []
        for cyvm in cyvm_a:
            rvm = RunVM()
            rvm.instanceid = cyvm.iaasid
            rvm.nodeid = cyvm.nodeid
            rvm.hostname = cyvm.hostname
            rvm.service_type = cyvm.service_type
            rvm.parent = cyvm.parent
            rvm.runlogdir = cyvm.runlogdir
            rvm.vmlogdir = cyvm.vmlogdir

            for e in cyvm.events:
                xtras = {}
                for x in e.extra:
                    xtras[x.key] = x.value
                c = CYvent(e.source, e.name, e.unique_event_key, e.timestamp, xtras)
                rvm.events.append(c)
            vm_a.append(rvm)

        return vm_a
def vms_launched(m, run_name, eventname):
    provisioner = _get_provisioner(m, run_name)
    vms = []
    for event in provisioner.events:
        if event.name == eventname:
            vm = RunVM()
            if eventname == "new_node":
                vm.instanceid = event.extra['iaas_id']
                vm.nodeid = event.extra['node_id']
            elif eventname == "node_started":
                vm.instanceid = event.extra['iaas_id']
                vm.nodeid = event.extra['node_id']
            else:
                raise IncompatibleEnvironment("eventname is illegal")
            vm.hostname = event.extra['public_ip']
            # todo: 'unknown' is hardcoded in fetchkill, too
            vm.service_type = "unknown" + vm.WORKER_SUFFIX
            m.runlogs.new_vm(vm)
            vms.append(vm)
    return vms