Files
deb-python-fuelclient/fuelclient/v1/graph.py
Alexander Saprykin fd6e2dc601 Remove APIClient singleton from fuelclient library
Fuelclient connection configuration was hardcoded
and it was impossible to create clients for
multiple fuel servers.

User should be able to use multiple connections.
This patches introduces fuelclient.connect()
function which returns conneciton object that
can be used as a parameter to fuelclient.get_client()
function.

Closes-Bug: #1454347
Change-Id: I81f630a2bd8464e9cbeac0543c3a7125d97c1152
2016-08-11 17:36:41 +02:00

149 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
#
# Copyright 2016 Mirantis, Inc.
#
# 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 fuelclient.cli import error
from fuelclient import objects
from fuelclient.v1 import base_v1
class GraphClient(base_v1.BaseV1Client):
_entity_wrapper = objects.Environment
related_graphs_list_api_path = "{related_model}/{related_model_id}" \
"/deployment_graphs/"
related_graph_api_path = "{related_model}/{related_model_id}" \
"/deployment_graphs/{graph_type}"
cluster_deploy_api_path = "clusters/{env_id}/deploy/"
merged_cluster_tasks_api_path = "clusters/{env_id}/deployment_tasks" \
"/?graph_type={graph_type}"
merged_plugins_tasks_api_path = "clusters/{env_id}/deployment_tasks" \
"/plugins/?graph_type={graph_type}"
cluster_release_tasks_api_path = "clusters/{env_id}/deployment_tasks" \
"/release/?graph_type={graph_type}"
def update_graph_for_model(
self, data, related_model, related_model_id, graph_type=None):
return self.connection.put_request(
self.related_graph_api_path.format(
related_model=related_model,
related_model_id=related_model_id,
graph_type=graph_type or ""),
data
)
def create_graph_for_model(
self, data, related_model, related_model_id, graph_type=None):
return self.connection.post_request(
self.related_graph_api_path.format(
related_model=related_model,
related_model_id=related_model_id,
graph_type=graph_type or ""),
data
)
def get_graph_for_model(
self, related_model, related_model_id, graph_type=None):
return self.connection.get_request(
self.related_graph_api_path.format(
related_model=related_model,
related_model_id=related_model_id,
graph_type=graph_type or ""))
def upload(self, data, related_model, related_id, graph_type):
# create or update
try:
self.get_graph_for_model(
related_model, related_id, graph_type)
self.update_graph_for_model(
{'tasks': data}, related_model, related_id, graph_type)
except error.HTTPError as exc:
if '404' in exc.message:
self.create_graph_for_model(
{'tasks': data}, related_model, related_id, graph_type)
def execute(self, env_id, nodes, graph_type=None, dry_run=False):
put_args = []
if nodes:
put_args.append("nodes={0}".format(",".join(map(str, nodes))))
if graph_type:
put_args.append(("graph_type=" + graph_type))
if dry_run:
put_args.append("dry_run=1")
url = "".join([
self.cluster_deploy_api_path.format(env_id=env_id),
'?',
'&'.join(put_args)])
deploy_data = self.connection.put_request(url, {})
return objects.DeployTask.init_with_data(deploy_data)
def get_merged_cluster_tasks(self, env_id, graph_type=None):
return self.connection.get_request(
self.merged_cluster_tasks_api_path.format(
env_id=env_id,
graph_type=graph_type or ""))
def get_merged_plugins_tasks(self, env_id, graph_type=None):
return self.connection.get_request(
self.merged_plugins_tasks_api_path.format(
env_id=env_id,
graph_type=graph_type or ""))
def get_release_tasks_for_cluster(self, env_id, graph_type=None):
return self.connection.get_request(
self.merged_plugins_tasks_api_path.format(
env_id=env_id,
graph_type=graph_type or ""))
def download(self, env_id, level, graph_type):
tasks_levels = {
'all': lambda: self.get_merged_cluster_tasks(
env_id=env_id, graph_type=graph_type),
'cluster': lambda: self.get_graph_for_model(
related_model='clusters',
related_model_id=env_id,
graph_type=graph_type).get('tasks', []),
'plugins': lambda: self.get_merged_plugins_tasks(
env_id=env_id,
graph_type=graph_type),
'release': lambda: self.get_release_tasks_for_cluster(
env_id=env_id,
graph_type=graph_type)
}
return tasks_levels[level]()
def list(self, env_id):
# todo(ikutukov): extend lists to support all models
return self.connection.get_request(
self.related_graphs_list_api_path.format(
related_model='clusters',
related_model_id=env_id))
def get_client(connection):
return GraphClient(connection)