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
Exemplo n.º 2
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
Exemplo n.º 3
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