def SetDiskProperties(context, disks, add_blank_src_img=False):
    """Set properties on each disk to required format.

  Sets default values, and moves properties passed directly into
  initializeParams where required.

  Args:
    context: Template context dictionary.
    disks: List of disks to set properties on.
    add_blank_src_img: When true, link to blank source image is added for new
    disks where a source image is not specified.
  """

    project = context.env[default.PROJECT]
    zone = context.properties.setdefault(ZONE, DEFAULT_ZONE)

    for disk in disks:
        disk.setdefault(default.AUTO_DELETE, True)
        disk.setdefault('boot', False)
        disk.setdefault(default.TYPE, DEFAULT_PERSISTENT)

        # If disk already exists, no properties to change.
        if default.DISK_SOURCE in disk:
            continue

        else:
            disk_init = disk.setdefault(default.INITIALIZEP, dict())
            if disk[default.TYPE] == SCRATCH:
                disk_init.setdefault(DISKTYPE, 'local-ssd')
            else:
                # In the Instance API reference, size and type are within this property
                if disk_init:
                    disk_init.setdefault(default.DISK_SIZE,
                                         DEFAULT_DATADISKSIZE)
                    disk_init.setdefault(default.DISKTYPE, DEFAULT_DISKTYPE)
                # You can also simply pass the size and type properties directly
                else:
                    disk_init[default.DISK_SIZE] = disk.pop(
                        default.DISK_SIZE, DEFAULT_DATADISKSIZE)
                    disk_init[default.DISKTYPE] = disk.pop(
                        default.DISKTYPE, DEFAULT_DISKTYPE)

                # If disk name was given as a direct property, move to initializeParams
                if default.DISK_NAME in disk:
                    disk_init[default.DISK_NAME] = disk.pop(default.DISK_NAME)

                # Add link to a blank source image where non-specified
                if add_blank_src_img and default.SRCIMAGE not in disk_init:
                    disk_init[default.SRCIMAGE] = common.MakeC2DImageLink(
                        BLANK_IMAGE)

            # Change disk type names into URLs
            disk_init[default.DISKTYPE] = common.LocalComputeLink(
                project, zone, 'diskTypes', disk_init[default.DISKTYPE])
Esempio n. 2
0
def AppendLocalSSDDisks(context, disk_list, num_of_local_ssd):
  """Apends local ssds."""
  project = context.env[default.PROJECT]
  prop = context.properties
  zone = prop.setdefault(ZONE, DEFAULT_ZONE)
  local_ssd_disks = []
  for i in range(0, num_of_local_ssd):
    local_ssd_disks.append({
        'deviceName': 'local-ssd-%s' % i,
        'type': SCRATCH,
        'interface': 'SCSI',
        'mode': 'READ_WRITE',
        'autoDelete': True,
        'initializeParams': {'diskType': common.LocalComputeLink(
            project, zone, 'diskTypes', 'local-ssd')}
    })
  return disk_list + local_ssd_disks
def GenerateDisks(context, disk_list, new_disks):
    """Generates as many disks as passed in the disk_list."""
    project = context.env[default.PROJECT]
    prop = context.properties
    zone = prop.setdefault(ZONE, DEFAULT_ZONE)
    sourced_disks = []
    disk_names = []
    for disk in disk_list:
        d_name = (disk[default.DEVICE_NAME] if default.DISK_NAME not in disk
                  else disk[default.DISK_NAME])
        if default.DISK_SOURCE in disk:  # Existing disk, expect disk api link
            source = disk[default.DISK_SOURCE]
        else:  # The disks should be create separately
            if default.DEVICE_NAME not in disk and default.DISK_NAME not in disk:
                raise common.Error(
                    'deviceName or diskName is needed for each disk in '
                    'this module implemention of multiple disks per vm.')
            disk_init = disk.setdefault(default.INITIALIZEP, dict())
            disk_size = disk_init.setdefault(default.DISK_SIZE,
                                             DEFAULT_DATADISKSIZE)
            passed_disk_type = disk_init.setdefault(default.TYPE,
                                                    DEFAULT_DISKTYPE)
            disk_type = common.LocalComputeLink(project, zone, 'diskTypes',
                                                passed_disk_type)
            new_disks.append({
                'name': d_name,
                'type': default.DISK,
                'properties': {
                    'type': disk_type,
                    'sizeGb': disk_size,
                    'zone': zone
                }
            })  # pyformat: disable
            disk_names.append(d_name)
            source = common.Ref(d_name)
        sourced_disks.append({
            'deviceName': d_name,
            'autoDelete': True,
            'boot': False,
            'source': source,
            'type': DEFAULT_PERSISTENT,
        })

    items = prop[METADATA].setdefault('items', list())
    items.append({'key': ATTACHED_DISKS, 'value': ','.join(disk_names)})
    return sourced_disks, new_disks
