Merged plcorebase
diff --git a/planetstack/core/admin.py b/planetstack/core/admin.py
index bae7be1..dd89024 100644
--- a/planetstack/core/admin.py
+++ b/planetstack/core/admin.py
@@ -16,6 +16,15 @@
import django_evolution
+class SingletonAdmin (admin.ModelAdmin):
+ def has_add_permission(self, request):
+ num_objects = self.model.objects.count()
+ if num_objects >= 1:
+ return False
+ else:
+ return True
+
+
class PlStackTabularInline(admin.TabularInline):
pass
@@ -119,7 +128,7 @@
class SliceInline(PlStackTabularInline):
model = Slice
- fields = ['name','enabled','description','slice_url']
+ fields = ['name','site', 'serviceClass', 'service']
extra = 0
suit_classes = 'suit-tab suit-tab-slices'
@@ -254,6 +263,22 @@
(None, {'fields': ['sites'], 'classes':['suit-tab suit-tab-sites']}),]
suit_form_tabs =(('sites', 'Sites'),('nodes','Nodes'),('deploymentprivileges','Privileges'),('tags','Tags'))
+class ServiceAttrAsTabInline(PlStackTabularInline):
+ model = ServiceAttribute
+ fields = ['name','value']
+ extra = 0
+ suit_classes = 'suit-tab suit-tab-serviceattrs'
+
+class ServiceAttributeInline(PlStackTabularInline):
+ model = ServiceAttribute
+ fields = ['name','value']
+ extra = 0
+
+class ServiceAdmin(PlanetStackBaseAdmin):
+ list_display = ("name","enabled")
+ fieldsets = [(None, {'fields': ['name','enabled','description']})]
+ inlines = [ServiceAttributeInline,]
+
class SiteAdmin(PlanetStackBaseAdmin):
fieldsets = [
(None, {'fields': ['name', 'site_url', 'enabled', 'is_public', 'login_base', 'location'], 'classes':['suit-tab suit-tab-general']}),
@@ -342,8 +367,16 @@
qs = qs.filter(site__in=sites)
return qs
+class SliceForm(forms.ModelForm):
+ class Meta:
+ model = Slice
+ widgets = {
+ 'service': LinkedSelect
+ }
+
class SliceAdmin(PlanetStackBaseAdmin):
- fieldsets = [('Slice Details', {'fields': ['name', 'site', 'serviceClass', 'description', 'slice_url'], 'classes':['suit-tab suit-tab-general']}),]
+ form = SliceForm
+ fieldsets = [('Slice Details', {'fields': ['name', 'site', 'serviceClass', 'enabled','description', 'service', 'slice_url'], 'classes':['suit-tab suit-tab-general']}),]
list_display = ('name', 'site','serviceClass', 'slice_url')
inlines = [SlicePrivilegeInline,SliverInline, TagInline, ReservationInline,SliceNetworkInline]
@@ -500,11 +533,8 @@
'image': LinkedSelect
}
-class ProjectAdmin(admin.ModelAdmin):
- inlines = [TagInline]
-
class TagAdmin(admin.ModelAdmin):
- list_display = ['project', 'name', 'value', 'content_type', 'content_object',]
+ list_display = ['service', 'name', 'value', 'content_type', 'content_object',]
class SliverAdmin(PlanetStackBaseAdmin):
form = SliverForm
@@ -631,6 +661,7 @@
# These override the definitions on the base UserAdmin
# that reference specific fields on auth.User.
list_display = ('email', 'firstname', 'lastname', 'is_admin', 'last_login')
+ #list_display = ('email', 'username','firstname', 'lastname', 'is_admin', 'last_login')
list_filter = ()
inlines = [SlicePrivilegeInline,SitePrivilegeInline,DeploymentPrivilegeInline]
fieldsets = (
@@ -747,7 +778,7 @@
return False
class ReservationAdmin(admin.ModelAdmin):
- fieldsets = [('Reservation Details', {'fields': ['startTime', 'duration','slice'], 'classes': ['suit-tab suit-tab-general']})]
+ fieldsets = [('Reservation Details', {'fields': ['slice', 'startTime', 'duration'], 'classes': ['suit-tab suit-tab-general']})]
list_display = ('startTime', 'duration')
form = ReservationAddForm
@@ -862,11 +893,12 @@
request.session['auth'] = auth
user_logged_in.connect(cache_credentials)
+
# Now register the new UserAdmin...
admin.site.register(User, UserAdmin)
# ... and, since we're not using Django's builtin permissions,
# unregister the Group model from admin.
-admin.site.unregister(Group)
+#admin.site.unregister(Group)
#Do not show django evolution in the admin interface
from django_evolution.models import Version, Evolution
@@ -881,8 +913,8 @@
admin.site.register(Deployment, DeploymentAdmin)
admin.site.register(Site, SiteAdmin)
admin.site.register(Slice, SliceAdmin)
-admin.site.register(Project, ProjectAdmin)
admin.site.register(ServiceClass, ServiceClassAdmin)
+admin.site.register(Service, ServiceAdmin)
admin.site.register(Reservation, ReservationAdmin)
admin.site.register(Network, NetworkAdmin)
admin.site.register(Router, RouterAdmin)
@@ -892,6 +924,10 @@
if showAll:
#admin.site.register(PlanetStack)
admin.site.register(Tag, TagAdmin)
+ admin.site.register(DeploymentRole)
+ admin.site.register(SiteRole)
+ admin.site.register(SliceRole)
+ admin.site.register(PlanetStackRole)
admin.site.register(Node, NodeAdmin)
#admin.site.register(SlicePrivilege, SlicePrivilegeAdmin)
#admin.site.register(SitePrivilege, SitePrivilegeAdmin)
diff --git a/planetstack/core/fixtures/initial_data.json b/planetstack/core/fixtures/initial_data.json
index 3db94b8..45edbd4 100644
--- a/planetstack/core/fixtures/initial_data.json
+++ b/planetstack/core/fixtures/initial_data.json
@@ -1,6 +1,147 @@
[
{
"pk": 1,
+ "model": "core.planetstackrole",
+ "fields": {
+ "updated": "2013-09-03T11:47:42.611Z",
+ "role": "admin",
+ "created": "2013-09-03T11:47:42.611Z"
+ }
+},
+{
+ "pk": 1,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:35:50.572Z",
+ "content_type": 8,
+ "description": "PlanetStack Application Administrator",
+ "role_type": "Admin",
+ "created": "2013-07-30T10:30:28.633Z"
+ }
+},
+{
+ "pk": 2,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:36:30.174Z",
+ "content_type": 8,
+ "description": "User level role for PlanetStack Application",
+ "role_type": "Default",
+ "created": "2013-07-30T10:31:02.627Z"
+ }
+},
+{
+ "pk": 3,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:36:07.877Z",
+ "content_type": 21,
+ "description": "Administrative role for a Slice",
+ "role_type": "Admin",
+ "created": "2013-07-30T10:31:25.829Z"
+ }
+},
+{
+ "pk": 4,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:36:20.679Z",
+ "content_type": 21,
+ "description": "User level access for a particular Slice",
+ "role_type": "Default",
+ "created": "2013-07-30T10:31:48.791Z"
+ }
+},
+{
+ "pk": 5,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:35:59.388Z",
+ "content_type": 15,
+ "description": "Administrator role for a particular Site",
+ "role_type": "Admin",
+ "created": "2013-07-30T10:32:20.600Z"
+ }
+},
+{
+ "pk": 6,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:34:39.494Z",
+ "content_type": 15,
+ "description": "Principal Investigator for a particular Site",
+ "role_type": "PI",
+ "created": "2013-07-30T10:34:39.494Z"
+ }
+},
+{
+ "pk": 7,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:35:27.633Z",
+ "content_type": 15,
+ "description": "Technical support for a particular Site. Allows for Read/Write access to a Site's Nodes.",
+ "role_type": "Tech",
+ "created": "2013-07-30T10:35:27.633Z"
+ }
+},
+{
+ "pk": 8,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:38:04.554Z",
+ "content_type": 15,
+ "description": "Responsibility for a particular Site's accounting and invoices.",
+ "role_type": "Billing",
+ "created": "2013-07-30T10:38:04.554Z"
+ }
+},
+{
+ "pk": 9,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:39:07.062Z",
+ "content_type": 15,
+ "description": "Default access for a particular Site which allows for Read-only access to the Site's objects.",
+ "role_type": "Default",
+ "created": "2013-07-30T10:39:07.062Z"
+ }
+},
+{
+ "pk": 10,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T10:39:55.479Z",
+ "content_type": 15,
+ "description": "Represents the Site through which a particular user is managed through.",
+ "role_type": "Homed",
+ "created": "2013-07-30T10:39:55.479Z"
+ }
+},
+{
+ "pk": 11,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T17:35:59.815Z",
+ "content_type": 9,
+ "description": "Administrative responsibility for a particular Deployment.",
+ "role_type": "Admin",
+ "created": "2013-07-30T17:35:59.815Z"
+ }
+},
+{
+ "pk": 12,
+ "model": "core.role",
+ "fields": {
+ "updated": "2013-07-30T17:36:54.728Z",
+ "content_type": 9,
+ "description": "Default access for a particular Deployment.",
+ "role_type": "Default",
+ "created": "2013-07-30T17:36:54.728Z"
+ }
+},
+{
+ "pk": 1,
"model": "core.deployment",
"fields": {
"updated": "2013-04-03T22:57:09.331Z",
@@ -37,16 +178,27 @@
},
{
"pk": 1,
+ "model": "core.deploymentrole",
+ "fields": {
+ "updated": "2013-09-03T11:48:02.080Z",
+ "role": "admin",
+ "created": "2013-09-03T11:48:02.080Z"
+ }
+},
+{
+ "pk": 1,
"model": "core.site",
"fields": {
- "updated": "2013-06-21T21:12:16.675Z",
+ "updated": "2013-09-22T22:04:18.656Z",
"name": "Princeton University",
"created": "2013-04-03T23:00:10.085Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://princeton.edu/",
"login_base": "princeton",
"location": "40.3502,-74.6524",
+ "latitude": null,
"is_public": true,
"deployments": [
3,
@@ -64,12 +216,14 @@
"created": "2013-04-03T23:03:51.742Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://www.stanford.edu/",
"login_base": "stanford",
"location": "37.4294,-122.172",
+ "latitude": null,
"is_public": true,
"deployments": [],
- "abbreviated_name": ""
+ "abbreviated_name": ""
}
},
{
@@ -81,12 +235,14 @@
"created": "2013-04-03T23:05:51.984Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://www.gatech.edu/",
"login_base": "gt",
"location": "33.7772,-84.3976",
+ "latitude": null,
"is_public": true,
"deployments": [],
- "abbreviated_name": ""
+ "abbreviated_name": ""
}
},
{
@@ -98,12 +254,14 @@
"created": "2013-04-03T23:09:52.337Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "https://www.washington.edu/",
"login_base": "uw",
"location": "47.6531,-122.313",
+ "latitude": null,
"is_public": true,
"deployments": [],
- "abbreviated_name": ""
+ "abbreviated_name": ""
}
},
{
@@ -115,12 +273,14 @@
"created": "2013-04-03T23:14:11.072Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://www.inf.ethz.ch/",
"login_base": "ethzcs",
"location": "47.3794,8.54513",
+ "latitude": null,
"is_public": true,
"deployments": [],
- "abbreviated_name": ""
+ "abbreviated_name": ""
}
},
{
@@ -132,9 +292,11 @@
"created": "2013-04-03T23:19:38.789Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://www.mpi-sws.mpg.de/",
"login_base": "mpisws",
"location": "49.14,6.589",
+ "latitude": null,
"is_public": true,
"deployments": [],
"abbreviated_name": ""
@@ -149,12 +311,218 @@
"created": "2013-04-03T23:20:49.815Z",
"tenant_id": "",
"enabled": true,
+ "longitude": null,
"site_url": "http://www.planet-lab-jp.org/",
"login_base": "utokyo",
"location": "35.75,139.5",
+ "latitude": null,
"is_public": true,
"deployments": [],
- "abbreviated_name": ""
+ "abbreviated_name": ""
+ }
+},
+{
+ "pk": 1,
+ "model": "core.siterole",
+ "fields": {
+ "updated": "2013-09-03T11:48:34.966Z",
+ "role": "admin",
+ "created": "2013-09-03T11:48:34.966Z"
+ }
+},
+{
+ "pk": 2,
+ "model": "core.siterole",
+ "fields": {
+ "updated": "2013-09-03T11:48:49.480Z",
+ "role": "pi",
+ "created": "2013-09-03T11:48:49.480Z"
+ }
+},
+{
+ "pk": 3,
+ "model": "core.siterole",
+ "fields": {
+ "updated": "2013-09-03T11:49:03.678Z",
+ "role": "tech",
+ "created": "2013-09-03T11:49:03.678Z"
+ }
+},
+{
+ "pk": 4,
+ "model": "core.siterole",
+ "fields": {
+ "updated": "2013-09-03T11:49:17.254Z",
+ "role": "billing",
+ "created": "2013-09-03T11:49:17.254Z"
+ }
+},
+{
+ "pk": 1,
+ "model": "core.user",
+ "fields": {
+ "username": "padmin@vicci.org",
+ "public_key": null,
+ "updated": "2013-09-22T21:47:30.993Z",
+ "firstname": "PlanetStack",
+ "user_url": null,
+ "lastname": "Admin",
+ "created": "2013-09-22T21:47:30.959Z",
+ "is_active": true,
+ "site": null,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T21:48:01.047Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "pbkdf2_sha256$10000$myaBvvoueiQR$o6h2VfhUUfsgDNUYB8v9Qt3U4t+uPSQSb+OMVIPoNsI=",
+ "email": "padmin@vicci.org",
+ "enacted": null
+ }
+},
+{
+ "pk": 2,
+ "model": "core.user",
+ "fields": {
+ "username": "tony.mack@gmail.com",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.249Z",
+ "firstname": "Tony",
+ "user_url": null,
+ "lastname": "Mack",
+ "created": "2013-09-22T22:04:26.249Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.628Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "tony.mack@gmail.com",
+ "enacted": null
+ }
+},
+{
+ "pk": 3,
+ "model": "core.user",
+ "fields": {
+ "username": "smbaker@gmail.com",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.250Z",
+ "firstname": "Scott",
+ "user_url": null,
+ "lastname": "Baker",
+ "created": "2013-09-22T22:04:26.250Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.630Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "smbaker@gmail.com",
+ "enacted": null
+ }
+},
+{
+ "pk": 4,
+ "model": "core.user",
+ "fields": {
+ "username": "pete.larry@gmail.com",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.251Z",
+ "firstname": "Larry",
+ "user_url": null,
+ "lastname": "Peterson",
+ "created": "2013-09-22T22:04:26.251Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.633Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "pete.larry@gmail.com",
+ "enacted": null
+ }
+},
+{
+ "pk": 5,
+ "model": "core.user",
+ "fields": {
+ "username": "john.hartman@gmail.com",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.252Z",
+ "firstname": "John",
+ "user_url": null,
+ "lastname": "Hartman",
+ "created": "2013-09-22T22:04:26.252Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.635Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "john.hartman@gmail.com",
+ "enacted": null
+ }
+},
+{
+ "pk": 6,
+ "model": "core.user",
+ "fields": {
+ "username": "mhw@princeton.cs.edu",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.253Z",
+ "firstname": "Michael",
+ "user_url": null,
+ "lastname": "Wawrzoniak",
+ "created": "2013-09-22T22:04:26.253Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.636Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "mhw@princeton.cs.edu",
+ "enacted": null
+ }
+},
+{
+ "pk": 7,
+ "model": "core.user",
+ "fields": {
+ "username": "andybavier@gmail.com",
+ "public_key": null,
+ "updated": "2013-09-22T22:04:26.253Z",
+ "firstname": "Andy",
+ "user_url": null,
+ "lastname": "Bavier",
+ "created": "2013-09-22T22:04:26.253Z",
+ "is_active": true,
+ "site": 1,
+ "phone": null,
+ "kuser_id": null,
+ "is_staff": true,
+ "last_login": "2013-09-22T22:04:18.638Z",
+ "timezone": "America/New_York",
+ "is_admin": true,
+ "password": "!",
+ "email": "andybavier@gmail.com",
+ "enacted": null
}
},
{
@@ -163,7 +531,6 @@
"fields": {
"updated": "2013-05-10T23:30:52.931Z",
"membershipFee": 0,
- "description": "Best Effort",
"membershipFeeMonths": 0,
"created": "2013-05-10T23:30:52.931Z",
"upgradeFrom": [
@@ -172,7 +539,8 @@
],
"commitment": 0,
"name": "Best Effort",
- "upgradeRequiresApproval": false
+ "upgradeRequiresApproval": false,
+ "description": "Best Effort"
}
},
{
@@ -181,7 +549,6 @@
"fields": {
"updated": "2013-05-10T23:35:51.694Z",
"membershipFee": 100,
- "description": "Silver",
"membershipFeeMonths": 1,
"created": "2013-05-10T23:33:24.930Z",
"upgradeFrom": [
@@ -190,7 +557,8 @@
],
"commitment": 365,
"name": "Silver",
- "upgradeRequiresApproval": false
+ "upgradeRequiresApproval": false,
+ "description": "Silver"
}
},
{
@@ -199,7 +567,6 @@
"fields": {
"updated": "2013-05-10T23:34:01.320Z",
"membershipFee": 18000,
- "description": "Gold",
"membershipFeeMonths": 12,
"created": "2013-05-10T23:34:01.320Z",
"upgradeFrom": [
@@ -208,7 +575,100 @@
],
"commitment": 365,
"name": "Gold",
- "upgradeRequiresApproval": false
+ "upgradeRequiresApproval": false,
+ "description": "Gold"
+ }
+},
+{
+ "pk": 1,
+ "model": "core.service",
+ "fields": {
+ "updated": "2013-09-22T21:53:48.013Z",
+ "name": "Request Router Service",
+ "enabled": true,
+ "description": "Service to help load balance and direct traffic flow to content within the CDN",
+ "created": "2013-09-22T21:53:48.013Z"
+ }
+},
+{
+ "pk": 1,
+ "model": "core.slice",
+ "fields": {
+ "router_id": null,
+ "service": 1,
+ "updated": "2013-09-22T21:54:33.729Z",
+ "name": "DnsRedir",
+ "created": "2013-09-22T21:54:33.729Z",
+ "network_id": null,
+ "tenant_id": "",
+ "serviceClass": 1,
+ "enabled": true,
+ "site": 1,
+ "omf_friendly": false,
+ "subnet_id": null,
+ "slice_url": "",
+ "creator": 1,
+ "description": ""
+ }
+},
+{
+ "pk": 2,
+ "model": "core.slice",
+ "fields": {
+ "router_id": null,
+ "service": 1,
+ "updated": "2013-09-22T22:07:48.740Z",
+ "name": "Redirect",
+ "created": "2013-09-22T22:06:33.765Z",
+ "network_id": null,
+ "tenant_id": "",
+ "serviceClass": 1,
+ "enabled": true,
+ "site": 1,
+ "omf_friendly": false,
+ "subnet_id": null,
+ "slice_url": "",
+ "creator": 1,
+ "description": ""
+ }
+},
+{
+ "pk": 3,
+ "model": "core.slice",
+ "fields": {
+ "router_id": null,
+ "service": 1,
+ "updated": "2013-09-22T22:07:21.804Z",
+ "name": "DnsDemux",
+ "created": "2013-09-22T22:07:21.804Z",
+ "network_id": null,
+ "tenant_id": "",
+ "serviceClass": 1,
+ "enabled": true,
+ "site": 1,
+ "omf_friendly": false,
+ "subnet_id": null,
+ "slice_url": "",
+ "creator": 1,
+ "description": ""
+ }
+},
+{
+ "pk": 1,
+ "model": "core.slicerole",
+ "fields": {
+ "updated": "2013-09-03T11:48:02.080Z",
+ "role": "admin",
+ "created": "2013-09-03T11:48:02.080Z"
+ }
+},
+{
+ "pk": 2,
+ "model": "core.slicerole",
+ "fields": {
+ "updated": "2013-09-03T11:48:17.688Z",
+ "role": "default",
+ "created": "2013-09-03T11:48:17.688Z"
}
},
{
@@ -221,11 +681,11 @@
"created": "2013-05-10T23:37:09.312Z",
"serviceClass": 1,
"maxUnitsDeployment": 0,
- "calendarReservable": false,
"bucketInRate": 0,
"cost": 7,
- "maxUnitsNode": 0,
- "maxDuration": 0
+ "calendarReservable": false,
+ "maxDuration": 0,
+ "maxUnitsNode": 0
}
},
{
@@ -238,11 +698,11 @@
"created": "2013-05-10T23:44:39.936Z",
"serviceClass": 2,
"maxUnitsDeployment": 0,
- "calendarReservable": false,
"bucketInRate": 0,
"cost": 7,
- "maxUnitsNode": 0,
- "maxDuration": 0
+ "calendarReservable": false,
+ "maxDuration": 0,
+ "maxUnitsNode": 0
}
},
{
@@ -255,11 +715,11 @@
"created": "2013-05-10T23:45:16.137Z",
"serviceClass": 3,
"maxUnitsDeployment": 0,
- "calendarReservable": false,
"bucketInRate": 0,
"cost": 7,
- "maxUnitsNode": 0,
- "maxDuration": 0
+ "calendarReservable": false,
+ "maxDuration": 0,
+ "maxUnitsNode": 0
}
},
{
@@ -272,11 +732,11 @@
"created": "2013-05-10T23:46:33.201Z",
"serviceClass": 2,
"maxUnitsDeployment": 210,
- "calendarReservable": true,
"bucketInRate": 10,
"cost": 7,
- "maxUnitsNode": 6,
- "maxDuration": 168
+ "calendarReservable": true,
+ "maxDuration": 168,
+ "maxUnitsNode": 6
}
},
{
@@ -289,215 +749,22 @@
"created": "2013-05-10T23:47:31.770Z",
"serviceClass": 3,
"maxUnitsDeployment": 210,
- "calendarReservable": true,
"bucketInRate": 0,
"cost": 0,
- "maxUnitsNode": 6,
- "maxDuration": 8760
+ "calendarReservable": true,
+ "maxDuration": 8760,
+ "maxUnitsNode": 6
}
},
{
"pk": 1,
- "model": "core.role",
+ "model": "requestrouter.requestrouterservice",
"fields": {
- "updated": "2013-07-30T10:35:50.572Z",
- "description": "PlanetStack Application Administrator",
- "created": "2013-07-30T10:30:28.633Z",
- "content_type": 8,
- "role_type": "Admin"
- }
-},
-{
- "pk": 2,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:36:30.174Z",
- "description": "User level role for PlanetStack Application",
- "created": "2013-07-30T10:31:02.627Z",
- "content_type": 8,
- "role_type": "Default"
- }
-},
-{
- "pk": 3,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:36:07.877Z",
- "description": "Administrative role for a Slice",
- "created": "2013-07-30T10:31:25.829Z",
- "content_type": 21,
- "role_type": "Admin"
- }
-},
-{
- "pk": 4,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:36:20.679Z",
- "description": "User level access for a particular Slice",
- "created": "2013-07-30T10:31:48.791Z",
- "content_type": 21,
- "role_type": "Default"
- }
-},
-{
- "pk": 5,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:35:59.388Z",
- "description": "Administrator role for a particular Site",
- "created": "2013-07-30T10:32:20.600Z",
- "content_type": 15,
- "role_type": "Admin"
- }
-},
-{
- "pk": 6,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:34:39.494Z",
- "description": "Principal Investigator for a particular Site",
- "created": "2013-07-30T10:34:39.494Z",
- "content_type": 15,
- "role_type": "PI"
- }
-},
-{
- "pk": 7,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:35:27.633Z",
- "description": "Technical support for a particular Site. Allows for Read/Write access to a Site's Nodes.",
- "created": "2013-07-30T10:35:27.633Z",
- "content_type": 15,
- "role_type": "Tech"
- }
-},
-{
- "pk": 8,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:38:04.554Z",
- "description": "Responsibility for a particular Site's accounting and invoices.",
- "created": "2013-07-30T10:38:04.554Z",
- "content_type": 15,
- "role_type": "Billing"
- }
-},
-{
- "pk": 9,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:39:07.062Z",
- "description": "Default access for a particular Site which allows for Read-only access to the Site's objects.",
- "created": "2013-07-30T10:39:07.062Z",
- "content_type": 15,
- "role_type": "Default"
- }
-},
-{
- "pk": 10,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T10:39:55.479Z",
- "description": "Represents the Site through which a particular user is managed through.",
- "created": "2013-07-30T10:39:55.479Z",
- "content_type": 15,
- "role_type": "Homed"
- }
-},
-{
- "pk": 11,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T17:35:59.815Z",
- "description": "Administrative responsibility for a particular Deployment.",
- "created": "2013-07-30T17:35:59.815Z",
- "content_type": 9,
- "role_type": "Admin"
- }
-},
-{
- "pk": 12,
- "model": "core.role",
- "fields": {
- "updated": "2013-07-30T17:36:54.728Z",
- "description": "Default access for a particular Deployment.",
- "created": "2013-07-30T17:36:54.728Z",
- "content_type": 9,
- "role_type": "Default"
- }
-},
-{
- "pk": 1,
- "model": "core.planetstackrole",
- "fields": {
- "updated": "2013-09-03T11:47:42.611Z",
- "role": "admin",
- "created": "2013-09-03T11:47:42.611Z"
- }
-},
-{
- "pk": 1,
- "model": "core.siterole",
- "fields": {
- "updated": "2013-09-03T11:48:34.966Z",
- "role": "admin",
- "created": "2013-09-03T11:48:34.966Z"
- }
-},
-{
- "pk": 2,
- "model": "core.siterole",
- "fields": {
- "updated": "2013-09-03T11:48:49.480Z",
- "role": "pi",
- "created": "2013-09-03T11:48:49.480Z"
- }
-},
-{
- "pk": 3,
- "model": "core.siterole",
- "fields": {
- "updated": "2013-09-03T11:49:03.678Z",
- "role": "tech",
- "created": "2013-09-03T11:49:03.678Z"
- }
-},
-{
- "pk": 4,
- "model": "core.siterole",
- "fields": {
- "updated": "2013-09-03T11:49:17.254Z",
- "role": "billing",
- "created": "2013-09-03T11:49:17.254Z"
- }
-},
-{
- "pk": 1,
- "model": "core.slicerole",
- "fields": {
- "updated": "2013-09-03T11:48:02.080Z",
- "role": "admin",
- "created": "2013-09-03T11:48:02.080Z"
- }
-},
-{
- "pk": 2,
- "model": "core.slicerole",
- "fields": {
- "updated": "2013-09-03T11:48:17.688Z",
- "role": "default",
- "created": "2013-09-03T11:48:17.688Z"
- }
-},
-{
- "pk": 1,
- "model": "core.deploymentrole",
- "fields": {
- "updated": "2013-09-03T11:48:02.080Z",
- "role": "admin",
- "created": "2013-09-03T11:48:02.080Z"
+ "behindNat": false,
+ "defaultAction": "best",
+ "defaultTTL": 30,
+ "lastResortAction": "random",
+ "maxAnswers": 3
}
}
]
diff --git a/planetstack/core/models/__init__.py b/planetstack/core/models/__init__.py
index b4c7cf6..ac12370 100644
--- a/planetstack/core/models/__init__.py
+++ b/planetstack/core/models/__init__.py
@@ -1,6 +1,9 @@
from .plcorebase import PlCoreBase
from .planetstack import PlanetStack
from .project import Project
+from .singletonmodel import SingletonModel
+from .service import Service
+from .service import ServiceAttribute
from .tag import Tag
from .role import Role
from .deployment import Deployment
diff --git a/planetstack/core/models/network.py b/planetstack/core/models/network.py
index 55711a4..72e7a5f 100644
--- a/planetstack/core/models/network.py
+++ b/planetstack/core/models/network.py
@@ -29,7 +29,7 @@
subnet = models.CharField(max_length=32, blank=True)
ports = models.CharField(max_length=1024, blank=True, null=True)
labels = models.CharField(max_length=1024, blank=True, null=True)
- owner = models.ForeignKey(Slice, related_name="ownedNetworks")
+ owner = models.ForeignKey(Slice, related_name="ownedNetworks", help_text="Slice that owns control of this Network")
guaranteedBandwidth = models.IntegerField(default=0)
permitAllSlices = models.BooleanField(default=False)
diff --git a/planetstack/core/models/plcorebase.py b/planetstack/core/models/plcorebase.py
index 921b89b..dcc3c39 100644
--- a/planetstack/core/models/plcorebase.py
+++ b/planetstack/core/models/plcorebase.py
@@ -45,12 +45,11 @@
# Investigate later.
pass
-
def save(self, *args, **kwargs):
super(PlCoreBase, self).save(*args, **kwargs)
# Tell the observer that the source database has been updated
- EventSender().fire()
+ #EventSender().fire()
self.__initial = self._dict
diff --git a/planetstack/core/models/plservice.py b/planetstack/core/models/plservice.py
new file mode 100644
index 0000000..eb27d0f
--- /dev/null
+++ b/planetstack/core/models/plservice.py
@@ -0,0 +1,9 @@
+from core.models import PlCoreBase,SingletonModel
+from django.db import models
+
+class PlanetStackService(PlCoreBase):
+ description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Service")
+ enabled = models.BooleanField(default=True)
+ serviceName = models.CharField(max_length=30, help_text="Service Name")
+
+ def __unicode__(self): return u'%s' % (self.serviceName)
diff --git a/planetstack/core/models/service.py b/planetstack/core/models/service.py
new file mode 100644
index 0000000..ffa3531
--- /dev/null
+++ b/planetstack/core/models/service.py
@@ -0,0 +1,17 @@
+from core.models import PlCoreBase,SingletonModel
+from django.db import models
+
+class Service(PlCoreBase):
+ description = models.TextField(max_length=254,null=True, blank=True,help_text="Description of Service")
+ enabled = models.BooleanField(default=True)
+ name = models.CharField(max_length=30, help_text="Service Name")
+ versionNumber = models.CharField(max_length=30, help_text="Version of Service Definition")
+
+ def __unicode__(self): return u'%s' % (self.name)
+
+class ServiceAttribute(PlCoreBase):
+ name = models.SlugField(help_text="Attribute Name", max_length=128)
+ value = models.CharField(help_text="Attribute Value", max_length=1024)
+ service = models.ForeignKey(Service, related_name='serviceattributes', help_text="The Service this attribute is associated with")
+
+
diff --git a/planetstack/core/models/singletonmodel.py b/planetstack/core/models/singletonmodel.py
new file mode 100644
index 0000000..4ab6f6e
--- /dev/null
+++ b/planetstack/core/models/singletonmodel.py
@@ -0,0 +1,16 @@
+from django.db import models
+
+class SingletonModel(models.Model):
+ class Meta:
+ abstract = True
+
+ def save(self, *args, **kwargs):
+ self.__class__.objects.exclude(id=self.id).delete()
+ super(SingletonModel, self).save(*args, **kwargs)
+
+ @classmethod
+ def load(cls):
+ try:
+ return cls.objects.get()
+ except cls.DoesNotExist:
+ return cls()
diff --git a/planetstack/core/models/slice.py b/planetstack/core/models/slice.py
index 9fec155..b7ca15d 100644
--- a/planetstack/core/models/slice.py
+++ b/planetstack/core/models/slice.py
@@ -8,6 +8,7 @@
from core.models import ServiceClass
from core.models import Tag
from django.contrib.contenttypes import generic
+from core.models import Service
# Create your models here.
@@ -22,6 +23,7 @@
network_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum network")
router_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum router id")
subnet_id = models.CharField(null=True, blank=True, max_length=256, help_text="Quantum subnet id")
+ service = models.ForeignKey(Service, related_name='service', null=True, blank=True)
tags = generic.GenericRelation(Tag)
diff --git a/planetstack/core/models/tag.py b/planetstack/core/models/tag.py
index 7c957a1..cbe63a5 100644
--- a/planetstack/core/models/tag.py
+++ b/planetstack/core/models/tag.py
@@ -1,7 +1,7 @@
import os
from django.db import models
from core.models import PlCoreBase
-from core.models import Project
+from core.models import Service
from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import generic
@@ -9,7 +9,7 @@
class Tag(PlCoreBase):
- project = models.ForeignKey(Project, related_name='tags', help_text="The Project this Tag is associated with")
+ service = models.ForeignKey(Service, related_name='tags', help_text="The Service this Tag is associated with")
name = models.SlugField(help_text="The name of this tag", max_length=128)
value = models.CharField(help_text="The value of this tag", max_length=1024)
diff --git a/planetstack/core/static/planetstack.css b/planetstack/core/static/planetstack.css
index b517eac..e076854 100644
--- a/planetstack/core/static/planetstack.css
+++ b/planetstack/core/static/planetstack.css
@@ -1,2 +1,21 @@
.required:after {color: red ! important; font-size: 18px }
#.btn-success {color:black}
+#suit-center {
+padding: 20px;
+width: 100%;
+min-width:650px;
+}
+.inner-two-columns .inner-center-column .tab-content {
+overflow: inherit;
+margin-bottom: 15px;
+min-width: 650px;
+}
+.inner-two-columns .inner-center-column {
+#margin-right: 200px;
+#background-color: rgb(158, 163, 159);
+}
+label {
+display: block;
+font-weight: bold;
+margin-bottom: 5px;
+}
diff --git a/planetstack/planetstack/settings.py b/planetstack/planetstack/settings.py
index 7593650..5cd62b0 100644
--- a/planetstack/planetstack/settings.py
+++ b/planetstack/planetstack/settings.py
@@ -138,6 +138,7 @@
'django_evolution',
'core',
'hpc',
+ 'requestrouter',
'geoposition',
)
diff --git a/planetstack/requestrouter/__init__.py b/planetstack/requestrouter/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/planetstack/requestrouter/__init__.py
diff --git a/planetstack/requestrouter/admin.py b/planetstack/requestrouter/admin.py
new file mode 100644
index 0000000..30b7fad
--- /dev/null
+++ b/planetstack/requestrouter/admin.py
@@ -0,0 +1,31 @@
+from django.contrib import admin
+
+from requestrouter.models import *
+from django import forms
+from django.utils.safestring import mark_safe
+from django.contrib.auth.admin import UserAdmin
+from django.contrib.admin.widgets import FilteredSelectMultiple
+from django.contrib.auth.forms import ReadOnlyPasswordHashField
+from django.contrib.auth.signals import user_logged_in
+from django.utils import timezone
+from django.contrib.contenttypes import generic
+from suit.widgets import LinkedSelect
+from core.admin import SingletonAdmin,SliceInline,ServiceAttrAsTabInline
+
+class RequestRouterServiceAdmin(SingletonAdmin):
+ model = RequestRouterService
+ verbose_name = "Request Router Service"
+ verbose_name_plural = "Request Router Service"
+ list_display = ("name","enabled")
+ fieldsets = [(None, {'fields': ['name','enabled','versionNumber', 'description','behindNat','defaultTTL','defaultAction','lastResortAction','maxAnswers'], 'classes':['suit-tab suit-tab-general']})]
+ inlines = [SliceInline,ServiceAttrAsTabInline]
+
+ suit_form_tabs =(('general', 'Request Router Service Details'),
+ ('slices','Slices'),
+ ('serviceattrs','Additional Attributes'),
+ )
+
+
+admin.site.register(RequestRouterService, RequestRouterServiceAdmin)
+admin.site.register(ClientMap)
+
diff --git a/planetstack/requestrouter/models.py b/planetstack/requestrouter/models.py
new file mode 100644
index 0000000..c641b16
--- /dev/null
+++ b/planetstack/requestrouter/models.py
@@ -0,0 +1,25 @@
+from core.models import User,Site,Service,SingletonModel,PlCoreBase
+import os
+from django.db import models
+from django.forms.models import model_to_dict
+
+# Create your models here.
+
+class RequestRouterService(SingletonModel,Service):
+ class Meta:
+ app_label = "requestrouter"
+ verbose_name = "Request Router Service"
+
+ behindNat = models.BooleanField(default=False, help_text="Enables 'Behind NAT' mode.")
+ defaultTTL = models.PositiveIntegerField(default=30, help_text="DNS response time-to-live(TTL)")
+ defaultAction = models.CharField(max_length=30, default = "best", help_text="Review if this should be enum")
+ lastResortAction = models.CharField(max_length=30, default = "random", help_text="Review if this should be enum")
+ maxAnswers = models.PositiveIntegerField(default=3, help_text="Maximum number of answers in DNS response.")
+
+ def __unicode__(self): return u'RequestRouterService'
+
+class ClientMap(models.Model):
+ site = models.OneToOneField(Site, unique=True)
+ name = models.CharField(max_length=64, help_text="Name of the Client Map")
+ description = models.TextField(null=True, blank=True,max_length=130)
+