Skip to content

Commit c3e32ce

Browse files
committed
add volumedriver filter for desiredlrps
1 parent d022742 commit c3e32ce

File tree

8 files changed

+222
-38
lines changed

8 files changed

+222
-38
lines changed

db/sqldb/desired_lrp_db.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ func (db *SQLDB) DesiredLRPs(ctx context.Context, logger lager.Logger, filter mo
125125
values = append(values, filter.Domain)
126126
}
127127

128+
if filter.VolumeMountDriver != "" {
129+
wheres = append(wheres, "run_info LIKE ?")
130+
values = append(values, "%\"Driver\"%\"%"+filter.VolumeMountDriver+"\"%")
131+
}
132+
128133
if len(filter.ProcessGuids) > 0 {
129134
wheres = append(wheres, whereClauseForProcessGuids(filter.ProcessGuids))
130135

db/sqldb/desired_lrp_db_test.go

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,35 @@ var _ = Describe("DesiredLRPDB", func() {
135135
expectedDesiredLRPs = append(expectedDesiredLRPs, model_helpers.NewValidDesiredLRP("d-1"))
136136
expectedDesiredLRPs = append(expectedDesiredLRPs, model_helpers.NewValidDesiredLRP("d-2"))
137137
expectedDesiredLRPs = append(expectedDesiredLRPs, model_helpers.NewValidDesiredLRP("d-3"))
138+
// Create LRP with multiple volume mounts (one matching, one not)
139+
expectedDesiredLRPs[1].VolumeMounts = []*models.VolumeMount{
140+
{
141+
Driver: "other-driver",
142+
ContainerDir: "/mnt/other",
143+
Mode: "r",
144+
Shared: &models.SharedDevice{
145+
VolumeId: "vol-id-3",
146+
},
147+
},
148+
{
149+
Driver: "test-driver",
150+
ContainerDir: "/mnt/test2",
151+
Mode: "rw",
152+
Shared: &models.SharedDevice{
153+
VolumeId: "vol-id-4",
154+
},
155+
},
156+
{
157+
Driver: "third-driver",
158+
ContainerDir: "/mnt/third",
159+
Mode: "r",
160+
Shared: &models.SharedDevice{
161+
VolumeId: "vol-id-5",
162+
},
163+
},
164+
}
165+
// Create LRP with no volume mounts
166+
expectedDesiredLRPs[2].VolumeMounts = []*models.VolumeMount{}
138167
for i, expectedDesiredLRP := range expectedDesiredLRPs {
139168
expectedDesiredLRP.Domain = fmt.Sprintf("domain-%d", i+1)
140169
Expect(sqlDB.DesireLRP(ctx, logger, expectedDesiredLRP)).To(Succeed())
@@ -218,6 +247,57 @@ var _ = Describe("DesiredLRPDB", func() {
218247
})
219248
})
220249

250+
Context("when filtering by volume mount driver", func() {
251+
FIt("returns LRPs that have a volume mount with matching driver", func() {
252+
desiredLRPs, err := sqlDB.DesiredLRPs(ctx, logger, models.DesiredLRPFilter{VolumeMountDriver: "my-driver"})
253+
Expect(err).NotTo(HaveOccurred())
254+
255+
Expect(desiredLRPs).To(HaveLen(1))
256+
processGuids := []string{desiredLRPs[0].ProcessGuid}
257+
Expect(processGuids).To(ContainElements("d-1"))
258+
})
259+
260+
FIt("finds LRPs with matching driver among multiple volume mounts", func() {
261+
desiredLRPs, err := sqlDB.DesiredLRPs(ctx, logger, models.DesiredLRPFilter{VolumeMountDriver: "third-driver"})
262+
Expect(err).NotTo(HaveOccurred())
263+
264+
Expect(desiredLRPs).To(HaveLen(1))
265+
Expect(desiredLRPs[0].ProcessGuid).To(Equal("d-2"))
266+
Expect(desiredLRPs[0].VolumeMounts).To(HaveLen(3))
267+
})
268+
269+
It("returns empty list when no LRPs have matching volume mount driver", func() {
270+
desiredLRPs, err := sqlDB.DesiredLRPs(ctx, logger, models.DesiredLRPFilter{VolumeMountDriver: "non-existent-driver"})
271+
Expect(err).NotTo(HaveOccurred())
272+
273+
Expect(desiredLRPs).To(HaveLen(0))
274+
})
275+
276+
It("excludes LRPs with no volume mounts", func() {
277+
desiredLRPs, err := sqlDB.DesiredLRPs(ctx, logger, models.DesiredLRPFilter{VolumeMountDriver: "test-driver"})
278+
Expect(err).NotTo(HaveOccurred())
279+
280+
processGuids := make([]string, len(desiredLRPs))
281+
for i, lrp := range desiredLRPs {
282+
processGuids[i] = lrp.ProcessGuid
283+
}
284+
Expect(processGuids).NotTo(ContainElement("d-3"))
285+
})
286+
287+
It("can combine volume mount driver filter with domain filter", func() {
288+
desiredLRPs, err := sqlDB.DesiredLRPs(ctx, logger, models.DesiredLRPFilter{
289+
Domain: "domain-1",
290+
VolumeMountDriver: "my-driver",
291+
})
292+
Expect(err).NotTo(HaveOccurred())
293+
294+
Expect(desiredLRPs).To(HaveLen(1))
295+
for _, lrp := range desiredLRPs {
296+
Expect(lrp.Domain).To(Equal("domain-1"))
297+
}
298+
})
299+
})
300+
221301
Context("when the run info is invalid", func() {
222302
BeforeEach(func() {
223303
queryStr := "UPDATE desired_lrps SET run_info = ? WHERE process_guid = ?"

handlers/desired_lrp_handlers.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,7 @@ func (h *DesiredLRPHandler) commonDesiredLRPs(logger lager.Logger, targetVersion
7575

7676
err = parseRequest(logger, req, request)
7777
if err == nil {
78-
filter := models.DesiredLRPFilter{Domain: request.Domain, ProcessGuids: request.ProcessGuids}
78+
filter := models.DesiredLRPFilter{Domain: request.Domain, ProcessGuids: request.ProcessGuids, VolumeMountDriver: request.VolumeMountDriver}
7979

8080
var desiredLRPs []*models.DesiredLRP
8181
desiredLRPs, err = h.desiredLRPDB.DesiredLRPs(req.Context(), logger, filter)

handlers/desired_lrp_handlers_test.go

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -343,6 +343,18 @@ var _ = Describe("DesiredLRP Handlers", func() {
343343
})
344344
})
345345

346+
Context("when filtering by volume mount driver", func() {
347+
BeforeEach(func() {
348+
requestBody = &models.DesiredLRPsRequest{VolumeMountDriver: "test-driver"}
349+
})
350+
351+
It("passes the volume mount driver filter to the DB", func() {
352+
Expect(fakeDesiredLRPDB.DesiredLRPsCallCount()).To(Equal(1))
353+
_, _, filter := fakeDesiredLRPDB.DesiredLRPsArgsForCall(0)
354+
Expect(filter.VolumeMountDriver).To(Equal("test-driver"))
355+
})
356+
})
357+
346358
Context("when the DB returns no desired lrps", func() {
347359
BeforeEach(func() {
348360
fakeDesiredLRPDB.DesiredLRPsReturns([]*models.DesiredLRP{}, nil)
@@ -700,6 +712,18 @@ var _ = Describe("DesiredLRP Handlers", func() {
700712
Expect(filter.ProcessGuids).To(Equal([]string{"guid-1", "guid-2"}))
701713
})
702714
})
715+
716+
Context("when filtering by volume mount driver", func() {
717+
BeforeEach(func() {
718+
requestBody = &models.DesiredLRPsRequest{VolumeMountDriver: "test-driver"}
719+
})
720+
721+
It("passes the volume mount driver filter to the DB", func() {
722+
Expect(fakeDesiredLRPDB.DesiredLRPSchedulingInfosCallCount()).To(Equal(1))
723+
_, _, filter := fakeDesiredLRPDB.DesiredLRPSchedulingInfosArgsForCall(0)
724+
Expect(filter.VolumeMountDriver).To(Equal("test-driver"))
725+
})
726+
})
703727
})
704728

705729
Context("when the DB returns no desired lrps", func() {

models/desired_lrp.go

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@ type DesiredLRPChange struct {
2424
}
2525

2626
type DesiredLRPFilter struct {
27-
Domain string
28-
ProcessGuids []string
27+
Domain string
28+
ProcessGuids []string
29+
VolumeMountDriver string
2930
}
3031

3132
func PreloadedRootFS(stack string) string {

models/desired_lrp_requests.pb.go

Lines changed: 94 additions & 35 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

models/desired_lrp_requests.proto

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ message DesiredLRPsResponse {
1818
message DesiredLRPsRequest {
1919
string domain = 1 [(gogoproto.jsontag) = "domain"];
2020
repeated string process_guids = 2;
21+
repeated string app_guids = 3;
2122
}
2223

2324
message DesiredLRPResponse {

models/desired_lrp_test.go

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1692,3 +1692,17 @@ func newValidLRPKey() models.DesiredLRPKey {
16921692
func newValidResource() models.DesiredLRPResource {
16931693
return models.NewDesiredLRPResource(256, 256, 256, "preloaded://linux64")
16941694
}
1695+
1696+
var _ = Describe("DesiredLRPFilter", func() {
1697+
It("supports VolumeMountDriver field", func() {
1698+
filter := models.DesiredLRPFilter{
1699+
Domain: "test-domain",
1700+
ProcessGuids: []string{"guid-1", "guid-2"},
1701+
VolumeMountDriver: "test-driver",
1702+
}
1703+
1704+
Expect(filter.Domain).To(Equal("test-domain"))
1705+
Expect(filter.ProcessGuids).To(Equal([]string{"guid-1", "guid-2"}))
1706+
Expect(filter.VolumeMountDriver).To(Equal("test-driver"))
1707+
})
1708+
})

0 commit comments

Comments
 (0)