Beispiel #1
0
def parse_gnt_instance(instance):
    try:
        instance_id = utils.id_from_instance_name(instance['name'])
    except Exception:
        logger.error("Ignoring instance with malformed name %s",
                     instance['name'])
        return (None, None)

    beparams = instance["beparams"]

    vcpus = beparams["vcpus"]
    ram = beparams["maxmem"]
    state = instance["oper_state"] and "STARTED" or "STOPPED"

    return {
        "id": instance_id,
        "state": state,  # FIX
        "updated": datetime.fromtimestamp(instance["mtime"]),
        "disks": disks_from_instance(instance),
        "nics": nics_from_instance(instance),
        "flavor": {
            "vcpus": vcpus,
            "ram": ram
        },
        "tags": instance["tags"]
    }
Beispiel #2
0
def parse_gnt_instance(instance):
    try:
        instance_id = utils.id_from_instance_name(instance['name'])
    except Exception:
        logger.error("Ignoring instance with malformed name %s",
                     instance['name'])
        return (None, None)

    beparams = instance["beparams"]

    vcpus = beparams["vcpus"]
    ram = beparams["maxmem"]
    state = instance["oper_state"] and "STARTED" or "STOPPED"

    disks = disks_from_instance(instance)
    root_disk = [d for d in disks if d['index'] == 0]
    if root_disk:
        disk = (int(root_disk[0].get('size', 0)) >> 10)
    else:
        disk = 0

    flavor = {'vcpus': vcpus, 'ram': ram, 'disk': disk}

    return {
        "id": instance_id,
        "state": state,  # FIX
        "updated": datetime.fromtimestamp(instance["mtime"]),
        "disks": disks,
        "nics": nics_from_instance(instance),
        "flavor": flavor,
        "tags": instance["tags"]
    }
Beispiel #3
0
 def wrapper(msg):
     try:
         vm_id = utils.id_from_instance_name(msg["instance"])
         vm = VirtualMachine.objects.select_for_update().get(id=vm_id)
         func(vm, msg)
     except VirtualMachine.InvalidBackendIdError:
         log.debug("Ignoring msg for unknown instance %s.", msg["instance"])
     except VirtualMachine.DoesNotExist:
         log.error("VM for instance %s with id %d not found in DB.", msg["instance"], vm_id)
     except (Network.InvalidBackendIdError, Network.DoesNotExist) as e:
         log.error("Invalid message, can not find network. msg: %s", msg)
Beispiel #4
0
 def wrapper(msg):
     try:
         vm_id = utils.id_from_instance_name(msg["instance"])
         vm = VirtualMachine.objects.select_for_update().get(id=vm_id)
         func(vm, msg)
     except VirtualMachine.InvalidBackendIdError:
         log.debug("Ignoring msg for unknown instance %s.", msg['instance'])
     except VirtualMachine.DoesNotExist:
         log.error("VM for instance %s with id %d not found in DB.",
                   msg['instance'], vm_id)
     except Network.InvalidBackendIdError, Network.DoesNotExist:
         log.error("Invalid message", msg)
Beispiel #5
0
    def handle(self, *args, **options):
        if len(args) < 1:
            raise CommandError("Please specify a Ganeti instance")

        instance_name = args[0]

        try:
            id_from_instance_name(instance_name)
            raise CommandError("%s is already a synnefo instance")
        except:
            pass

        user_id = options['user_id']
        backend_id = options['backend_id']
        image_id = options['image_id']
        flavor_id = options['flavor_id']
        new_public_nic = options['new_nics']

        for field in self.REQUIRED:
            if not locals()[field.replace("-", "_")]:
                raise CommandError(field + " is mandatory")

        import_server(instance_name, backend_id, flavor_id, image_id, user_id,
                      new_public_nic, self.stdout)
Beispiel #6
0
 def wrapper(msg, atomic_context=None):
     try:
         vm_id = utils.id_from_instance_name(msg["instance"])
         vm = VirtualMachine.objects.select_for_update().get(id=vm_id)
         if vm.deleted:
             log.debug("Ignoring message for deleted instance '%s'", vm)
             return
         func(vm, msg, atomic_context=atomic_context)
     except VirtualMachine.InvalidBackendIdError:
         log.debug("Ignoring msg for unknown instance %s.", msg['instance'])
     except VirtualMachine.DoesNotExist:
         log.error("VM for instance %s with id %d not found in DB.",
                   msg['instance'], vm_id)
     except (Network.InvalidBackendIdError, Network.DoesNotExist):
         log.error("Invalid message, can not find network. msg: %s", msg)
