From 1c0b172a2c0f6fc3aa364376744cc2518014bd72 Mon Sep 17 00:00:00 2001 From: Jeff Layton Date: Wed, 31 Oct 2018 13:42:56 -0400 Subject: [PATCH] orchestrator/rook: rework describe_service() to accomodate "service ls" Rework the describe_service operation for rook to allow listing of services, with optional filters for service type, id and nodename. Signed-off-by: Jeff Layton --- src/pybind/mgr/rook/module.py | 22 ++++++++-------- src/pybind/mgr/rook/rook_cluster.py | 41 +++++++++++++++++------------ 2 files changed, 35 insertions(+), 28 deletions(-) diff --git a/src/pybind/mgr/rook/module.py b/src/pybind/mgr/rook/module.py index 16e94961137..afdaa505012 100644 --- a/src/pybind/mgr/rook/module.py +++ b/src/pybind/mgr/rook/module.py @@ -332,30 +332,30 @@ class RookOrchestrator(MgrModule, orchestrator.Orchestrator): return result @deferred_read - def describe_service(self, service_type, service_id): + def describe_service(self, service_type, service_id, nodename): - assert service_type in ("mds", "osd", "mgr", "mon", "rgw"), service_type + " unsupported" + assert service_type in ("mds", "osd", "mgr", "mon", None), service_type + " unsupported" - pods = self.rook_cluster.describe_pods(service_type, service_id) + pods = self.rook_cluster.describe_pods(service_type, service_id, nodename) result = orchestrator.ServiceDescription() for p in pods: sl = orchestrator.ServiceLocation() sl.nodename = p['nodename'] sl.container_id = p['name'] + sl.service_type = p['labels']['app'].replace('rook-ceph-', '') - if service_type == "osd": + if sl.service_type == "osd": sl.daemon_name = "%s" % p['labels']["ceph-osd-id"] - elif service_type == "mds": + elif sl.service_type == "mds": sl.daemon_name = p['labels']["rook_file_system"] - elif service_type == "mon": + elif sl.service_type == "mon": sl.daemon_name = p['labels']["mon"] - elif service_type == "mgr": + elif sl.service_type == "mgr": sl.daemon_name = p['labels']["mgr"] - elif service_type == "rgw": - # FIXME: put a label on the pod to consume - # from here - raise NotImplementedError("rgw") + else: + # Unknown type -- skip it + continue result.locations.append(sl) diff --git a/src/pybind/mgr/rook/rook_cluster.py b/src/pybind/mgr/rook/rook_cluster.py index ff2b90ceb18..ccd2bcb6bb8 100644 --- a/src/pybind/mgr/rook/rook_cluster.py +++ b/src/pybind/mgr/rook/rook_cluster.py @@ -125,7 +125,7 @@ class RookCluster(object): return nodename_to_devices - def describe_pods(self, service_type, service_id): + def describe_pods(self, service_type, service_id, nodename): # Go query the k8s API about deployment, containers related to this # filesystem @@ -143,25 +143,32 @@ class RookCluster(object): # Label filter is rook_cluster= # rook_file_system= - label_filter = "rook_cluster={0},app=rook-ceph-{1}".format( - self.cluster_name, service_type) - if service_type == "mds": - label_filter += ",rook_file_system={0}".format(service_id) - elif service_type == "osd": - # Label added in https://github.com/rook/rook/pull/1698 - label_filter += ",ceph-osd-id={0}".format(service_id) - elif service_type == "mon": - # label like mon=rook-ceph-mon0 - label_filter += ",mon={0}".format(service_id) - elif service_type == "mgr": - label_filter += ",mgr={0}".format(service_id) - elif service_type == "rgw": - # TODO: rgw - pass + label_filter = "rook_cluster={0}".format(self.cluster_name) + if service_type != None: + label_filter += ",app=rook-ceph-{0}".format(service_type) + if service_id != None: + if service_type == "mds": + label_filter += ",rook_file_system={0}".format(service_id) + elif service_type == "osd": + # Label added in https://github.com/rook/rook/pull/1698 + label_filter += ",ceph-osd-id={0}".format(service_id) + elif service_type == "mon": + # label like mon=rook-ceph-mon0 + label_filter += ",mon={0}".format(service_id) + elif service_type == "mgr": + label_filter += ",mgr={0}".format(service_id) + elif service_type == "rgw": + # TODO: rgw + pass + + field_filter = "" + if nodename != None: + field_filter = "spec.nodeName={0}".format(nodename); pods = self.k8s.list_namespaced_pod( self.rook_namespace, - label_selector=label_filter) + label_selector=label_filter, + field_selector=field_filter) # import json # print json.dumps(pods.items[0]) -- 2.39.5