Esempio n. 4
0
def AppendLocalSSDDisks(context, disk_list, num_of_local_ssd):
    """Apends local ssds."""
    project = context.env[default.PROJECT]
    prop = context.properties
    zone = prop.setdefault(ZONE, DEFAULT_ZONE)
    local_ssd_disks = []
    for i in range(0, num_of_local_ssd):
        local_ssd_disks.append({
            "deviceName": "local-ssd-%s" % i,
            "type": SCRATCH,
            "interface": "SCSI",
            "mode": "READ_WRITE",
            "autoDelete": True,
            "initializeParams": {
                "diskType":
                common.LocalComputeLink(project, zone, "diskTypes",
                                        "local-ssd")
            },
        })
    return disk_list + local_ssd_disks
def GenerateDisks(context, disk_list, new_disks):
    """Generates as many disks as passed in the disk_list."""
    project = context.env[default.PROJECT]
    prop = context.properties
    zone = prop.setdefault(ZONE, DEFAULT_ZONE)
    sourced_disks = []
    disk_names = []
    for disk in disk_list:
        d_name = (disk[default.DEVICE_NAME] if default.DISK_NAME not in disk
                  else disk[default.DISK_NAME])
        d_autodelete = (True if default.AUTO_DELETE not in disk else
                        disk[default.AUTO_DELETE])
        d_type = (DEFAULT_PERSISTENT
                  if default.TYPE not in disk else disk[default.TYPE])

        if default.DISK_SOURCE in disk:  # Existing disk, expect disk api link
            source = disk[default.DISK_SOURCE]
        elif d_type == SCRATCH:  # No special treatment needed for SSD disk
            if default.INITIALIZEP in disk:
                disk_type = disk[default.INITIALIZEP][DISKTYPE]
            else:
                disk_type = 'local-ssd'
            disk[default.INITIALIZEP] = {
                DISKTYPE:
                common.LocalComputeLink(project, zone, 'diskTypes', disk_type)
            }
            sourced_disks.append(disk)
            continue
        else:
            if default.DEVICE_NAME not in disk and default.DISK_NAME not in disk:
                raise common.Error(
                    'deviceName or diskName is needed for each disk in '
                    'this module implemention of multiple disks per vm.')
            # In the Instance API reference, size and type are within this property
            if default.INITIALIZEP in disk:
                disk_init = disk[default.INITIALIZEP]
                disk_size = disk_init.setdefault(default.DISK_SIZE,
                                                 DEFAULT_DATADISKSIZE)
                passed_disk_type = disk_init.setdefault(
                    DISKTYPE, DEFAULT_DISKTYPE)
            # You can also simply pass the size and type properties directly
            else:
                disk_size = disk.setdefault(default.DISK_SIZE,
                                            DEFAULT_DATADISKSIZE)
                passed_disk_type = disk.setdefault(DISKTYPE, DEFAULT_DISKTYPE)
            disk_type = common.LocalComputeLink(project, zone, 'diskTypes',
                                                passed_disk_type)
            new_disks.append({
                'name': d_name,
                'type': default.DISK,
                'properties': {
                    'type': disk_type,
                    'sizeGb': disk_size,
                    'zone': zone
                }
            })  # pyformat: disable
            disk_names.append(d_name)
            source = common.Ref(d_name)
        sourced_disks.append({
            'deviceName': d_name,
            'autoDelete': d_autodelete,
            'boot': False,
            'source': source,
            'type': d_type,
        })

    items = prop[METADATA].setdefault('items', list())
    items.append({'key': ATTACHED_DISKS, 'value': ','.join(disk_names)})
    return sourced_disks, new_disks