Beispiel #1
0
  def _CombinePerInstanceConfigMessage(holder, configs_getter, igm_ref,
                                       instance_ref, update_stateful_disks,
                                       remove_stateful_disks):
    disk_getter = instance_disk_getter.InstanceDiskGetter(
        instance_ref=instance_ref, holder=holder)
    messages = holder.client.messages
    per_instance_config = configs_getter.get_instance_config(
        igm_ref=igm_ref, instance_ref=instance_ref)

    per_instance_config.override.reset('origin')

    remove_stateful_disks_set = set(remove_stateful_disks or [])
    update_stateful_disks_dict = Update._UpdateStatefulDisksToDict(
        update_stateful_disks)

    new_stateful_disks = []
    for current_stateful_disk in per_instance_config.override.disks:
      if current_stateful_disk.deviceName in remove_stateful_disks_set:
        continue
      if current_stateful_disk.deviceName in update_stateful_disks_dict:
        update_stateful_disk = update_stateful_disks_dict[
            current_stateful_disk.deviceName]
        source = update_stateful_disk.get('source')
        mode = update_stateful_disk.get('mode')
        if not (source or mode):
          raise exceptions.InvalidArgumentException(
              parameter_name='--update-stateful-disk',
              message=('[source] or [mode] is required when updating'
                       ' [device-name] already existing in instance config'))
        if source:
          current_stateful_disk.source = source
        if mode:
          current_stateful_disk.mode = instance_configs_messages.GetMode(
              messages=messages, mode=mode)
        del update_stateful_disks_dict[current_stateful_disk.deviceName]
      new_stateful_disks.append(current_stateful_disk)

    for update_stateful_disk in update_stateful_disks_dict.values():
      new_stateful_disks.append(
          instance_configs_messages.GetDiskOverride(
              messages=messages,
              stateful_disk=update_stateful_disk,
              disk_getter=disk_getter))

    per_instance_config.override.disks = new_stateful_disks

    return per_instance_config
def CreatePerInstanceConfigMessage(holder,
                                   instance_ref,
                                   stateful_disks,
                                   stateful_metadata,
                                   disk_getter=None):
    """Create per-instance config message from the given stateful disks and metadata."""
    if not disk_getter:
        disk_getter = instance_disk_getter.InstanceDiskGetter(
            instance_ref=instance_ref, holder=holder)
    messages = holder.client.messages
    disk_overrides = []
    preserved_state_disks = []
    for stateful_disk in stateful_disks or []:
        disk_overrides.append(
            GetDiskOverride(messages=messages,
                            stateful_disk=stateful_disk,
                            disk_getter=disk_getter))
        preserved_state_disks.append(
            MakePreservedStateDiskEntry(messages, stateful_disk, disk_getter))
    metadata_overrides = []
    preserved_state_metadata = []
    # Keeping the metadata sorted to maintain consistency across commands
    for metadata_key, metadata_value in sorted(
            six.iteritems(stateful_metadata)):
        metadata_overrides.append(
            messages.ManagedInstanceOverride.MetadataValueListEntry(
                key=metadata_key, value=metadata_value))
        preserved_state_metadata.append(
            MakePreservedStateMetadataEntry(messages,
                                            key=metadata_key,
                                            value=metadata_value))
    return messages.PerInstanceConfig(
        instance=str(instance_ref),
        name=path_simplifier.Name(str(instance_ref)),
        override=messages.ManagedInstanceOverride(disks=disk_overrides,
                                                  metadata=metadata_overrides),
        preservedState=messages.PreservedState(
            disks=messages.PreservedState.DisksValue(
                additionalProperties=preserved_state_disks),
            metadata=messages.PreservedState.MetadataValue(
                additionalProperties=preserved_state_metadata)))
Beispiel #3
0
 def _GetPerInstanceConfigMessage(holder, instance_ref, stateful_disks,
                                  stateful_metadata):
     disk_getter = instance_disk_getter.InstanceDiskGetter(
         instance_ref=instance_ref, holder=holder)
     messages = holder.client.messages
     disk_overrides = [
         instance_configs_messages.GetDiskOverride(
             messages=messages,
             stateful_disk=stateful_disk,
             disk_getter=disk_getter)
         for stateful_disk in stateful_disks or []
     ]
     metadata_overrides = [
         messages.ManagedInstanceOverride.MetadataValueListEntry(
             key=metadata_key, value=metadata_value) for metadata_key,
         metadata_value in sorted(stateful_metadata.iteritems())
     ]
     return messages.PerInstanceConfig(
         instance=str(instance_ref),
         override=messages.ManagedInstanceOverride(
             disks=disk_overrides, metadata=metadata_overrides))
    def _CombinePerInstanceConfigMessage(self, holder, per_instance_config,
                                         instance_ref, args):
        update_stateful_disks = args.stateful_disk
        remove_stateful_disks = args.remove_stateful_disks
        update_stateful_metadata = args.stateful_metadata
        remove_stateful_metadata = args.remove_stateful_metadata

        messages = holder.client.messages
        # Patch stateful disks.
        disk_getter = instance_disk_getter.InstanceDiskGetter(
            instance_ref=instance_ref, holder=holder)
        disks_to_remove_set = set(remove_stateful_disks or [])
        disks_to_update_dict = {
            update_stateful_disk.get('device-name'): update_stateful_disk
            for update_stateful_disk in (update_stateful_disks or [])
        }
        new_stateful_disks = UpdateGA._UpdateStatefulDisks(
            messages, per_instance_config, disks_to_update_dict,
            disks_to_remove_set, disk_getter)

        # Patch stateful metadata.
        new_stateful_metadata = UpdateGA._UpdateStatefulMetadata(
            messages, per_instance_config, update_stateful_metadata,
            remove_stateful_metadata)

        per_instance_config.preservedState.disks = (
            messages.PreservedState.DisksValue(
                additionalProperties=new_stateful_disks))

        per_instance_config.preservedState.metadata = (
            messages.PreservedState.MetadataValue(additionalProperties=[
                instance_configs_messages.MakePreservedStateMetadataEntry(
                    messages, key=key, value=value)
                for key, value in sorted(six.iteritems(new_stateful_metadata))
            ]))

        return per_instance_config
