tuskar-ui/tuskar_ui/api/tuskar.py
Tzu-Mainn Chen 3bb83e2e1b Added mock tuskar driver
This patch allows you to simulate the creation and deletion of
a tuskar plan, allowing us to test workflows while the tuskar
API is under development.

It also removes the deployment count validation, as it causes
problems in the new api and is not likely to be used as is.

Change-Id: I20083021e0b55b5de234af68b89786e793ab8f09
2014-08-04 19:20:44 +02:00

224 lines
7.2 KiB
Python

# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import django.conf
import logging
from django.utils.translation import ugettext_lazy as _
from openstack_dashboard.api import base
from openstack_dashboard.test.test_data import utils
from tuskarclient.v1 import client as tuskar_client
from tuskar_ui.cached_property import cached_property # noqa
from tuskar_ui.handle_errors import handle_errors # noqa
from tuskar_ui.test.test_data import tuskar_data
from tuskar_ui.test.test_driver import tuskar_driver as mock_tuskar
TEST_DATA = utils.TestDataContainer()
tuskar_data.data(TEST_DATA)
LOG = logging.getLogger(__name__)
TUSKAR_ENDPOINT_URL = getattr(django.conf.settings, 'TUSKAR_ENDPOINT_URL')
# FIXME: request isn't used right in the tuskar client right now,
# but looking at other clients, it seems like it will be in the future
def tuskarclient(request):
c = tuskar_client.Client(TUSKAR_ENDPOINT_URL)
return c
class OvercloudPlan(base.APIDictWrapper):
_attrs = ('id', 'name', 'description', 'created_at', 'modified_at',
'roles', 'parameters')
def __init__(self, apiresource, request=None):
super(OvercloudPlan, self).__init__(apiresource)
self._request = request
@classmethod
def create(cls, request, name, description):
"""Create an OvercloudPlan in Tuskar
:param request: request object
:type request: django.http.HttpRequest
:param name: plan name
:type name: string
:param description: plan description
:type description: string
:return: the created OvercloudPlan object
:rtype: tuskar_ui.api.tuskar.OvercloudPlan
"""
plan = mock_tuskar.Plan.create(name, description)
return cls(plan, request=request)
@classmethod
def update(cls, request, plan_id, name, description):
"""Update an OvercloudPlan in Tuskar
:param request: request object
:type request: django.http.HttpRequest
:param plan_id: id of the plan we want to update
:type plan_id: string
:param name: plan name
:type name: string
:param description: plan description
:type description: string
:return: the updated OvercloudPlan object
:rtype: tuskar_ui.api.tuskar.OvercloudPlan
"""
plan = mock_tuskar.Plan.update(plan_id, name, description)
return cls(plan, request=request)
@classmethod
def list(cls, request):
"""Return a list of OvercloudPlans in Tuskar
:param request: request object
:type request: django.http.HttpRequest
:return: list of OvercloudPlans, or an empty list if there are none
:rtype: list of tuskar_ui.api.tuskar.OvercloudPlan
"""
plans = mock_tuskar.Plan.list()
return [cls(plan, request=request) for plan in plans]
@classmethod
@handle_errors(_("Unable to retrieve plan"))
def get(cls, request, plan_id):
"""Return the OvercloudPlan that matches the ID
:param request: request object
:type request: django.http.HttpRequest
:param plan_id: id of OvercloudPlan to be retrieved
:type plan_id: int
:return: matching OvercloudPlan, or None if no OvercloudPlan matches
the ID
:rtype: tuskar_ui.api.tuskar.OvercloudPlan
"""
return cls(mock_tuskar.Plan.get(plan_id))
# TODO(lsmola) before will will support multiple overclouds, we
# can work only with overcloud that is named overcloud. Delete
# this once we have more overclouds. Till then, this is the overcloud
# that rules them all.
# This is how API supports it now, so we have to have it this way.
# Also till Overcloud workflow is done properly, we have to work
# with situations that overcloud is deleted, but stack is still
# there. So overcloud will pretend to exist when stack exist.
@classmethod
def get_the_plan(cls, request):
plan_list = cls.list(request)
for plan in plan_list:
return plan
@classmethod
def delete(cls, request, plan_id):
"""Delete an OvercloudPlan
:param request: request object
:type request: django.http.HttpRequest
:param plan_id: plan id
:type plan_id: int
"""
mock_tuskar.Plan.delete(plan_id)
@cached_property
def role_list(self):
return [OvercloudRole.get(self._request, role['id'])
for role in self.roles]
def parameter(self, param_name):
for parameter in self.parameters:
if parameter['name'] == param_name:
return parameter
def parameter_value(self, param_name):
parameter = self.parameter(param_name)
if parameter is not None:
return parameter['value']
class OvercloudRole(base.APIDictWrapper):
_attrs = ('id', 'name', 'version', 'description', 'created_at',
'parameters')
@classmethod
@handle_errors(_("Unable to retrieve overcloud roles"), [])
def list(cls, request):
"""Return a list of Overcloud Roles in Tuskar
:param request: request object
:type request: django.http.HttpRequest
:return: list of Overcloud Roles, or an empty list if there
are none
:rtype: list of tuskar_ui.api.tuskar.OvercloudRole
"""
roles = TEST_DATA.tuskarclient_roles.list()
return [cls(role) for role in roles]
@classmethod
@handle_errors(_("Unable to retrieve overcloud role"))
def get(cls, request, role_id):
"""Return the Tuskar OvercloudRole that matches the ID
:param request: request object
:type request: django.http.HttpRequest
:param role_id: ID of OvercloudRole to be retrieved
:type role_id: int
:return: matching OvercloudRole, or None if no matching
OvercloudRole can be found
:rtype: tuskar_ui.api.tuskar.OvercloudRole
"""
for role in OvercloudRole.list(request):
if role.id == role_id:
return role
# TODO(tzumainn): fix this once we know how a role corresponds to
# its provider resource type
@property
def provider_resource_type(self):
return self.name
# TODO(tzumainn): fix this once we know how this connection can be
# made
@property
def node_count_parameter_name(self):
return self.name + 'NodeCount'
# TODO(tzumainn): fix this once we know how this connection can be
# made
@property
def image_id_parameter_name(self):
return self.name + 'ImageID'
# TODO(tzumainn): fix this once we know how this connection can be
# made
@property
def flavor_id_parameter_name(self):
return self.name + 'FlavorID'