Skip to content

Commit

Permalink
Refactor remote* plugins
Browse files Browse the repository at this point in the history
This patchset simplifies remove_* plugins a lot

Change-Id: Idb95724c3959516c03a2b64c1306ced0d22b9aac
  • Loading branch information
9seconds committed May 3, 2017
1 parent 52fa5af commit 42d807b
Show file tree
Hide file tree
Showing 9 changed files with 101 additions and 332 deletions.
55 changes: 55 additions & 0 deletions backend/common/decapod_common/playbook_plugin.py
Original file line number Diff line number Diff line change
Expand Up @@ -558,6 +558,61 @@ def make_inventory(self, cluster, data, servers, hints):
return inventory


class CephAnsiblePlaybookRemove(CephAnsiblePlaybook):

PUBLIC = True
REQUIRED_SERVER_LIST = True
SERVER_LIST_POLICY = ServerListPolicy.in_this_cluster

def on_post_execute(self, groupname, task, exc_value, exc_type, exc_tb):
super().on_post_execute(task, exc_value, exc_type, exc_tb)

if exc_value:
LOG.warning("Cannot remove %s host: %s (%s)",
self.entry_point, exc_value, exc_type)
raise exc_value

playbook_config = self.get_playbook_configuration(task)
config = playbook_config.configuration["inventory"]
cluster = playbook_config.cluster
servers = playbook_config.servers
servers = {srv.ip: srv for srv in servers}

group_vars = config.pop(groupname)
group_servers = [servers[ip] for ip in group_vars]
cluster.remove_servers(group_servers, groupname)

if cluster.configuration.changed:
cluster.save()

def make_playbook_configuration(self, cluster, servers, hints):
data = cluster_data.ClusterData.find_one(cluster.model_id)
global_vars = self.make_global_vars(cluster, data, servers, hints)
inventory = self.make_inventory(cluster, data, servers, hints)

return global_vars, inventory

def make_global_vars(self, cluster, data, servers, hints):
return {
"cluster": data.global_vars.get("cluster", cluster.name)
}

def make_inventory(self, cluster, data, servers, hints):
groups = self.get_inventory_groups(cluster, servers, hints)
inventory = {"_meta": {"hostvars": {}}}

for name, group_servers in groups.items():
for srv in group_servers:
inventory.setdefault(name, []).append(srv.ip)
hostvars = inventory["_meta"]["hostvars"].setdefault(
srv.ip, {})

hostvars.update(data.get_host_vars(srv.ip))
hostvars.setdefault("ansible_user", srv.username)

return inventory


@functools.lru_cache()
def load_config(filename):
return config.yaml_load(filename)
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@
from decapod_common import log
from decapod_common import playbook_plugin
from decapod_common import playbook_plugin_hints
from decapod_common.models import cluster_data


DESCRIPTION = "Remove CLI/RBD client from the host"
Expand Down Expand Up @@ -58,13 +57,10 @@
"""Do not execute if server has such role."""


class RemoveClient(playbook_plugin.Playbook):
class RemoveClient(playbook_plugin.CephAnsiblePlaybookRemove):

NAME = DESCRIPTION
DESCRIPTION = DESCRIPTION
PUBLIC = True
REQUIRED_SERVER_LIST = True
SERVER_LIST_POLICY = playbook_plugin.ServerListPolicy.in_this_cluster
HINTS = playbook_plugin_hints.Hints(HINTS_SCHEMA)

def get_dynamic_inventory(self):
Expand All @@ -83,50 +79,14 @@ def get_dynamic_inventory(self):
return inventory

def on_post_execute(self, task, exc_value, exc_type, exc_tb):
super().on_post_execute(task, exc_value, exc_type, exc_tb)

if exc_value:
LOG.warning("Cannot remove client from host: %s (%s)",
exc_value, exc_type)
raise exc_value

playbook_config = self.get_playbook_configuration(task)
config = playbook_config.configuration["inventory"]
cluster = playbook_config.cluster
servers = playbook_config.servers
servers = {srv.ip: srv for srv in servers}

group_vars = config.pop("clients")
group_servers = [servers[ip] for ip in group_vars]
cluster.remove_servers(group_servers, "clients")

if cluster.configuration.changed:
cluster.save()

def make_playbook_configuration(self, cluster, servers, hints):
data = cluster_data.ClusterData.find_one(cluster.model_id)
global_vars = self.make_global_vars(cluster, data, servers, hints)
inventory = self.make_inventory(cluster, data, servers, hints)

