networks basic testing

This commit is contained in:
Nikolay Markov 2012-06-29 14:03:34 +04:00
parent f5d832c989
commit d567e69b1b
6 changed files with 128 additions and 16 deletions

View File

@ -1,4 +1,5 @@
import re import re
import ipaddr
import simplejson as json import simplejson as json
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
@ -7,7 +8,7 @@ from django.forms.fields import Field, IntegerField, CharField, ChoiceField, \
BooleanField BooleanField
from django.core.validators import RegexValidator from django.core.validators import RegexValidator
from nailgun.models import Cluster, Node, Recipe, Role, Release from nailgun.models import Cluster, Node, Recipe, Role, Release, Network
class RecipeForm(forms.ModelForm): class RecipeForm(forms.ModelForm):
@ -139,6 +140,7 @@ def validate_networks_metadata(data):
if not isinstance(data, list): if not isinstance(data, list):
raise ValidationError("There should be a list of network names") raise ValidationError("There should be a list of network names")
class ReleaseCreationForm(forms.ModelForm): class ReleaseCreationForm(forms.ModelForm):
roles = Field(validators=[validate_release_node_roles]) roles = Field(validators=[validate_release_node_roles])
networks_metadata = Field(validators=[validate_networks_metadata]) networks_metadata = Field(validators=[validate_networks_metadata])
@ -151,8 +153,37 @@ class ReleaseCreationForm(forms.ModelForm):
def validate_network(data): def validate_network(data):
pass try:
a = ipaddr.IPv4Network(data)
except:
raise ValidationError("Invalid network format!")
class NetworkCreationForm(forms.Form): def validate_ip(data):
network = Field(validators=[validate_network]) try:
a = ipaddr.IPv4Address(data)
except:
raise ValidationError("Invalid IP address format!")
class NetworkCreationForm(forms.ModelForm):
release = CharField()
network = CharField(validators=[validate_network])
range_l = CharField(validators=[validate_ip])
range_h = CharField(validators=[validate_ip])
gateway = CharField(validators=[validate_ip])
class Meta:
model = Network
def clean_release(self):
release_id = self.cleaned_data["release"]
if not release_id:
raise ValidationError("Release id not specified!")
try:
r = Release.objects.get(id=release_id)
except Release.DoesNotExist:
raise ValidationError("Invalid release id!")
#self.instance.release = r
return r

View File

@ -11,7 +11,7 @@ from nailgun.models import Cluster, Node, Recipe, Role, Release, Network
from nailgun.api.validators import validate_json from nailgun.api.validators import validate_json
from nailgun.api.forms import ClusterForm, ClusterCreationForm, RecipeForm, \ from nailgun.api.forms import ClusterForm, ClusterCreationForm, RecipeForm, \
RoleForm, RoleFilterForm, NodeCreationForm, NodeFilterForm, NodeForm, \ RoleForm, RoleFilterForm, NodeCreationForm, NodeFilterForm, NodeForm, \
ReleaseCreationForm ReleaseCreationForm, NetworkCreationForm
from nailgun import tasks from nailgun import tasks
@ -472,7 +472,8 @@ class NetworkHandler(JSONHandler):
allowed_methods = ('GET',) allowed_methods = ('GET',)
model = Network model = Network
fields = ('id', 'network') fields = ('id', 'network', 'name', 'access',
'vlan_id', 'range_l', 'range_h', 'gateway')
special_fields = ('release', 'nodes') special_fields = ('release', 'nodes')
@classmethod @classmethod
@ -495,8 +496,41 @@ class NetworkHandler(JSONHandler):
except Network.DoesNotExist: except Network.DoesNotExist:
return rc.NOT_FOUND return rc.NOT_FOUND
class NetworkCollectionHandler(BaseHandler): class NetworkCollectionHandler(BaseHandler):
allowed_methods = ('GET', 'POST') allowed_methods = ('GET', 'POST')
model = Network model = Network
@validate_json(NetworkCreationForm)
def create(self, request):
data = request.form.cleaned_data
try:
release = Network.objects.get(
name=data['name'],
network=data['network']
)
return rc.DUPLICATE_ENTRY
except Network.DoesNotExist:
pass
nw = Network(
name=data['name'],
network=data['network'],
release=data['release'],
access=data['access'],
range_l=data['range_l'],
range_h=data['range_h'],
gateway=data['gateway'],
vlan_id=data['vlan_id']
)
nw.save()
return NetworkHandler.render(nw)
def read(self, request):
return map(
NetworkHandler.render,
Network.objects.all()
)

View File

