Fix the broken senlin dashboard

Change-Id: Id94616132adcf5d44ea2045f9ffd5039c8b4f6bb
Closes-Bug: 1535538
This commit is contained in:
jing.liuqing 2016-01-18 22:38:50 -05:00
parent 39b85a7f04
commit d4a87777d2
20 changed files with 118 additions and 120 deletions

View File

@ -15,19 +15,18 @@ from django.conf import settings
from horizon.utils import memoized
from openstack_dashboard.api import base
from senlinclient import client as senlin_client
from senlinclient.v1 import models
USER_AGENT = 'python-senlinclient'
class Cluster(base.APIResourceWrapper):
_attrs = ['id', 'name', 'status', 'created_time', 'updated_time',
_attrs = ['id', 'name', 'status', 'created_at', 'updated_at',
'profile_name', 'profile_id', 'status_reason']
class Profile(base.APIResourceWrapper):
_attrs = ['id', 'name', 'type', 'created_time', 'updated_time',
'permission']
_attrs = ['id', 'name', 'type_name', 'created_at', 'updated_at',
'permission', 'metadata', 'spec']
class ProfileType(base.APIResourceWrapper):
@ -36,11 +35,11 @@ class ProfileType(base.APIResourceWrapper):
class Policy(base.APIResourceWrapper):
_attrs = ['id', 'name', 'type', 'spec', 'level', 'cooldown',
'created_time', 'updated_time']
'created_at', 'updated_at']
class Node(base.APIResourceWrapper):
_attrs = ['id', 'name', 'status', 'created_time', 'updated_time',
_attrs = ['id', 'name', 'status', 'created_at', 'updated_at',
'profile_name', 'status_reason', 'physical_id', 'role',
'profile_id', 'profile_url']
@ -56,117 +55,112 @@ def senlinclient(request):
kwargs = {
'auth_url': getattr(settings, 'OPENSTACK_KEYSTONE_URL'),
'token': request.user.token.id,
'user_id': request.user.id,
'project_id': request.user.tenant_id,
'auth_plugin': 'token',
}
return senlin_client.Client(api_version, {}, USER_AGENT, **kwargs)
def cluster_list(request):
def cluster_list(request, params):
"""Returns all clusters."""
clusters = senlinclient(request).list(models.Cluster)
clusters = senlinclient(request).clusters(**params)
return [Cluster(c) for c in clusters]
def cluster_create(request, params):
"""Create cluster."""
cluster = senlinclient(request).create(models.Cluster, params)
return cluster
def cluster_delete(request, cluster_id):
"""Delete cluster."""
senlinclient(request).delete(models.Cluster, {"id": cluster_id})
def cluster_get(request, cluster_id):
"""Returns cluster."""
cluster = senlinclient(request).get(models.Cluster, {"id": cluster_id})
cluster = senlinclient(request).create_cluster(**params)
return Cluster(cluster)
def profile_list(request):
def cluster_delete(request, cluster):
"""Delete cluster."""
senlinclient(request).delete_cluster(cluster)
def cluster_get(request, cluster):
"""Returns cluster."""
cluster = senlinclient(request).get_cluster(cluster)
return Cluster(cluster)
def profile_list(request, params):
"""Returns all profiles."""
profiles = senlinclient(request).list(models.Profile)
profiles = senlinclient(request).profiles(**params)
return [Profile(p) for p in profiles]
def profile_type_list(request):
"""Returns all profile types."""
prof_types = senlinclient(request).list(models.ProfileType)
return [ProfileType(t) for t in prof_types]
def profile_get(request, profile_id):
def profile_get(request, profile):
"""Returns profile."""
profile = senlinclient(request).get(models.Profile, {"id": profile_id})
return profile
profile = senlinclient(request).get_profile(profile)
return Profile(profile)
def profile_create(request, opts):
def profile_create(request, params):
"""Create profile."""
profile = senlinclient(request).create(models.Profile, opts)
return profile
profile = senlinclient(request).create_profile(**params)
return Profile(profile)
def profile_update(request, opts):
def profile_update(request, profile, params):
"""Update profile."""
profile = senlinclient(request).update(models.Profile, opts)
return profile
profile = senlinclient(request).update_profile(profile, **params)
return Profile(profile)
def profile_delete(request, profile_id):
def profile_delete(request, profile):
"""Delete profile."""
senlinclient(request).delete(models.Profile, {"id": profile_id})
senlinclient(request).delete_profile(profile)
def policy_list(request):
def policy_list(request, params):
"""Returns all policies."""
policies = senlinclient(request).list(models.Policy)
policies = senlinclient(request).policies(**params)
return [Policy(p) for p in policies]
def policy_create(request, args):
def policy_create(request, params):
"""Create a policy."""
policy = senlinclient(request).create(models.Policy, args)
policy = senlinclient(request).create_policy(**params)
return policy
def policy_delete(request, policy_id):
def policy_delete(request, policy):
"""Delete a policy."""
senlinclient(request).delete(models.Policy, {"id": policy_id})
senlinclient(request).delete_policy(policy)
def policy_get(request, policy_id):
def policy_get(request, policy):
"""Returns policy."""
policy = senlinclient(request).get(models.Policy, {"id": policy_id})
policy = senlinclient(request).get_policy(policy)
return policy
def node_list(request):
def node_list(request, params):
"""Returns all nodes."""
nodes = senlinclient(request).list(models.Node)
nodes = senlinclient(request).nodes(**params)
return [Node(p) for p in nodes]
def node_create(request, params):
"""Create node."""
node = senlinclient(request).create(models.Node, params)
node = senlinclient(request).create_node(**params)
return node
def node_delete(request, node_id):
def node_delete(request, node):
"""Delete node."""
senlinclient(request).delete(models.Node, {"id": node_id})
senlinclient(request).delete_node(node)
def node_get(request, node_id):
def node_get(request, node):
"""Returns node."""
node = senlinclient(request).get(models.Node, {"id": node_id})
node = senlinclient(request).get_node(node)
return Node(node)
def event_list(request, **kwargs):
def event_list(request, params):
"""Returns events."""
events = senlinclient(request).list(models.Event, **kwargs)
events = senlinclient(request).events(**params)
return [Event(c) for c in events]

View File

@ -64,7 +64,7 @@ class CreateForm(forms.SelfHandlingForm):
def __init__(self, request, *args, **kwargs):
super(CreateForm, self).__init__(request, *args, **kwargs)
profiles = senlin.profile_list(request)
profiles = senlin.profile_list(request, params={})
self.fields['profile_id'].choices = [(profile.id, profile.name)
for profile in profiles]

View File

@ -36,7 +36,7 @@ def get_profile_link(cluster):
def get_updated_time(object):
return filters.parse_isotime(object.updated_time) or None
return filters.parse_isotime(object.updated_at) or None
class DeleteCluster(tables.DeleteAction):
@ -111,7 +111,7 @@ class ClustersTable(tables.DataTable):
link=get_profile_link,
verbose_name=_("Profile Name"))
created = tables.Column(
"created_time",
"created_at",
verbose_name=_("Created"),
filters=(
filters.parse_isotime,

View File

@ -13,10 +13,10 @@
<dt>{% trans "Status" %}</dt>
<dd>{{ cluster.status }}</dd>
<dt>{% trans "Created" context "Created time" %}</dt>
<dd>{{ cluster.created_time|parse_date }}</dd>
{% if cluster.updated_time %}
<dd>{{ cluster.created_at|parse_date }}</dd>
{% if cluster.updated_at %}
<dt>{% trans "Updated" context "Updated time" %}</dt>
<dd>{{ cluster.updated_time|parse_date }}</dd>
<dd>{{ cluster.updated_at|parse_date }}</dd>
{% endif %}
</dl>
</div>

View File

@ -31,7 +31,7 @@ class ClustersTest(test.TestCase):
def test_index(self):
clusters = self.clusters.list()
api.senlin.cluster_list(
IsA(http.HttpRequest)).AndReturn(clusters)
IsA(http.HttpRequest), params={}).AndReturn(clusters)
self.mox.ReplayAll()
res = self.client.get(CLUSTER_INDEX_URL)
@ -42,7 +42,7 @@ class ClustersTest(test.TestCase):
@test.create_stubs({api.senlin: ('cluster_list',)})
def test_index_cluster_list_exception(self):
api.senlin.cluster_list(
IsA(http.HttpRequest)).AndRaise(self.exceptions.senlin)
IsA(http.HttpRequest), params={}).AndRaise(self.exceptions.senlin)
self.mox.ReplayAll()
res = self.client.get(CLUSTER_INDEX_URL)
@ -53,7 +53,7 @@ class ClustersTest(test.TestCase):
@test.create_stubs({api.senlin: ('cluster_list',)})
def test_index_no_cluster(self):
api.senlin.cluster_list(
IsA(http.HttpRequest)).AndReturn([])
IsA(http.HttpRequest), params={}).AndReturn([])
self.mox.ReplayAll()
res = self.client.get(CLUSTER_INDEX_URL)
@ -81,7 +81,7 @@ class ClustersTest(test.TestCase):
opts = formdata
api.senlin.profile_list(
IsA(http.HttpRequest)).AndReturn(profiles)
IsA(http.HttpRequest), params={}).AndReturn(profiles)
api.senlin.cluster_create(
IsA(http.HttpRequest), opts).AndReturn(cluster)
self.mox.ReplayAll()