return global_vars, inventory
super().on_post_execute("clients", task, exc_value, exc_type, exc_tb)

def make_global_vars(self, cluster, data, servers, hints):
return {
"cluster": data.global_vars.get("cluster", cluster.name),
"uninstall_packages": bool(hints["uninstall_packages"]),
"apt_purge": bool(hints["apt_purge"])
}

def make_inventory(self, cluster, data, servers, hints):
groups = {"clients": servers}
inventory = {"_meta": {"hostvars": {}}}
base = super().make_global_vars(cluster, data, servers, hints)
base["uninstall_packages"] = bool(hints["uninstall_packages"])
base["apt_purge"] = bool(hints["apt_purge"])

for name, group_servers in groups.items():
for srv in group_servers:
inventory.setdefault(name, []).append(srv.ip)
return base

hostvars = inventory["_meta"]["hostvars"].setdefault(
srv.ip, {})
hostvars["ansible_user"] = srv.username

return inventory
def get_inventory_groups(self, cluster, servers, hints):
return {"clients": servers}
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,6 @@

from decapod_common import log
from decapod_common import playbook_plugin
from decapod_common.models import cluster_data
from decapod_common.models import server


Expand All @@ -29,19 +28,17 @@
"""Logger."""


class RemoveMds(playbook_plugin.CephAnsiblePlaybook):
class RemoveMds(playbook_plugin.CephAnsiblePlaybookRemove):

NAME = "Remove metadata server from host"
DESCRIPTION = DESCRIPTION
PUBLIC = True
REQUIRED_SERVER_LIST = True
SERVER_LIST_POLICY = playbook_plugin.ServerListPolicy.in_this_cluster

def on_post_execute(self, task, exc_value, exc_type, exc_tb):
super().on_post_execute(task, exc_value, exc_type, exc_tb)
playbook_plugin.CephAnsiblePlaybook.on_post_execute(
self, task, exc_value, exc_type, exc_tb)