@ -3,7 +3,12 @@
"model": "nailgun.release", "model": "nailgun.release",
"pk": 1, "pk": 1,
"fields": { "fields": {
"name": "Default Release" "name": "Default Release",
"networks_metadata": [
{"name": "floating", "access": "public"},
{"name": "fixed", "access": "private"},
{"name": "management", "access": "private"}
]
} }
}, },
{ {

View File

@ -71,7 +71,7 @@ class Network(models.Model):
range_l = models.CharField(max_length=25) range_l = models.CharField(max_length=25)
range_h = models.CharField(max_length=25) range_h = models.CharField(max_length=25)
gateway = models.CharField(max_length=25) gateway = models.CharField(max_length=25)
nodes = models.ManyToManyField(Node, through=IPAddr) nodes = models.ManyToManyField(Node, through=IPAddr, null=True, blank=True)
@property @property
def netmask(self): def netmask(self):

View File

@ -33,10 +33,6 @@ class TestHandlers(TestCase):
'cpu': 'asf', 'cpu': 'asf',
'memory': 'sd' 'memory': 'sd'
} }
self.another_cluster = Cluster(id=2,
release_id=1,
name='Another cluster')
self.another_cluster.save()
self.node_name = "test.server.com" self.node_name = "test.server.com"
@ -86,6 +82,12 @@ class TestHandlers(TestCase):
'cpu': 'u', 'cpu': 'u',
'memory': 'a' 'memory': 'a'
} }
self.another_cluster = Cluster(id=2,
release_id=1,
name='Another cluster')
self.another_cluster.save()
self.meta_json = json.dumps(self.new_meta) self.meta_json = json.dumps(self.new_meta)
def tearDown(self): def tearDown(self):
@ -106,6 +108,7 @@ class TestHandlers(TestCase):
'cluster_handler': {'cluster_id': 1}, 'cluster_handler': {'cluster_id': 1},
'node_handler': {'node_id': 'A' * 12}, 'node_handler': {'node_id': 'A' * 12},
#'task_handler': {'task_id': 'a' * 36}, #'task_handler': {'task_id': 'a' * 36},
'network_handler': {'network_id': 1},
'release_handler': {'release_id': 1}, 'release_handler': {'release_id': 1},
'role_handler': {'role_id': 1}, 'role_handler': {'role_id': 1},
'node_role_available': {'node_id': 'A' * 12, 'role_id': 1}, 'node_role_available': {'node_id': 'A' * 12, 'role_id': 1},
@ -147,6 +150,8 @@ class TestHandlers(TestCase):
self.assertEquals(len(clusters_from_db), 1) self.assertEquals(len(clusters_from_db), 1)
self.assertEquals(clusters_from_db[0].nodes.all()[0].id, self.assertEquals(clusters_from_db[0].nodes.all()[0].id,
self.another_node.id) self.another_node.id)
cluster = clusters_from_db[0]
self.assertEquals(len(cluster.release.networks.all()), 3)
def test_cluster_update(self): def test_cluster_update(self):
updated_name = 'Updated cluster' updated_name = 'Updated cluster'
@ -416,7 +421,12 @@ class TestHandlers(TestCase):
'name': release_name, 'name': release_name,
'version': release_version, 'version': release_version,
'description': release_description, 'description': release_description,
'roles': release_roles 'roles': release_roles,
'networks_metadata': [
{"name": "floating", "access": "public"},
{"name": "fixed", "access": "private"},
{"name": "storage", "access": "private"}
]
}), }),
"application/json" "application/json"
) )
@ -429,7 +439,10 @@ class TestHandlers(TestCase):
'name': release_name, 'name': release_name,
'version': release_version, 'version': release_version,
'description': release_description, 'description': release_description,
'roles': release_roles 'roles': release_roles,
'networks_metadata': [
{"name": "fixed", "access": "private"}
]
}), }),
"application/json" "application/json"
) )
@ -450,3 +463,34 @@ class TestHandlers(TestCase):
}) })
for a, b in zip(sorted(roles), sorted(release_roles)): for a, b in zip(sorted(roles), sorted(release_roles)):
self.assertEquals(a, b) self.assertEquals(a, b)
def test_network_create(self):
network_data = {
"name": "test_network",
"network": "10.0.0.0/24",
"range_l": "10.0.0.5",
"range_h": "10.0.0.10",
"gateway": "10.0.0.1",
"vlan_id": 100,
"release": 1,
"access": "public"
}
resp = self.client.post(
reverse('network_collection_handler'),
json.dumps(network_data),
"application/json"
)
self.assertEquals(resp.status_code, 200)
resp = self.client.post(
reverse('network_collection_handler'),
json.dumps(network_data),
"application/json"
)
self.assertEquals(resp.status_code, 409)
network_data["network"] = "test_fail"
resp = self.client.post(
reverse('network_collection_handler'),
json.dumps(network_data),
"application/json"
)
self.assertEqual(resp.status_code, 400)

View File

@ -4,9 +4,7 @@
"description": "Description for Release", "description": "Description for Release",
"networks_metadata": [ "networks_metadata": [
{"name": "floating", "access": "public"}, {"name": "floating", "access": "public"},
{"name": "fixed", "access": "private"},
{"name": "management", "access": "private"}, {"name": "management", "access": "private"},
{"name": "public", "access": "public"},
{"name": "storage", "access": "private"} {"name": "storage", "access": "private"}
], ],
"roles": [{ "roles": [{