Blame SOURCES/sos-bz1616030-etcd-kube-osp-3-10.patch

b72d26
From 6372a7f7f09511d864aa6bd894109d937f4fda65 Mon Sep 17 00:00:00 2001
b72d26
From: Jake Hunsaker <jhunsake@redhat.com>
b72d26
Date: Thu, 12 Jul 2018 12:36:25 -0400
b72d26
Subject: [PATCH 1/3] [kubernetes|etcd] Support OpenShift 3.10 deployments
b72d26
b72d26
The 3.10 version of OCP changes the deployment configurations for etcd
b72d26
and kubernetes components, and additionally changes the way the etcdctl
b72d26
command is called when running in a static pod. Update these plugins to
b72d26
support this new deployment style.
b72d26
b72d26
Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
b72d26
---
b72d26
 sos/plugins/etcd.py       |  11 ++-
b72d26
 sos/plugins/kubernetes.py | 148 +++++++++++++++++++-------------------
b72d26
 2 files changed, 83 insertions(+), 76 deletions(-)
b72d26
b72d26
diff --git a/sos/plugins/etcd.py b/sos/plugins/etcd.py
b72d26
index c343f750..c8ee3849 100644
b72d26
--- a/sos/plugins/etcd.py
b72d26
+++ b/sos/plugins/etcd.py
b72d26
@@ -10,6 +10,7 @@
b72d26
 # See the LICENSE file in the source distribution for further information.
b72d26
 
b72d26
 from sos.plugins import Plugin, RedHatPlugin
b72d26
+from os import path
b72d26
 
b72d26
 
b72d26
 class etcd(Plugin, RedHatPlugin):
b72d26
@@ -19,10 +20,14 @@ class etcd(Plugin, RedHatPlugin):
b72d26
     plugin_name = 'etcd'
b72d26
     packages = ('etcd',)
b72d26
     profiles = ('container', 'system', 'services', 'cluster')
b72d26
-
b72d26
-    cmd = 'etcdctl'
b72d26
+    files = ('/etc/origin/node/pods/etcd.yaml',)
b72d26
 
b72d26
     def setup(self):
b72d26
+        if path.exists('/etc/origin/node/pods/etcd.yaml'):
b72d26
+            etcd_cmd = 'master-exec etcd etcd etcdctl'
b72d26
+        else:
b72d26
+            etcd_cmd = 'etcdctl'
b72d26
+
b72d26
         etcd_url = self.get_etcd_url()
b72d26
 
b72d26
         self.add_forbidden_path('/etc/etcd/ca')
b72d26
@@ -35,7 +40,7 @@ class etcd(Plugin, RedHatPlugin):
b72d26
            'ls --recursive',
b72d26
         ]
b72d26
 
b72d26
-        self.add_cmd_output(['%s %s' % (self.cmd, sub) for sub in subcmds])
b72d26
+        self.add_cmd_output(['%s %s' % (etcd_cmd, sub) for sub in subcmds])
b72d26
 
b72d26
         urls = [
b72d26
             '/v2/stats/leader',
b72d26
diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
b72d26
index e75c7a37..21cb51df 100644
b72d26
--- a/sos/plugins/kubernetes.py
b72d26
+++ b/sos/plugins/kubernetes.py
b72d26
@@ -18,11 +18,16 @@ class kubernetes(Plugin, RedHatPlugin):
b72d26
     """Kubernetes plugin
b72d26
     """
b72d26
 
b72d26
-    # Red Hat Atomic Platform and OpenShift Enterprise use the
b72d26
-    # atomic-openshift-master package to provide kubernetes
b72d26
+    # OpenShift Container Platform uses the atomic-openshift-master package
b72d26
+    # to provide kubernetes
b72d26
     packages = ('kubernetes', 'kubernetes-master', 'atomic-openshift-master')
b72d26
     profiles = ('container',)
b72d26
-    files = ("/etc/origin/master/master-config.yaml",)
b72d26
+    # use files only for masters, rely on package list for nodes
b72d26
+    files = (
b72d26
+        "/var/run/kubernetes/apiserver.key",
b72d26
+        "/etc/origin/master/",
b72d26
+        "/etc/origin/node/pods/master-config.yaml"
b72d26
+    )
b72d26
 
b72d26
     option_list = [
b72d26
         ("all", "also collect all namespaces output separately",
b72d26
@@ -33,12 +38,7 @@ class kubernetes(Plugin, RedHatPlugin):
b72d26
     ]
b72d26
 
b72d26
     def check_is_master(self):
b72d26
-        if any([
b72d26
-            path.exists("/var/run/kubernetes/apiserver.key"),
b72d26
-            path.exists("/etc/origin/master/master-config.yaml")
b72d26
-        ]):
b72d26
-            return True
b72d26
-        return False
b72d26
+        return any([path.exists(f) for f in self.files])
b72d26
 
b72d26
     def setup(self):
b72d26
         self.add_copy_spec("/etc/kubernetes")
b72d26
@@ -56,74 +56,76 @@ class kubernetes(Plugin, RedHatPlugin):
b72d26
             self.add_journal(units=svc)
b72d26
 
b72d26
         # We can only grab kubectl output from the master
b72d26
-        if self.check_is_master():
b72d26
-            kube_cmd = "kubectl "
b72d26
-            if path.exists('/etc/origin/master/admin.kubeconfig'):
b72d26
-                kube_cmd += "--config=/etc/origin/master/admin.kubeconfig"
b72d26
-
b72d26
-            kube_get_cmd = "get -o json "
b72d26
-            for subcmd in ['version', 'config view']:
b72d26
-                self.add_cmd_output('%s %s' % (kube_cmd, subcmd))
b72d26
-
b72d26
-            # get all namespaces in use
b72d26
-            kn = self.get_command_output('%s get namespaces' % kube_cmd)
b72d26
-            knsps = [n.split()[0] for n in kn['output'].splitlines()[1:] if n]
b72d26
-
b72d26
-            resources = [
b72d26
-                'limitrange',
b72d26
-                'pods',
b72d26
-                'pvc',
b72d26
-                'rc',
b72d26
-                'resourcequota',
b72d26
-                'services'
b72d26
-            ]
b72d26
-
b72d26
-            # nodes and pvs are not namespaced, must pull separately.
b72d26
-            # Also collect master metrics
b72d26
-            self.add_cmd_output([
b72d26
-                "{} get -o json nodes".format(kube_cmd),
b72d26
-                "{} get -o json pv".format(kube_cmd),
b72d26
-                "{} get --raw /metrics".format(kube_cmd)
b72d26
-            ])
b72d26
-
b72d26
-            for n in knsps:
b72d26
-                knsp = '--namespace=%s' % n
b72d26
-                if self.get_option('all'):
b72d26
-                    k_cmd = '%s %s %s' % (kube_cmd, kube_get_cmd, knsp)
b72d26
-
b72d26
-                    self.add_cmd_output('%s events' % k_cmd)
b72d26
+        if not self.check_is_master():
b72d26
+            return
b72d26
+
b72d26
+        kube_cmd = "kubectl "
b72d26
+        if path.exists('/etc/origin/master/admin.kubeconfig'):
b72d26
+            kube_cmd += "--config=/etc/origin/master/admin.kubeconfig"
b72d26
+
b72d26
+        kube_get_cmd = "get -o json "
b72d26
+        for subcmd in ['version', 'config view']:
b72d26
+            self.add_cmd_output('%s %s' % (kube_cmd, subcmd))
b72d26
+
b72d26
+        # get all namespaces in use
b72d26
+        kn = self.get_command_output('%s get namespaces' % kube_cmd)
b72d26
+        knsps = [n.split()[0] for n in kn['output'].splitlines()[1:] if n]
b72d26
+
b72d26
+        resources = [
b72d26
+            'limitrange',
b72d26
+            'pods',
b72d26
+            'pvc',
b72d26
+            'rc',
b72d26
+            'resourcequota',
b72d26
+            'services'
b72d26
+        ]
b72d26
+
b72d26
+        # nodes and pvs are not namespaced, must pull separately.
b72d26
+        # Also collect master metrics
b72d26
+        self.add_cmd_output([
b72d26
+            "{} get -o json nodes".format(kube_cmd),
b72d26
+            "{} get -o json pv".format(kube_cmd),
b72d26
+            "{} get --raw /metrics".format(kube_cmd)
b72d26
+        ])
b72d26
+
b72d26
+        for n in knsps:
b72d26
+            knsp = '--namespace=%s' % n
b72d26
+            if self.get_option('all'):
b72d26
+                k_cmd = '%s %s %s' % (kube_cmd, kube_get_cmd, knsp)
b72d26
+
b72d26
+                self.add_cmd_output('%s events' % k_cmd)
b72d26
 
b72d26
-                    for res in resources:
b72d26
-                        self.add_cmd_output('%s %s' % (k_cmd, res))
b72d26
-
b72d26
-                    if self.get_option('describe'):
b72d26
-                        # need to drop json formatting for this
b72d26
-                        k_cmd = '%s get %s' % (kube_cmd, knsp)
b72d26
-                        for res in resources:
b72d26
-                            r = self.get_command_output(
b72d26
-                                '%s %s' % (k_cmd, res))
b72d26
-                            if r['status'] == 0:
b72d26
-                                k_list = [k.split()[0] for k in
b72d26
-                                          r['output'].splitlines()[1:]]
b72d26
-                                for k in k_list:
b72d26
-                                    k_cmd = '%s %s' % (kube_cmd, knsp)
b72d26
-                                    self.add_cmd_output(
b72d26
-                                        '%s describe %s %s' % (k_cmd, res, k))
b72d26
-
b72d26
-                if self.get_option('podlogs'):
b72d26
-                    k_cmd = '%s %s' % (kube_cmd, knsp)
b72d26
-                    r = self.get_command_output('%s get pods' % k_cmd)
b72d26
-                    if r['status'] == 0:
b72d26
-                        pods = [p.split()[0] for p in
b72d26
-                                r['output'].splitlines()[1:]]
b72d26
-                        for pod in pods:
b72d26
-                            self.add_cmd_output('%s logs %s' % (k_cmd, pod))
b72d26
-
b72d26
-            if not self.get_option('all'):
b72d26
-                k_cmd = '%s get --all-namespaces=true' % kube_cmd
b72d26
                 for res in resources:
b72d26
                     self.add_cmd_output('%s %s' % (k_cmd, res))
b72d26
 
b72d26
+                if self.get_option('describe'):
b72d26
+                    # need to drop json formatting for this
b72d26
+                    k_cmd = '%s get %s' % (kube_cmd, knsp)
b72d26
+                    for res in resources:
b72d26
+                        r = self.get_command_output(
b72d26
+                            '%s %s' % (k_cmd, res))
b72d26
+                        if r['status'] == 0:
b72d26
+                            k_list = [k.split()[0] for k in
b72d26
+                                      r['output'].splitlines()[1:]]
b72d26
+                            for k in k_list:
b72d26
+                                k_cmd = '%s %s' % (kube_cmd, knsp)
b72d26
+                                self.add_cmd_output(
b72d26
+                                    '%s describe %s %s' % (k_cmd, res, k))
b72d26
+
b72d26
+            if self.get_option('podlogs'):
b72d26
+                k_cmd = '%s %s' % (kube_cmd, knsp)
b72d26
+                r = self.get_command_output('%s get pods' % k_cmd)
b72d26
+                if r['status'] == 0:
b72d26
+                    pods = [p.split()[0] for p in
b72d26
+                            r['output'].splitlines()[1:]]
b72d26
+                    for pod in pods:
b72d26
+                        self.add_cmd_output('%s logs %s' % (k_cmd, pod))
b72d26
+
b72d26
+        if not self.get_option('all'):
b72d26
+            k_cmd = '%s get --all-namespaces=true' % kube_cmd
b72d26
+            for res in resources:
b72d26
+                self.add_cmd_output('%s %s' % (k_cmd, res))
b72d26
+
b72d26
     def postproc(self):
b72d26
         # First, clear sensitive data from the json output collected.
b72d26
         # This will mask values when the "name" looks susceptible of
b72d26
-- 
b72d26
2.17.1
b72d26
b72d26
b72d26
From 63ad6c251ab88ab2f0e07ae9e3f1b2771d5e90ca Mon Sep 17 00:00:00 2001
b72d26
From: Jake Hunsaker <jhunsake@redhat.com>
b72d26
Date: Thu, 12 Jul 2018 13:07:34 -0400
b72d26
Subject: [PATCH 2/3] [kubernetes] Correct config option syntax
b72d26
b72d26
Versions of kubernetes after 1.5 use --kubeconfig instead of --config to
b72d26
specify a configuration file to use for kubectl commands. Update the
b72d26
kubernetes plugin to use the proper syntax.
b72d26
b72d26
Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
b72d26
---
b72d26
 sos/plugins/kubernetes.py | 2 +-
b72d26
 1 file changed, 1 insertion(+), 1 deletion(-)
b72d26
b72d26
diff --git a/sos/plugins/kubernetes.py b/sos/plugins/kubernetes.py
b72d26
index 21cb51df..c14e078e 100644
b72d26
--- a/sos/plugins/kubernetes.py
b72d26
+++ b/sos/plugins/kubernetes.py
b72d26
@@ -61,7 +61,7 @@ class kubernetes(Plugin, RedHatPlugin):
b72d26
 
b72d26
         kube_cmd = "kubectl "
b72d26
         if path.exists('/etc/origin/master/admin.kubeconfig'):
b72d26
-            kube_cmd += "--config=/etc/origin/master/admin.kubeconfig"
b72d26
+            kube_cmd += "--kubeconfig=/etc/origin/master/admin.kubeconfig"
b72d26
 
b72d26
         kube_get_cmd = "get -o json "
b72d26
         for subcmd in ['version', 'config view']:
b72d26
-- 
b72d26
2.17.1
b72d26
b72d26
b72d26
From 46fffd469f4f3d07337dc335cfc24341e836f23b Mon Sep 17 00:00:00 2001
b72d26
From: Jake Hunsaker <jhunsake@redhat.com>
b72d26
Date: Thu, 12 Jul 2018 13:11:44 -0400
b72d26
Subject: [PATCH 3/3] [origin] Collect statistics information
b72d26
b72d26
Adds collection of 'oc adm top' output for images and imagestreams.
b72d26
b72d26
Resolves: #1165
b72d26
Closes: #1383
b72d26
b72d26
Signed-off-by: Jake Hunsaker <jhunsake@redhat.com>
b72d26
---
b72d26
 sos/plugins/origin.py | 26 ++++++++++++++++++++------
b72d26
 1 file changed, 20 insertions(+), 6 deletions(-)
b72d26
b72d26
diff --git a/sos/plugins/origin.py b/sos/plugins/origin.py
b72d26
index 02bc047a..0e384117 100644
b72d26
--- a/sos/plugins/origin.py
b72d26
+++ b/sos/plugins/origin.py
b72d26
@@ -124,14 +124,28 @@ class OpenShiftOrigin(Plugin):
b72d26
             #
b72d26
             # Note: Information about nodes, events, pods, and services
b72d26
             # is already collected by the Kubernetes plugin
b72d26
+
b72d26
+            subcmds = [
b72d26
+                "describe projects",
b72d26
+                "adm top images",
b72d26
+                "adm top imagestreams"
b72d26
+            ]
b72d26
+
b72d26
             self.add_cmd_output([
b72d26
-                "%s describe projects" % oc_cmd_admin,
b72d26
-                "%s get -o json hostsubnet" % oc_cmd_admin,
b72d26
-                "%s get -o json clusternetwork" % oc_cmd_admin,
b72d26
-                "%s get -o json netnamespaces" % oc_cmd_admin,
b72d26
-                # Registry and router configs are typically here
b72d26
-                "%s get -o json dc -n default" % oc_cmd_admin,
b72d26
+                '%s %s' % (oc_cmd_admin, subcmd) for subcmd in subcmds
b72d26
             ])
b72d26
+
b72d26
+            jcmds = [
b72d26
+                "hostsubnet",
b72d26
+                "clusternetwork",
b72d26
+                "netnamespaces",
b72d26
+                "dc -n default"
b72d26
+            ]
b72d26
+
b72d26
+            self.add_cmd_output([
b72d26
+                '%s get -o json %s' % (oc_cmd_admin, jcmd) for jcmd in jcmds
b72d26
+            ])
b72d26
+
b72d26
             if self.get_option('diag'):
b72d26
                 diag_cmd = "%s adm diagnostics -l 0" % oc_cmd_admin
b72d26
                 if self.get_option('diag-prevent'):
b72d26
-- 
b72d26
2.17.1
b72d26