implementing attributes for cluster
This commit is contained in:
parent
d751baafdf
commit
c4c2b5117d
|
@ -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
|
||||
)
|
||||
|
|
|
@ -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 = (
|
||||
|
|
|
@ -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/?$',
|
||||
|
|
|
@ -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",
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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, "")
|
|
@ -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": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue