Example #1
0
def edit(caller_id, system_image_id, name, description, disk_controller, video_device, network_device, platform):
    """
    Updates attributes of the specified SystemImage.

    @cmview_user
    @param_post{system_image_id,int} id of the SystemImage to edit
    @param_post{name,string} SystemImage new name (optional)
    @param_post{description,string} SystemImage new description (optional)
    @param_post{disk_controller} SystemImage new controller (optional)
    @param_post{video_device} SystemImage new video device (optional)
    @param_post{network_device} SystemImage new network device (optional)
    @param_post{platform} (optional)
    """

    image = SystemImage.get(caller_id, system_image_id)

    if image.state != image_states['ok']:
        raise CMException('image_edit')

    image.name = name
    image.description = description
    image.disk_controller = disk_controller
    image.video_device = video_device
    image.network_device = network_device
    image.platform = platform
    try:
        image.save()
    except:
        raise CMException('image_edit')
Example #2
0
def edit(caller_id, system_image_id, name, description, disk_controller,
         video_device, network_device, platform):
    """
    Sets Image's new attributes. Those should be get by src.cm.manager.image.get_by_id().

    @cmview_admin_cm
    @param_post{system_image_id,string} new Image name
    @param_post{name,string} new Image name
    @param_post{description,string} new Image description
    @param_post{disk_controller} new Image controller optional
    @param_post{video_device} new video device optional
    @param_post{network_device} new network device optional
    @param_post{platform} optional
    """

    image = SystemImage.admin_get(system_image_id)

    if image.state != image_states['ok']:
        raise CMException('image_edit')

    image.name = name
    image.description = description
    image.disk_controller = disk_controller
    image.video_device = video_device
    image.network_device = network_device
    image.platform = platform
    try:
        image.save()
    except:
        raise CMException('image_edit')
Example #3
0
def edit(caller_id, system_image_id, name, description, disk_controller, video_device, network_device, platform):
    """
    Updates attributes of the specified SystemImage.

    @cmview_user
    @param_post{system_image_id,int} id of the SystemImage to edit
    @param_post{name,string} SystemImage new name (optional)
    @param_post{description,string} SystemImage new description (optional)
    @param_post{disk_controller} SystemImage new controller (optional)
    @param_post{video_device} SystemImage new video device (optional)
    @param_post{network_device} SystemImage new network device (optional)
    @param_post{platform} (optional)
    """

    image = SystemImage.get(caller_id, system_image_id)

    if image.state != image_states["ok"]:
        raise CMException("image_edit")

    image.name = name
    image.description = description
    image.disk_controller = disk_controller
    image.video_device = video_device
    image.network_device = network_device
    image.platform = platform
    try:
        image.save()
    except:
        raise CMException("image_edit")
Example #4
0
def set_group(caller_id, system_image_id, group_id):
    """
    Method sets specified Image access type as group (belonging to specified Group).
    @cmview_admin_cm

    @parameter{group_id,int} id of the Group Image should belong to
    @parameter{image_id,int}
    @parameter{type,image_types} type of image, automatically set, type is in the URL requested

    @response{None}

    @raises{image_set_group,CMException} cannot set group access type
    """
    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['group']

    # create new group-image object
    ig = SystemImageGroup()
    ig.image = image
    ig.group_id = group_id

    try:
        ig.save()
    except:
        raise CMException('image_set_group')
Example #5
0
def download(caller_id, description, name, path, disk_controller, network_device, platform, video_device):
    """
    Downloads image depending on the \c data parameter.
    @cmview_admin_cm

    @parameter{description,string}
    @parameter{name,string}
    @parameter{path,string} HTTP or FTP path to image to download
    @parameter{type,image_types} type of image, automatically set, type is in the URL requested

    @response{None}
    """

    # size value is taken
    try:
        connection = urllib.urlopen(path)
        size = int(connection.info()["Content-Length"])
    except IOError:
        log.exception(caller_id, 'Cannot find image')
        raise CMException('image_not_found')
    except KeyError:
        log.exception(caller_id, 'Cannot calculate size')
        raise CMException('image_calculate_size')

    user = User.get(caller_id)

    image = SystemImage.create(name=name, description=description, user=user, platform=platform,
                               disk_controller=disk_controller, network_device=network_device,
                               video_device=video_device)

    try:
        image.save()
    except Exception, e:
        log.error(caller_id, "Unable to save image to DB: %s" % str(e))
        raise CMException('image_create')
