implementing attributes for cluster

This commit is contained in:
Nikolay Markov 2012-10-03 13:52:29 +04:00 committed by default
parent d751baafdf
commit c4c2b5117d
7 changed files with 154 additions and 3 deletions

View File

@ -10,7 +10,8 @@ import netaddr
import rpc
from settings import settings
from api.models import Cluster, Node, Network, Release, Vlan, Task
from api.models import Cluster, Node, Network, Release, Attributes
from api.models import Vlan, Task
from api.handlers.base import JSONHandler
from api.handlers.node import NodeHandler
from api.handlers.tasks import TaskHandler
@ -121,6 +122,16 @@ class ClusterCollectionHandler(JSONHandler):
web.ctx.orm.add(cluster)
web.ctx.orm.commit()
attributes = Attributes(
editable=cluster.release.attributes_metadata.get("editable"),
generated=cluster.release.attributes_metadata.get("generated"),
cluster=cluster
)
web.ctx.orm.add(attributes)
web.ctx.orm.commit()
attributes.generate_fields()
web.ctx.orm.add(attributes)
web.ctx.orm.commit()
used_nets = [n.cidr for n in web.ctx.orm.query(Network).all()]
used_vlans = [v.id for v in web.ctx.orm.query(Vlan).all()]
@ -325,3 +336,27 @@ class ClusterNetworksHandler(JSONHandler):
self.render(cluster),
indent=4
)
class ClusterAttributesHandler(JSONHandler):
fields = (
"editable",
)
def GET(self, cluster_id):
web.header('Content-Type', 'application/json')
q = web.ctx.orm.query(Cluster).filter(Cluster.id == cluster_id)
cluster = q.first()
if not cluster:
return web.notfound()
attrs = cluster.attributes
if not attrs:
return web.notfound()
return json.dumps(
{
"editable": attrs.editable
},
indent=4
)

View File

@ -1,5 +1,8 @@
# -*- coding: utf-8 -*-
import re
import string
from random import choice
import web
from sqlalchemy import Column, UniqueConstraint, Table
@ -28,6 +31,7 @@ class Release(Base, BasicValidator):
version = Column(String(30), nullable=False)
description = Column(Unicode)
networks_metadata = Column(JSON, default=[])
attributes_metadata = Column(JSON, default={})
clusters = relationship("Cluster", backref="release")
@classmethod
@ -71,7 +75,11 @@ class Cluster(Base, BasicValidator):
name = Column(Unicode(50), unique=True, nullable=False)
release_id = Column(Integer, ForeignKey('releases.id'), nullable=False)
nodes = relationship("Node", backref="cluster")
<<<<<<< HEAD
tasks = relationship("Task", backref="cluster")
=======
attributes = relationship("Attributes", uselist=False, backref="cluster")
>>>>>>> implementing attributes for cluster
@classmethod
def validate(cls, data):
@ -254,6 +262,25 @@ class Network(Base, BasicValidator):
return d
class Attributes(Base, BasicValidator):
__tablename__ = 'attributes'
id = Column(Integer, primary_key=True)
cluster_id = Column(Integer, ForeignKey('clusters.id'))
editable = Column(JSON)
generated = Column(JSON)
def generate_fields(self):
for service, flds in self.generated.iteritems():
for field, value in flds.iteritems():
self.generated[service][field] = self._generate_pwd()
web.ctx.orm.add(self)
web.ctx.orm.commit()
def _generate_pwd(self, length=8):
chars = string.letters + string.digits
return ''.join([choice(chars) for i in xrange(length)])
class Task(Base, BasicValidator):
__tablename__ = 'tasks'
TASK_STATUSES = (

View File

@ -4,6 +4,7 @@ import web
from api.handlers.cluster import ClusterHandler, ClusterCollectionHandler
from api.handlers.cluster import ClusterChangesHandler, ClusterNetworksHandler
from api.handlers.cluster import ClusterAttributesHandler
from api.handlers.release import ReleaseHandler, ReleaseCollectionHandler
from api.handlers.node import NodeHandler, NodeCollectionHandler
from api.handlers.networks import NetworkCollectionHandler
@ -21,6 +22,8 @@ urls = (
'ClusterHandler',
r'/clusters/(?P<cluster_id>\d+)/changes/?$',
'ClusterChangesHandler',
r'/clusters/(?P<cluster_id>\d+)/attributes/?$',
'ClusterAttributesHandler',
r'/clusters/(?P<cluster_id>\d+)/verify/networks/?$',
'ClusterNetworksHandler',
r'/nodes/?$',

View File

@ -11,7 +11,19 @@
{"name": "fixed", "access": "private10"},
{"name": "management", "access": "private172"},
{"name": "storage", "access": "private192"}
]
],
"attributes_metadata": {
"editable": {
"keystone": {
"admin_tenant": "admin"
}
},
"generated": {
"mysql": {
"root_password": ""
}
}
}
}
},
{
@ -30,6 +42,23 @@
"release": 1
}
},
{
"pk": 1,
"model": "nailgun.attributes",
"fields": {
"cluster": 1,
"editable": {
"keystone": {
"admin_tenant": "admin"
}
},
"generated": {
"mysql": {
"root_password": "12345"
}
}
}
},
{
"pk": 1,
"model": "nailgun.node",

View File

@ -104,6 +104,18 @@ class BaseHandlers(TestCase):
{"name": "management", "access": "private172"},
{"name": "other_172", "access": "private172"}
]
release.attributes_metadata = {
"editable": {
"keystone": {
"admin_tenant": "admin"
}
},
"generated": {
"mysql": {
"root_password": ""
}
}
}
self.db.add(release)
self.db.commit()
return release

View File

@ -0,0 +1,33 @@
# -*- coding: utf-8 -*-
import json
from paste.fixture import TestApp
from api.models import Cluster, Node, Attributes
from base import BaseHandlers
from base import reverse
class TestAttributes(BaseHandlers):
def test_attributes_creation(self):
release = self.create_default_release()
yet_another_cluster_name = 'Yet another cluster'
resp = self.app.post(
'/api/clusters',
params=json.dumps({
'name': yet_another_cluster_name,
'release': release.id
}),
headers=self.default_headers
)
self.assertEquals(201, resp.status)
response = json.loads(resp.body)
cluster_id = int(response["id"])
resp = self.app.get(
'/api/clusters/%d/attributes/' % cluster_id,
headers=self.default_headers
)
self.assertEquals(200, resp.status)
response = json.loads(resp.body)
attrs = self.db.query(Attributes).filter(Attributes.cluster_id == cluster_id).first()
for service, fields in attrs.editable.iteritems():
for f, value in fields.iteritems():
self.assertNotEqual(value, "")

View File

@ -6,5 +6,17 @@
{"name": "floating", "access": "public"},
{"name": "management", "access": "private10"},
{"name": "storage", "access": "private172"}
]
],
"attributes_metadata": {
"editable": {
"keystone": {
"admin_tenant": "admin"
}
},
"generated": {
"mysql": {
"root_password": ""
}
}
}
}