Skip to content

Commit 11016ff

Browse files
committed
Design and flow changes for tenant discovery
1 parent 5aedb7b commit 11016ff

15 files changed

Lines changed: 422 additions & 445 deletions

File tree

‎.idea/workspace.xml‎

Lines changed: 171 additions & 283 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.9.2 on 2016-03-30 07:45
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
import django.db.models.deletion
7+
8+
9+
class Migration(migrations.Migration):
10+
11+
dependencies = [
12+
('cloud', '0006_auto_20160321_0634'),
13+
]
14+
15+
operations = [
16+
migrations.CreateModel(
17+
name='Subnet',
18+
fields=[
19+
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False, verbose_name='ID')),
20+
('subnet_id', models.CharField(max_length=255)),
21+
('network_name', models.CharField(max_length=255)),
22+
('cidr', models.CharField(max_length=255)),
23+
],
24+
options={
25+
'db_table': 'cloud_tenant_network_subnets',
26+
},
27+
),
28+
migrations.RemoveField(
29+
model_name='network',
30+
name='network_cidr',
31+
),
32+
migrations.RemoveField(
33+
model_name='network',
34+
name='subnet',
35+
),
36+
migrations.AddField(
37+
model_name='subnet',
38+
name='network',
39+
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='subnets', to='cloud.Network'),
40+
),
41+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.9.2 on 2016-03-30 08:08
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations, models
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('cloud', '0007_auto_20160330_0745'),
12+
]
13+
14+
operations = [
15+
migrations.AddField(
16+
model_name='subnet',
17+
name='is_dirty',
18+
field=models.BooleanField(default=False),
19+
),
20+
]
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
# -*- coding: utf-8 -*-
2+
# Generated by Django 1.9.2 on 2016-03-30 11:16
3+
from __future__ import unicode_literals
4+
5+
from django.db import migrations
6+
7+
8+
class Migration(migrations.Migration):
9+
10+
dependencies = [
11+
('cloud', '0008_subnet_is_dirty'),
12+
]
13+
14+
operations = [
15+
migrations.RenameField(
16+
model_name='subnet',
17+
old_name='network_name',
18+
new_name='subnet_name',
19+
),
20+
]

‎ntt_tool/apps/cloud/models.py‎

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -37,9 +37,7 @@ class Network(models.Model):
3737
tenant = models.ForeignKey(Tenant, related_name="networks")
3838
network_id = models.CharField(max_length=255)
3939
network_name = models.CharField(max_length=255)
40-
network_cidr = models.CharField(max_length=255)
4140
shared = models.BooleanField(default=False)
42-
subnet = models.CharField(max_length=255, blank=True, null=True)
4341
status = models.CharField(max_length=25)
4442
is_dirty = models.BooleanField(default=False)
4543
creator = models.ForeignKey(User, blank=True, null=True)
@@ -50,6 +48,17 @@ class Meta:
5048
db_table = "cloud_tenant_networks"
5149

5250

51+
class Subnet(models.Model):
52+
network = models.ForeignKey(Network, related_name="subnets")
53+
subnet_id = models.CharField(max_length=255)
54+
subnet_name = models.CharField(max_length=255)
55+
cidr = models.CharField(max_length=255)
56+
is_dirty = models.BooleanField(default=False)
57+
58+
class Meta:
59+
db_table = "cloud_tenant_network_subnets"
60+
61+
5362
class Router(models.Model):
5463
tenant = models.ForeignKey(Tenant, related_name="routers")
5564
router_id = models.CharField(max_length=255)
Lines changed: 44 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,32 +1,38 @@
1+
import logging
12
from django.db import transaction
23
from django.utils import timezone
34
from keystoneclientutils import KeystoneClientUtils
45
from neutronclientutils import NeutronClientUtils
5-
from ntt_tool.apps.cloud.models import Tenant, Network, Router
6+
from ntt_tool.apps.cloud.models import Tenant, Network, Subnet
67
from ntt_tool.apps.cloud.serializers import TenantSerializer
78

89

10+
logger = logging.getLogger(__name__)
11+
12+
913
class TenantDiscovery(KeystoneClientUtils):
1014

1115
def get_tenants(self):
1216
keystone = self.get_client_instance()
1317
return keystone.tenants.list()
1418

1519

16-
class NetworkRouterDiscovery(NeutronClientUtils):
20+
class NetworkSubnetDiscovery(NeutronClientUtils):
1721

18-
def get_networks_and_routers(self, user, cloud_id, tenants):
22+
def get_networks_and_subnets(self, user, cloud_id, tenants):
1923
neutron = self.get_client_instance()
2024

2125
discovery_result = []
2226
with transaction.atomic():
2327
discovery_datetime = timezone.now()
2428

