PortAllocator: Check if generated port is not already in use or reserved

Change-Id: Ic152e5265fe06b62d8e4e94e8212b02eb42025dd
diff --git a/core/port-allocator/main.go b/core/port-allocator/main.go
index 6b4fd47..3d69ab9 100644
--- a/core/port-allocator/main.go
+++ b/core/port-allocator/main.go
@@ -200,7 +200,9 @@
 		p := start + int(r.Int64())
 		ps := strconv.Itoa(p)
 		if _, ok := pm[ps]; !ok {
-			return p, nil
+			if _, ok := reserve[p]; !ok {
+				return p, nil
+			}
 		}
 	}
 	return -1, fmt.Errorf("could not generate random port")
diff --git a/core/port-allocator/main_test.go b/core/port-allocator/main_test.go
index caf2d51..c56f51c 100644
--- a/core/port-allocator/main_test.go
+++ b/core/port-allocator/main_test.go
@@ -171,3 +171,17 @@
 	}
 	t.Logf("Generated secret: %s", secret)
 }
+
+func TestReservePort(t *testing.T) {
+	pm := map[string]struct{}{
+		"10000": {},
+	}
+	reserve := make(map[int]string)
+	for i := start; i <= end; i++ {
+		reserve[i] = "reserved"
+	}
+	_, err := reservePort(pm, reserve)
+	if err != nil {
+		t.Fatalf("error: %v", err)
+	}
+}