Skip to content

Commit 97ac8ca

Browse files
authored
Merge pull request #1212 from sam-berning/volume
limactl: allow passing disks as args to `disk ls`
2 parents 309b358 + c93034d commit 97ac8ca

File tree

2 files changed

+60
-47
lines changed

2 files changed

+60
-47
lines changed

cmd/limactl/disk.go

+59-43
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ func diskCreateAction(cmd *cobra.Command, args []string) error {
7878
return fmt.Errorf("disk %q already exists (%q)", name, diskDir)
7979
}
8080

81-
logrus.Infof("Creating a disk %q", name)
81+
logrus.Infof("Creating disk %q with size %s", name, units.BytesSize(float64(diskSize)))
8282

8383
if err := os.MkdirAll(diskDir, 0700); err != nil {
8484
return err
@@ -100,13 +100,23 @@ $ limactl disk list
100100
`,
101101
Short: "List existing Lima disks",
102102
Aliases: []string{"ls"},
103-
Args: cobra.NoArgs,
103+
Args: cobra.ArbitraryArgs,
104104
RunE: diskListAction,
105105
}
106106
diskListCommand.Flags().Bool("json", false, "JSONify output")
107107
return diskListCommand
108108
}
109109

110+
func diskMatches(diskName string, disks []string) []string {
111+
matches := []string{}
112+
for _, disk := range disks {
113+
if disk == diskName {
114+
matches = append(matches, disk)
115+
}
116+
}
117+
return matches
118+
}
119+
110120
func diskListAction(cmd *cobra.Command, args []string) error {
111121
jsonFormat, err := cmd.Flags().GetBool("json")
112122
if err != nil {
@@ -118,8 +128,22 @@ func diskListAction(cmd *cobra.Command, args []string) error {
118128
return err
119129
}
120130

131+
disks := []string{}
132+
if len(args) > 0 {
133+
for _, arg := range args {
134+
matches := diskMatches(arg, allDisks)
135+
if len(matches) > 0 {
136+
disks = append(disks, matches...)
137+
} else {
138+
logrus.Warnf("No disk matching %v found.", arg)
139+
}
140+
}
141+
} else {
142+
disks = allDisks
143+
}
144+
121145
if jsonFormat {
122-
for _, diskName := range allDisks {
146+
for _, diskName := range disks {
123147
disk, err := store.InspectDisk(diskName)
124148
if err != nil {
125149
logrus.WithError(err).Errorf("disk %q does not exist?", diskName)
@@ -137,11 +161,11 @@ func diskListAction(cmd *cobra.Command, args []string) error {
137161
w := tabwriter.NewWriter(cmd.OutOrStdout(), 4, 8, 4, ' ', 0)
138162
fmt.Fprintln(w, "NAME\tSIZE\tDIR\tIN-USE-BY")
139163

140-
if len(allDisks) == 0 {
164+
if len(disks) == 0 {
141165
logrus.Warn("No disk found. Run `limactl disk create DISK --size SIZE` to create a disk.")
142166
}
143167

144-
for _, diskName := range allDisks {
168+
for _, diskName := range disks {
145169
disk, err := store.InspectDisk(diskName)
146170
if err != nil {
147171
logrus.WithError(err).Errorf("disk %q does not exist?", diskName)
@@ -168,7 +192,7 @@ $ limactl disk delete DISK1 DISK2 ...
168192
Args: cobra.MinimumNArgs(1),
169193
RunE: diskDeleteAction,
170194
}
171-
diskDeleteCommand.Flags().Bool("force", false, "force delete")
195+
diskDeleteCommand.Flags().BoolP("force", "f", false, "force delete")
172196
return diskDeleteCommand
173197
}
174198

@@ -178,24 +202,20 @@ func diskDeleteAction(cmd *cobra.Command, args []string) error {
178202
return err
179203
}
180204

181-
for _, diskName := range args {
182-
if force {
183-
disk, err := store.InspectDisk(diskName)
184-
if err != nil {
185-
if errors.Is(err, fs.ErrNotExist) {
186-
logrus.Warnf("Ignoring non-existent disk %q", diskName)
187-
continue
188-
}
189-
return err
190-
}
191-
192-
if err := deleteDisk(disk); err != nil {
193-
return fmt.Errorf("failed to delete disk %q: %w", diskName, err)
194-
}
195-
logrus.Infof("Deleted %q (%q)", diskName, disk.Dir)
205+
instNames, err := store.Instances()
206+
if err != nil {
207+
return err
208+
}
209+
var instances []*store.Instance
210+
for _, instName := range instNames {
211+
inst, err := store.Inspect(instName)
212+
if err != nil {
196213
continue
197214
}
215+
instances = append(instances, inst)
216+
}
198217

218+
for _, diskName := range args {
199219
disk, err := store.InspectDisk(diskName)
200220
if err != nil {
201221
if errors.Is(err, fs.ErrNotExist) {
@@ -204,33 +224,29 @@ func diskDeleteAction(cmd *cobra.Command, args []string) error {
204224
}
205225
return err
206226
}
207-
if disk.Instance != "" {
208-
return fmt.Errorf("cannot delete disk %q in use by instance %q", disk.Name, disk.Instance)
209-
}
210-
instances, err := store.Instances()
211-
if err != nil {
212-
return err
213-
}
214-
var refInstances []string
215-
for _, instName := range instances {
216-
inst, err := store.Inspect(instName)
217-
if err != nil {
218-
continue
227+
228+
if !force {
229+
if disk.Instance != "" {
230+
return fmt.Errorf("cannot delete disk %q in use by instance %q", disk.Name, disk.Instance)
219231
}
220-
if len(inst.AdditionalDisks) > 0 {
221-
for _, d := range inst.AdditionalDisks {
222-
if d == diskName {
223-
refInstances = append(refInstances, instName)
232+
var refInstances []string
233+
for _, inst := range instances {
234+
if len(inst.AdditionalDisks) > 0 {
235+
for _, d := range inst.AdditionalDisks {
236+
if d == diskName {
237+
refInstances = append(refInstances, inst.Name)
238+
}
224239
}
225240
}
226241
}
242+
if len(refInstances) > 0 {
243+
logrus.Warnf("Skipping deleting disk %q, disk is referenced by one or more non-running instances: %q",
244+
diskName, refInstances)
245+
logrus.Warnf("To delete anyway, run %q", forceDeleteCommand(diskName))
246+
continue
247+
}
227248
}
228-
if len(refInstances) > 0 {
229-
logrus.Warnf("Skipping deleting disk %q, disk is referenced by one or more non-running instances: %q",
230-
diskName, refInstances)
231-
logrus.Warnf("To delete anyway, run %q", forceDeleteCommand(diskName))
232-
continue
233-
}
249+
234250
if err := deleteDisk(disk); err != nil {
235251
return fmt.Errorf("failed to delete disk %q: %v", diskName, err)
236252
}

pkg/store/disk.go

+1-4
Original file line numberDiff line numberDiff line change
@@ -44,10 +44,7 @@ func InspectDisk(diskName string) (*Disk, error) {
4444

4545
instDir, err := os.Readlink(filepath.Join(diskDir, filenames.InUseBy))
4646
if err != nil {
47-
if errors.Is(err, fs.ErrNotExist) {
48-
disk.Instance = ""
49-
disk.InstanceDir = ""
50-
} else {
47+
if !errors.Is(err, fs.ErrNotExist) {
5148
return nil, err
5249
}
5350
} else {

0 commit comments

Comments
 (0)