25-
Tenant.objects.filter(cloud_id=cloud_id).update(is_dirty=False)
29+
Tenant.objects.filter(cloud_id=cloud_id)\
30+
.update(is_dirty=False)
31+
2632
for tenant in tenants:
2733
tenant_obj = None
2834
try:
29-
tenant_obj = Tenant.objects.filter(tenant_name=tenant.name).get()
35+
tenant_obj = Tenant.objects.filter(tenant_id=tenant.id).get()
3036
except Tenant.DoesNotExist:
3137
tenant_obj = Tenant()
3238
tenant_obj.cloud_id = cloud_id
@@ -42,6 +48,7 @@ def get_networks_and_routers(self, user, cloud_id, tenants):
4248
# Setting all records belongs to tenant as not dirty/updated
4349
Network.objects.filter(tenant__tenant_id=tenant.id)\
4450
.update(is_dirty=False)
51+
4552
networks = neutron.list_networks(tenant_id=tenant.id)
4653
for network in networks.get("networks", []):
4754
network_obj = None
@@ -57,51 +64,47 @@ def get_networks_and_routers(self, user, cloud_id, tenants):
5764
network_obj.network_id = network.get("id")
5865
network_obj.network_name = network.get("name")
5966
network_obj.shared = network.get("shared")
60-
# ToDo: We are assuming that each network is having only one subnet
61-
# ToDo: Need to handle the scenario if we add more than one subnet for a network
62-
if network.get("subnets"):
63-
subnet_list = neutron.list_subnets(id=network.get("subnets"))
64-
network_obj.network_cidr = subnet_list.get("subnets")[0].get("cidr")
6567
network_obj.status = network.get("status")
6668
network_obj.is_dirty = True
6769
network_obj.creator = user
6870
network_obj.updated_on = discovery_datetime
6971
network_obj.save()
70-
# Deleting networks which are not got changed after discovery
71-
Network.objects.filter(tenant__tenant_id=tenant_obj.id)\
72-
.filter(is_dirty=False).delete()
7372

74-
# Setting all records belongs to tenant as not dirty/updated
75-
Router.objects.filter(tenant__tenant_id=tenant.id)\
76-
.update(is_dirty=False)
77-
routers = neutron.list_routers(tenant_id=tenant.id)
78-
for router in routers.get("routers", []):
79-
router_obj = None
80-
try:
81-
filters = {
82-
"tenant__tenant_id": tenant.id,
83-
"router_name": router.get("name")
84-
}
85-
router_obj = Router.objects.filter(**filters).get()
86-
except Router.DoesNotExist:
87-
router_obj = Router()
88-
router_obj.created_on = discovery_datetime
89-
router_obj.tenant = tenant_obj
90-
router_obj.router_id = router.get("id")
91-
router_obj.router_name = router.get("name")
92-
router_obj.status = router.get("status")
93-
router_obj.is_dirty = True
94-
router_obj.creator = user
95-
router_obj.updated_on = discovery_datetime
96-
router_obj.save()
97-
# Deleting routers which are got changed after discovery
98-
Router.objects.filter(tenant__tenant_id=tenant_obj.id)\
99-
.filter(is_dirty=False).delete()
73+
# Setting all records belongs to tenant as not dirty/updated
74+
Subnet.objects.filter(network__network_id=network.get("id"))\
75+
.update(is_dirty=False)
76+
77+
subnets = neutron.list_subnets(network_id=network.get("id"))
78+
for subnet in subnets.get("subnets"):
79+
subnet_obj = None
80+
try:
81+
filters = {
82+
"network__network_id": network.get("id"),
83+
"subnet_id": subnet.get("id")
84+
}
85+
print filters
86+
subnet_obj = Subnet.objects.filter(**filters).get()
87+
except Subnet.DoesNotExist:
88+
subnet_obj = Subnet()
89+
subnet_obj.subnet_id = subnet.get("id")
90+
subnet_obj.network_id = network_obj.id
91+
subnet_obj.subnet_name = subnet.get("name")
92+
subnet_obj.cidr = subnet.get("cidr")
93+
subnet_obj.is_dirty = True
94+
subnet_obj.save()
10095

101-
# Deleting tenants which are got changed after discovery
102-
Tenant.objects.filter(cloud_id=cloud_id)\
96+
# Deleting subnets which are got changed after discovery
97+
Subnet.objects.filter(network__network_id=network.get("id"))\
98+
.filter(is_dirty=False).delete()
99+
100+
# Deleting networks which are not got changed after discovery
101+
Network.objects.filter(tenant__tenant_id=tenant_obj.id)\
103102
.filter(is_dirty=False).delete()
104103

105104
serializer = TenantSerializer(tenant_obj)
106105
discovery_result.append(serializer.data)
106+
107+
# Deleting tenants which are got changed after discovery
108+
Tenant.objects.filter(cloud_id=cloud_id)\
109+
.filter(is_dirty=False).delete()
107110
return discovery_result

‎ntt_tool/apps/cloud/serializers.py‎

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@ class Meta:
99
exclude = ('creator', 'updated_on')
1010

