mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 18:08:51 +08:00 
			
		
		
		
	 2e70d4201f
			
		
	
	2e70d4201f
	
	
	
		
			
			Testing `podman system check` requires that we have a way to intentionally introduce storage corruptions. Add a hidden `podman testing` command that provides the necessary internal logic in subcommands. Stub out the tunnel implementation for now. Signed-off-by: Nalin Dahyabhai <nalin@redhat.com>
		
			
				
	
	
		
			406 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			406 lines
		
	
	
		
			14 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package main
 | |
| 
 | |
| import (
 | |
| 	"errors"
 | |
| 	"os"
 | |
| 
 | |
| 	"github.com/containers/common/pkg/completion"
 | |
| 	"github.com/containers/podman/v5/cmd/podman/validate"
 | |
| 	"github.com/containers/podman/v5/internal/domain/entities"
 | |
| 	"github.com/spf13/cobra"
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	createLayerDataDescription = `Create data for a layer in local storage.`
 | |
| 	createLayerDataCmd         = &cobra.Command{
 | |
| 		Use:               "create-layer-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Create data for a layer",
 | |
| 		Long:              createLayerDataDescription,
 | |
| 		RunE:              createLayerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing create-layer-data`,
 | |
| 	}
 | |
| 
 | |
| 	createLayerDataOpts  entities.CreateLayerDataOptions
 | |
| 	createLayerDataKey   string
 | |
| 	createLayerDataValue string
 | |
| 	createLayerDataFile  string
 | |
| 
 | |
| 	createImageDataDescription = `Create data for an image in local storage.`
 | |
| 	createImageDataCmd         = &cobra.Command{
 | |
| 		Use:               "create-image-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Create data for an image",
 | |
| 		Long:              createImageDataDescription,
 | |
| 		RunE:              createImageData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing create-image-data`,
 | |
| 	}
 | |
| 
 | |
| 	createImageDataOpts  entities.CreateImageDataOptions
 | |
| 	createImageDataKey   string
 | |
| 	createImageDataValue string
 | |
| 	createImageDataFile  string
 | |
| 
 | |
| 	createContainerDataDescription = `Create data for a container in local storage.`
 | |
| 	createContainerDataCmd         = &cobra.Command{
 | |
| 		Use:               "create-container-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Create data for a container",
 | |
| 		Long:              createContainerDataDescription,
 | |
| 		RunE:              createContainerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing create-container-data`,
 | |
| 	}
 | |
| 
 | |
| 	createContainerDataOpts  entities.CreateContainerDataOptions
 | |
| 	createContainerDataKey   string
 | |
| 	createContainerDataValue string
 | |
| 	createContainerDataFile  string
 | |
| 
 | |
| 	modifyLayerDataDescription = `Modify data for a layer in local storage, corrupting it.`
 | |
| 	modifyLayerDataCmd         = &cobra.Command{
 | |
| 		Use:               "modify-layer-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Modify data for a layer",
 | |
| 		Long:              modifyLayerDataDescription,
 | |
| 		RunE:              modifyLayerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing modify-layer-data`,
 | |
| 	}
 | |
| 
 | |
| 	modifyLayerDataOpts  entities.ModifyLayerDataOptions
 | |
| 	modifyLayerDataValue string
 | |
| 	modifyLayerDataFile  string
 | |
| 
 | |
| 	modifyImageDataDescription = `Modify data for an image in local storage, corrupting it.`
 | |
| 	modifyImageDataCmd         = &cobra.Command{
 | |
| 		Use:               "modify-image-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Modify data for an image",
 | |
| 		Long:              modifyImageDataDescription,
 | |
| 		RunE:              modifyImageData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing modify-image-data`,
 | |
| 	}
 | |
| 
 | |
| 	modifyImageDataOpts  entities.ModifyImageDataOptions
 | |
| 	modifyImageDataValue string
 | |
| 	modifyImageDataFile  string
 | |
| 
 | |
| 	modifyContainerDataDescription = `Modify data for a container in local storage, corrupting it.`
 | |
| 	modifyContainerDataCmd         = &cobra.Command{
 | |
| 		Use:               "modify-container-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Modify data for a container",
 | |
| 		Long:              modifyContainerDataDescription,
 | |
| 		RunE:              modifyContainerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing modify-container-data`,
 | |
| 	}
 | |
| 
 | |
| 	modifyContainerDataOpts  entities.ModifyContainerDataOptions
 | |
| 	modifyContainerDataValue string
 | |
| 	modifyContainerDataFile  string
 | |
| 
 | |
| 	removeLayerDataDescription = `Remove data from a layer in local storage, corrupting it.`
 | |
| 	removeLayerDataCmd         = &cobra.Command{
 | |
| 		Use:               "remove-layer-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Remove data for a layer",
 | |
| 		Long:              removeLayerDataDescription,
 | |
| 		RunE:              removeLayerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing remove-layer-data`,
 | |
| 	}
 | |
| 
 | |
| 	removeLayerDataOpts entities.RemoveLayerDataOptions
 | |
| 
 | |
| 	removeImageDataDescription = `Remove data from an image in local storage, corrupting it.`
 | |
| 	removeImageDataCmd         = &cobra.Command{
 | |
| 		Use:               "remove-image-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Remove data from an image",
 | |
| 		Long:              removeImageDataDescription,
 | |
| 		RunE:              removeImageData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing remove-image-data`,
 | |
| 	}
 | |
| 
 | |
| 	removeImageDataOpts entities.RemoveImageDataOptions
 | |
| 
 | |
| 	removeContainerDataDescription = `Remove data from a container in local storage, corrupting it.`
 | |
| 	removeContainerDataCmd         = &cobra.Command{
 | |
| 		Use:               "remove-container-data [options]",
 | |
| 		Args:              validate.NoArgs,
 | |
| 		Short:             "Remove data from a container",
 | |
| 		Long:              removeContainerDataDescription,
 | |
| 		RunE:              removeContainerData,
 | |
| 		ValidArgsFunction: completion.AutocompleteNone,
 | |
| 		Example:           `podman testing remove-container-data`,
 | |
| 	}
 | |
| 
 | |
| 	removeContainerDataOpts entities.RemoveContainerDataOptions
 | |
| )
 | |
