github.com/opencontainers/runtime-tools@v0.9.0/validation/misc_props/misc_props.go (about) 1 package main 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 "time" 10 11 "github.com/mndrix/tap-go" 12 rspecs "github.com/opencontainers/runtime-spec/specs-go" 13 "github.com/opencontainers/runtime-tools/specerror" 14 "github.com/opencontainers/runtime-tools/validation/util" 15 uuid "github.com/satori/go.uuid" 16 ) 17 18 func saveConfig(path string, v interface{}) error { 19 data, err := json.Marshal(v) 20 if err != nil { 21 return err 22 } 23 24 return ioutil.WriteFile(path, data, 0644) 25 } 26 27 func main() { 28 t := tap.New() 29 t.Header(0) 30 bundleDir, err := util.PrepareBundle() 31 if err != nil { 32 util.Fatal(err) 33 } 34 defer os.RemoveAll(bundleDir) 35 configFile := filepath.Join(bundleDir, "config.json") 36 37 type extendedSpec struct { 38 rspecs.Spec 39 Unknown string `json:"unknown,omitempty"` 40 } 41 42 containerID := uuid.NewV4().String() 43 basicConfig, err := util.GetDefaultGenerator() 44 if err != nil { 45 util.Fatal(err) 46 } 47 basicConfig.SetProcessArgs([]string{"true"}) 48 annotationConfig, err := util.GetDefaultGenerator() 49 if err != nil { 50 util.Fatal(err) 51 } 52 annotationConfig.AddAnnotation(fmt.Sprintf("org.%s", containerID), "") 53 invalidConfig, err := util.GetDefaultGenerator() 54 if err != nil { 55 util.Fatal(err) 56 } 57 invalidConfig.SetVersion("invalid") 58 59 cases := []struct { 60 eSpec extendedSpec 61 action util.LifecycleAction 62 errExpected bool 63 err error 64 }{ 65 {extendedSpec{Spec: *annotationConfig.Spec()}, util.LifecycleActionCreate | util.LifecycleActionStart | util.LifecycleActionDelete, true, specerror.NewError(specerror.AnnotationsKeyIgnoreUnknown, fmt.Errorf("implementations that are reading/processing this configuration file MUST NOT generate an error if they encounter an unknown annotation key"), rspecs.Version)}, 66 {extendedSpec{Spec: *basicConfig.Spec(), Unknown: "unknown"}, util.LifecycleActionCreate | util.LifecycleActionStart | util.LifecycleActionDelete, true, specerror.NewError(specerror.ExtensibilityIgnoreUnknownProp, fmt.Errorf("runtimes that are reading or processing this configuration file MUST NOT generate an error if they encounter an unknown property"), rspecs.Version)}, 67 {extendedSpec{Spec: *invalidConfig.Spec()}, util.LifecycleActionCreate | util.LifecycleActionStart | util.LifecycleActionDelete, false, specerror.NewError(specerror.ValidValues, fmt.Errorf("runtimes that are reading or processing this configuration file MUST generate an error when invalid or unsupported values are encountered"), rspecs.Version)}, 68 } 69 70 for _, c := range cases { 71 config := util.LifecycleConfig{ 72 BundleDir: bundleDir, 73 Actions: c.action, 74 PreCreate: func(r *util.Runtime) error { 75 r.SetID(containerID) 76 return saveConfig(configFile, c.eSpec) 77 }, 78 PreDelete: func(r *util.Runtime) error { 79 util.WaitingForStatus(*r, util.LifecycleStatusCreated|util.LifecycleStatusStopped, time.Second*10, time.Second*1) 80 return nil 81 }, 82 } 83 err = util.RuntimeLifecycleValidate(config) 84 util.SpecErrorOK(t, (err == nil) == c.errExpected, c.err, err) 85 } 86 87 t.AutoPlan() 88 }