Example #6
0
def edit(caller_id, system_image_id, name, description, disk_controller, video_device, network_device, platform):
    """
    Sets Image's new attributes. Those should be get by src.cm.manager.image.get_by_id().

    @cmview_admin_cm
    @param_post{system_image_id,string} new Image name
    @param_post{name,string} new Image name
    @param_post{description,string} new Image description
    @param_post{disk_controller} new Image controller optional
    @param_post{video_device} new video device optional
    @param_post{network_device} new network device optional
    @param_post{platform} optional
    """

    image = SystemImage.admin_get(system_image_id)

    if image.state != image_states['ok']:
        raise CMException('image_edit')

    image.name = name
    image.description = description
    image.disk_controller = disk_controller
    image.video_device = video_device
    image.network_device = network_device
    image.platform = platform
    try:
        image.save()
    except:
        raise CMException('image_edit')
Example #7
0
def get_by_id(caller_id, system_image_id):
    """
    @cmview_admin_cm
    @param_post{system_image_id,int} id of the Image to get

    @response{dict} extended information about specified Image
    """
    return SystemImage.admin_get(system_image_id).dict
Example #8
0
def get_by_id(caller_id, system_image_id):
    """
    @cmview_admin_cm
    @param_post{system_image_id,int} id of the Image to get

    @response{dict} extended information about specified Image
    """
    return SystemImage.admin_get(system_image_id).dict
Example #9
0
def get_by_id(caller_id, system_image_id, groups):
    """
    @cmview_user
    @param_post{groups,list(int)} list of Groups ids, required for @val{group} access
    @param_post{system_image_id,int} id of the requested Image

    @response{dict} SystemImage.dict property of the requested SystemImage
    """
    return SystemImage.get(caller_id, system_image_id, groups).dict
Example #10
0
def get_by_id(caller_id, system_image_id, groups):
    """
    @cmview_user
    @param_post{groups,list(int)} list of Groups ids, required for @val{group} access
    @param_post{system_image_id,int} id of the requested Image

    @response{dict} SystemImage.dict property of the requested SystemImage
    """
    return SystemImage.get(caller_id, system_image_id, groups).dict
Example #11
0
def get_by_id(caller_id, system_image_id):
    """
    @cmview_admin_cm

    @parameter{image_id,int} id of the Image to get
    @parameter{type,image_types} type of image, automatically set, type is in the URL requested

    @response{dict} extended information about specified Image
    """
    return SystemImage.admin_get(system_image_id).dict
Example #12
0
def get_by_id(caller_id, system_image_id, groups):
    """
    @cmview_user

    @parameter{groups,list(int)} list of Group ids necessary when access is group, for system and cd images
    @parameter{system_image_id,int} id of the Image to get

    @response{dict} extended information about specified Image
    """
    return SystemImage.get(caller_id, system_image_id, groups).dict
Example #13
0
def copy(caller_id, src_image_id, dest_user_id):
    """
    Copy selected image to user's images

    @cmview_admin_cm
    @param_post{src_image_id,int}
    @param_post{dest_user_id,int}
    """
    src_image = SystemImage.admin_get(src_image_id)
    dest_user = User.get(dest_user_id)
    dest_image = SystemImage.create(name=src_image.name, description=src_image.description, user=dest_user,
                                    platform=src_image.platform, disk_controller=src_image.disk_controller,
                                    network_device=src_image.network_device, video_device=src_image.video_device)

    try:
        dest_image.save()
    except Exception, e:
        log.error(caller_id, "Unable to commit: %s" % str(e))
        raise CMException('image_create')
Example #14
0
def delete(caller_id, system_image_id_list):
    """
    Deletes given Image
    @cmview_admin_cm

    @parameter{system_image_id} id of the Image to delete
    @parameter{type,image_types} type of image, automatically set, type is in the URL requested
    """
    for system_image_id in system_image_id_list:
        image = SystemImage.admin_get(system_image_id)
        image.state = image_states['locked']
        image.save()
Example #15
0
def delete(caller_id, system_image_id_list):
    """
    Sets SystemImage state as 'locked'.

    @cmview_admin_cm
    @param_post{system_image_id_list,list(int)} list of the specified Images ids

    @todo Should delete SystemImage and set its state to @val{deleted}.
    """
    for system_image_id in system_image_id_list:
        image = SystemImage.admin_get(system_image_id)
        image.state = image_states['locked']
        image.save()
Example #16
0
def delete(caller_id, system_image_id_list):
    """
    Sets SystemImage state as 'locked'.

    @cmview_admin_cm
    @param_post{system_image_id_list,list(int)} list of the specified Images ids

    @todo Should delete SystemImage and set its state to @val{deleted}.
    """
    for system_image_id in system_image_id_list:
        image = SystemImage.admin_get(system_image_id)
        image.state = image_states['locked']
        image.save()
Example #17
0
def convert_to_storage_image(caller_id, system_image_id):
    """
    Changes type of the given Image.

    @cmview_user
    @param_post{system_image_id,int} ID of an Image to change type of
    """
    image = SystemImage.get(caller_id, system_image_id)
    try:
        image.recast('cm.storageimage')
        image.save()
    except Exception:
        log.exception(caller_id, "convert_to_storage_image")
        raise CMException('image_change_type')
