Defined Models and REST APIs
TOSCA specs
Synchronizer

Change-Id: Icd9dde1b456711ca7e5f0c69ae547072ff5b3120
diff --git a/xos/api/service/vrouter.py b/xos/api/service/vrouter.py
new file mode 100644
index 0000000..a932931
--- /dev/null
+++ b/xos/api/service/vrouter.py
@@ -0,0 +1,146 @@
+from rest_framework.decorators import api_view
+from rest_framework.response import Response
+from rest_framework.reverse import reverse
+from rest_framework import serializers
+from rest_framework import generics
+from rest_framework import status
+from core.models import *
+from django.forms import widgets
+from services.vrouter.models import *
+from xos.apibase import XOSListCreateAPIView, XOSRetrieveUpdateDestroyAPIView, XOSPermissionDenied
+from api.xosapi_helpers import PlusModelSerializer, XOSViewSet, ReadOnlyField
+import json
+
+BASE_NAME = 'vrouter'
+
+
+class VRouterServiceSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    name = serializers.CharField(required=False)
+    kind = serializers.CharField(required=False)
+    service_specific_attribute = serializers.CharField(required=False)
+    humanReadableName = serializers.SerializerMethodField("getHumanReadableName")
+
+    class Meta:
+        model = VRouterService
+        fields = ('humanReadableName', 'id', 'name', 'kind', 'service_specific_attribute')
+
+    def getHumanReadableName(self, obj):
+        return obj.__unicode__()
+
+
+class VRouterDeviceSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    name = serializers.CharField(required=False)
+    openflow_id = serializers.CharField(required=False)
+    config_key = serializers.CharField(required=False)
+    driver = serializers.CharField(required=False)
+    vrouter_service = serializers.PrimaryKeyRelatedField(read_only=True)
+
+    ports = serializers.SerializerMethodField("getDevicePorts")
+
+    def getDevicePorts(self, device):
+        ports = VRouterPort.objects.filter(vrouter_device=device.id)
+        return VRouterPortSerializer(ports, many=True).data
+
+    class Meta:
+        model = VRouterDevice
+        fields = ('id', 'name', 'openflow_id', 'config_key', 'driver', 'vrouter_service', 'ports')
+
+
+class VRouterPortSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    name = serializers.CharField(required=False)
+    openflow_id = serializers.CharField(required=False)
+    interfaces = serializers.SerializerMethodField("getPortInterfaces")
+
+    def getPortInterfaces(self, port):
+        interfaces = VRouterInterface.objects.filter(vrouter_port=port.id)
+        return VRouterInterfaceSerializer(interfaces, many=True).data
+
+    class Meta:
+        model = VRouterPort
+        fields = ('id', 'name', 'openflow_id', 'interfaces')
+
+
+class VRouterInterfaceSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    name = serializers.CharField(required=False)
+    mac = serializers.CharField(required=False)
+    vlan = serializers.CharField(required=False)
+    ips = serializers.SerializerMethodField("getInterfaceIps")
+
+    def getInterfaceIps(self, interface):
+        interfaces = VRouterIp.objects.filter(vrouter_interface=interface.id)
+        return VRouterIpSerializer(interfaces, many=True).data
+
+    class Meta:
+        model = VRouterPort
+        fields = ('id', 'name', 'mac', 'vlan', 'ips')
+
+
+class VRouterIpSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    ip = serializers.CharField(required=False)
+    name = serializers.CharField(required=False)
+
+    class Meta:
+        model = VRouterIp
+        fields = ('id', 'ip', 'name')
+
+
+class VRouterAppSerializer(PlusModelSerializer):
+    id = ReadOnlyField()
+    name = serializers.CharField(required=False)
+    control_plane_connect_point = serializers.CharField(required=False)
+    ospf_enabled = serializers.BooleanField(required=False)
+    interfaces = serializers.SerializerMethodField("dumpInterfaces")
+
+    def dumpInterfaces(self, app):
+        return json.dumps(app.interfaces)
+
+    class Meta:
+        model = VRouterApp
+        fields = ('id', 'name', 'control_plane_connect_point', 'ospf_enabled', 'interfaces')
+
+
+class VRouterServiceViewSet(XOSViewSet):
+    base_name = BASE_NAME
+    method_name = "vrouter"
+    method_kind = "viewset"
+    queryset = VRouterService.objects.filter(kind='vROUTER')
+    serializer_class = VRouterServiceSerializer
+
+    @classmethod
+    def get_urlpatterns(self, api_path="^"):
+        patterns = super(VRouterServiceViewSet, self).get_urlpatterns(api_path=api_path)
+
+        patterns.append(self.detail_url("devices/$", {
+            "get": "get_devices"
+        }, "vrouter_devices"))
+
+        patterns.append(self.detail_url("apps/$", {
+            "get": "get_apps"
+        }, "vrouter_apps"))
+
+        return patterns
+
+    def get_devices(self, request, pk=None):
+        if (not request.user.is_authenticated()):
+            raise XOSPermissionDenied("You must be authenticated in order to use this API")
+        else:
+            if(pk is not None):
+                devices = VRouterDevice.objects.filter(vrouter_service=pk)
+            else:
+                devices = VRouterDevice.objects.all()
+            return Response(VRouterDeviceSerializer(devices, many=True).data)
+
+    def get_apps(self, request, pk=None):
+        if (not request.user.is_authenticated()):
+            raise XOSPermissionDenied("You must be authenticated in order to use this API")
+        else:
+            if(pk is not None):
+                apps = VRouterApp.objects.filter(vrouter_service=pk)
+            else:
+                apps = VRouterApp.objects.all()
+            return Response(VRouterAppSerializer(apps, many=True).data)