View File

@ -32,7 +32,8 @@ class IndexView(tables.DataTableView):
def get_data(self):
try:
clusters = senlin.cluster_list(self.request)
params = {}
clusters = senlin.cluster_list(self.request, params)
except Exception:
clusters = []
exceptions.handle(self.request,

View File

@ -46,12 +46,12 @@ class CreateForm(forms.SelfHandlingForm):
def __init__(self, request, *args, **kwargs):
super(CreateForm, self).__init__(request, *args, **kwargs)
profiles = senlin.profile_list(request)
profiles = senlin.profile_list(request, params={})
self.fields['profile_id'].choices = (
[("", _("Select Profile"))] + [(profile.id, profile.name)
for profile in profiles])
clusters = senlin.cluster_list(request)
clusters = senlin.cluster_list(request, params={})
self.fields['cluster_id'].choices = (
[("", _("Select Cluster"))] + [(cluster.id, cluster.name)
for cluster in clusters])

View File

@ -72,7 +72,7 @@ def get_physical_link(node):
def get_updated_time(object):
return filters.parse_isotime(object.updated_time) or None
return filters.parse_isotime(object.updated_at) or None
class NodesTable(tables.DataTable):
@ -115,7 +115,7 @@ class NodesTable(tables.DataTable):
status_reason = tables.Column("status_reason",
verbose_name=_("Status Reason"))
created = tables.Column(
"created_time",
"created_at",
verbose_name=_("Created"),
filters=(
filters.parse_isotime,

View File

@ -19,10 +19,10 @@
<dd>{{ node.role }}</dd>
{% endif %}
<dt>{% trans "Created" context "Created time" %}</dt>
<dd>{{ node.created_time|parse_date }}</dd>
{% if node.updated_time %}
<dd>{{ node.created_at|parse_date }}</dd>
{% if node.updated_at %}
<dt>{% trans "Updated" context "Updated time" %}</dt>
<dd>{{ node.updated_time|parse_date }}</dd>
<dd>{{ node.updated_at|parse_date }}</dd>
{% endif %}
</dl>

View File

@ -31,7 +31,7 @@ class NodesTest(test.TestCase):
def test_index(self):
nodes = self.nodes.list()
api.senlin.node_list(
IsA(http.HttpRequest)).AndReturn(nodes)
IsA(http.HttpRequest), params={}).AndReturn(nodes)
self.mox.ReplayAll()
res = self.client.get(NODE_INDEX_URL)
@ -42,7 +42,7 @@ class NodesTest(test.TestCase):
@test.create_stubs({api.senlin: ('node_list',)})
def test_index_node_list_exception(self):
api.senlin.node_list(
IsA(http.HttpRequest)).AndRaise(self.exceptions.senlin)
IsA(http.HttpRequest), params={}).AndRaise(self.exceptions.senlin)
self.mox.ReplayAll()
res = self.client.get(NODE_INDEX_URL)
@ -52,7 +52,7 @@ class NodesTest(test.TestCase):
@test.create_stubs({api.senlin: ('node_list',)})
def test_index_no_node(self):
api.senlin.node_list(
IsA(http.HttpRequest)).AndReturn([])
IsA(http.HttpRequest), params={}).AndReturn([])
self.mox.ReplayAll()
res = self.client.get(NODE_INDEX_URL)
@ -79,9 +79,9 @@ class NodesTest(test.TestCase):
opts = formdata
api.senlin.profile_list(
IsA(http.HttpRequest)).AndReturn(profiles)
IsA(http.HttpRequest), params={}).AndReturn(profiles)
api.senlin.cluster_list(
IsA(http.HttpRequest)).AndReturn(clusters)
IsA(http.HttpRequest), params={}).AndReturn(clusters)
api.senlin.node_create(
IsA(http.HttpRequest), opts).AndReturn(node)
self.mox.ReplayAll()