Example #18
0
def copy(caller_id, src_image_id, dest_user_id):
    """
    Copy selected image to user's images

    @cmview_admin_cm
    @param_post{src_image_id,int}
    @param_post{dest_user_id,int}
    """
    src_image = SystemImage.admin_get(src_image_id)
    dest_user = User.get(dest_user_id)
    dest_image = SystemImage.create(name=src_image.name,
                                    description=src_image.description,
                                    user=dest_user,
                                    platform=src_image.platform,
                                    disk_controller=src_image.disk_controller,
                                    network_device=src_image.network_device,
                                    video_device=src_image.video_device)

    try:
        dest_image.save()
    except Exception, e:
        log.error(caller_id, "Unable to commit: %s" % str(e))
        raise CMException('image_create')
Example #19
0
def download(caller_id, description, name, path, disk_controller, network_device, platform, video_device):
    """
    Downloads image depending on the \c data parameter.
    @cmview_user

    @parameter{path,string} HTTP or FTP path to image to download
    @parameter{name,string}
    @parameter{description,string}

    @parameter{type,image_types} type of image, automatically set, type is in the URL requested

    @response{None}

    @raises{image_not_found,CMException}
    @raises{image_create,CMException}
    """
    user = User.get(caller_id)

    if not any([path.startswith("http://"), path.startswith("https://"), path.startswith("ftp://")]):
        path = "http://" + path.strip()

    # size value is taken
    try:
        connection = urllib.urlopen(path)
        size = int(connection.info()["Content-Length"])
    except IOError:
        log.exception(caller_id, "Cannot find image")
        raise CMException("image_not_found")
    except KeyError:
        log.exception(caller_id, "Cannot calculate size")
        raise CMException("image_calculate_size")

    user = User.get(caller_id)
    user.check_storage(size / (1024 * 1024))

    image = SystemImage.create(
        name=name,
        description=description,
        user=user,
        platform=platform,
        disk_controller=disk_controller,
        network_device=network_device,
        video_device=video_device,
    )

    try:
        image.save()
    except Exception, e:
        log.error(caller_id, "Unable to save image to DB: %s" % str(e))
        raise CMException("image_create")
Example #20
0
def convert_to_storage_image(caller_id, system_image_id):
    """
    Changes type of the given Image.

    @cmview_user
    @param_post{system_image_id,int} ID of an Image to change type of
    """
    image = SystemImage.get(caller_id, system_image_id)
    try:
        image.recast("cm.storageimage")
        image.save()
    except Exception:
        log.exception(caller_id, "convert_to_storage_image")
        raise CMException("image_change_type")
Example #21
0
def delete(caller_id, system_image_id):
    """
    Deletes specified SystemImage

    @cmview_user
    @param_post{system_image_ids,list(int)} id of the SystemImage to delete
    """
    image = SystemImage.get(caller_id, system_image_id)

    if image.state != image_states["ok"]:
        raise CMException("image_delete")

    try:
        subprocess.call(["rm", image.path])
    except Exception, e:
        raise CMException("image_delete")
Example #22
0
def delete(caller_id, system_image_id):
    """
    Deletes specified SystemImage

    @cmview_user
    @param_post{system_image_ids,list(int)} id of the SystemImage to delete
    """
    image = SystemImage.get(caller_id, system_image_id)

    if image.state != image_states['ok']:
        raise CMException('image_delete')

    try:
        subprocess.call(['rm', image.path])
    except Exception, e:
        raise CMException('image_delete')
Example #23
0
def set_public(caller_id, system_image_id):
    """
    Makes SystemImage available in public pool.

    @cmview_admin_cm
    @param_post{system_image_id,int}
    """

    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['public']
    # delete the existing group association
    try:
        image.systemimagegroup_set.all().delete()
        image.save()
    except:
        raise CMException('image_set_public')
Example #24
0
def convert_to_storage_image(caller_id, system_image_id):
    """
    Changes type of the given Image.
    @cmview_user

    @parameter{system_image_id,int} ID of an Image to change type of

    @response{None}
    """
    image = SystemImage.get(caller_id, system_image_id)
    try:
        image.recast('cm.storageimage')
        image.save()
    except Exception:
        log.exception(caller_id, "convert_to_storage_image")
        raise CMException('image_change_type')
Example #25
0
def set_public(caller_id, system_image_id):
    """
    Makes SystemImage available in public pool.

    @cmview_admin_cm
    @param_post{system_image_id,int}
    """

    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['public']
    # delete the existing group association
    try:
        image.systemimagegroup_set.all().delete()
        image.save()
    except:
        raise CMException('image_set_public')
