changeset 2738:7815245e7915

macOS compatibility fixes This patch just enables the agent to build and pass tests on the current macOS. The web-gateway and the web-client are already macOS compatible at this point in time. Many plugins are stil only stubs. Reviewed-by: neugens Review-thread: http://icedtea.classpath.org/pipermail/thermostat/2017-August/024634.html
author Simon Tooke <stooke@redhat.com>
date Wed, 23 Aug 2017 11:14:49 -0400
parents 2b3ed04c4d2d
children cc16bcb56e60
files common/portability/src/main/java/com/redhat/thermostat/common/portability/SysConf.java distribution/pom.xml plugins/host-cpu/agent/src/main/java/com/redhat/thermostat/host/cpu/agent/internal/CpuStatBuilderFactory.java plugins/host-cpu/agent/src/main/java/com/redhat/thermostat/host/cpu/agent/internal/MacOsCpuStatBuilder.java process-handler/src/test/java/com/redhat/thermostat/service/internal/unix/UnixProcessUtilitiesTest.java
diffstat 5 files changed, 137 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/common/portability/src/main/java/com/redhat/thermostat/common/portability/SysConf.java	Fri Aug 18 10:58:51 2017 -0400
+++ b/common/portability/src/main/java/com/redhat/thermostat/common/portability/SysConf.java	Wed Aug 23 11:14:49 2017 -0400
@@ -54,14 +54,14 @@
     }
 
     public static long getClockTicksPerSecond() {
-        return OS.IS_LINUX ? getLinuxClockTicksPerSecond() : getWindowsClockTicksPerSecond();
+        return OS.IS_UNIX ? getPosixClockTicksPerSecond() : getWindowsClockTicksPerSecond();
     }
 
     private static long getWindowsClockTicksPerSecond() {
         return PortableHostFactory.getInstance().getClockTicksPerSecond();
     }
 