View File

@ -32,7 +32,8 @@ class IndexView(tables.DataTableView):
def get_data(self):
try:
nodes = senlin.node_list(self.request)
params = {}
nodes = senlin.node_list(self.request, params)
except Exception:
nodes = []
exceptions.handle(self.request,

View File

@ -51,17 +51,15 @@ class DeletePolicy(tables.DeleteAction):
def get_updated_time(object):
return filters.parse_isotime(object.updated_time) or None
return filters.parse_isotime(object.updated_at) or None
class PoliciesTable(tables.DataTable):
name = tables.Column("name", verbose_name=_("Name"),
link=policies_forms.DETAIL_URL)
type = tables.Column("type", verbose_name=_("Type"))
level = tables.Column("level", verbose_name=_("Level"))
cooldown = tables.Column("cooldown", verbose_name=_("Cooldown"))
created = tables.Column(
"created_time",
"created_at",
verbose_name=_("Created"),
filters=(
filters.parse_isotime,
@ -78,4 +76,3 @@ class PoliciesTable(tables.DataTable):
table_actions = (tables.FilterAction,
CreatePolicy,
DeletePolicy,)
row_actions = (DeletePolicy,)

View File

@ -33,7 +33,7 @@ class PoliciesTest(test.TestCase):
def test_index(self):
policies = self.policies.list()
api.senlin.policy_list(
IsA(http.HttpRequest)).AndReturn(policies)
IsA(http.HttpRequest), params={}).AndReturn(policies)
self.mox.ReplayAll()
res = self.client.get(INDEX_URL)
@ -44,7 +44,7 @@ class PoliciesTest(test.TestCase):
@test.create_stubs({api.senlin: ('policy_list',)})
def test_index_policy_list_exception(self):
api.senlin.policy_list(
IsA(http.HttpRequest)).AndRaise(self.exceptions.senlin)
IsA(http.HttpRequest), params={}).AndRaise(self.exceptions.senlin)
self.mox.ReplayAll()
res = self.client.get(INDEX_URL)
@ -55,7 +55,7 @@ class PoliciesTest(test.TestCase):
@test.create_stubs({api.senlin: ('policy_list',)})
def test_index_no_policy(self):
api.senlin.policy_list(
IsA(http.HttpRequest)).AndReturn([])
IsA(http.HttpRequest), params={}).AndReturn([])
self.mox.ReplayAll()
res = self.client.get(INDEX_URL)