Example #26
0
def set_private(caller_id, system_image_id):
    """
    Removes SystemImage from public pool.

    @cmview_admin_cm
    @param_post{system_image_id,int}
    """

    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['private']
    # delete the existing group association
    try:
        image.save()
        image.systemimagegroup_set.all().delete()
    except:
        log.exception(caller_id, 'image_set_private')
        raise CMException('image_set_private')
Example #27
0
def set_private(caller_id, system_image_id):
    """
    Removes SystemImage from public pool.

    @cmview_admin_cm
    @param_post{system_image_id,int}
    """

    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['private']
    # delete the existing group association
    try:
        image.save()
        image.systemimagegroup_set.all().delete()
    except:
        log.exception(caller_id, 'image_set_private')
        raise CMException('image_set_private')
Example #28
0
def delete(caller_id, system_image_id):
    """
    Deletes given Image

    @cmview_user

    @parameter{system_image_id} id of the Image to delete
    """
    image = SystemImage.get(caller_id, system_image_id)

    if image.state != image_states['ok']:
        raise CMException('image_delete')

    try:
        subprocess.call(['rm', image.path])
    except Exception, e:
        raise CMException('image_delete')
Example #29
0
def download(caller_id, description, name, path, disk_controller, network_device, platform, video_device):
    """
    Downloads image depending on the \c data parameter.
    @cmview_user

    @parameter{path,string} HTTP or FTP path to image to download
    @parameter{name,string}
    @parameter{description,string}

    @parameter{type,image_types} type of image, automatically set, type is in the URL requested

    @response{None}

    @raises{image_not_found,CMException}
    @raises{image_create,CMException}
    """
    user = User.get(caller_id)

    if not any([path.startswith('http://'), path.startswith('https://'), path.startswith('ftp://')]):
        path = 'http://' + path.strip()

    # size value is taken
    try:
        connection = urllib.urlopen(path)
        size = int(connection.info()["Content-Length"])
    except IOError:
        log.exception(caller_id, 'Cannot find image')
        raise CMException('image_not_found')
    except KeyError:
        log.exception(caller_id, 'Cannot calculate size')
        raise CMException('image_calculate_size')

    user = User.get(caller_id)
    user.check_storage(size / (1024 * 1024))

    image = SystemImage.create(name=name, description=description, user=user, platform=platform,
                        disk_controller=disk_controller, network_device=network_device, video_device=video_device)

    try:
        image.save()
    except Exception, e:
        log.error(caller_id, "Unable to save image to DB: %s" % str(e))
        raise CMException('image_create')
Example #30
0
def download(caller_id, description, name, path, disk_controller,
             network_device, platform, video_device):
    """
    Downloads specified SystemImage.

    @cmview_admin_cm
    @param_post{description,string}
    @param_post{name,string}
    @param_post{path,string} HTTP or FTP path to image to download
    @param_post{disk_controller}
    @param_post{network_device}
    @param_post{platform}
    @param_post{video_device}
    """

    # size value is taken
    try:
        connection = urllib.urlopen(path)
        size = int(connection.info()["Content-Length"])
    except IOError:
        log.exception(caller_id, 'Cannot find image')
        raise CMException('image_not_found')
    except KeyError:
        log.exception(caller_id, 'Cannot calculate size')
        raise CMException('image_calculate_size')

    user = User.get(caller_id)

    image = SystemImage.create(name=name,
                               description=description,
                               user=user,
                               platform=platform,
                               disk_controller=disk_controller,
                               network_device=network_device,
                               video_device=video_device)

    try:
        image.save()
    except Exception, e:
        log.error(caller_id, "Unable to save image to DB: %s" % str(e))
        raise CMException('image_create')
Example #31
0
def set_private(caller_id, system_image_id, leader_groups):
    """
    Marks SystemImage as @val{private}. The caller needs to be:
    - either the <b>owner of the SystemImage</b>
    - or the <b>leader of the group</b> to which SystemImage belongs

    @cmview_user
    @param_post{system_image_id,int} id of the Image to set private
    @param_post{leader_groups,list(int)} ids of the group where the caller is
    leader, requierd if Image's access type is group
    """

    image = SystemImage.get(caller_id, system_image_id, leader_groups)
    image.access = image_access['private']
    # delete the existing group association
    try:
        image.save()
        image.systemimagegroup_set.all().delete()
    except:
        log.exception(caller_id, 'image_set_private')
        raise CMException('image_set_private')
