1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
|
package com.yahoo.vespa.hosted.node.verification.spec;
import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo;
import com.yahoo.vespa.hosted.node.verification.spec.retrievers.HardwareInfo.DiskType;
import com.yahoo.vespa.hosted.node.verification.spec.report.VerificationReport;
/**
* Created by olaa on 04/07/2017.
* Compares two HardwareInfo objects and stores divergent values in a VerificationReport
*/
public class HardwareNodeComparator {
private static final double PERCENTAGE_THRESHOLD = 0.05;
public static VerificationReport compare(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware) {
VerificationReport verificationReport = new VerificationReport();
if (nodeRepoHardwareInfo == null || actualHardware == null) {
return verificationReport;
}
setReportMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
return verificationReport;
}
private static void setReportMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
setMemoryMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
setCpuMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
setDiskTypeMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
setDiskSpaceMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
setNetMetrics(nodeRepoHardwareInfo, actualHardware, verificationReport);
}
private static void setMemoryMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
double expectedMemory = nodeRepoHardwareInfo.getMinMainMemoryAvailableGb();
double actualMemory = actualHardware.getMinMainMemoryAvailableGb();
if (outsideThreshold(expectedMemory, actualMemory, PERCENTAGE_THRESHOLD)) {
verificationReport.setActualMemoryAvailable(actualMemory);
}
}
private static void setCpuMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
int expectedCpuCores = nodeRepoHardwareInfo.getMinCpuCores();
int actualCpuCores = actualHardware.getMinCpuCores();
if (expectedCpuCores != actualCpuCores) {
verificationReport.setActualcpuCores(actualCpuCores);
}
}
private static void setDiskTypeMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
DiskType expectedFastDisk = nodeRepoHardwareInfo.getDiskType();
DiskType actualFastDisk = actualHardware.getDiskType();
if (expectedFastDisk != null && actualFastDisk != null && expectedFastDisk != actualFastDisk) {
verificationReport.setActualDiskType(actualFastDisk);
}
}
private static void setDiskSpaceMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
double expectedDiskSpace = nodeRepoHardwareInfo.getMinDiskAvailableGb();
double actualDiskSpace = actualHardware.getMinDiskAvailableGb();
if (outsideThreshold(expectedDiskSpace, actualDiskSpace, PERCENTAGE_THRESHOLD)) {
verificationReport.setActualDiskSpaceAvailable(actualDiskSpace);
}
}
private static void setNetMetrics(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, VerificationReport verificationReport) {
double expectedInterfaceSpeed = nodeRepoHardwareInfo.getInterfaceSpeedMbs();
double actualInterfaceSpeed = actualHardware.getInterfaceSpeedMbs();
if (nodeRepoHardwareInfo.getInterfaceSpeedMbs() > actualHardware.getInterfaceSpeedMbs()) {
specReportMetrics.setExpectedInterfaceSpeed(expectedInterfaceSpeed);
specReportMetrics.setActualInterfaceSpeed(actualInterfaceSpeed);
}
if (nodeRepoHardwareInfo.isIpv6Connection() != actualHardware.isIpv6Connection()) {
specReportMetrics.setActualIpv6Connection(actualHardware.isIpv6Connection());
specReportMetrics.setExpectedIpv6Connection(nodeRepoHardwareInfo.isIpv6Connection());
}
private static boolean compareCPU(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, SpecReportDimensions specReportDimensions) {
boolean equalCPU = nodeRepoHardwareInfo.getMinCpuCores() == actualHardware.getMinCpuCores();
specReportDimensions.setCpuCoresMatch(equalCPU);
return equalCPU;
}
private static boolean compareMemory(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, SpecReportDimensions specReportDimensions) {
boolean equalMemory = insideThreshold(nodeRepoHardwareInfo.getMinMainMemoryAvailableGb(), actualHardware.getMinMainMemoryAvailableGb(), PERCENTAGE_THRESHOLD);
specReportDimensions.setMemoryMatch(equalMemory);
return equalMemory;
}
private static boolean compareNetInterface(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, SpecReportDimensions specReportDimensions) {
boolean equalNetInterfaceSpeed = nodeRepoHardwareInfo.getInterfaceSpeedMbs() <= actualHardware.getInterfaceSpeedMbs();
boolean equalIpv6Interface = !nodeRepoHardwareInfo.getIpv6Interface() || actualHardware.getIpv6Interface();
boolean equalIpv4Interface = !nodeRepoHardwareInfo.getIpv4Interface() || actualHardware.getIpv4Interface();
boolean equalIpv6Connection = !nodeRepoHardwareInfo.isIpv6Connection() || actualHardware.isIpv6Connection();
specReportDimensions.setNetInterfaceSpeedMatch(equalNetInterfaceSpeed);
specReportDimensions.setIpv6Match(equalIpv6Interface);
specReportDimensions.setIpv4Match(equalIpv4Interface);
return equalIpv4Interface && equalIpv6Connection && equalNetInterfaceSpeed && equalIpv6Interface;
}
private static boolean compareDisk(HardwareInfo nodeRepoHardwareInfo, HardwareInfo actualHardware, SpecReportDimensions specReportDimensions) {
boolean equalDiskType = nodeRepoHardwareInfo.getDiskType() == actualHardware.getDiskType();
boolean equalDiskSize = insideThreshold(nodeRepoHardwareInfo.getMinDiskAvailableGb(), actualHardware.getMinDiskAvailableGb(), PERCENTAGE_THRESHOLD);
specReportDimensions.setDiskTypeMatch(equalDiskType);
specReportDimensions.setDiskAvailableMatch(equalDiskSize);
return equalDiskType && equalDiskSize;
}
private static boolean outsideThreshold(double value1, double value2 , double thresholdPercentage) {
double lowerThresholdPercentage = 1 - thresholdPercentage;
double upperThresholdPercentage = 1 + thresholdPercentage;
return value1 < lowerThresholdPercentage * value2 || value1 > upperThresholdPercentage * value2;
}
}
|