Beispiel #7
0
    def handle(self, *args, **options):
        if len(args) < 1:
            raise CommandError("Please specify a Ganeti instance")

        instance_name = args[0]

        try:
            id_from_instance_name(instance_name)
            raise CommandError("%s is already a synnefo instance")
        except:
            pass

        user_id = options['user_id']
        backend_id = options['backend_id']
        image_id = options['image_id']
        flavor_id = options['flavor_id']
        new_public_nic = options['new_nics']

        for field in self.REQUIRED:
            if not locals()[field.replace("-", "_")]:
                raise CommandError(field + " is mandatory")

        import_server(instance_name, backend_id, flavor_id, image_id, user_id,
                      new_public_nic, self.stderr)
Beispiel #8
0
def get_vm(server_id):
    """Get a VirtualMachine object by its ID.

    @type server_id: int or string
    @param server_id: The server's DB id or the Ganeti name

    """
    try:
        server_id = int(server_id)
    except (ValueError, TypeError):
        try:
            server_id = id_from_instance_name(server_id)
        except VirtualMachine.InvalidBackendIdError:
            raise CommandError("Invalid server ID: %s" % server_id)

    try:
        return VirtualMachine.objects.get(id=server_id)
    except VirtualMachine.DoesNotExist:
        raise CommandError("Server with ID %s not found in DB."
                           " Use snf-manage server-list to find out"
                           " available server IDs." % server_id)
Beispiel #9
0
def get_vm(server_id):
    """Get a VirtualMachine object by its ID.

    @type server_id: int or string
    @param server_id: The server's DB id or the Ganeti name

    """
    try:
        server_id = int(server_id)
    except (ValueError, TypeError):
        try:
            server_id = id_from_instance_name(server_id)
        except VirtualMachine.InvalidBackendIdError:
            raise CommandError("Invalid server ID: %s" % server_id)

    try:
        return VirtualMachine.objects.get(id=server_id)
    except VirtualMachine.DoesNotExist:
        raise CommandError("Server with ID %s not found in DB."
                           " Use snf-manage server-list to find out"
                           " available server IDs." % server_id)
Beispiel #10
0
def get_resource(name, value, for_update=False):
    """Get object from DB based by it's ID

    Helper function for getting an object from DB by it's DB and raising
    appropriate command line errors if the object does not exist or the
    ID is invalid.

    """
    objects = RESOURCE_MAP[name]
    if name == "floating-ip":
        capital_name = "Floating IP"
    else:
        capital_name = name.capitalize()
    PREFIXED_RESOURCES = ["server", "network", "port", "volume"]

    if isinstance(value, basestring) and name in PREFIXED_RESOURCES:
        if value.startswith(settings.BACKEND_PREFIX_ID):
            try:
                if name == "server":
                    value = id_from_instance_name(value)
                elif name == "network":
                    value = id_from_network_name(value)
                elif name == "port":
                    value = id_from_nic_name(value)
                elif name == "volume":
                    value = id_from_disk_name(value)
            except ValueError:
                raise CommandError("Invalid {} ID: {}".format(capital_name,
                                                              value))

    if for_update:
        objects = objects.select_for_update()
    try:
        return objects.get(id=value)
    except ObjectDoesNotExist:
        msg = ("{0} with ID {1} does not exist. Use {2}-list to find out"
               " available {2} IDs.")
        raise CommandError(msg.format(capital_name, value, name))
    except (ValueError, TypeError):
        raise CommandError("Invalid {} ID: {}".format(capital_name, value))
Beispiel #11
0
def get_resource(name, value, for_update=False):
    """Get object from DB based by it's ID

    Helper function for getting an object from DB by it's DB and raising
    appropriate command line errors if the object does not exist or the
    ID is invalid.

    """
    objects = RESOURCE_MAP[name]
    if name == "floating-ip":
        capital_name = "Floating IP"
    else:
        capital_name = name.capitalize()
    PREFIXED_RESOURCES = ["server", "network", "port", "volume"]

    if isinstance(value, basestring) and name in PREFIXED_RESOURCES:
        if value.startswith(settings.BACKEND_PREFIX_ID):
            try:
                if name == "server":
                    value = id_from_instance_name(value)
                elif name == "network":
                    value = id_from_network_name(value)
                elif name == "port":
                    value = id_from_nic_name(value)
                elif name == "volume":
                    value = id_from_disk_name(value)
            except ValueError:
                raise CommandError("Invalid {} ID: {}".format(
                    capital_name, value))

    if for_update:
        objects = objects.select_for_update()
    try:
        return objects.get(id=value)
    except ObjectDoesNotExist:
        msg = ("{0} with ID {1} does not exist. Use {2}-list to find out"
               " available {2} IDs.")
        raise CommandError(msg.format(capital_name, value, name))
    except (ValueError, TypeError):
        raise CommandError("Invalid {} ID: {}".format(capital_name, value))
