Added two commands to dump snapshot config and provide it for snapshot task Will download default config and dump it to stdout fuel snapshot --conf > conf.yaml Next command will accept config as input and bypass it to snapshot generation request fuel snapshot < conf.yaml This is required to overwrite certain parameters if needed, some of those are: - target directory of snapshot generation - timeout of snapshot generation procedure - exclusion/inclusion of certain directories Depends on I5e01a7459cefe49a128192d82dd827f02866f909 Related-Bug: 1382511 Related-Bug: 1420054 DocImpact Change-Id: I1ddab26fba1346dad30955289e7d28f4d3aa1562
105 lines
2.9 KiB
Python
105 lines
2.9 KiB
Python
# Copyright 2014 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 operator import methodcaller
|
|
from time import sleep
|
|
|
|
from fuelclient.cli.error import DeployProgressError
|
|
from fuelclient.objects.base import BaseObject
|
|
|
|
|
|
class Task(BaseObject):
|
|
|
|
class_api_path = "tasks/"
|
|
instance_api_path = "tasks/{0}/"
|
|
|
|
def delete(self, force=False):
|
|
return self.connection.delete_request(
|
|
"tasks/{0}/?force={1}".format(
|
|
self.id,
|
|
int(force),
|
|
))
|
|
|
|
@property
|
|
def progress(self):
|
|
return self.get_fresh_data()["progress"]
|
|
|
|
@property
|
|
def status(self):
|
|
return self.get_fresh_data()["status"]
|
|
|
|
@property
|
|
def is_finished(self):
|
|
return self.status in ("ready", "error")
|
|
|
|
def wait(self):
|
|
while not self.is_finished:
|
|
sleep(0.5)
|
|
|
|
|
|
class DeployTask(Task):
|
|
|
|
def __init__(self, obj_id, env_id):
|
|
from fuelclient.objects.environment import Environment
|
|
super(DeployTask, self).__init__(obj_id)
|
|
self.env = Environment(env_id)
|
|
self.nodes = self.env.get_all_nodes()
|
|
|
|
@classmethod
|
|
def init_with_data(cls, data):
|
|
return cls(data["id"], data["cluster"])
|
|
|
|
@property
|
|
def not_finished_nodes(self):
|
|
return filter(
|
|
lambda n: not n.is_finished(latest=False),
|
|
self.nodes
|
|
)
|
|
|
|
@property
|
|
def is_finished(self):
|
|
return super(DeployTask, self).is_finished and all(
|
|
map(
|
|
methodcaller("is_finished"),
|
|
self.not_finished_nodes
|
|
)
|
|
)
|
|
|
|
def __iter__(self):
|
|
return self
|
|
|
|
def next(self):
|
|
if not self.is_finished:
|
|
sleep(1)
|
|
deploy_task_data = self.get_fresh_data()
|
|
if deploy_task_data["status"] == "error":
|
|
raise DeployProgressError(deploy_task_data["message"])
|
|
for node in self.not_finished_nodes:
|
|
node.update()
|
|
return self.progress, self.nodes
|
|
else:
|
|
raise StopIteration
|
|
|
|
|
|
class SnapshotTask(Task):
|
|
|
|
@classmethod
|
|
def start_snapshot_task(cls, conf):
|
|
dump_task = cls.connection.put_request("logs/package", conf)
|
|
return cls(dump_task["id"])
|
|
|
|
@classmethod
|
|
def get_default_config(cls):
|
|
return cls.connection.get_request("logs/package/config/default/")
|