Example #32
0
def set_private(caller_id, system_image_id, leader_groups):
    """
    Marks SystemImage as @val{private}. The caller needs to be:
    - either the <b>owner of the SystemImage</b>
    - or the <b>leader of the group</b> to which SystemImage belongs

    @cmview_user
    @param_post{system_image_id,int} id of the Image to set private
    @param_post{leader_groups,list(int)} ids of the group where the caller is
    leader, requierd if Image's access type is group
    """

    image = SystemImage.get(caller_id, system_image_id, leader_groups)
    image.access = image_access["private"]
    # delete the existing group association
    try:
        image.save()
        image.systemimagegroup_set.all().delete()
    except:
        log.exception(caller_id, "image_set_private")
        raise CMException("image_set_private")
Example #33
0
def set_public(caller_id, system_image_id):
    """
    Sets Image as private, only for system and cd image
    To succeed it requires caller to be:
    - either the owner of the image
    - or the leader of the group to which Image belongs

    @cmview_admin_cm

    @parameter{system_image_id,int}
    @parameter{leader_groups,list(int)} ids of the group where the caller is leader, requierd if Image's access type is group
    """

    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['public']
    # delete the existing group association
    try:
        image.systemimagegroup_set.all().delete()
        image.save()
    except:
        raise CMException('image_set_public')
Example #34
0
def convert_to_system_image(caller_id, storage_image_id):
    """
    Converts specified StorageImage to SystemImage. After convertion it's not
    available as StorageImage anymore. File is moved and StorageImage entry is
    removed from database.

    @cmview_admin_cm
    @param_post{storage_image_id,int} ID of an StorageImage to convert
    """
    image = StorageImage.admin_get(storage_image_id)

    system_image = SystemImage.create(name=image.name, description=image.description, user=image.user, disk_controller=image.disk_controller)
    system_image.state = image_states['ok']
    system_image.size = image.size

    try:
        system_image.save()
        os.rename(image.path, system_image.path)
        image.delete()
    except Exception:
        raise CMException('image_change_type')
Example #35
0
def convert_to_system_image(caller_id, storage_image_id):
    """
    Changes type of the given Image.
    @cmview_admin_cm

    @parameter{system_image_id,int} ID of an Image to change type of

    @response{None}
    """
    image = StorageImage.admin_get(storage_image_id)

    system_image = SystemImage.create(name=image.name, description=image.description, user=image.user, disk_controller=image.disk_controller)
    system_image.state = image_states['ok']
    system_image.size = image.size

    try:
        system_image.save()
        os.rename(image.path, system_image.path)
        image.delete()
    except Exception:
        raise CMException('image_change_type')
Example #36
0
def set_private(caller_id, system_image_id, leader_groups):
    """
    Sets Image as private, only for system and cd image
    To succeed it requires caller to be:
    - either the <b>owner of the image</b>
    - or the <b>leader of the group</b> to which Image belongs

    @cmview_user

    @parameter{system_image_id,int} id of the Image to set private
    @parameter{leader_groups,list(int)} ids of the group where the caller is
    leader, requierd if Image's access type is group
    """

    image = SystemImage.get(caller_id, system_image_id, leader_groups)
    image.access = image_access['private']
    # delete the existing group association
    try:
        image.save()
        image.systemimagegroup_set.all().delete()
    except:
        log.exception(caller_id, 'image_set_private')
        raise CMException('image_set_private')
Example #37
0
def download(caller_id, description, name, path, disk_controller, network_device, platform, video_device):
    """
    Downloads specified SystemImage.

    @cmview_admin_cm
    @param_post{description,string}
    @param_post{name,string}
    @param_post{path,string} HTTP or FTP path to image to download
    @param_post{disk_controller}
    @param_post{network_device}
    @param_post{platform}
    @param_post{video_device}
    """

    # size value is taken
    try:
        connection = urllib.urlopen(path)
        size = int(connection.info()["Content-Length"])
    except IOError:
        log.exception(caller_id, 'Cannot find image')
        raise CMException('image_not_found')
    except KeyError:
        log.exception(caller_id, 'Cannot calculate size')
        raise CMException('image_calculate_size')

    user = User.get(caller_id)

    image = SystemImage.create(name=name, description=description, user=user, platform=platform,
                               disk_controller=disk_controller, network_device=network_device,
                               video_device=video_device)

    try:
        image.save()
    except Exception, e:
        log.error(caller_id, "Unable to save image to DB: %s" % str(e))
        raise CMException('image_create')
Example #38
0
def set_group(caller_id, system_image_id, group_id):
    """
    Method sets specified Image access type as group (belonging to specified Group)
    (only for sys and cd images - from private or public to group)

    @cmview_user
    @param_post{group_id,int} id of the Group Image should belong to
    @param_post{system_image_id,int}

    @response{None}
    """
    image = SystemImage.get(caller_id, system_image_id)
    image.access = image_access['group']

    # create new group-image object
    ig = SystemImageGroup()
    ig.image = image
    ig.group_id = group_id

    try:
        ig.save()
        image.save()
    except:
        raise CMException('image_set_group')