| 
 | |
| func init() {
 | |
| 	mainCmd.AddCommand(createLayerDataCmd)
 | |
| 	flags := createLayerDataCmd.Flags()
 | |
| 	flags.StringVarP(&createLayerDataOpts.ID, "layer", "i", "", "ID of the layer")
 | |
| 	flags.StringVarP(&createLayerDataKey, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&createLayerDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&createLayerDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(createImageDataCmd)
 | |
| 	flags = createImageDataCmd.Flags()
 | |
| 	flags.StringVarP(&createImageDataOpts.ID, "image", "i", "", "ID of the image")
 | |
| 	flags.StringVarP(&createImageDataKey, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&createImageDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&createImageDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(createContainerDataCmd)
 | |
| 	flags = createContainerDataCmd.Flags()
 | |
| 	flags.StringVarP(&createContainerDataOpts.ID, "container", "i", "", "ID of the container")
 | |
| 	flags.StringVarP(&createContainerDataKey, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&createContainerDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&createContainerDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(modifyLayerDataCmd)
 | |
| 	flags = modifyLayerDataCmd.Flags()
 | |
| 	flags.StringVarP(&modifyLayerDataOpts.ID, "layer", "i", "", "ID of the layer")
 | |
| 	flags.StringVarP(&modifyLayerDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&modifyLayerDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&modifyLayerDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(modifyImageDataCmd)
 | |
| 	flags = modifyImageDataCmd.Flags()
 | |
| 	flags.StringVarP(&modifyImageDataOpts.ID, "image", "i", "", "ID of the image")
 | |
| 	flags.StringVarP(&modifyImageDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&modifyImageDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&modifyImageDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(modifyContainerDataCmd)
 | |
| 	flags = modifyContainerDataCmd.Flags()
 | |
| 	flags.StringVarP(&modifyContainerDataOpts.ID, "container", "i", "", "ID of the container")
 | |
| 	flags.StringVarP(&modifyContainerDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| 	flags.StringVarP(&modifyContainerDataValue, "value", "v", "", "Value of the data item")
 | |
| 	flags.StringVarP(&modifyContainerDataFile, "file", "f", "", "File containing the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(removeLayerDataCmd)
 | |
| 	flags = removeLayerDataCmd.Flags()
 | |
| 	flags.StringVarP(&removeLayerDataOpts.ID, "layer", "i", "", "ID of the layer")
 | |
| 	flags.StringVarP(&removeLayerDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(removeImageDataCmd)
 | |
| 	flags = removeImageDataCmd.Flags()
 | |
| 	flags.StringVarP(&removeImageDataOpts.ID, "image", "i", "", "ID of the image")
 | |
| 	flags.StringVarP(&removeImageDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| 
 | |
| 	mainCmd.AddCommand(removeContainerDataCmd)
 | |
| 	flags = removeContainerDataCmd.Flags()
 | |
| 	flags.StringVarP(&removeContainerDataOpts.ID, "container", "i", "", "ID of the container")
 | |
| 	flags.StringVarP(&removeContainerDataOpts.Key, "key", "k", "", "Name of the data item")
 | |
| }
 | |
| 
 | |
| func createLayerData(cmd *cobra.Command, args []string) error {
 | |
| 	if createLayerDataOpts.ID == "" {
 | |
| 		return errors.New("layer ID not specified")
 | |
| 	}
 | |
| 	if createLayerDataKey == "" {
 | |
| 		return errors.New("layer data name not specified")
 | |
| 	}
 | |
| 	if createLayerDataValue == "" && createLayerDataFile == "" {
 | |
| 		return errors.New("neither layer data value nor file specified")
 | |
| 	}
 | |
| 	createLayerDataOpts.Data = make(map[string][]byte)
 | |
| 	if createLayerDataValue != "" {
 | |
| 		createLayerDataOpts.Data[createLayerDataKey] = []byte(createLayerDataValue)
 | |
| 	}
 | |
| 	if createLayerDataFile != "" {
 | |
| 		buf, err := os.ReadFile(createLayerDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		createLayerDataOpts.Data[createLayerDataKey] = buf
 | |
| 	}
 | |
| 	_, err := testingEngine.CreateLayerData(mainContext, createLayerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func createImageData(cmd *cobra.Command, args []string) error {
 | |
| 	if createImageDataOpts.ID == "" {
 | |
| 		return errors.New("image ID not specified")
 | |
| 	}
 | |
| 	if createImageDataKey == "" {
 | |
| 		return errors.New("image data name not specified")
 | |
| 	}
 | |
| 	if createImageDataValue == "" && createImageDataFile == "" {
 | |
| 		return errors.New("neither image data value nor file specified")
 | |
| 	}
 | |
| 	createImageDataOpts.Data = make(map[string][]byte)
 | |
| 	if createImageDataValue != "" {
 | |
| 		createImageDataOpts.Data[createImageDataKey] = []byte(createImageDataValue)
 | |
| 	}
 | |
| 	if createImageDataFile != "" {
 | |
| 		d, err := os.ReadFile(createImageDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		createImageDataOpts.Data[createImageDataKey] = d
 | |
| 	}
 | |
| 	_, err := testingEngine.CreateImageData(mainContext, createImageDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func createContainerData(cmd *cobra.Command, args []string) error {
 | |
| 	if createContainerDataOpts.ID == "" {
 | |
| 		return errors.New("container ID not specified")
 | |
| 	}
 | |
| 	if createContainerDataKey == "" {
 | |
| 		return errors.New("container data name not specified")
 | |
| 	}
 | |
| 	if createContainerDataValue == "" && createContainerDataFile == "" {
 | |
| 		return errors.New("neither container data value nor file specified")
 | |
| 	}
 | |
| 	createContainerDataOpts.Data = make(map[string][]byte)
 | |
| 	if createContainerDataValue != "" {
 | |
| 		createContainerDataOpts.Data[createContainerDataKey] = []byte(createContainerDataValue)
 | |
| 	}
 | |
| 	if createContainerDataFile != "" {
 | |
| 		d, err := os.ReadFile(createContainerDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		createContainerDataOpts.Data[createContainerDataKey] = d
 | |
| 	}
 | |
| 	_, err := testingEngine.CreateContainerData(mainContext, createContainerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func modifyLayerData(cmd *cobra.Command, args []string) error {
 | |
| 	if modifyLayerDataOpts.ID == "" {
 | |
| 		return errors.New("layer ID not specified")
 | |
| 	}
 | |
| 	if modifyLayerDataOpts.Key == "" {
 | |
| 		return errors.New("layer data name not specified")
 | |
| 	}
 | |
| 	if modifyLayerDataValue == "" && modifyLayerDataFile == "" {
 | |
| 		return errors.New("neither layer data value nor file specified")
 | |
| 	}
 | |
| 	modifyLayerDataOpts.Data = []byte(modifyLayerDataValue)
 | |
| 	if modifyLayerDataFile != "" {
 | |
| 		d, err := os.ReadFile(modifyLayerDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		modifyLayerDataOpts.Data = d
 | |
| 	}
 | |
| 	_, err := testingEngine.ModifyLayerData(mainContext, modifyLayerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func modifyImageData(cmd *cobra.Command, args []string) error {
 | |
| 	if modifyImageDataOpts.ID == "" {
 | |
| 		return errors.New("image ID not specified")
 | |
| 	}
 | |
| 	if modifyImageDataOpts.Key == "" {
 | |
| 		return errors.New("image data name not specified")
 | |
| 	}
 | |
| 	if modifyImageDataValue == "" && modifyImageDataFile == "" {
 | |
| 		return errors.New("neither image data value nor file specified")
 | |
| 	}
 | |
| 	modifyImageDataOpts.Data = []byte(modifyImageDataValue)
 | |
| 	if modifyImageDataFile != "" {
 | |
| 		d, err := os.ReadFile(modifyImageDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		modifyImageDataOpts.Data = d
 | |
| 	}
 | |
| 	_, err := testingEngine.ModifyImageData(mainContext, modifyImageDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func modifyContainerData(cmd *cobra.Command, args []string) error {
 | |
| 	if modifyContainerDataOpts.ID == "" {
 | |
| 		return errors.New("container ID not specified")
 | |
| 	}
 | |
| 	if modifyContainerDataOpts.Key == "" {
 | |
| 		return errors.New("container data name not specified")
 | |
| 	}
 | |
| 	if modifyContainerDataValue == "" && modifyContainerDataFile == "" {
 | |
| 		return errors.New("neither container data value nor file specified")
 | |
| 	}
 | |
| 	modifyContainerDataOpts.Data = []byte(modifyContainerDataValue)
 | |
| 	if modifyContainerDataFile != "" {
 | |
| 		d, err := os.ReadFile(modifyContainerDataFile)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 		modifyContainerDataOpts.Data = d
 | |
| 	}
 | |
| 	_, err := testingEngine.ModifyContainerData(mainContext, modifyContainerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func removeLayerData(cmd *cobra.Command, args []string) error {
 | |
| 	if removeLayerDataOpts.ID == "" {
 | |
| 		return errors.New("layer ID not specified")
 | |
| 	}
 | |
| 	if removeLayerDataOpts.Key == "" {
 | |
| 		return errors.New("layer data name not specified")
 | |
| 	}
 | |
| 	_, err := testingEngine.RemoveLayerData(mainContext, removeLayerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func removeImageData(cmd *cobra.Command, args []string) error {
 | |
| 	if removeImageDataOpts.ID == "" {
 | |
| 		return errors.New("image ID not specified")
 | |
| 	}
 | |
| 	if removeImageDataOpts.Key == "" {
 | |
| 		return errors.New("image data name not specified")
 | |
| 	}
 | |
| 	_, err := testingEngine.RemoveImageData(mainContext, removeImageDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func removeContainerData(cmd *cobra.Command, args []string) error {
 | |
| 	if removeContainerDataOpts.ID == "" {
 | |
| 		return errors.New("container ID not specified")
 | |
| 	}
 | |
| 	if removeContainerDataOpts.Key == "" {
 | |
| 		return errors.New("container data name not specified")
 | |
| 	}
 | |
| 	_, err := testingEngine.RemoveContainerData(mainContext, removeContainerDataOpts)
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 |