Source code for senlin_dashboard.api.senlin

# 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.

from django.conf import settings

from horizon.utils import functions as utils
from horizon.utils import memoized

from keystoneauth1.identity import generic
from keystoneauth1 import session as ks_session
from openstack_dashboard.api import base
from senlin_dashboard.api import utils as api_utils
from senlinclient.v1 import client as senlin_client

USER_AGENT = 'python-senlinclient'


[docs] class Cluster(base.APIResourceWrapper): _attrs = ['id', 'name', 'status', 'created_at', 'updated_at', 'profile_name', 'profile_id', 'status_reason', 'max_size', 'min_size', 'desired_capacity', 'timeout', 'metadata']
[docs] class ClusterPolicy(base.APIResourceWrapper): _attrs = ['id', 'policy_name', 'policy_type', 'enabled', 'cluster_id', 'policy_id']
[docs] class Profile(base.APIResourceWrapper): # NOTE(Kenji-i): Generally, openstack.cluster.v1.profile.Profile # class has 'type'. However, it doesn't provide that attribute at # least in Oct 2016. Instead of this, it provides 'type_name' # attribute. _attrs = ['id', 'name', 'type', 'type_name', 'created_at', 'updated_at', 'metadata', 'spec'] # Attribute mapping. All of original codes are using 'type' and # it's correct. Thus, this is to avoid changing these codes. _attrs_map = {'type': 'type_name', 'type_name': 'type'} def __getattr__(self, attr): try: return super(Profile, self).__getattribute__(attr) except Exception: return super(Profile, self).__getattribute__(self._attrs_map[attr])
[docs] class ProfileType(base.APIResourceWrapper): _attrs = ['id', 'name']
[docs] class Policy(base.APIResourceWrapper): _attrs = ['id', 'name', 'type', 'spec', 'level', 'cooldown', 'created_at', 'updated_at']
[docs] class Node(base.APIResourceWrapper): _attrs = ['id', 'name', 'status', 'created_at', 'updated_at', 'profile_name', 'status_reason', 'physical_id', 'role', 'profile_id', 'profile_url', 'cluster_id', 'metadata']
[docs] class Event(base.APIResourceWrapper): _attrs = ['id', 'obj_id', 'obj_name', 'generated_at', 'status', 'status_reason', 'action']
[docs] class Receiver(base.APIResourceWrapper): _attrs = ['id', 'name', 'type', 'cluster_id', 'action', 'created_at', 'updated_at', 'params', 'channel']
[docs] @memoized.memoized def senlinclient(request): auth = generic.Token( auth_url=getattr(settings, 'OPENSTACK_KEYSTONE_URL'), token=request.user.token.id, project_id=request.user.tenant_id ) cacert = getattr(settings, 'OPENSTACK_SSL_CACERT', None) insecure = getattr(settings, 'OPENSTACK_SSL_NO_VERIFY', False) session = ks_session.Session(auth=auth, verify=cacert if cacert else not insecure, user_agent=USER_AGENT) return senlin_client.Client(session=session, region_name=request.user.services_region)
def _populate_request_size_and_page_size(request, paginate=False): limit = getattr(settings, 'API_RESULT_LIMIT', 1000) page_size = utils.get_page_size(request) if paginate: request_size = page_size + 1 else: request_size = limit return page_size, request_size
[docs] def cluster_list(request, sort_dir='desc', sort_key='created_at', marker=None, paginate=False, reversed_order=False, filters=None): """Returns all clusters.""" has_prev_data = False has_more_data = False page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} if reversed_order: sort_dir = 'desc' if sort_dir == 'asc' else 'asc' params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker} params.update(filters) clusters_iter = senlinclient(request).clusters(**params) if paginate: clusters, has_more_data, has_prev_data = api_utils.update_pagination( clusters_iter, request_size, page_size, marker, reversed_order) else: clusters = list(clusters_iter) return [Cluster(c) for c in clusters], has_more_data, has_prev_data
[docs] def cluster_create(request, **params): """Create a cluster.""" cluster = senlinclient(request).create_cluster(**params) return Cluster(cluster)
[docs] def cluster_update(request, cluster_id, **params): """Update a cluster""" cluster = senlinclient(request).get_cluster(cluster_id) updated = senlinclient(request).update_cluster(cluster, **params) return Cluster(updated)
[docs] def cluster_check(request, cluster, params=None): """Check a Cluster's Health Status.""" if not params: params = {} senlinclient(request).check_cluster(cluster, **params)
[docs] def cluster_recover(request, cluster, params=None): """Recover a Cluster to a Healthy Status""" if not params: params = {} senlinclient(request).recover_cluster(cluster, **params)
[docs] def cluster_scale_in(request, cluster, count=None): """Scale in a Cluster""" senlinclient(request).cluster_scale_in(cluster, count)
[docs] def cluster_scale_out(request, cluster, count=None): """Scale out a Cluster""" senlinclient(request).cluster_scale_out(cluster, count)
[docs] def cluster_resize(request, cluster, **params): """Resize a Cluster""" senlinclient(request).cluster_resize(cluster, **params)
[docs] def cluster_delete(request, cluster): """Delete cluster.""" senlinclient(request).delete_cluster(cluster)
[docs] def cluster_get(request, cluster): """Returns cluster.""" cluster = senlinclient(request).get_cluster(cluster) return Cluster(cluster)
[docs] def cluster_attach_policy(request, cluster, policy, params): """Attach policy to a specific cluster""" return senlinclient(request).cluster_attach_policy( cluster, policy, **params)
[docs] def cluster_detach_policy(request, cluster, policy): """Detach policy from cluster.""" senlinclient(request).cluster_detach_policy( cluster, policy)
[docs] def cluster_policy_list(request, cluster, params): """List policies from cluster.""" policies = senlinclient(request).cluster_policies( cluster, **params) return [ClusterPolicy(p) for p in policies]
[docs] def profile_list(request, sort_dir='desc', sort_key='created_at', marker=None, paginate=False, reversed_order=False, filters=None): """Returns all profiles.""" has_prev_data = False has_more_data = False page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker} params.update(filters) profiles_iter = senlinclient(request).profiles(**params) if paginate: profiles, has_more_data, has_prev_data = api_utils.update_pagination( profiles_iter, request_size, page_size, marker, reversed_order) else: profiles = list(profiles_iter) return [Profile(p) for p in profiles], has_more_data, has_prev_data
[docs] def profile_get(request, profile): """Returns a profile.""" profile = senlinclient(request).get_profile(profile) return Profile(profile)
[docs] def profile_create(request, **params): """Create a profile.""" profile = senlinclient(request).create_profile(**params) return Profile(profile)
[docs] def profile_update(request, profile_id, **params): """Update a profile.""" profile = senlinclient(request).get_profile(profile_id) updated_profile = senlinclient(request).update_profile(profile, **params) return Profile(updated_profile)
[docs] def profile_delete(request, profile): """Delete a profile.""" senlinclient(request).delete_profile(profile)
[docs] def policy_list(request, sort_dir='desc', sort_key='created_at', marker=None, paginate=False, reversed_order=False, filters=None): """Returns all policies.""" has_prev_data = False has_more_data = False page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} if reversed_order: sort_dir = 'desc' if sort_dir == 'asc' else 'asc' params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker} params.update(filters) policies_iter = senlinclient(request).policies(**params) if paginate: policies, has_more_data, has_prev_data = api_utils.update_pagination( policies_iter, request_size, page_size, marker, reversed_order) else: policies = list(policies_iter) return [Policy(p) for p in policies], has_more_data, has_prev_data
[docs] def policy_create(request, **params): """Create a policy.""" policy = senlinclient(request).create_policy(**params) return Policy(policy)
[docs] def policy_update(request, policy, **params): """Update a policy.""" policy = senlinclient(request).get_policy(policy) updated = senlinclient(request).update_policy(policy, **params) return Policy(updated)
[docs] def policy_delete(request, policy): """Delete a policy.""" senlinclient(request).delete_policy(policy)
[docs] def policy_get(request, policy): """Returns a policy.""" policy = senlinclient(request).get_policy(policy) return Policy(policy)
[docs] def node_list(request, sort_dir='desc', sort_key='name', marker=None, paginate=False, reversed_order=False, cluster_id=None, filters=None): """Returns all nodes.""" has_prev_data = False has_more_data = False # NOTE(Liuqing): workaround for bug: 1594352 # https://bugs.launchpad.net/senlin/+bug/1594352 # Sometimes we failed to create node and the `created_at` attribution # node object will be None. The api node_list will failed if we # use `created_at` as the `sort_key`. page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} if reversed_order: sort_dir = 'desc' if sort_dir == 'asc' else 'asc' params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker, 'cluster_id': cluster_id} params.update(filters) nodes_iter = senlinclient(request).nodes(**params) if paginate: nodes, has_more_data, has_prev_data = api_utils.update_pagination( nodes_iter, request_size, page_size, marker, reversed_order) else: nodes = list(nodes_iter) return [Node(n) for n in nodes], has_more_data, has_prev_data
[docs] def node_create(request, **params): """Create a node.""" node = senlinclient(request).create_node(**params) return Node(node)
[docs] def node_check(request, node, params=None): """Check a node's health status.""" if not params: params = {} senlinclient(request).check_node(node, **params)
[docs] def node_recover(request, node, params=None): """Recover a Node to Healthy Status""" if not params: params = {} senlinclient(request).recover_node(node, **params)
[docs] def node_delete(request, node): """Delete a node.""" senlinclient(request).delete_node(node)
[docs] def node_get(request, node): """Returns a node.""" node = senlinclient(request).get_node(node) return Node(node)
[docs] def node_update(request, node_id, **params): """Update a node""" node = senlinclient(request).get_node(node_id) updated = senlinclient(request).update_node(node, **params) return Node(updated)
[docs] def event_list(request, sort_dir='desc', sort_key='timestamp', marker=None, paginate=False, reversed_order=False, filters=None): """Returns all events.""" has_prev_data = False has_more_data = False page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} if reversed_order: sort_dir = 'desc' if sort_dir == 'asc' else 'asc' params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker} params.update(filters) events_iter = senlinclient(request).events(**params) if paginate: events, has_more_data, has_prev_data = api_utils.update_pagination( events_iter, request_size, page_size, marker, reversed_order) else: events = list(events_iter) return [Event(e) for e in events], has_more_data, has_prev_data
[docs] def receiver_list(request, sort_dir='desc', sort_key='created_at', marker=None, paginate=False, reversed_order=False, filters=None): """Returns all receivers.""" has_prev_data = False has_more_data = False page_size, request_size = _populate_request_size_and_page_size( request, paginate) if not filters: filters = {} if reversed_order: sort_dir = 'desc' if sort_dir == 'asc' else 'asc' params = { 'sort': '%s:%s' % (sort_key, sort_dir), 'limit': request_size, 'marker': marker} params.update(filters) receivers_iter = senlinclient(request).receivers(**params) if paginate: receivers, has_more_data, has_prev_data = api_utils.update_pagination( receivers_iter, request_size, page_size, marker, reversed_order) else: receivers = list(receivers_iter) return [Receiver(r) for r in receivers], has_more_data, has_prev_data
[docs] def receiver_create(request, **params): """Create a receiver""" receiver = senlinclient(request).create_receiver(**params) return Receiver(receiver)
[docs] def receiver_delete(request, receiver): """Delete a receiver.""" senlinclient(request).delete_receiver(receiver)
[docs] def receiver_update(request, receiver_id, **params): """Update a receiver""" receiver = senlinclient(request).get_receiver(receiver_id) updated = senlinclient(request).update_receiver(receiver, **params) return Receiver(updated)
[docs] def receiver_get(request, receiver): """Returns a receiver.""" receiver = senlinclient(request).get_receiver(receiver) return Receiver(receiver)