|
| 1 | +package run |
| 2 | + |
| 3 | +import ( |
| 4 | + "io/ioutil" |
| 5 | + "os" |
| 6 | + "path/filepath" |
| 7 | + "testing" |
| 8 | + |
| 9 | + "github.com/weaveworks/gitops-toolkit/pkg/runtime" |
| 10 | + "github.com/weaveworks/gitops-toolkit/pkg/storage" |
| 11 | + "github.com/weaveworks/gitops-toolkit/pkg/storage/cache" |
| 12 | + |
| 13 | + api "github.com/weaveworks/ignite/pkg/apis/ignite" |
| 14 | + "github.com/weaveworks/ignite/pkg/apis/ignite/scheme" |
| 15 | + meta "github.com/weaveworks/ignite/pkg/apis/meta/v1alpha1" |
| 16 | + "github.com/weaveworks/ignite/pkg/client" |
| 17 | + "github.com/weaveworks/ignite/pkg/providers" |
| 18 | + "github.com/weaveworks/ignite/pkg/util" |
| 19 | +) |
| 20 | + |
| 21 | +func TestNewRmOptions(t *testing.T) { |
| 22 | + testdataDir := "testdata" |
| 23 | + |
| 24 | + cases := []struct { |
| 25 | + name string |
| 26 | + existingVMs []string |
| 27 | + rmFlags *RmFlags |
| 28 | + vmMatches []string // argument of NewRmOptions() |
| 29 | + wantMatches []string |
| 30 | + err bool |
| 31 | + }{ |
| 32 | + { |
| 33 | + name: "rm with vm arg", |
| 34 | + existingVMs: []string{"myvm1", "myvm2", "myvm3"}, |
| 35 | + rmFlags: &RmFlags{}, |
| 36 | + vmMatches: []string{"myvm2"}, |
| 37 | + wantMatches: []string{"myvm2"}, |
| 38 | + }, |
| 39 | + { |
| 40 | + name: "rm with multiple vm args", |
| 41 | + existingVMs: []string{"myvm1", "myvm2", "myvm3"}, |
| 42 | + rmFlags: &RmFlags{}, |
| 43 | + vmMatches: []string{"myvm2", "myvm3"}, |
| 44 | + wantMatches: []string{"myvm2", "myvm3"}, |
| 45 | + }, |
| 46 | + { |
| 47 | + name: "error rm non-existing vm", |
| 48 | + existingVMs: []string{"myvm1", "myvm2", "myvm3"}, |
| 49 | + rmFlags: &RmFlags{}, |
| 50 | + vmMatches: []string{"myvm4"}, |
| 51 | + err: true, |
| 52 | + }, |
| 53 | + { |
| 54 | + name: "error rm without any args or config flag", |
| 55 | + existingVMs: []string{"myvm1", "myvm2", "myvm3"}, |
| 56 | + rmFlags: &RmFlags{}, |
| 57 | + err: true, |
| 58 | + }, |
| 59 | + { |
| 60 | + name: "error rm with vm arg and config flag", |
| 61 | + existingVMs: []string{"myvm1"}, |
| 62 | + rmFlags: &RmFlags{ConfigFile: "foo.yaml"}, |
| 63 | + vmMatches: []string{"myvm1"}, |
| 64 | + err: true, |
| 65 | + }, |
| 66 | + { |
| 67 | + name: "rm with config file", |
| 68 | + existingVMs: []string{"myvm1", "myvm2", "myvm3"}, |
| 69 | + rmFlags: &RmFlags{ConfigFile: filepath.Join(testdataDir, "input/rm-vm1.yaml")}, |
| 70 | + wantMatches: []string{"myvm2"}, |
| 71 | + }, |
| 72 | + { |
| 73 | + name: "error rm config name and uid missing", |
| 74 | + existingVMs: []string{"myvm1"}, |
| 75 | + rmFlags: &RmFlags{ConfigFile: filepath.Join(testdataDir, "input/rm-no-name-uid.yaml")}, |
| 76 | + err: true, |
| 77 | + }, |
| 78 | + } |
| 79 | + |
| 80 | + for _, rt := range cases { |
| 81 | + t.Run(rt.name, func(t *testing.T) { |
| 82 | + // Create storage. |
| 83 | + dir, err := ioutil.TempDir("", "ignite") |
| 84 | + if err != nil { |
| 85 | + t.Fatalf("failed to create storage for ignite: %v", err) |
| 86 | + } |
| 87 | + defer os.RemoveAll(dir) |
| 88 | + |
| 89 | + storage := cache.NewCache( |
| 90 | + storage.NewGenericStorage( |
| 91 | + storage.NewGenericRawStorage(dir), scheme.Serializer)) |
| 92 | + |
| 93 | + // Create ignite client with the created storage. |
| 94 | + ic := client.NewClient(storage) |
| 95 | + |
| 96 | + // Create the existing VMs. |
| 97 | + for _, objectName := range rt.existingVMs { |
| 98 | + vm := &api.VM{} |
| 99 | + vm.SetName(objectName) |
| 100 | + |
| 101 | + // Set UID. |
| 102 | + uid, err := util.NewUID() |
| 103 | + if err != nil { |
| 104 | + t.Errorf("failed to generate new UID: %v", err) |
| 105 | + } |
| 106 | + vm.SetUID(runtime.UID(uid)) |
| 107 | + |
| 108 | + // Set VM image. |
| 109 | + ociRef, err := meta.NewOCIImageRef("foo/bar:latest") |
| 110 | + if err != nil { |
| 111 | + t.Errorf("failed to create new image reference: %v", err) |
| 112 | + } |
| 113 | + img := &api.Image{ |
| 114 | + Spec: api.ImageSpec{ |
| 115 | + OCI: ociRef, |
| 116 | + }, |
| 117 | + } |
| 118 | + vm.SetImage(img) |
| 119 | + |
| 120 | + // Set Kernel image. |
| 121 | + ociRefKernel, err := meta.NewOCIImageRef("foo/bar:latest") |
| 122 | + if err != nil { |
| 123 | + t.Errorf("failed to create new image reference: %v", err) |
| 124 | + } |
| 125 | + kernel := &api.Kernel{ |
| 126 | + Spec: api.KernelSpec{ |
| 127 | + OCI: ociRefKernel, |
| 128 | + }, |
| 129 | + } |
| 130 | + vm.SetKernel(kernel) |
| 131 | + |
| 132 | + // Save object. |
| 133 | + if err := ic.VMs().Set(vm); err != nil { |
| 134 | + t.Errorf("failed to store VM object: %v", err) |
| 135 | + } |
| 136 | + } |
| 137 | + |
| 138 | + // Set provider client used in remove to find VM matches. |
| 139 | + providers.Client = ic |
| 140 | + |
| 141 | + // Create new rm options using the rmFlags and vmMatches. |
| 142 | + ro, err := rt.rmFlags.NewRmOptions(rt.vmMatches) |
| 143 | + if (err != nil) != rt.err { |
| 144 | + t.Fatalf("expected error %t, actual: %v", rt.err, err) |
| 145 | + } |
| 146 | + |
| 147 | + // Check if the wanted VMs are in the matched VMs list. |
| 148 | + for _, wantVM := range rt.wantMatches { |
| 149 | + found := false |
| 150 | + for _, vm := range ro.vms { |
| 151 | + if vm.Name == wantVM { |
| 152 | + found = true |
| 153 | + break |
| 154 | + } |
| 155 | + } |
| 156 | + if !found { |
| 157 | + t.Errorf("expected vm %q to be in remove vm list", wantVM) |
| 158 | + } |
| 159 | + } |
| 160 | + }) |
| 161 | + } |
| 162 | +} |
0 commit comments