Beispiel #12
0
def parse_gnt_instance(instance):
    try:
        instance_id = utils.id_from_instance_name(instance['name'])
    except Exception:
        logger.error("Ignoring instance with malformed name %s",
                     instance['name'])
        return (None, None)

    beparams = instance["beparams"]

    vcpus = beparams["vcpus"]
    ram = beparams["maxmem"]
    state = instance["oper_state"] and "STARTED" or "STOPPED"

    disks = disks_from_instance(instance)
    root_disk = [d for d in disks if d['index'] == 0]
    if root_disk:
        disk = (int(root_disk[0].get('size', 0)) >> 10)
    else:
        disk = 0

    flavor = {
        'vcpus': vcpus,
        'ram': ram,
        'disk': disk
    }
    return {
        "id": instance_id,
        "state": state,  # FIX
        "updated": datetime.fromtimestamp(instance["mtime"]),
        "disks": disks,
        "nics": nics_from_instance(instance),
        "flavor": flavor,
        "hvparams": instance.get("hvparams"),
        "tags": instance["tags"]
    }
Beispiel #13
0
def parse_gnt_instance(instance):
    try:
        instance_id = utils.id_from_instance_name(instance['name'])
    except Exception:
        logger.error("Ignoring instance with malformed name %s",
                     instance['name'])
        return (None, None)

    beparams = instance["beparams"]

    vcpus = beparams["vcpus"]
    ram = beparams["maxmem"]
    state = instance["oper_state"] and "STARTED" or "STOPPED"

    return {
        "id": instance_id,
        "state": state,  # FIX
        "updated": datetime.fromtimestamp(instance["mtime"]),
        "disks": disks_from_instance(instance),
        "nics": nics_from_instance(instance),
        "flavor": {"vcpus": vcpus,
                   "ram": ram},
        "tags": instance["tags"]
    }
Beispiel #14
0
def get_nics_from_ganeti(backend=None):
    """Get network interfaces for each ganeti instance.

    """
    instances = get_ganeti_instances(backend=backend, bulk=True)
    prefix = settings.BACKEND_PREFIX_ID

    snf_instances_nics = {}
    for i in instances:
        if i['name'].startswith(prefix):
            try:
                id = utils.id_from_instance_name(i['name'])
            except Exception:
                log.error("Ignoring instance with malformed name %s",
                          i['name'])
                continue
            if id in snf_instances_nics:
                log.error("Ignoring instance with duplicate Synnefo id %s",
                          i['name'])
                continue

            snf_instances_nics[id] = get_nics_from_instance(i)

    return snf_instances_nics
Beispiel #15
0
def get_instances_from_ganeti(backend=None):
    ganeti_instances = get_ganeti_instances(backend=backend, bulk=True)
    snf_instances = {}
    snf_nics = {}

    prefix = settings.BACKEND_PREFIX_ID
    for i in ganeti_instances:
        if i['name'].startswith(prefix):
            try:
                id = utils.id_from_instance_name(i['name'])
            except Exception:
                log.error("Ignoring instance with malformed name %s",
                          i['name'])
                continue

            if id in snf_instances:
                log.error("Ignoring instance with duplicate Synnefo id %s",
                          i['name'])
                continue

            snf_instances[id] = i['oper_state']
            snf_nics[id] = get_nics_from_instance(i)

    return snf_instances, snf_nics
Beispiel #16
0
 def test_id_from_iname(self):
     self.assertEqual(utils.id_from_instance_name('snf-42'), 42)
     for name in [None, 'foo', 'snf42', 'snf-a', 'snf-snf-42', 1234]:
         self.assertRaises(VirtualMachine.InvalidBackendIdError,
                           utils.id_from_instance_name, '')
Beispiel #17
0
 def test_id_from_iname(self):
     self.assertEqual(utils.id_from_instance_name('snf-42'), 42)
     for name in [None, 'foo', 'snf42', 'snf-a', 'snf-snf-42', 1234]:
         self.assertRaises(VirtualMachine.InvalidBackendIdError,
                           utils.id_from_instance_name, '')