Example #39
0
def set_group(caller_id, system_image_id, group_id):
    """
    Method sets specified Image access type as group (belonging to specified Group)
    (only for sys and cd images - from private or public to group)

    @cmview_user
    @param_post{group_id,int} id of the Group Image should belong to
    @param_post{system_image_id,int}

    @response{None}
    """
    image = SystemImage.get(caller_id, system_image_id)
    image.access = image_access["group"]

    # create new group-image object
    ig = SystemImageGroup()
    ig.image = image
    ig.group_id = group_id

    try:
        ig.save()
        image.save()
    except:
        raise CMException("image_set_group")
Example #40
0
def set_group(caller_id, system_image_id, group_id):
    """
    Method sets specified Image access type as group (belonging to specified Group).

    @cmview_admin_cm
    @param_post{system_image_id,int}
    @param_post{group_id,int} id of the Group Image should belong to

    @response{None}

    @raises{image_set_group,CMException} cannot set group access type
    """
    image = SystemImage.admin_get(system_image_id)
    image.access = image_access['group']

    # create new group-image object
    ig = SystemImageGroup()
    ig.image = image
    ig.group_id = group_id

    try:
        ig.save()
    except:
        raise CMException('image_set_group')
Example #41
0
def convert_to_storage_image(caller_id, system_image_id):
    """
    Changes type of the given Image.

    @cmview_admin_cm
    @param_post{system_image_id,int} ID of an Image to change type of

    @response{None}
    """
    image = SystemImage.admin_get(system_image_id)

    storage_image = StorageImage.create(name=image.name,
                                        description=image.description,
                                        user=image.user,
                                        disk_controller=image.disk_controller)
    storage_image.state = image_states['ok']
    storage_image.size = image.size

    try:
        storage_image.save()
        os.rename(image.path, storage_image.path)
        image.delete()
    except Exception:
        raise CMException('image_change_type')
Example #42
0
    def save_image(self):
        """
        Method saves VM to image with VM's name, description and parameters.
        """
        self.set_state('saving')
        try:
            self.save(update_fields=['state'])
            transaction.commit()
        except Exception, e:
            log.exception(self.user.id, 'save img')
            return

        img = SystemImage.create(
            name=(self.name + "_autosave" if self.save_vm == 1 else self.name),
            description=self.description,
            user=self.user,
            platform=self.system_image.platform,
            disk_controller=self.system_image.disk_controller,
            network_device=self.system_image.network_device,
            video_device=self.system_image.video_device)
        img.size = self.system_image.size
        img.save()

        try:
            img.copy_to_storage(self, img)
        except Exception, e:
            self.set_state('saving failed')
            self.node.lock()
            message.error(self.user.id, 'vm_save', {
                'id': self.id,
                'name': self.name
            })
