Source code for gocd.api.stage
from gocd.api.endpoint import Endpoint
__all__ = ['Stage']
[docs]class Stage(Endpoint):
base_path = 'go/api/stages/{id}'
def __init__(self, server, pipeline_name, stage_name, pipeline_counter=None):
"""A wrapper for the `Go stage API`__
.. __: http://api.go.cd/current/#stages
Args:
server (Server): A configured instance of
:class:gocd.server.Server
pipeline_name (str): The name of the pipeline we're working on
stage_name (str): The name of the stage we're working on
"""
self.server = server
self.pipeline_name = pipeline_name
self.pipeline_counter = pipeline_counter
self.stage_name = stage_name
[docs] def get_id(self):
return "{pipeline}/{stage}".format(pipeline=self.pipeline_name,
stage=self.stage_name)
[docs] def cancel(self):
"""Cancels a currently running stage
Returns:
Response: :class:`gocd.api.response.Response` object
"""
return self._post('/cancel', headers={"Confirm": True})
[docs] def history(self, offset=0):
"""Lists previous instances/runs of the stage
See the `Go stage history documentation`__ for example responses.
.. __: http://api.go.cd/current/#get-stage-history
Args:
offset (int, optional): How many instances to skip for this response.
Returns:
Response: :class:`gocd.api.response.Response` object
"""
return self._get('/history/{offset:d}'.format(offset=offset or 0))
[docs] def instance(self, counter=None, pipeline_counter=None):
"""Returns all the information regarding a specific stage run
See the `Go stage instance documentation`__ for examples.
.. __: http://api.go.cd/current/#get-stage-instance
Args:
counter (int): The stage instance to fetch.
If falsey returns the latest stage instance from :meth:`history`.
pipeline_counter (int): The pipeline instance for which to fetch
the stage. If falsey returns the latest pipeline instance.
Returns:
Response: :class:`gocd.api.response.Response` object
"""
pipeline_counter = pipeline_counter or self.pipeline_counter
pipeline_instance = None
if not pipeline_counter:
pipeline_instance = self.server.pipeline(self.pipeline_name).instance()
self.pipeline_counter = int(pipeline_instance['counter'])
if not counter:
if pipeline_instance is None:
pipeline_instance = (
self.server
.pipeline(self.pipeline_name)
.instance(pipeline_counter)
)
for stages in pipeline_instance['stages']:
if stages['name'] == self.stage_name:
return self.instance(
counter=int(stages['counter']),
pipeline_counter=pipeline_counter
)
return self._get('/instance/{pipeline_counter:d}/{counter:d}'
.format(pipeline_counter=pipeline_counter, counter=counter))