Skip to content

Commit

Permalink
Get security issues for all regions
Browse files Browse the repository at this point in the history
  • Loading branch information
Sergey Skripnick committed Dec 26, 2016
1 parent 993a258 commit ef444a4
Show file tree
Hide file tree
Showing 7 changed files with 105 additions and 97 deletions.
4 changes: 2 additions & 2 deletions ceagle/api/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -17,12 +17,12 @@

from ceagle.api import base
from ceagle.api_fake_data import availability
from ceagle.api_fake_data import fake_security
from ceagle.api_fake_data import health
from ceagle.api_fake_data import security
from ceagle import config

FAKE_CLIENT_MAP = {
"security": fake_security.Client,
"security": security.Client,
"health": health.Client,
"availability": availability.Client,
}
Expand Down
14 changes: 11 additions & 3 deletions ceagle/api/v1/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,12 +20,20 @@
security = flask.Blueprint("security", __name__)


@security.route("/<region>/security/issues/<period>", methods=["GET"])
@security.route("/region/<region>/security/issues/<period>", methods=["GET"])
def get_issues(region, period):
c = client.get_client("security")
body, status = c.get("%s/security/issues/%s" % (region, period))
body, status = c.get(
"/api/v1/region/%s/security/issues/%s" % (region, period))
return flask.jsonify(body), status


@security.route("/security/issues/<period>", methods=["GET"])
def get_issues_all_regions(period):
c = client.get_client("security")
body, status = c.get("/api/v1/security/issues/%s" % period)
return flask.jsonify(body), status


def get_blueprints():
return [["/region", security]]
return [["", security]]
2 changes: 1 addition & 1 deletion ceagle/api_fake_data/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@

def route(reg):
def decorator(method):
method._route = re.compile(reg)
method._route = re.compile("^%s$" % reg)
return method
return decorator

Expand Down
79 changes: 0 additions & 79 deletions ceagle/api_fake_data/fake_security.py

This file was deleted.

65 changes: 62 additions & 3 deletions ceagle/api_fake_data/security.py
Original file line number Diff line number Diff line change
Expand Up @@ -13,11 +13,70 @@
# License for the specific language governing permissions and limitations
# under the License.

import datetime

from ceagle.api_fake_data import base


def _get_fake_issue(region, issue_type, days):
now = datetime.datetime.now()
discovered = now - datetime.timedelta(days=days)
confirmed = now
return {
"type": issue_type,
"description": "Sample issue " + issue_type,
"discovered_at": discovered.isoformat(),
"confirmed_at": confirmed.isoformat(),
"object_id": "test-id-%s-%d" % (issue_type, days),
"region": region,
}

FAKE_ISSUES = {
"region1": [
_get_fake_issue("region1", "IssueType1", 2),
_get_fake_issue("region1", "IssueType2", 8),
],
"north-2.piedpiper.net": [
_get_fake_issue("north-2.piedpiper.net", "IssueType1", 0),
_get_fake_issue("north-2.piedpiper.net", "IssueType2", 2),
_get_fake_issue("north-2.piedpiper.net", "IssueType2", 8),
],
}

PERIOD_MAP = {
"day": 1,
"week": 7,
"month": 30,
}

REGION_R = r"(?P<region>[a-z\d\-\.\_]+)"
PERIOD_R = r"(?P<period>day|week|month)"


def _get_issues(region, period):
issues = []
if region:
all_issues = FAKE_ISSUES.get(region)
else:
all_issues = sum(FAKE_ISSUES.values(), [])
now = datetime.datetime.now()
try:
discovered_before = (now - datetime.timedelta(
days=PERIOD_MAP[period])).isoformat("T")
except KeyError:
return {"error": "Not found"}, 404
for issue in all_issues:
if issue["discovered_at"] >= discovered_before:
issues.append(issue)
return issues


class Client(base.FakeClient):

@base.route("/api/v1/security/issues/(?P<period>day|week|month)")
def health(self, query, period):
return {"issues": {}}, 200
@base.route(r"/api/v1/region/%s/security/issues/%s" % (REGION_R, PERIOD_R))
def issues(self, query, region, period):
return {"issues": _get_issues(region, period)}, 200

@base.route(r"/api/v1/security/issues/%s" % PERIOD_R)
def issues_all_regions(self, query, period):
return {"issues": _get_issues(None, period)}, 200
13 changes: 13 additions & 0 deletions raml/api.raml
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,19 @@ mediaType: application/json
schema: !include schemas/200.json
example: !include response_examples/200/regions_detailed.json

/security/issues/{period}:
uriParameters:
period:
description: "Return issues discovered at specific period"
enum: ["day", "week", "month"]
get:
description: "Return list of Issue objects"
responses:
200:
body:
schema: !include schemas/200.json
example: !include response_examples/200/security_issues.json

/region/{region}:
uriParameters:
region:
Expand Down
25 changes: 16 additions & 9 deletions tests/unit/api/v1/test_security.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@

from tests.unit import test

import ddt
import mock


Expand All @@ -27,34 +28,40 @@
}


@ddt.ddt
@mock.patch("ceagle.api.client.config", fake_config)
class SecurityTestCase(test.TestCase):

def _test_get_issues_all_regions(self):
resp = self.get("/api/v1/security/issues/day")
self.assertEqual(200, resp[0])
self.assertEqual(2, len(resp[1]["issues"]))

def test_get_issues_month(self):
resp = self.get("/api/v1/region/Region1/security/issues/month")
resp = self.get("/api/v1/region/region1/security/issues/month")
self.assertEqual(200, resp[0])
self.assertEqual(2, len(resp[1]["issues"]))

def test_get_issues_week(self):
def _test_get_issues_week(self):
resp = self.get(
"/api/v1/region/north-2.piedpiper.net/security/issues/week")
self.assertEqual(200, resp[0])
self.assertEqual(2, len(resp[1]["issues"]))

def test_get_issues_day(self):
def _test_get_issues_day(self):
resp = self.get(
"/api/v1/region/north-2.piedpiper.net/security/issues/day")
self.assertEqual(200, resp[0])
self.assertEqual(1, len(resp[1]["issues"]))

def test_get_issues_empty(self):
resp = self.get("/api/v1/region/Region1/security/issues/day")
def _test_get_issues_empty(self):
resp = self.get("/api/v1/region/region1/security/issues/day")
self.assertEqual((200, {"issues": []}), resp)

def test_get_issues_unknown_region(self):
resp = self.get("/api/v1/region/Region3/security/issues/day")
def _test_get_issues_unknown_region(self):
resp = self.get("/api/v1/region/region3/security/issues/day")
self.assertEqual(404, resp[0])

def test_get_issues_404(self):
resp = self.get("/api/v1/region/Region3/day")
def _test_get_issues_404(self):
resp = self.get("/api/v1/region/region3/day")
self.assertEqual(404, resp[0])

0 comments on commit ef444a4

Please sign in to comment.