if exc_value:
LOG.warning("Cannot remove REST API host: %s (%s)",
LOG.warning("Cannot remove MDS host: %s (%s)",
exc_value, exc_type)
raise exc_value

Expand All @@ -58,34 +55,13 @@ def on_post_execute(self, task, exc_value, exc_type, exc_tb):
if cluster.configuration.changed:
cluster.save()

def make_playbook_configuration(self, cluster, servers, hints):
data = cluster_data.ClusterData.find_one(cluster.model_id)
global_vars = self.make_global_vars(cluster, data, servers, hints)
inventory = self.make_inventory(cluster, data, servers, hints)

return global_vars, inventory

def make_global_vars(self, cluster, data, servers, hints):
result = super().make_global_vars(cluster, servers, hints)
result = playbook_plugin.CephAnsiblePlaybook.make_global_vars(
self, cluster, servers, hints)
result.update(data.global_vars)

return result

def make_inventory(self, cluster, data, servers, hints):
groups = self.get_inventory_groups(cluster, servers, hints)
inventory = {"_meta": {"hostvars": {}}}

for name, group_servers in groups.items():
for srv in group_servers:
inventory.setdefault(name, []).append(srv.ip)

hostvars = inventory["_meta"]["hostvars"].setdefault(
srv.ip, {})
hostvars.update(data.get_host_vars(srv.ip))
hostvars["ansible_user"] = srv.username

return inventory

def get_inventory_groups(self, cluster, servers, hints):
cluster_servers = server.ServerModel.cluster_servers(cluster.model_id)
cluster_servers = {item._id: item for item in cluster_servers}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@

from decapod_common import log
from decapod_common import playbook_plugin
from decapod_common.models import cluster_data

from . import exceptions

Expand All @@ -29,34 +30,13 @@
"""Logger."""


class RemoveMon(playbook_plugin.CephAnsiblePlaybook):
class RemoveMon(playbook_plugin.CephAnsiblePlaybookRemove):

NAME = "Remove monitor host from Ceph cluster"
DESCRIPTION = DESCRIPTION
PUBLIC = True
REQUIRED_SERVER_LIST = True
SERVER_LIST_POLICY = playbook_plugin.ServerListPolicy.in_this_cluster

def on_post_execute(self, task, exc_value, exc_type, exc_tb):
super().on_pre_execute(task)

if exc_value:
LOG.warning("Cannot remove monitor host: %s (%s)",
exc_value, exc_type)
raise exc_value

playbook_config = self.get_playbook_configuration(task)
config = playbook_config.configuration["inventory"]
cluster = playbook_config.cluster
servers = playbook_config.servers
servers = {srv.ip: srv for srv in servers}

group_vars = config.pop("mons")
group_servers = [servers[ip] for ip in group_vars]
cluster.remove_servers(group_servers, "mons")

if cluster.configuration.changed:
cluster.save()
super().on_post_execute("mons", task, exc_value, exc_type, exc_tb)

def make_playbook_configuration(self, cluster, servers, hints):
cluster_config = cluster.configuration.make_api_structure()
Expand All @@ -74,24 +54,11 @@ def make_playbook_configuration(self, cluster, servers, hints):
if mon_ids == to_remove_ids:
raise exceptions.CannotRemoveAllMonitors(cluster.model_id)

global_vars = self.make_global_vars(cluster, servers, hints)
inventory = self.make_inventory(cluster, servers, hints)
data = cluster_data.ClusterData.find_one(cluster.model_id)
global_vars = self.make_global_vars(cluster, data, servers, hints)
inventory = self.make_inventory(cluster, data, servers, hints)

return global_vars, inventory

def make_global_vars(self, cluster, servers, hints):
return {"cluster": cluster.name}

def make_inventory(self, cluster, servers, hints):
groups = {"mons": servers}
inventory = {"_meta": {"hostvars": {}}}

for name, group_servers in groups.items():
for srv in group_servers:
inventory.setdefault(name, []).append(srv.ip)

hostvars = inventory["_meta"]["hostvars"].setdefault(
srv.ip, {})
hostvars["ansible_user"] = srv.username

return inventory
def get_inventory_groups(self, cluster, servers, hints):
return {"mons": servers}
Original file line number Diff line number Diff line change
Expand Up @@ -44,17 +44,15 @@
"""Logger."""


class RemoveNfs(playbook_plugin.CephAnsiblePlaybook):
class RemoveNfs(playbook_plugin.CephAnsiblePlaybookRemove):

NAME = "Remove NFS Gateway host"
DESCRIPTION = DESCRIPTION
PUBLIC = True
REQUIRED_SERVER_LIST = True
SERVER_LIST_POLICY = playbook_plugin.ServerListPolicy.in_this_cluster
HINTS = playbook_plugin_hints.Hints(HINTS_SCHEMA)

def on_post_execute(self, task, exc_value, exc_type, exc_tb):
super().on_post_execute(task, exc_value, exc_type, exc_tb)
playbook_plugin.CephAnsiblePlaybook.on_post_execute(
task, exc_value, exc_type, exc_tb)

if exc_value:
LOG.warning("Cannot remove NFS gateway host: %s (%s)",
Expand All @@ -79,34 +77,16 @@ def on_post_execute(self, task, exc_value, exc_type, exc_tb):
if cluster.configuration.changed:
cluster.save()

def make_playbook_configuration(self, cluster, servers, hints):
global_vars = self.make_global_vars(cluster, servers, hints)
inventory = self.make_inventory(cluster, servers, hints)
def make_global_vars(self, cluster, data, servers, hints):
base = super().make_global_vars(cluster, data, servers, hints)
base["ceph_nfs_rgw_user"] = data.global_vars["ceph_nfs_rgw_user"]
base["remove_nfs_rgw_user"] = bool(hints["remove_nfs_rgw_user"])

return global_vars, inventory
return base

def make_global_vars(self, cluster, servers, hints):
result = super().make_global_vars(cluster, servers, hints)

return {
"cluster": result["cluster"],
"ceph_nfs_rgw_user": result["ceph_nfs_rgw_user"],
"remove_nfs_rgw_user": bool(hints["remove_nfs_rgw_user"])
}

def make_inventory(self, cluster, servers, hints):
def get_inventory_groups(self, cluster, data, servers, hints):
groups = {"nfss": servers}
if hints["remove_rgw"]:
groups["rgws"] = servers

inventory = {"_meta": {"hostvars": {}}}

for name, group_servers in groups.items():
for srv in group_servers:
inventory.setdefault(name, []).append(srv.ip)

hostvars = inventory["_meta"]["hostvars"].setdefault(
srv.ip, {})
hostvars["ansible_user"] = srv.username

return inventory
return groups

0 comments on commit 42d807b

Please sign in to comment.