Beispiel #5
0
    def _CombinePerInstanceConfigMessage(holder, configs_getter, igm_ref,
                                         instance_ref, update_stateful_disks,
                                         remove_stateful_disks,
                                         update_stateful_metadata,
                                         remove_stateful_metadata):
        # Patch stateful disks.
        disk_getter = instance_disk_getter.InstanceDiskGetter(
            instance_ref=instance_ref, holder=holder)
        messages = holder.client.messages
        per_instance_config = configs_getter.get_instance_config(
            igm_ref=igm_ref, instance_ref=instance_ref)
        disks_to_remove_set = set(remove_stateful_disks or [])
        disks_to_update_dict = {
            update_stateful_disk.get('device-name'): update_stateful_disk
            for update_stateful_disk in (update_stateful_disks or [])
        }
        new_stateful_disks = UpdateBeta._UpdateStatefulDisks(
            messages, per_instance_config, disks_to_update_dict,
            disks_to_remove_set, disk_getter)
        # Patch stateful metadata.
        new_stateful_metadata = UpdateBeta._UpdateStatefulMetadata(
            messages, per_instance_config, update_stateful_metadata,
            remove_stateful_metadata)

        # Create preserved state
        preserved_state = messages.PreservedState()
        preserved_state.disks = messages.PreservedState.DisksValue(
            additionalProperties=new_stateful_disks)
        preserved_state.metadata = messages.PreservedState.MetadataValue(
            additionalProperties=[
                instance_configs_messages.MakePreservedStateMetadataEntry(
                    messages, key=key, value=value)
                for key, value in sorted(six.iteritems(new_stateful_metadata))
            ])
        per_instance_config.preservedState = preserved_state
        return per_instance_config
Beispiel #6
0
    def _CombinePerInstanceConfigMessage(holder, configs_getter, igm_ref,
                                         instance_ref, update_stateful_disks,
                                         remove_stateful_disks,
                                         update_stateful_metadata,
                                         remove_stateful_metadata):
        disk_getter = instance_disk_getter.InstanceDiskGetter(
            instance_ref=instance_ref, holder=holder)
        messages = holder.client.messages
        per_instance_config = configs_getter.get_instance_config(
            igm_ref=igm_ref, instance_ref=instance_ref)
        remove_stateful_disks_set = set(remove_stateful_disks or [])
        removed_stateful_disks_set = set()
        update_stateful_disks_dict = Update._UpdateStatefulDisksToDict(
            update_stateful_disks)
        new_stateful_disks = []
        existing_disks = []
        if per_instance_config.preservedState.disks:
            existing_disks =\
                per_instance_config.preservedState.disks.additionalProperties
        for current_stateful_disk in existing_disks:
            disk_name = current_stateful_disk.key
            # Disk to be removed
            if disk_name in remove_stateful_disks_set:
                removed_stateful_disks_set.add(disk_name)
                continue
            # Disk to be updated
            if disk_name in update_stateful_disks_dict:
                update_disk_data = update_stateful_disks_dict[disk_name]
                source = update_disk_data.get('source')
                mode = update_disk_data.get('mode')
                auto_delete = update_disk_data.get('auto-delete')
                if not (source or mode):
                    raise exceptions.InvalidArgumentException(
                        parameter_name='--update-stateful-disk',
                        message=(
                            '[source] or [mode] is required when updating'
                            ' [device-name] already existing in instance config'
                        ))
                preserved_disk = current_stateful_disk.value
                if source:
                    preserved_disk.source = source
                if mode:
                    preserved_disk.mode = instance_configs_messages.GetMode(
                        messages=messages, mode=mode)
                if auto_delete:
                    preserved_disk.autoDelete = auto_delete.GetAutoDeleteEnumValue(
                        messages.PreservedStatePreservedDisk.
                        AutoDeleteValueValuesEnum)
                del update_stateful_disks_dict[disk_name]
            new_stateful_disks.append(current_stateful_disk)
        unremoved_stateful_disks = (
            remove_stateful_disks_set.difference(removed_stateful_disks_set))
        if unremoved_stateful_disks:
            raise exceptions.InvalidArgumentException(
                parameter_name='--remove-stateful-disk',
                message=(
                    'The following are invalid stateful disks: `{0}`'.format(
                        ','.join(unremoved_stateful_disks))))
        for update_stateful_disk in update_stateful_disks_dict.values():
            new_stateful_disks.append(
                instance_configs_messages.MakePreservedStateDiskEntry(
                    messages=messages,
                    stateful_disk_data=update_stateful_disk,
                    disk_getter=disk_getter))

        existing_metadata = []
        if per_instance_config.preservedState.metadata:
            existing_metadata = per_instance_config.preservedState\
                .metadata.additionalProperties
        new_stateful_metadata = {
            metadata.key: metadata.value
            for metadata in existing_metadata
        }
        for stateful_metadata_key_to_remove in remove_stateful_metadata or []:
            if stateful_metadata_key_to_remove in new_stateful_metadata:
                del new_stateful_metadata[stateful_metadata_key_to_remove]
            else:
                raise exceptions.InvalidArgumentException(
                    parameter_name='--remove-stateful-metadata',
                    message=
                    ('stateful metadata key to remove `{0}` does not exist in'
                     ' the given instance config'.format(
                         stateful_metadata_key_to_remove)))
        new_stateful_metadata.update(update_stateful_metadata)

        # Create preserved state
        preserved_state = messages.PreservedState()
        preserved_state.disks = messages.PreservedState.DisksValue(
            additionalProperties=new_stateful_disks)
        preserved_state.metadata = messages.PreservedState.MetadataValue(
            additionalProperties=[
                instance_configs_messages.MakePreservedStateMetadataEntry(
                    messages, key=key, value=value)
                for key, value in sorted(six.iteritems(new_stateful_metadata))
            ])
        per_instance_config.preservedState = preserved_state
        return per_instance_config
