summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Wirzenius <liw@liw.fi>2018-07-23 15:54:14 +0300
committerLars Wirzenius <liw@liw.fi>2018-07-23 15:54:14 +0300
commit12e22b32e6023e06769761788738cd6dc5a9cea3 (patch)
treee6271afa501a88aaa184d1eb7198881a6881877b
parentcd94b9bb79ef7793ee0e828d04774607621eca3e (diff)
downloadick2-12e22b32e6023e06769761788738cd6dc5a9cea3.tar.gz
Change: allow projects, pipelines, etc, have a foo/bar/baz syntax
-rw-r--r--ick2/apibase.py7
-rw-r--r--ick2/projectapi.py4
-rw-r--r--yarns/100-projects.yarn30
-rw-r--r--yarns/150-pipelines.yarn24
-rw-r--r--yarns/900-local.yarn2
5 files changed, 34 insertions, 33 deletions
diff --git a/ick2/apibase.py b/ick2/apibase.py
index 9e3eaff..b629f68 100644
--- a/ick2/apibase.py
+++ b/ick2/apibase.py
@@ -23,6 +23,7 @@ class APIbase:
self._trans = ick2.TransactionalState(state)
def get_routes(self, path):
+ resource_path = '{}/<name:re:[^/+][^/]*?(/[^/+][^/]*?)*>'.format(path)
return [
{
'method': 'POST',
@@ -36,17 +37,17 @@ class APIbase:
},
{
'method': 'GET',
- 'path': '{}/<name>'.format(path),
+ 'path': resource_path,
'callback': self.GET(self.show),
},
{
'method': 'PUT',
- 'path': '{}/<name>'.format(path),
+ 'path': resource_path,
'callback': self.PUT(self.update),
},
{
'method': 'DELETE',
- 'path': '{}/<name>'.format(path),
+ 'path': resource_path,
'callback': self.DELETE(self.delete),
},
]
diff --git a/ick2/projectapi.py b/ick2/projectapi.py
index f351e8d..90197ae 100644
--- a/ick2/projectapi.py
+++ b/ick2/projectapi.py
@@ -39,9 +39,7 @@ class ProjectAPI(ick2.ResourceApiBase):
return super().get_routes(path) + self.get_status_routes(path)
def get_status_routes(self, path): # pragma: no cover
- all_statuses_path = '/status'
- status_path = '{}/<project>/status'.format(path)
- trigger_path = '{}/<project>/+trigger'.format(path)
+ trigger_path = '{}/<project:path>/+trigger'.format(path)
return [
{
'needs-authorization': False,
diff --git a/yarns/100-projects.yarn b/yarns/100-projects.yarn
index 2fddded..b75dea4 100644
--- a/yarns/100-projects.yarn
+++ b/yarns/100-projects.yarn
@@ -75,23 +75,23 @@ building them. We start by starting an instance of the controller.
... }
WHEN user makes request POST /projects with a valid token and body
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "pipelines": ["build"]
... }
THEN result has status code 201
AND body matches
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "pipelines": ["build"],
... "next_build_id": null
... }
- AND controller state directory contains project website
+ AND controller state directory contains project foo/website
Creating a new project with the same name is forbidden.
WHEN user makes request POST /projects with a valid token and body
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "pipelines": []
... }
THEN result has status code 409
@@ -102,7 +102,7 @@ Creating a new project with the same name is forbidden.
... {
... "projects": [
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "pipelines": ["build"],
... "next_build_id": null
... }
@@ -111,45 +111,45 @@ Creating a new project with the same name is forbidden.
WHEN user stops ick controller
GIVEN a running ick controller
- WHEN user makes request GET /projects/website
+ WHEN user makes request GET /projects/foo/website
THEN result has status code 200
AND body matches
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "pipelines": ["build"],
... "next_build_id": null
... }
- WHEN user makes request PUT /projects/website with a valid token
+ WHEN user makes request PUT /projects/foo/website with a valid token
... and body
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "parameters": {"foo": "bar"},
... "pipelines": ["build"]
... }
THEN result has status code 200
AND body matches
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "parameters": {"foo": "bar"},
... "pipelines": ["build"],
... "next_build_id": null
... }
- AND controller state directory contains project website
+ AND controller state directory contains project foo/website
- WHEN user makes request GET /projects/website
+ WHEN user makes request GET /projects/foo/website
THEN result has status code 200
AND body matches
... {
- ... "project": "website",
+ ... "project": "foo/website",
... "parameters": {"foo": "bar"},
... "pipelines": ["build"],
... "next_build_id": null
... }
- WHEN user makes request DELETE /projects/website
+ WHEN user makes request DELETE /projects/foo/website
THEN result has status code 200
- WHEN user makes request GET /projects/website
+ WHEN user makes request GET /projects/foo/website
THEN result has status code 404
WHEN user makes request PUT /projects/nosuchproject with a valid token and body
diff --git a/yarns/150-pipelines.yarn b/yarns/150-pipelines.yarn
index e2416a8..d828935 100644
--- a/yarns/150-pipelines.yarn
+++ b/yarns/150-pipelines.yarn
@@ -77,7 +77,7 @@ running them. We start by starting an instance of the controller.
WHEN user makes request POST /pipelines with a valid token and body
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "git clone git://repo src" },
... { "where": "host", "shell": "mkdir html" },
@@ -87,7 +87,7 @@ running them. We start by starting an instance of the controller.
THEN result has status code 201
AND body matches
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "git clone git://repo src" },
... { "where": "host", "shell": "mkdir html" },
@@ -99,7 +99,7 @@ Creating a new pipeline with the same name is forbidden.
WHEN user makes request POST /pipelines with a valid token and body
... {
- ... "pipeline": "build_website"
+ ... "pipeline": "foo/build_website"
... }
THEN result has status code 409
@@ -109,7 +109,7 @@ Creating a new pipeline with the same name is forbidden.
... {
... "pipelines": [
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "git clone git://repo src" },
... { "where": "host", "shell": "mkdir html" },
@@ -121,11 +121,11 @@ Creating a new pipeline with the same name is forbidden.
WHEN user stops ick controller
GIVEN a running ick controller
- WHEN user makes request GET /pipelines/build_website
+ WHEN user makes request GET /pipelines/foo/build_website
THEN result has status code 200
AND body matches
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "git clone git://repo src" },
... { "where": "host", "shell": "mkdir html" },
@@ -136,7 +136,7 @@ Creating a new pipeline with the same name is forbidden.
WHEN user makes request PUT /pipelines/build_websitte with a valid token
... and body
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "build-it" }
... ]
@@ -144,25 +144,25 @@ Creating a new pipeline with the same name is forbidden.
THEN result has status code 200
AND body matches
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "build-it" }
... ]
... }
- WHEN user makes request GET /pipelines/build_website
+ WHEN user makes request GET /pipelines/foo/build_website
THEN result has status code 200
AND body matches
... {
- ... "pipeline": "build_website",
+ ... "pipeline": "foo/build_website",
... "actions": [
... { "where": "host", "shell": "build-it" }
... ]
... }
- WHEN user makes request DELETE /pipelines/build_website
+ WHEN user makes request DELETE /pipelines/foo/build_website
THEN result has status code 200
- WHEN user makes request GET /pipelines/build_website
+ WHEN user makes request GET /pipelines/foo/build_website
THEN result has status code 404
WHEN user makes request PUT /pipelines/doesnotexist with a valid token and body
diff --git a/yarns/900-local.yarn b/yarns/900-local.yarn
index 1318eb9..6c83ce6 100644
--- a/yarns/900-local.yarn
+++ b/yarns/900-local.yarn
@@ -112,6 +112,8 @@ along with this program. If not, see <http://www.gnu.org/licenses/>.
name = get_next_match()
basename = encode_basename(name)
filename = os.path.join(vars['statedir'], 'projects', basename)
+ print 'name', name
+ print 'basename', basename
print 'filename', filename
assertTrue(os.path.exists(filename))