Browse code

Refactor publish/expose filter to remove duplication

Signed-off-by: Vincent Demeester <vincent@sbr.pm>

Vincent Demeester authored on 2017/02/28 19:11:55
Showing 1 changed files
... ...
@@ -333,49 +333,13 @@ func (daemon *Daemon) foldFilter(config *types.ContainerListOptions) (*listConte
333 333
 	}
334 334
 
335 335
 	publishFilter := map[nat.Port]bool{}
336
-	err = psFilters.WalkValues("publish", func(value string) error {
337
-		if strings.Contains(value, ":") {
338
-			return fmt.Errorf("filter for 'publish' should not contain ':': %v", value)
339
-		}
340
-		//support two formats, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
341
-		proto, port := nat.SplitProtoPort(value)
342
-		start, end, err := nat.ParsePortRange(port)
343
-		if err != nil {
344
-			return fmt.Errorf("error while looking up for publish %v: %s", value, err)
345
-		}
346
-		for i := start; i <= end; i++ {
347
-			p, err := nat.NewPort(proto, strconv.FormatUint(i, 10))
348
-			if err != nil {
349
-				return fmt.Errorf("error while looking up for publish %v: %s", value, err)
350
-			}
351
-			publishFilter[p] = true
352
-		}
353
-		return nil
354
-	})
336
+	err = psFilters.WalkValues("publish", portOp("publish", publishFilter))
355 337
 	if err != nil {
356 338
 		return nil, err
357 339
 	}
358 340
 
359 341
 	exposeFilter := map[nat.Port]bool{}
360
-	err = psFilters.WalkValues("expose", func(value string) error {
361
-		if strings.Contains(value, ":") {
362
-			return fmt.Errorf("filter for 'expose' should not contain ':': %v", value)
363
-		}
364
-		//support two formats, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
365
-		proto, port := nat.SplitProtoPort(value)
366
-		start, end, err := nat.ParsePortRange(port)
367
-		if err != nil {
368
-			return fmt.Errorf("error while looking up for 'expose' %v: %s", value, err)
369
-		}
370
-		for i := start; i <= end; i++ {
371
-			p, err := nat.NewPort(proto, strconv.FormatUint(i, 10))
372
-			if err != nil {
373
-				return fmt.Errorf("error while looking up for 'expose' %v: %s", value, err)
374
-			}
375
-			exposeFilter[p] = true
376
-		}
377
-		return nil
378
-	})
342
+	err = psFilters.WalkValues("expose", portOp("expose", exposeFilter))
379 343
 	if err != nil {
380 344
 		return nil, err
381 345
 	}
... ...
@@ -395,6 +359,27 @@ func (daemon *Daemon) foldFilter(config *types.ContainerListOptions) (*listConte
395 395
 		names:                daemon.nameIndex.GetAll(),
396 396
 	}, nil
397 397
 }
398
+func portOp(key string, filter map[nat.Port]bool) func(value string) error {
399
+	return func(value string) error {
400
+		if strings.Contains(value, ":") {
401
+			return fmt.Errorf("filter for '%s' should not contain ':': %s", key, value)
402
+		}
403
+		//support two formats, original format <portnum>/[<proto>] or <startport-endport>/[<proto>]
404
+		proto, port := nat.SplitProtoPort(value)
405
+		start, end, err := nat.ParsePortRange(port)
406
+		if err != nil {
407
+			return fmt.Errorf("error while looking up for %s %s: %s", key, value, err)
408
+		}
409
+		for i := start; i <= end; i++ {
410
+			p, err := nat.NewPort(proto, strconv.FormatUint(i, 10))
411
+			if err != nil {
412
+				return fmt.Errorf("error while looking up for %s %s: %s", key, value, err)
413
+			}
414
+			filter[p] = true
415
+		}
416
+		return nil
417
+	}
418
+}
398 419
 
399 420
 // includeContainerInList decides whether a container should be included in the output or not based in the filter.
400 421
 // It also decides if the iteration should be stopped or not.