blob: 1072c07820c02ae516fa561b59cc76fe988f29c1 [file] [log] [blame]
Tony Mack771f4b92013-04-12 01:49:57 -04001import re
Tony Mack5df6c552013-04-11 21:24:17 -04002from types import StringTypes
Tony Mack3a1af412013-04-09 22:36:27 -04003from plstackapi.openstack.client import OpenStackClient
4from plstackapi.openstack.driver import OpenStackDriver
5from plstackapi.core.api.auth import auth_check
Tony Mack29c287f2013-04-11 21:07:16 -04006from plstackapi.core.models import Slice
7from plstackapi.core.api.sites import _get_sites
8
Tony Mack771f4b92013-04-12 01:49:57 -04009def validate_name(name):
10 # N.B.: Responsibility of the caller to ensure that login_base
11 # portion of the slice name corresponds to a valid site, if
12 # desired.
13
14 # 1. Lowercase.
15 # 2. Begins with login_base (letters or numbers).
16 # 3. Then single underscore after login_base.
17 # 4. Then letters, numbers, or underscores.
18 good_name = r'^[a-z0-9]+_[a-zA-Z0-9_]+$'
19 if not name or \
20 not re.match(good_name, name):
21 raise Exception, "Invalid slice name: %s" % name
Tony Mack29c287f2013-04-11 21:07:16 -040022
23def _get_slices(filter):
Tony Mack5df6c552013-04-11 21:24:17 -040024 if isinstance(filter, StringTypes) and filter.isdigit():
25 filter = int(filter)
Tony Mack29c287f2013-04-11 21:07:16 -040026 if isinstance(filter, int):
27 slices = Slice.objects.filter(id=filter)
28 elif isinstance(filter, StringTypes):
29 slices = Slice.objects.filter(name=filter)
Tony Mack5df6c552013-04-11 21:24:17 -040030 elif isinstance(filter, dict):
Tony Mack29c287f2013-04-11 21:07:16 -040031 slices = Slice.objects.filter(**filter)
32 else:
33 slices = []
34 return slices
35
Tony Mack3a1af412013-04-09 22:36:27 -040036
Tony Mack3a1af412013-04-09 22:36:27 -040037def add_slice(auth, fields):
38 driver = OpenStackDriver(client = auth_check(auth))
Tony Mack771f4b92013-04-12 01:49:57 -040039 validate_name(fields.get('name'))
40 login_base = fields['name'][:fields['name'].find('_')]
41 sites = _get_sites(login_base)
Tony Mack29c287f2013-04-11 21:07:16 -040042 if sites: fields['site'] = sites[0]
Tony Mack3a1af412013-04-09 22:36:27 -040043 slice = Slice(**fields)
Tony Mack771f4b92013-04-12 01:49:57 -040044
Tony Mack3a1af412013-04-09 22:36:27 -040045 # create tenant
46 nova_fields = {'tenant_name': slice.name,
47 'description': slice.description,
48 'enabled': slice.enabled}
49 tenant = driver.create_tenant(**nova_fields)
50 slice.tenant_id=tenant.id
51
52 # create network
Tony Mack53c63342013-04-10 08:11:45 -040053 network = driver.create_network(slice.name)
Tony Mackd95d1aa2013-04-10 08:02:02 -040054 slice.network_id = network['id']
Tony Mack3a1af412013-04-09 22:36:27 -040055
56 # create router
Tony Mack53c63342013-04-10 08:11:45 -040057 router = driver.create_router(slice.name)
Tony Mackd95d1aa2013-04-10 08:02:02 -040058 slice.router_id = router['id']
Tony Mack3a1af412013-04-09 22:36:27 -040059
60 slice.save()
61 return slice
62
63def update_slice(auth, id, **fields):
64 driver = OpenStackDriver(client = auth_check(auth))
Tony Mack29c287f2013-04-11 21:07:16 -040065 slices = _get_slices(id)
Tony Mack3a1af412013-04-09 22:36:27 -040066 if not slices:
67 return
68
69 # update tenant
70 slice = slices[0]
71 nova_fields = {}
72 if 'name' in fields:
73 nova_fields['tenant_name'] = fields['name']
74 if 'description' in fields:
75 nova_fields['description'] = fields['description']
76 if 'enabled' in fields:
77 nova_fields['enabled'] = fields['enabled']
78 driver.update_tenant(slice.tenant_id, **nova_fields)
79
80 # update db record
Tony Mack29c287f2013-04-11 21:07:16 -040081 sites = _get_sites(fields.get('site'))
82 if sites: fields['site'] = sites[0]
Tony Mack3a1af412013-04-09 22:36:27 -040083 slice.update(**fields)
84
85 return slice
86
87def delete_slice(auth, filter={}):
88 driver = OpenStackDriver(client = auth_check(auth))
Tony Mack29c287f2013-04-11 21:07:16 -040089 slices = _get_slices(id)
Tony Mack3a1af412013-04-09 22:36:27 -040090 for slice in slices:
91 driver.delete_slice(id=slice.tenant_id)
92 slice.delete()
93 return 1
94
95def get_slices(auth, filter={}):
96 client = auth_check(auth)
Tony Mackd95d1aa2013-04-10 08:02:02 -040097 if 'site' in filter:
Tony Mack29c287f2013-04-11 21:07:16 -040098 sites = _get_sites(filter.get('site'))
99 if sites: filter['site'] = sites[0]
100 slices = _get_slices(filter)
Tony Mack3a1af412013-04-09 22:36:27 -0400101 return slices
102
103
104