-    public static long getLinuxClockTicksPerSecond() {
+    public static long getPosixClockTicksPerSecond() {
         String ticks = sysConf("CLK_TCK");
         try {
             return Long.valueOf(ticks);
--- a/distribution/pom.xml	Fri Aug 18 10:58:51 2017 -0400
+++ b/distribution/pom.xml	Wed Aug 23 11:14:49 2017 -0400
@@ -122,7 +122,7 @@
         <os><family>mac</family></os>
       </activation>
       <properties>
-        <assemblyfile.suffix>macosx</assemblyfile.suffix>
+        <assemblyfile.suffix>-macosx</assemblyfile.suffix>
         <agent_extra_bundles>,com.redhat.thermostat.agent.ipc.unixsocket.server=${project.version}, \
           ${jffi-native.bundle.symbolic.name}=${jffi.version}</agent_extra_bundles>
         <service_extra_bundles>,com.redhat.thermostat.agent.ipc.unixsocket.server=${project.version}, \
--- a/plugins/host-cpu/agent/src/main/java/com/redhat/thermostat/host/cpu/agent/internal/CpuStatBuilderFactory.java	Fri Aug 18 10:58:51 2017 -0400
+++ b/plugins/host-cpu/agent/src/main/java/com/redhat/thermostat/host/cpu/agent/internal/CpuStatBuilderFactory.java	Wed Aug 23 11:14:49 2017 -0400
@@ -49,7 +49,7 @@
     }
 
     public CpuStatBuilder build(final WriterID id) {
-        return OS.IS_LINUX ? buildForLinux(id) : buildForWindows(id);
+        return OS.IS_LINUX ? buildForLinux(id) : OS.IS_WINDOWS ? buildForWindows(id) : buildForMacOS(id);
     }
 
     private CpuStatBuilder buildForLinux(final WriterID id) {
@@ -59,6 +59,12 @@
         return new LinuxCpuStatBuilder(clock, source, ticksPerSecond, id);
     }
 
+    private CpuStatBuilder buildForMacOS(final WriterID id) {
+        final Clock clock = new SystemClock();
+        final long ticksPerSecond = SysConf.getClockTicksPerSecond();
+        return new MacOsCpuStatBuilder(clock, ticksPerSecond, id);
+    }
+
     private CpuStatBuilder buildForWindows(final WriterID id) {
         final Clock clock = new SystemClock();
         return new WindowsCpuStatBuilder(clock, id);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/plugins/host-cpu/agent/src/main/java/com/redhat/thermostat/host/cpu/agent/internal/MacOsCpuStatBuilder.java	Wed Aug 23 11:14:49 2017 -0400
@@ -0,0 +1,121 @@
+/*
+ * Copyright 2012-2017 Red Hat, Inc.
+ *
+ * This file is part of Thermostat.
+ *
+ * Thermostat is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published
+ * by the Free Software Foundation; either version 2, or (at your
+ * option) any later version.
+ *
+ * Thermostat is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with Thermostat; see the file COPYING.  If not see
+ * <http://www.gnu.org/licenses/>.
+ *
+ * Linking this code with other modules is making a combined work
+ * based on this code.  Thus, the terms and conditions of the GNU
+ * General Public License cover the whole combination.
+ *
+ * As a special exception, the copyright holders of this code give
+ * you permission to link this code with independent modules to
+ * produce an executable, regardless of the license terms of these
+ * independent modules, and to copy and distribute the resulting
+ * executable under terms of your choice, provided that you also
+ * meet, for each linked independent module, the terms and conditions
+ * of the license of that module.  An independent module is a module
+ * which is not derived from or based on this code.  If you modify
+ * this code, you may extend this exception to your version of the
+ * library, but you are not obligated to do so.  If you do not wish
+ * to do so, delete this exception statement from your version.
+ */
+
+package com.redhat.thermostat.host.cpu.agent.internal;
+
+import com.redhat.thermostat.common.Clock;
+import com.redhat.thermostat.common.utils.LoggingUtils;
+import com.redhat.thermostat.host.cpu.model.CpuStat;
+import com.redhat.thermostat.storage.core.WriterID;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/*
+ * STUB class
+ */
+public class MacOsCpuStatBuilder implements CpuStatBuilder {
+
+    private static final Logger logger = LoggingUtils.getLogger(LinuxCpuStatBuilder.class);
+
+    private final Clock clock;
+    private final long ticksPerSecond;
+    private final WriterID writerId;
+
+    private boolean initialized = false;
+
+    private long[] previousCpuTicks;
+    private long previousTime;
+
+    MacOsCpuStatBuilder(Clock clock, long ticksPerSecond, WriterID writerId) {
+        this.writerId = writerId;
+        this.clock = clock;
+        this.ticksPerSecond = ticksPerSecond;
+    }
+
+    @Override
+    public void initialize() {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
+        logger.severe("MacOsCpuStatBuilder is a stub class");
+        previousTime = clock.getMonotonicTimeNanos();
+        previousCpuTicks = getCurrentCpuTicks();
+        initialized = true;
+    }
+
+    @Override
+    public CpuStat build() {
+        if (!initialized) {
+            throw new IllegalStateException("not initialized yet");
+        }
+
+        long currentRealTime = clock.getRealTimeMillis();
+        long currentTime = clock.getMonotonicTimeNanos();
+        long[] currentValues = getCurrentCpuTicks();
+
+        double[] cpuUsage = new double[currentValues.length];
+
+        double timeDelta = (currentTime - previousTime) * 1E-9;
+        for (int i = 0; i < currentValues.length; i++) {
+            long cpuTicksDelta = currentValues[i] - previousCpuTicks[i];
+            // 100 as in 100 percent.
+            cpuUsage[i] = cpuTicksDelta * (100.0 / timeDelta / ticksPerSecond);
+        }
+        previousTime = currentTime;
+        previousCpuTicks = currentValues;
+        String wId = writerId.getWriterID();
+        return new CpuStat(wId, currentRealTime, cpuUsage);
+    }
+
+    private long[] getCurrentCpuTicks() {
+        int maxIndex = 0;
+        long[] values = new long[1];
+        values[0] = 1;
+
+        return values;
+    }
+
+    @Override
+    public boolean isInitialized() {
+        return initialized;
+    }
+
+}
+
--- a/process-handler/src/test/java/com/redhat/thermostat/service/internal/unix/UnixProcessUtilitiesTest.java	Fri Aug 18 10:58:51 2017 -0400
+++ b/process-handler/src/test/java/com/redhat/thermostat/service/internal/unix/UnixProcessUtilitiesTest.java	Wed Aug 23 11:14:49 2017 -0400
@@ -38,6 +38,7 @@
 
 import com.redhat.thermostat.service.process.ProcessHandler;
 import com.redhat.thermostat.service.process.UNIXSignal;
+import com.redhat.thermostat.shared.config.OS;
 import org.junit.Assert;
 import org.junit.Before;
 import org.junit.Test;
@@ -110,7 +111,10 @@
 
         Assert.assertTrue(processArguments.contains("12345"));
         Assert.assertTrue(processArguments.contains("ps"));
-        Assert.assertTrue(processArguments.contains("--no-heading"));
+        if (!OS.IS_MACOS)
+            Assert.assertTrue(processArguments.contains("--no-heading"));
+        else
+            Assert.assertTrue(processArguments.contains("-ocomm="));
         Assert.assertTrue(processArguments.contains("-p"));
     }
 
@@ -133,6 +137,6 @@
 
         String result = process.getProcessName(12345);
         Assert.assertNull(result);
-    }    
+    }
 }