Example #43
0
    def create(user,
               name,
               description,
               image_id,
               template_id,
               public_ip_id,
               iso_list,
               disk_list,
               vnc,
               groups,
               ssh_key=None,
               ssh_username=None,
               count=1,
               farm=None,
               head_template_id=None,
               node_id=False,
               lease_id=None,
               user_data=None):
        from cm.models.storage_image import StorageImage
        from cm.utils.threads.vm import VMThread

        template = Template.get(template_id)
        image = SystemImage.get(user.id, image_id, groups)

        if image.state != image_states['ok']:
            raise CMException('image_unavailable')

        if farm:
            head_template = Template.get(head_template_id)
            wn_template = template
            user.check_quota([(head_template, 1), (wn_template, count)])
            count += 1
        else:
            user.check_quota([(template, count)])

        vms = []

        reservation_id = None

        for i in range(count):
            # create VM instance
            log.debug(user.id, "Looking for node")
            node = Node.get_free_node(
                head_template, image,
                node_id) if farm and i == 0 else Node.get_free_node(
                    template, image, node_id)
            log.info(user.id, 'Selected node: %d' % node.id)
            vm = VM()
            vm.libvirt_id = -1
            if farm:
                if i == 0:
                    vm.name = '%s-head' % name
                    vm.description = 'Farm head'
                    vm.template = head_template
                else:
                    vm.name = '%s-wn%d' % (name, i)
                    vm.description = 'Worker Node'
                    vm.template = wn_template
            else:
                vm.template = template
                vm.description = description
                if count > 1:
                    vm.name = '%s_%d' % (name, i + 1)
                else:
                    vm.name = name
            vm.user = user
            vm.state = vm_states['init']
            vm.start_time = datetime.now()
            vm.system_image = image
            vm.node = node
            vm.save_vm = True
            if farm:
                vm.farm = farm

            # Find first free vnc port
            used_ports = VM.objects.exclude(
                state__in=[vm_states['closed'], vm_states['erased']
                           ]).values_list('vnc_port', flat=True)

            for new_vnc_port in xrange(VNC_PORTS['START'],
                                       VNC_PORTS['END'] + 1):
                if new_vnc_port not in used_ports and new_vnc_port not in VNC_PORTS[
                        'EXCLUDE']:
                    break
            else:
                raise CMException('vm_vnc_not_found')

            log.debug(user.id, "Found vnc port: %d" % new_vnc_port)
            vm.vnc_port = new_vnc_port

            # Find first free novnc port
            used_ports = VM.objects.exclude(
                state__in=[vm_states['closed'], vm_states['erased']
                           ]).values_list('novnc_port', flat=True)
            for new_novnc_port in xrange(NOVNC_PORTS['START'],
                                         NOVNC_PORTS['END'] + 1):
                if new_novnc_port not in used_ports and new_novnc_port not in NOVNC_PORTS[
                        'EXCLUDE']:
                    break
            else:
                raise CMException('vm_novnc_not_found')

            log.debug(user.id, "Found novnc port: %d" % new_novnc_port)
            vm.novnc_port = new_novnc_port

            if vnc:
                vm.attach_vnc()
            vm.vnc_passwd = password_gen(13,
                                         chars=['letters', 'digits'],
                                         extra_chars='!@#$%^&*()')
            vm.ssh_key = ssh_key
            vm.ssh_username = ssh_username
            vm.user_data = user_data
            vm.save()

            if not reservation_id:
                reservation_id = vm.id

            vm.reservation_id = reservation_id
            vm.save()

            if farm and i == 0:
                farm.head = vm
            vms.append(vm)

            log.debug(user.id, "Attaching disks")
            disk_devs = []
            if i == 0 and disk_list:
                for disk_id in disk_list:
                    log.debug(user.id, 'Attaching disks to first VM')
                    disk = StorageImage.get(user.id, disk_id)
                    if disk.vm != None:
                        raise CMException('image_attached')
                    while disk.disk_dev in disk_devs:
                        disk.disk_dev += 1
                    disk_devs.append(disk.disk_dev)
                    disk.vm = vm
                    disk.save()

            log.debug(user.id, "Attaching CD")
            if i == 0 and iso_list:
                for iso_id in iso_list:
                    log.debug(user.id, 'Attaching iso to first VM')
                    # cd image have not be attached to any other vm
                    iso = IsoImage.get(user.id, iso_id)
                    iso.check_attached()
                    vm.iso_image = iso
                    vm.save()

        for i, vm in enumerate(vms):
            if lease_id != None:
                lease = Lease.objects.get(id=lease_id)

                if lease.user_network.user != user:
                    raise CMException('lease_permission')

                if lease.vm != None:
                    raise CMException('lease_attached')
                lease.vm = vm
                log.debug(user.id, "Attached ip: %s" % lease.address)
            else:
                lease = AvailableNetwork.get_lease(user)
                lease.vm = vm
                lease.save()
                log.debug(user.id, "Attached ip: %s" % lease.address)

            if i == 0 and public_ip_id > 0:
                log.debug(user.id, "Attaching PublicIP")
                try:
                    publicip = PublicIP.objects.filter(user=user).get(
                        id=public_ip_id)
                    publicip.assign(lease)
                    publicip.save()
                except Exception, e:
                    log.exception(user.id, str(e))
                    raise CMException("lease_not_found")
Example #44
0
File: vm.py Project: cc1-cloud/cc1
    def save_image(self):
        """
        Method saves VM to image with VM's name, description and parameters.
        """
        self.set_state('saving')
        try:
            self.save(update_fields=['state'])
            transaction.commit()
        except Exception, e:
            log.exception(self.user.id, 'save img')
            return

        img = SystemImage.create(name=(self.name + "_autosave" if self.save_vm == 1 else self.name),
                                 description=self.description, user=self.user, platform=self.system_image.platform,
                                 disk_controller=self.system_image.disk_controller,
                                 network_device=self.system_image.network_device,
                                 video_device=self.system_image.video_device)
        img.size = self.system_image.size
        img.save()

        try:
            img.copy_to_storage(self, img)
        except Exception, e:
            self.set_state('saving failed')
            self.node.lock()
            message.error(self.user.id, 'vm_save', {'id': self.id, 'name': self.name})
            try:
                img.delete()
                transaction.commit()
            except Exception, e:
