mirror of
https://github.com/containers/podman.git
synced 2025-05-17 15:18:43 +08:00

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
|
|
}
|