View File

@ -34,7 +34,8 @@ class IndexView(tables.DataTableView):
def get_data(self):
try:
policies = senlin.policy_list(self.request)
params = {}
policies = senlin.policy_list(self.request, params)
except Exception:
policies = []
exceptions.handle(self.request,

View File

@ -181,7 +181,7 @@ class UpdateProfileForm(forms.SelfHandlingForm):
)
try:
senlin.profile_update(request, opts)
senlin.profile_update(request, data.get('profile_id'), opts)
messages.success(request,
_('Your profile %s has been updated.') %
opts['name'])

View File

@ -59,15 +59,15 @@ class DeleteProfile(tables.DeleteAction):
def get_updated_time(object):
return filters.parse_isotime(object.updated_time) or None
return filters.parse_isotime(object.updated_at) or None
class ProfilesTable(tables.DataTable):
name = tables.Column("name", verbose_name=_("Name"),
link=profiles_forms.DETAIL_URL)
type = tables.Column("type", verbose_name=_("Type"))
type_name = tables.Column("type_name", verbose_name=_("Type"))
created = tables.Column(
"created_time",
"created_at",
verbose_name=_("Created"),
filters=(
filters.parse_isotime,

View File

@ -9,7 +9,7 @@
<dt>{% trans "ID" %}</dt>
<dd>{{ profile.profile_id }}</dd>
<dt>{% trans "Type" %}</dt>
<dd>{{ profile.type }}</dd>
<dd>{{ profile.type_name }}</dd>
<dt>{% trans "Spec" %}</dt>
<dd>{{ profile.profile_spec|force_escape|nbsp|linebreaksbr }}</dd>
{% if profile.permission %}
@ -17,10 +17,10 @@
<dd>{{ profile.permission }}</dd>
{% endif %}
<dt>{% trans "Created" context "Created time" %}</dt>
<dd>{{ profile.created_time|parse_date }}</dd>
{% if profile.updated_time %}
<dd>{{ profile.created_at|parse_date }}</dd>
{% if profile.updated_at %}
<dt>{% trans "Updated" context "Updated time" %}</dt>
<dd>{{ profile.updated_time|parse_date }}</dd>
<dd>{{ profile.updated_at|parse_date }}</dd>
{% endif %}
</dl>

View File

@ -31,7 +31,7 @@ class ProfilesTest(test.TestCase):
def test_index(self):
profiles = self.profiles.list()
api.senlin.profile_list(
IsA(http.HttpRequest)).AndReturn(profiles)
IsA(http.HttpRequest), params={}).AndReturn(profiles)
self.mox.ReplayAll()
res = self.client.get(PROFILE_INDEX_URL)
@ -42,7 +42,7 @@ class ProfilesTest(test.TestCase):
@test.create_stubs({api.senlin: ('profile_list',)})
def test_index_profile_list_exception(self):
api.senlin.profile_list(
IsA(http.HttpRequest)).AndRaise(self.exceptions.senlin)
IsA(http.HttpRequest), params={}).AndRaise(self.exceptions.senlin)
self.mox.ReplayAll()
res = self.client.get(PROFILE_INDEX_URL)
@ -52,7 +52,7 @@ class ProfilesTest(test.TestCase):
@test.create_stubs({api.senlin: ('profile_list',)})
def test_index_no_policy(self):
api.senlin.profile_list(
IsA(http.HttpRequest)).AndReturn([])
IsA(http.HttpRequest), params={}).AndReturn([])
self.mox.ReplayAll()
res = self.client.get(PROFILE_INDEX_URL)