Beispiel #7
0
    def _CombinePerInstanceConfigMessage(holder, configs_getter, igm_ref,
                                         instance_ref, update_stateful_disks,
                                         remove_stateful_disks,
                                         update_stateful_metadata,
                                         remove_stateful_metadata):
        disk_getter = instance_disk_getter.InstanceDiskGetter(
            instance_ref=instance_ref, holder=holder)
        messages = holder.client.messages
        per_instance_config = configs_getter.get_instance_config(
            igm_ref=igm_ref, instance_ref=instance_ref)

        per_instance_config.override.reset('origin')

        remove_stateful_disks_set = set(remove_stateful_disks or [])
        update_stateful_disks_dict = Update._UpdateStatefulDisksToDict(
            update_stateful_disks)

        new_stateful_disks = []
        for current_stateful_disk in per_instance_config.override.disks:
            if current_stateful_disk.deviceName in remove_stateful_disks_set:
                continue
            if current_stateful_disk.deviceName in update_stateful_disks_dict:
                update_stateful_disk = update_stateful_disks_dict[
                    current_stateful_disk.deviceName]
                source = update_stateful_disk.get('source')
                mode = update_stateful_disk.get('mode')
                if not (source or mode):
                    raise exceptions.InvalidArgumentException(
                        parameter_name='--update-stateful-disk',
                        message=(
                            '[source] or [mode] is required when updating'
                            ' [device-name] already existing in instance config'
                        ))
                if source:
                    current_stateful_disk.source = source
                if mode:
                    current_stateful_disk.mode = instance_configs_messages.GetMode(
                        messages=messages, mode=mode)
                del update_stateful_disks_dict[
                    current_stateful_disk.deviceName]
            new_stateful_disks.append(current_stateful_disk)

        for update_stateful_disk in update_stateful_disks_dict.values():
            new_stateful_disks.append(
                instance_configs_messages.GetDiskOverride(
                    messages=messages,
                    stateful_disk=update_stateful_disk,
                    disk_getter=disk_getter))

        per_instance_config.override.disks = new_stateful_disks

        new_stateful_metadata = {
            metadata.key: metadata.value
            for metadata in per_instance_config.override.metadata
        }

        for stateful_metadata_key_to_remove in remove_stateful_metadata or []:
            if stateful_metadata_key_to_remove in new_stateful_metadata:
                del new_stateful_metadata[stateful_metadata_key_to_remove]
            else:
                raise exceptions.InvalidArgumentException(
                    parameter_name='--remove-stateful-metadata',
                    message=
                    ('stateful metadata key to remove `{0}` does not exist in'
                     ' the given instance config'.format(
                         stateful_metadata_key_to_remove)))

        new_stateful_metadata.update(update_stateful_metadata)

        per_instance_config.override.metadata = [
            messages.ManagedInstanceOverride.MetadataValueListEntry(
                key=metadata_key, value=metadata_value) for metadata_key,
            metadata_value in sorted(new_stateful_metadata.iteritems())
        ]

        return per_instance_config