Example #45
0
File: vm.py Project: cc1-cloud/cc1
    def create(user, name, description, image_id, template_id, public_ip_id, iso_list, disk_list, vnc, groups,
               ssh_key=None, ssh_username=None, count=1,
               farm=None, head_template_id=None, node_id=False, lease_id=None, user_data=None):
        from cm.models.storage_image import StorageImage
        from cm.utils.threads.vm import VMThread

        template = Template.get(template_id)
        image = SystemImage.get(user.id, image_id, groups)

        if image.state != image_states['ok']:
            raise CMException('image_unavailable')

        if farm:
            head_template = Template.get(head_template_id)
            wn_template = template
            user.check_quota([(head_template, 1), (wn_template, count)])
            count += 1
        else:
            user.check_quota([(template, count)])

        vms = []

        reservation_id = None

        for i in range(count):
            # create VM instance
            log.debug(user.id, "Looking for node")
            node = Node.get_free_node(head_template, image, node_id) if farm and i == 0 else Node.get_free_node(template, image, node_id)
            log.info(user.id, 'Selected node: %d' % node.id)
            vm = VM()
            vm.libvirt_id = -1
            if farm:
                if i == 0:
                    vm.name = '%s-head' % name
                    vm.description = 'Farm head'
                    vm.template = head_template
                else:
                    vm.name = '%s-wn%d' % (name, i)
                    vm.description = 'Worker Node'
                    vm.template = wn_template
            else:
                vm.template = template
                vm.description = description
                if count > 1:
                    vm.name = '%s_%d' % (name, i + 1)
                else:
                    vm.name = name
            vm.user = user
            vm.state = vm_states['init']
            vm.start_time = datetime.now()
            vm.system_image = image
            vm.node = node
            vm.save_vm = True
            if farm:
                vm.farm = farm

            # Find first free vnc port
            used_ports = VM.objects.exclude(state__in=[vm_states['closed'], vm_states['erased']]).values_list('vnc_port', flat=True)

            for new_vnc_port in xrange(VNC_PORTS['START'], VNC_PORTS['END'] + 1):
                if new_vnc_port not in used_ports and new_vnc_port not in VNC_PORTS['EXCLUDE']:
                    break
            else:
                raise CMException('vm_vnc_not_found')

            log.debug(user.id, "Found vnc port: %d" % new_vnc_port)
            vm.vnc_port = new_vnc_port

            # Find first free novnc port
            used_ports = VM.objects.exclude(state__in=[vm_states['closed'], vm_states['erased']]).values_list('novnc_port', flat=True)
            for new_novnc_port in xrange(NOVNC_PORTS['START'], NOVNC_PORTS['END'] + 1):
                if new_novnc_port not in used_ports and new_novnc_port not in NOVNC_PORTS['EXCLUDE']:
                    break
            else:
                raise CMException('vm_novnc_not_found')

            log.debug(user.id, "Found novnc port: %d" % new_novnc_port)
            vm.novnc_port = new_novnc_port

            if vnc:
                vm.attach_vnc()
            vm.vnc_passwd = password_gen(13, chars=['letters', 'digits'], extra_chars='!@#$%^&*()')
            vm.ssh_key = ssh_key
            vm.ssh_username = ssh_username
            vm.user_data = user_data
            vm.save()

            if not reservation_id:
                reservation_id = vm.id

            vm.reservation_id = reservation_id
            vm.save()

            if farm and i == 0:
                farm.head = vm
            vms.append(vm)

            log.debug(user.id, "Attaching disks")
            disk_devs = []
            if i == 0 and disk_list:
                for disk_id in disk_list:
                    log.debug(user.id, 'Attaching disks to first VM')
                    disk = StorageImage.get(user.id, disk_id)
                    if disk.vm != None:
                        raise CMException('image_attached')
                    while disk.disk_dev in disk_devs:
                        disk.disk_dev += 1
                    disk_devs.append(disk.disk_dev)
                    disk.vm = vm
                    disk.save()

            log.debug(user.id, "Attaching CD")
            if i == 0 and iso_list:
                for iso_id in iso_list:
                    log.debug(user.id, 'Attaching iso to first VM')
                    # cd image have not be attached to any other vm
                    iso = IsoImage.get(user.id, iso_id)
                    iso.check_attached()
                    vm.iso_image = iso
                    vm.save()

        for i, vm in enumerate(vms):
            if lease_id != None:
                lease = Lease.objects.get(id=lease_id)

                if lease.user_network.user != user:
                    raise CMException('lease_permission')

                if lease.vm != None:
                    raise CMException('lease_attached')
                lease.vm = vm
                log.debug(user.id, "Attached ip: %s" % lease.address)
            else:
                lease = AvailableNetwork.get_lease(user)
                lease.vm = vm
                lease.save()
                log.debug(user.id, "Attached ip: %s" % lease.address)

            if i == 0 and public_ip_id > 0:
                log.debug(user.id, "Attaching PublicIP")
                try:
                    publicip = PublicIP.objects.filter(user=user).get(id=public_ip_id)
                    publicip.assign(lease)
                    publicip.save()
                except Exception, e:
                    log.exception(user.id, str(e))
                    raise CMException("lease_not_found")