1111

12+
class SubnetSerializer(serializers.ModelSerializer):
13+
14+
class Meta:
15+
model = Subnet
16+
17+
1218
class NetworkSerializer(serializers.ModelSerializer):
19+
subnets = SubnetSerializer(many=True, read_only=True)
1320

1421
class Meta:
1522
model = Network
@@ -31,7 +38,6 @@ class Meta:
3138

3239
class TenantSerializer(serializers.ModelSerializer):
3340
networks = NetworkSerializer(many=True, read_only=True)
34-
routers = RouterSerializer(many=True, read_only=True)
3541

3642
class Meta:
3743
model = Tenant

‎ntt_tool/apps/cloud/views.py‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from models import *
88
from serializers import *
99
from openstackscripts.novaclientutils import NovaClientUtils
10-
from openstackscripts.tenantnetworkdiscovery import TenantDiscovery, NetworkRouterDiscovery
10+
from openstackscripts.tenantnetworkdiscovery import *
1111

1212

1313
class CloudViewSet(viewsets.ModelViewSet):
@@ -27,7 +27,7 @@ class TenantViewSet(viewsets.ModelViewSet):
2727
permission_classes = (IsAuthenticated,)
2828
action_serializers = {
2929
'retrieve': TenantSerializer,
30-
'list': TenantListSerializer,
30+
'list': TenantSerializer,
3131
'create': TenantSerializer,
3232
'update': TenantSerializer,
3333
}
@@ -69,8 +69,8 @@ def discover(self, request, cloud_id=None):
6969
tenant_discovery = TenantDiscovery(**credentials)
7070
tenants = tenant_discovery.get_tenants()
7171

72-
network_router_discovery = NetworkRouterDiscovery(**credentials)
73-
tenant_networks_routers = network_router_discovery.get_networks_and_routers(
72+
network_subnets_discovery = NetworkSubnetDiscovery(**credentials)
73+
tenant_networks_routers = network_subnets_discovery.get_networks_and_subnets(
7474
request.user,
7575
cloud_id,
7676
tenants

‎ntt_tool/static/css/custom.css‎

Lines changed: 29 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@ body {
4242
color: #fff;
4343
background-color: transparent;
4444
}
45-
4645
.navbar-header a {
4746
text-transform: uppercase;
4847
font-size: 14px;
@@ -66,23 +65,38 @@ td > a{
6665
color: #555;
6766
}
6867

69-
.panel{
70-
border: 1px solid #fbfbfb;
68+
69+
/* utility classes */
70+
.bg-white {
71+
background: #fff;
72+
}
73+
74+
.border {
75+
border: 1px solid #ddd;
76+
}
77+
78+
.noborder{
79+
border: none !important;
7180
}
72-
.panel-info > .panel-heading{
73-
background-color: #ededed;
74-
border: 1px solid #fbfbfb;
81+
82+
.mb0 {
83+
margin-bottom: 0;
84+
}
85+
/* end: utility classes */
86+
87+
.panel-default .panel-heading {
88+
background: #dddddd;
7589
}
7690

7791
.btn-primary{
7892
background-color: #0E3D59;
7993
border: none;
8094
}
8195

82-
.page-header {
83-
background: #f6f6f6;
84-
border-color: #e9e9e9;
85-
}
96+
/*.page-header {*/
97+
/*background: #f6f6f6;*/
98+
/*border-color: #e9e9e9;*/
99+
/*}*/
86100
.page-header {
87101
border-bottom: 1px solid #e4e4e4;
88102
margin-top: 0;
@@ -102,14 +116,6 @@ td > a{
102116
margin-top: 18px;
103117
}
104118

105-
.bg-white {
106-
background: #fff;
107-
}
108-
109-
.border {
110-
border: 1px solid #ddd;
111-
}
112-
113119
.modal-body {
114120
max-height: calc(100vh - 210px);
115121
overflow-y: auto;
@@ -149,4 +155,9 @@ td > a{
149155
border-bottom: 1px solid #ddd;
150156
margin-bottom: 15px;
151157
padding-bottom: 10px;
158+
}
159+
160+
.tenants-list {
161+
max-height: calc(100vh - 210px);
162+
overflow-y: auto;
152163
}

‎ntt_tool/static/js/apps/app.js‎

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -54,16 +54,6 @@ nttApp.config(['$routeProvider', function($routeProvider){
5454
templateUrl: '/static/partials/cloud/cloud_view.html',
5555
});
5656

57-
58-
/**
59-
* URL patterns for cloud tenants and tenant discovery
60-
*/
61-
$routeProvider.when('/cloud/tenant/discovery/:cloudId/', {
62-
controller: 'TenantDiscoveryCtrl',
63-
templateUrl: '/static/partials/cloud/tenants/tenants_discovery.html',
64-
});
65-
66-
6757
/**
6858
* URL patterns for cloud traffic
6959
*/

0 commit comments

Comments
 (0)