View File

@ -34,7 +34,8 @@ class IndexView(tables.DataTableView):
def get_data(self):
try:
profiles = senlin.profile_list(self.request)
params = {}
profiles = senlin.profile_list(self.request, params)
except Exception:
profiles = []
msg = _('Unable to retrieve profiles.')
@ -73,7 +74,7 @@ class UpdateView(forms.ModalFormView):
default_flow_style=False)
profile_dict = {"profile_id": profile_id,
"name": profile.name,
"type": profile.type,
"type": profile.type_name,
"spec": yaml.safe_dump(
profile.spec,
default_flow_style=False),

View File

@ -10,8 +10,6 @@
# See the License for the specific language governing permissions and
# limitations under the License.
from senlinclient.v1 import models
from senlin_dashboard import api
from senlin_dashboard.test import helpers as test
@ -19,46 +17,51 @@ from senlin_dashboard.test import helpers as test
class SenlinApiTests(test.APITestCase):
def test_cluster_list(self):
params = {}
clusters = self.clusters.list()
senlinclient = self.stub_senlinclient()
senlinclient.list = self.mox.CreateMockAnything()
senlinclient.list(models.Cluster).AndReturn(clusters)
senlinclient.clusters = self.mox.CreateMockAnything()
senlinclient.clusters(**params).AndReturn(clusters)
self.mox.ReplayAll()
api.senlin.cluster_list(self.request)
api.senlin.cluster_list(self.request, params)
def test_profile_list(self):
params = {}
profiles = self.profiles.list()
senlinclient = self.stub_senlinclient()
senlinclient.list = self.mox.CreateMockAnything()
senlinclient.list(models.Profile).AndReturn(profiles)
senlinclient.profiles = self.mox.CreateMockAnything()
senlinclient.profiles(**params).AndReturn(profiles)
self.mox.ReplayAll()
api.senlin.profile_list(self.request)
api.senlin.profile_list(self.request, params)
def test_policy_list(self):
params = {}
policies = self.policies.list()
senlinclient = self.stub_senlinclient()
senlinclient.list = self.mox.CreateMockAnything()
senlinclient.list(models.Policy).AndReturn(policies)
senlinclient.policies = self.mox.CreateMockAnything()
senlinclient.policies(**params).AndReturn(policies)
self.mox.ReplayAll()
api.senlin.policy_list(self.request)
api.senlin.policy_list(self.request, params)
def test_node_list(self):
params = {}
nodes = self.nodes.list()
senlinclient = self.stub_senlinclient()
senlinclient.list = self.mox.CreateMockAnything()
senlinclient.list(models.Node).AndReturn(nodes)
senlinclient.nodes = self.mox.CreateMockAnything()
senlinclient.nodes(**params).AndReturn(nodes)
self.mox.ReplayAll()
api.senlin.node_list(self.request)
api.senlin.node_list(self.request, params)
def test_event_list(self):
params = {}
events = self.events.list()
senlinclient = self.stub_senlinclient()
senlinclient.list = self.mox.CreateMockAnything()
senlinclient.list(models.Event).AndReturn(events)
senlinclient.events = self.mox.CreateMockAnything()
senlinclient.events(**params).AndReturn(events)
self.mox.ReplayAll()
api.senlin.event_list(self.request)
api.senlin.event_list(self.request, params)