serializer = serializer_class(node, data=data) if serializer.is_valid(): kwargs.update(serializer.process_post()) else: errors.update(serializer.errors) if errors: raise exceptions.ParseError(detail=errors) # initialize firmware configuration base_image = BaseImage.objects.get(pk=kwargs.pop('base_image_id')) async = True success_status = status.HTTP_202_ACCEPTED # allow asynchronous requests if '201-created' == request.META.get('HTTP_EXPECT', None): async = False success_status = status.HTTP_201_CREATED # call firmware build task try: build = Build.build(node, base_image, async=async, **kwargs) except ConcurrencyError as e: raise exceptions.Throttled(detail=e.message) serializer = self.serializer_class(build) return Response(serializer.data, status=success_status) insert_ctl(NodeDetail, Firmware) api.register(BaseImageList, BaseImageDetail)
""" **Relation type:** [`http://confine-project.eu/rel/controller/do-request-mgmt-cert`]( http://confine-project.eu/rel/controller/do-request-mgmt-cert) Contains the controller API function URI used to upload a certificate signing request (CSR) to be signed by the testbed CA. The distinguished name of the request must match this host's management address. POST data: `ASCII-armored PEM representation of the CSR as a string.` Response data: a JSON document with a `/cert` member containing the `ASCII-armored PEM representation of the signed certificate`. """ url_name = 'request-cert' rel = 'http://confine-project.eu/rel/controller/do-request-mgmt-cert' def post(self, request, *args, **kwargs): csr = request.DATA node = get_object_or_404(Node, pk=kwargs.get('pk')) self.check_object_permissions(self.request, node) try: validate_csr(csr, node.mgmt_net.addr) except Exception as e: raise exceptions.ParseError(detail='Malformed CSR: %s' % e.message) signed_cert = node.mgmt_net.sign_cert_request(csr.strip()) response_data = {'cert': signed_cert} return Response(response_data, status=status.HTTP_202_ACCEPTED) insert_ctl(NodeDetail, RequestCert)
class State(generics.RetrieveAPIView): """Base State controller view that exposes state information.""" url_name = 'state' rel = 'http://confine-project.eu/rel/controller/state' serializer_class = StateSerializer model = None # should be defined on subclasses def __init__(self, *args, **kwargs): super(State, self).__init__(*args, **kwargs) if self.model is None: raise ValueError("You should define 'model' attribute.") def get(self, request, pk, *args, **kwargs): obj = get_object_or_404(self.model, pk=pk) serializer = self.get_serializer(obj.state) return Response(serializer.data) class NodeState(State): model = Node class SliverState(State): model = Sliver insert_ctl(NodeDetail, NodeState) insert_ctl(SliverDetail, SliverState)
from __future__ import absolute_import from api import generics from api.utils import insert_ctl from nodes.api import NodeDetail from .models import NodeGeolocation from .serializers import NodeGeolocationSerializer class Gis(generics.RetrieveUpdateDestroyAPIView): url_name = 'gis' rel = 'http://confine-project.eu/rel/controller/gis' serializer_class = NodeGeolocationSerializer model = NodeGeolocation list = False insert_ctl(NodeDetail, Gis)
return Response(serializer.data, status=status.HTTP_201_CREATED) raise exceptions.ParseError(detail='This endpoint only accepts null data') def put(self, request, pk, **kwargs): node = get_object_or_404(Node, pk=pk) serializer = self.serializer_class(data=request.DATA) if serializer.is_valid(): data = serializer.data for action in ['stop', 'start']: if data.get(action): try: vct_node(action, node) except CommandError as e: return Response({"detail": str(e)}, status=status.HTTP_500_INTERNAL_SERVER_ERROR) state = get_vct_node_state(node) serializer.data['state'] = state return Response(serializer.data, status=status.HTTP_200_OK) return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) def patch(self, request, pk, **kwargs): return self.put(request, pk, **kwargs) def delete(self, request, pk, format=None): node = get_object_or_404(Node, pk=pk) vct_node('remove', node) return Response(status=status.HTTP_204_NO_CONTENT) insert_ctl(NodeDetail, VMView)
super(State, self).__init__(*args, **kwargs) if self.model is None: raise ValueError("You should define 'model' attribute.") def get(self, request, pk, *args, **kwargs): obj = get_object_or_404(self.model, pk=pk) serializer = self.get_serializer(obj.state) return Response(serializer.data) def post(self, request, pk, *args, **kwargs): """Update state data querying node API.""" if not request.DATA: obj = get_object_or_404(self.model, pk=pk) opts = self.model._meta module = '%s.%s' % (opts.app_label, opts.object_name) get_state.delay(module, ids=[obj.pk], lock=False) return self.get(request, pk, *args, **kwargs) raise exceptions.ParseError(detail='This endpoint do not accept data') class NodeState(State): model = Node class SliverState(State): model = Sliver insert_ctl(NodeDetail, NodeState) insert_ctl(SliverDetail, SliverState)