mirror of
https://github.com/containers/podman.git
synced 2025-06-21 09:28:09 +08:00
Add until filter to volume ls filters list
As a conclusion of a discussion in #10861, until filter is added by this commit to volume ls filters. Signed-off-by: Jakub Guzik <jakubmguzik@gmail.com>
This commit is contained in:
@ -24,6 +24,7 @@ Volumes can be filtered by the following attributes:
|
|||||||
- name
|
- name
|
||||||
- opt
|
- opt
|
||||||
- scope
|
- scope
|
||||||
|
- until
|
||||||
|
|
||||||
#### **--format**=*format*
|
#### **--format**=*format*
|
||||||
|
|
||||||
|
@ -68,6 +68,7 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error {
|
|||||||
// - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
|
// - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
|
||||||
// - name=<volume-name> Matches all of volume name.
|
// - name=<volume-name> Matches all of volume name.
|
||||||
// - opt=<driver-option> Matches a storage driver options
|
// - opt=<driver-option> Matches a storage driver options
|
||||||
|
// - `until=<timestamp>` List volumes created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
|
||||||
// responses:
|
// responses:
|
||||||
// '200':
|
// '200':
|
||||||
// "$ref": "#/responses/VolumeList"
|
// "$ref": "#/responses/VolumeList"
|
||||||
@ -166,6 +167,7 @@ func (s *APIServer) registerVolumeHandlers(r *mux.Router) error {
|
|||||||
// - driver=<volume-driver-name> Matches volumes based on their driver.
|
// - driver=<volume-driver-name> Matches volumes based on their driver.
|
||||||
// - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
|
// - label=<key> or label=<key>:<value> Matches volumes based on the presence of a label alone or a label and a value.
|
||||||
// - name=<volume-name> Matches all of volume name.
|
// - name=<volume-name> Matches all of volume name.
|
||||||
|
// - `until=<timestamp>` List volumes created before this timestamp. The `<timestamp>` can be Unix timestamps, date formatted timestamps, or Go duration strings (e.g. `10m`, `1h30m`) computed relative to the daemon machine’s time.
|
||||||
//
|
//
|
||||||
// Note:
|
// Note:
|
||||||
// The boolean `dangling` filter is not yet implemented for this endpoint.
|
// The boolean `dangling` filter is not yet implemented for this endpoint.
|
||||||
|
@ -51,6 +51,12 @@ func GenerateVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, error) {
|
|||||||
}
|
}
|
||||||
return false
|
return false
|
||||||
})
|
})
|
||||||
|
case "until":
|
||||||
|
f, err := createUntilFilterVolumeFunction(val)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
vf = append(vf, f)
|
||||||
case "dangling":
|
case "dangling":
|
||||||
danglingVal := val
|
danglingVal := val
|
||||||
invert := false
|
invert := false
|
||||||
@ -93,16 +99,11 @@ func GeneratePruneVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, erro
|
|||||||
return util.MatchLabelFilters([]string{filterVal}, v.Labels())
|
return util.MatchLabelFilters([]string{filterVal}, v.Labels())
|
||||||
})
|
})
|
||||||
case "until":
|
case "until":
|
||||||
until, err := util.ComputeUntilTimestamp([]string{filterVal})
|
f, err := createUntilFilterVolumeFunction(filterVal)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
vf = append(vf, func(v *libpod.Volume) bool {
|
vf = append(vf, f)
|
||||||
if !until.IsZero() && v.CreatedTime().Before(until) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return false
|
|
||||||
})
|
|
||||||
default:
|
default:
|
||||||
return nil, errors.Errorf("%q is an invalid volume filter", filter)
|
return nil, errors.Errorf("%q is an invalid volume filter", filter)
|
||||||
}
|
}
|
||||||
@ -110,3 +111,16 @@ func GeneratePruneVolumeFilters(filters url.Values) ([]libpod.VolumeFilter, erro
|
|||||||
}
|
}
|
||||||
return vf, nil
|
return vf, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func createUntilFilterVolumeFunction(filter string) (libpod.VolumeFilter, error) {
|
||||||
|
until, err := util.ComputeUntilTimestamp([]string{filter})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return func(v *libpod.Volume) bool {
|
||||||
|
if !until.IsZero() && v.CreatedTime().Before(until) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
@ -174,6 +174,8 @@ t POST libpod/volumes/create \
|
|||||||
# with date way back in the past, volume should not be deleted (compat api)
|
# with date way back in the past, volume should not be deleted (compat api)
|
||||||
t POST volumes/prune?filters='{"until":["500000"]}' 200
|
t POST volumes/prune?filters='{"until":["500000"]}' 200
|
||||||
t GET libpod/volumes/json?filters='{"label":["testuntilcompat"]}' 200 length=1
|
t GET libpod/volumes/json?filters='{"label":["testuntilcompat"]}' 200 length=1
|
||||||
|
t GET libpod/volumes/json?filters='{"until":["500000"]}' 200 length=0
|
||||||
|
t GET libpod/volumes/json?filters='{"until":["5000000000"]}' 200 length=1
|
||||||
|
|
||||||
# with date far in the future, volume should be deleted (compat api)
|
# with date far in the future, volume should be deleted (compat api)
|
||||||
t POST volumes/prune?filters='{"until":["5000000000"]}' 200
|
t POST volumes/prune?filters='{"until":["5000000000"]}' 200
|
||||||
|
@ -101,6 +101,22 @@ var _ = Describe("Podman volume ls", func() {
|
|||||||
Expect(len(session.OutputToStringArray())).To(Equal(0))
|
Expect(len(session.OutputToStringArray())).To(Equal(0))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("podman ls volume with --filter until flag", func() {
|
||||||
|
session := podmanTest.Podman([]string{"volume", "create"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session).Should(Exit(0))
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"volume", "ls", "--filter", "until=5000000000"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session).Should(Exit(0))
|
||||||
|
Expect(len(session.OutputToStringArray())).To(Equal(2))
|
||||||
|
|
||||||
|
session = podmanTest.Podman([]string{"volume", "ls", "--filter", "until=50000"})
|
||||||
|
session.WaitWithDefaultTimeout()
|
||||||
|
Expect(session).Should(Exit(0))
|
||||||
|
Expect(len(session.OutputToStringArray())).To(Equal(0))
|
||||||
|
})
|
||||||
|
|
||||||
It("podman volume ls with --filter dangling", func() {
|
It("podman volume ls with --filter dangling", func() {
|
||||||
volName1 := "volume1"
|
volName1 := "volume1"
|
||||||
session := podmanTest.Podman([]string{"volume", "create", volName1})
|
session := podmanTest.Podman([]string{"volume", "create", volName1})
|
||||||
|
Reference in New Issue
Block a user