diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..d645695 --- /dev/null +++ b/LICENSE @@ -0,0 +1,202 @@ + + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright [yyyy] [name of copyright owner] + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/README.md b/README.md index 92c69f8..abbf140 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,7 @@ Small utility to fetch metrics from one or more HMC's and push those to an Influ ## Usage Instructions - Ensure you have correct date/time and NTP running to keep it accurate! -- Install jar, deb or rpm file from [downloads](https://bitbucket.org/mnellemann/hmci/downloads/) or compile from source. +- Install *.deb* or *.rpm* file from [downloads](https://bitbucket.org/mnellemann/hmci/downloads/) or compile from source - Copy the *doc/hmci.groovy.tpl* configuration template into */etc/hmci.groovy* and edit the configuration to suit your environment - Configure Grafana to communicate with your InfluxDB and import dashboards from *doc/* into Grafana (The dashboards are slightly modified versions of the dashboard provided by the nmon2influxdb tool) - Run the *bin/hmci* program in a shell, as a @reboot cron task or setup a proper service :) @@ -41,4 +41,4 @@ Start the Grafana container, linking it to the InfluxDB container docker run --name grafana --link influxdb:influxdb --rm -d -p 3000:3000 grafana/grafana:7.1.3 -Configure a new InfluxDB datasource on *http://influxdb:8086* named *hmci* to connect to the InfluxDB container. The database must be created beforehand, this can be done by running the hmci tool first. Grafana dashboards can be imported from the **doc/** folder. +Configure a new InfluxDB datasource on *http://influxdb:8086* named *hmci* to connect to the InfluxDB container. The database must be created beforehand, this can be done by running the hmci tool first. Grafana dashboards can be imported from the *doc/* folder. diff --git a/doc/Power Systems - HMC Logical Partitions-1597311623553.json b/doc/Power Systems - HMC Logical Partitions-1597311623553.json index 9b52141..1b710b8 100644 --- a/doc/Power Systems - HMC Logical Partitions-1597311623553.json +++ b/doc/Power Systems - HMC Logical Partitions-1597311623553.json @@ -43,7 +43,7 @@ } ] }, - "description": "HMC metrics imported from nmon2influxdb", + "description": "HMC Logical Partitions", "editable": true, "gnetId": 1510, "graphTooltip": 0, @@ -1502,4 +1502,4 @@ "title": "Power Systems - HMC Logical Partitions", "uid": "Xl7oHESGz", "version": 3 -} \ No newline at end of file +} diff --git a/doc/Power Systems - HMC Managed Systems-1597311518654.json b/doc/Power Systems - HMC Managed Systems-1597311518654.json index 1c5f782..0a80a68 100644 --- a/doc/Power Systems - HMC Managed Systems-1597311518654.json +++ b/doc/Power Systems - HMC Managed Systems-1597311518654.json @@ -43,7 +43,7 @@ } ] }, - "description": "nmon2influxdb HMC system view", + "description": "HMC Managed Systems", "editable": true, "gnetId": 1465, "graphTooltip": 0, @@ -1145,4 +1145,4 @@ "title": "Power Systems - HMC Managed Systems", "uid": "ClJhHPIGz", "version": 4 -} \ No newline at end of file +} diff --git a/doc/hmci.groovy.tpl b/doc/hmci.groovy.tpl index d98af3d..37bc0eb 100644 --- a/doc/hmci.groovy.tpl +++ b/doc/hmci.groovy.tpl @@ -2,7 +2,7 @@ Copy this file to /etc/hmci.groovy and change it to suit your environment. */ -// Query HMC's for data - in seconds +// How often to query HMC's for data - in seconds hmci.refresh = 30 // Rescan HMC's for new systems and partitions - every x refresh @@ -16,7 +16,7 @@ influx { database = "hmci" } -// One or more HMC to query for data and metrics +// One or more HMC's to query for data and metrics hmc { // HMC on our primary site diff --git a/gradle.properties b/gradle.properties index 51563b9..aee3848 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,2 +1,2 @@ group = biz.nellemann.hmci -version = 1.0.4 +version = 1.0.5 diff --git a/src/main/groovy/biz/nellemann/hmci/App.groovy b/src/main/groovy/biz/nellemann/hmci/App.groovy index 80c5366..55a1713 100644 --- a/src/main/groovy/biz/nellemann/hmci/App.groovy +++ b/src/main/groovy/biz/nellemann/hmci/App.groovy @@ -1,3 +1,18 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci import groovy.cli.picocli.CliBuilder @@ -60,10 +75,9 @@ class App implements Runnable { hmcClients.each { hmcId, hmcClient -> - hmcClient.logoff() - hmcClient.login() try { + hmcClient.login() hmcClient.getManagedSystems().each { systemId, system -> // Add to list of known systems @@ -78,7 +92,7 @@ class App implements Runnable { } } catch(Exception e) { log.error("discover() - " + hmcId + " error: " + e.message) - hmcClients.remove(hmcId) + //hmcClients.remove(hmcId) } } diff --git a/src/main/groovy/biz/nellemann/hmci/HmcClient.groovy b/src/main/groovy/biz/nellemann/hmci/HmcClient.groovy index 50f9245..edef610 100644 --- a/src/main/groovy/biz/nellemann/hmci/HmcClient.groovy +++ b/src/main/groovy/biz/nellemann/hmci/HmcClient.groovy @@ -1,3 +1,18 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci import groovy.util.logging.Slf4j @@ -53,7 +68,11 @@ class HmcClient { * * @throws IOException */ - void login() throws IOException { + void login(Boolean force = false) throws IOException { + + if(authToken && !force) { + return + } String payload = """\ @@ -77,6 +96,7 @@ class HmcClient { // Get response body and parse String responseBody = response.body.string() + response.body().close() def xml = new XmlSlurper().parseText(responseBody) authToken = xml.toString() @@ -205,7 +225,7 @@ class HmcClient { feed?.entry?.each { entry -> String link = entry.link["@href"] if(entry.category["@term"] == "ManagedSystem") { - jsonBody = getReponseBody(new URL(link)) + jsonBody = getResponseBody(new URL(link)) } } @@ -234,7 +254,7 @@ class HmcClient { feed?.entry?.each { entry -> String link = entry.link["@href"] if(entry.category["@term"] == "LogicalPartition") { - jsonBody = getReponseBody(new URL(link)) + jsonBody = getResponseBody(new URL(link)) } } @@ -248,10 +268,11 @@ class HmcClient { * @param url * @return */ - protected String getReponseBody(URL url) { - //log.debug("getBody() - " + url.toString()) + protected String getResponseBody(URL url) { Response response = getResponse(url) - return response.body.string() + String body = response.body().string() + response.body().close() + return body } @@ -262,7 +283,7 @@ class HmcClient { * @param url * @return */ - private Response getResponse(URL url) { + private Response getResponse(URL url, Integer retry = 0) { Request request = new Request.Builder() .url(url) @@ -273,11 +294,20 @@ class HmcClient { Response response = client.newCall(request).execute(); if (!response.isSuccessful()) { + response.body().close() + if(response.code == 401) { - login() - } else { - throw new IOException("Unexpected code " + response) + login(true) + return getResponse(url, retry++) } + + if(retry < 2) { + log.warn("getResponse() - Retrying due to unexpected response: " + response.code) + return getResponse(url, retry++) + } + + log.error("getResponse() - Unexpected response: " + response.code) + throw new IOException("getResponse() - Unexpected response: " + response.code) }; return response diff --git a/src/main/groovy/biz/nellemann/hmci/InfluxClient.groovy b/src/main/groovy/biz/nellemann/hmci/InfluxClient.groovy index c8620c3..6d5b14c 100644 --- a/src/main/groovy/biz/nellemann/hmci/InfluxClient.groovy +++ b/src/main/groovy/biz/nellemann/hmci/InfluxClient.groovy @@ -1,3 +1,18 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci import groovy.util.logging.Slf4j diff --git a/src/main/groovy/biz/nellemann/hmci/LogicalPartition.groovy b/src/main/groovy/biz/nellemann/hmci/LogicalPartition.groovy index fd0300b..08c6988 100644 --- a/src/main/groovy/biz/nellemann/hmci/LogicalPartition.groovy +++ b/src/main/groovy/biz/nellemann/hmci/LogicalPartition.groovy @@ -1,3 +1,18 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci import groovy.util.logging.Slf4j @@ -35,8 +50,8 @@ class LogicalPartition extends MetaSystem { log.debug("getMemoryMetrics() - tags: " + tagsMap.toString()) HashMap fieldsMap = [ - logicalMem: metrics.systemUtil.utilSamples.first().lparsUtil.first().memory.logicalMem.first(), - backedPhysicalMem: metrics.systemUtil.utilSamples.first().lparsUtil.first().memory.backedPhysicalMem.first(), + logicalMem: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.memory?.logicalMem?.first(), + backedPhysicalMem: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.memory?.backedPhysicalMem?.first(), ] map.put("fields", fieldsMap) log.debug("getMemoryMetrics() - fields: " + fieldsMap.toString()) @@ -59,17 +74,17 @@ class LogicalPartition extends MetaSystem { log.debug("getProcessorMetrics() - tags: " + tagsMap.toString()) HashMap fieldsMap = [ - utilizedProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.utilizedProcUnits.first(), + utilizedProcUnits: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.processor?.utilizedProcUnits?.first(), //maxVirtualProcessors: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.maxVirtualProcessors.first(), //currentVirtualProcessors: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.currentVirtualProcessors.first(), //donatedProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.donatedProcUnits.first(), //entitledProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.entitledProcUnits.first(), //idleProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.idleProcUnits.first(), //maxProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.maxProcUnits.first(), - utilizedCappedProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.utilizedCappedProcUnits.first(), - utilizedUncappedProcUnits: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.utilizedUncappedProcUnits.first(), - timePerInstructionExecution: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.timeSpentWaitingForDispatch.first(), - timeSpentWaitingForDispatch: metrics.systemUtil.utilSamples.first().lparsUtil.first().processor.timePerInstructionExecution.first(), + utilizedCappedProcUnits: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.processor?.utilizedCappedProcUnits?.first(), + utilizedUncappedProcUnits: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.processor?.utilizedUncappedProcUnits?.first(), + timePerInstructionExecution: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.processor?.timeSpentWaitingForDispatch?.first(), + timeSpentWaitingForDispatch: metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.processor?.timePerInstructionExecution?.first(), ] map.put("fields", fieldsMap) log.debug("getProcessorMetrics() - fields: " + fieldsMap.toString()) @@ -83,7 +98,7 @@ class LogicalPartition extends MetaSystem { List list = new ArrayList<>() Map map = new HashMap() - metrics.systemUtil.utilSamples.first().lparsUtil.first().network?.virtualEthernetAdapters?.each { + metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.network?.virtualEthernetAdapters?.each { HashMap tagsMap = [ system: system.name, @@ -117,7 +132,7 @@ class LogicalPartition extends MetaSystem { List list = new ArrayList<>() Map map = new HashMap() - metrics.systemUtil.utilSamples.first().lparsUtil.first().storage?.virtualFiberChannelAdapters?.each { + metrics.systemUtil?.utilSamples?.first()?.lparsUtil?.first()?.storage?.virtualFiberChannelAdapters?.each { HashMap tagsMap = [ system: system.name, diff --git a/src/main/groovy/biz/nellemann/hmci/ManagedSystem.groovy b/src/main/groovy/biz/nellemann/hmci/ManagedSystem.groovy index 45228dd..2dc77d5 100644 --- a/src/main/groovy/biz/nellemann/hmci/ManagedSystem.groovy +++ b/src/main/groovy/biz/nellemann/hmci/ManagedSystem.groovy @@ -1,3 +1,18 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci import groovy.util.logging.Slf4j @@ -40,10 +55,10 @@ class ManagedSystem extends MetaSystem { log.debug("getMemoryMetrics() - tags: " + tagsMap.toString()) HashMap fieldsMap = [ - totalMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.totalMem.first(), - availableMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.availableMem.first(), - configurableMem: metrics.systemUtil.utilSamples.first().serverUtil.memory.configurableMem.first(), - assignedMemToLpars: metrics.systemUtil.utilSamples.first().serverUtil.memory.assignedMemToLpars.first(), + totalMem: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.memory?.totalMem?.first(), + availableMem: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.memory?.availableMem?.first(), + configurableMem: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.memory?.configurableMem?.first(), + assignedMemToLpars: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.memory?.assignedMemToLpars?.first(), ] map.put("fields", fieldsMap) log.debug("getMemoryMetrics() - fields: " + fieldsMap.toString()) @@ -65,10 +80,10 @@ class ManagedSystem extends MetaSystem { log.debug("getProcessorMetrics() - tags: " + tagsMap.toString()) HashMap fieldsMap = [ - availableProcUnits: metrics.systemUtil.utilSamples.first().serverUtil.processor.totalProcUnits.first(), - utilizedProcUnits: metrics.systemUtil.utilSamples.first().serverUtil.processor.utilizedProcUnits.first(), - availableProcUnits: metrics.systemUtil.utilSamples.first().serverUtil.processor.availableProcUnits.first(), - configurableProcUnits: metrics.systemUtil.utilSamples.first().serverUtil.processor.configurableProcUnits.first(), + availableProcUnits: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.processor?.totalProcUnits?.first(), + utilizedProcUnits: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.processor?.utilizedProcUnits?.first(), + availableProcUnits: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.processor?.availableProcUnits?.first(), + configurableProcUnits: metrics.systemUtil?.utilSamples?.first()?.serverUtil?.processor?.configurableProcUnits?.first(), ] map.put("fields", fieldsMap) log.debug("getProcessorMetrics() - fields: " + fieldsMap.toString()) @@ -82,7 +97,7 @@ class ManagedSystem extends MetaSystem { List list = new ArrayList<>() Map map = new HashMap() - metrics.systemUtil.utilSamples.first().serverUtil.sharedProcessorPool.each { + metrics.systemUtil?.utilSamples?.first()?.serverUtil?.sharedProcessorPool?.each { HashMap tagsMap = [ system: name, @@ -110,7 +125,7 @@ class ManagedSystem extends MetaSystem { List list = new ArrayList<>() Map map = new HashMap() - metrics.systemUtil.utilSamples.first().viosUtil.each {vios -> + metrics.systemUtil?.utilSamples?.first()?.viosUtil?.each {vios -> vios.network.sharedAdapters.each { @@ -143,8 +158,8 @@ class ManagedSystem extends MetaSystem { List list = new ArrayList<>() Map map = new HashMap() - metrics.systemUtil.utilSamples.first().viosUtil.each { vios -> - vios.storage.fiberChannelAdapters.each { + metrics.systemUtil?.utilSamples?.first()?.viosUtil?.each { vios -> + vios.storage?.fiberChannelAdapters?.each { HashMap tagsMap = [ system: name, @@ -170,7 +185,7 @@ class ManagedSystem extends MetaSystem { } return list - } + } diff --git a/src/main/groovy/biz/nellemann/hmci/MetaSystem.groovy b/src/main/groovy/biz/nellemann/hmci/MetaSystem.groovy index 26ae197..065a780 100644 --- a/src/main/groovy/biz/nellemann/hmci/MetaSystem.groovy +++ b/src/main/groovy/biz/nellemann/hmci/MetaSystem.groovy @@ -1,6 +1,21 @@ +/** + * Copyright 2020 Mark Nellemann + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ package biz.nellemann.hmci -import biz.nellemann.hmci.pojo.PcmData +import biz.nellemann.hmci.pcm.PcmData import groovy.json.JsonSlurper import groovy.util.logging.Slf4j diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/FiberChannelAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/FiberChannelAdapter.groovy similarity index 91% rename from src/main/groovy/biz/nellemann/hmci/pojo/FiberChannelAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/FiberChannelAdapter.groovy index bafe7e7..f8612f8 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/FiberChannelAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/FiberChannelAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/GenericAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/GenericAdapter.groovy similarity index 91% rename from src/main/groovy/biz/nellemann/hmci/pojo/GenericAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/GenericAdapter.groovy index df38d49..d8a34d1 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/GenericAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/GenericAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/GenericPhysicalAdapters.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/GenericPhysicalAdapters.groovy similarity index 90% rename from src/main/groovy/biz/nellemann/hmci/pojo/GenericPhysicalAdapters.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/GenericPhysicalAdapters.groovy index dd0dd92..9fc2539 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/GenericPhysicalAdapters.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/GenericPhysicalAdapters.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/GenericVirtualAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/GenericVirtualAdapter.groovy similarity index 90% rename from src/main/groovy/biz/nellemann/hmci/pojo/GenericVirtualAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/GenericVirtualAdapter.groovy index c53d6a4..47ab712 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/GenericVirtualAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/GenericVirtualAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/LparMemory.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/LparMemory.groovy similarity index 81% rename from src/main/groovy/biz/nellemann/hmci/pojo/LparMemory.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/LparMemory.groovy index a1ca150..4865447 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/LparMemory.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/LparMemory.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/LparProcessor.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/LparProcessor.groovy similarity index 94% rename from src/main/groovy/biz/nellemann/hmci/pojo/LparProcessor.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/LparProcessor.groovy index 68d8da4..50f773b 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/LparProcessor.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/LparProcessor.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/LparUtil.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/LparUtil.groovy similarity index 89% rename from src/main/groovy/biz/nellemann/hmci/pojo/LparUtil.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/LparUtil.groovy index b4b0a41..73ed269 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/LparUtil.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/LparUtil.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/Network.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/Network.groovy similarity index 86% rename from src/main/groovy/biz/nellemann/hmci/pojo/Network.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/Network.groovy index 008f698..3913083 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/Network.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/Network.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/PcmData.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/PcmData.groovy similarity index 73% rename from src/main/groovy/biz/nellemann/hmci/pojo/PcmData.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/PcmData.groovy index 503cf70..986c54c 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/PcmData.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/PcmData.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/PhysicalProcessorPool.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/PhysicalProcessorPool.groovy similarity index 89% rename from src/main/groovy/biz/nellemann/hmci/pojo/PhysicalProcessorPool.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/PhysicalProcessorPool.groovy index 9d32610..85d6f48 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/PhysicalProcessorPool.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/PhysicalProcessorPool.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/SampleInfo.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/SampleInfo.groovy similarity index 77% rename from src/main/groovy/biz/nellemann/hmci/pojo/SampleInfo.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/SampleInfo.groovy index ac63892..10bb780 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/SampleInfo.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/SampleInfo.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/ServerMemory.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/ServerMemory.groovy similarity index 86% rename from src/main/groovy/biz/nellemann/hmci/pojo/ServerMemory.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/ServerMemory.groovy index 6df3cc2..a293af4 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/ServerMemory.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/ServerMemory.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/ServerProcessor.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/ServerProcessor.groovy similarity index 87% rename from src/main/groovy/biz/nellemann/hmci/pojo/ServerProcessor.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/ServerProcessor.groovy index 4b22a8d..b03a367 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/ServerProcessor.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/ServerProcessor.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/ServerUtil.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/ServerUtil.groovy similarity index 87% rename from src/main/groovy/biz/nellemann/hmci/pojo/ServerUtil.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/ServerUtil.groovy index 6c4f29a..9f184a1 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/ServerUtil.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/ServerUtil.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/SharedAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/SharedAdapter.groovy similarity index 92% rename from src/main/groovy/biz/nellemann/hmci/pojo/SharedAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/SharedAdapter.groovy index ce99838..0b9ab69 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/SharedAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/SharedAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/SharedProcessorPool.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/SharedProcessorPool.groovy similarity index 90% rename from src/main/groovy/biz/nellemann/hmci/pojo/SharedProcessorPool.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/SharedProcessorPool.groovy index fe90322..2a0d5e9 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/SharedProcessorPool.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/SharedProcessorPool.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/Storage.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/Storage.groovy similarity index 90% rename from src/main/groovy/biz/nellemann/hmci/pojo/Storage.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/Storage.groovy index be9832a..150152a 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/Storage.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/Storage.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/SystemUtil.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/SystemUtil.groovy similarity index 79% rename from src/main/groovy/biz/nellemann/hmci/pojo/SystemUtil.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/SystemUtil.groovy index 34f2853..707b706 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/SystemUtil.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/SystemUtil.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/UtilInfo.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/UtilInfo.groovy similarity index 81% rename from src/main/groovy/biz/nellemann/hmci/pojo/UtilInfo.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/UtilInfo.groovy index 8dd556a..c30d1cf 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/UtilInfo.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/UtilInfo.groovy @@ -1,9 +1,7 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString -import java.time.Instant - @ToString class UtilInfo { diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/UtilSample.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/UtilSample.groovy similarity index 86% rename from src/main/groovy/biz/nellemann/hmci/pojo/UtilSample.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/UtilSample.groovy index 9e6b745..b595aad 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/UtilSample.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/UtilSample.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/ViosUtil.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/ViosUtil.groovy similarity index 91% rename from src/main/groovy/biz/nellemann/hmci/pojo/ViosUtil.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/ViosUtil.groovy index 871dbb1..2873d6e 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/ViosUtil.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/ViosUtil.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/VirtualEthernetAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/VirtualEthernetAdapter.groovy similarity index 95% rename from src/main/groovy/biz/nellemann/hmci/pojo/VirtualEthernetAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/VirtualEthernetAdapter.groovy index 6c88e35..4930a73 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/VirtualEthernetAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/VirtualEthernetAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/main/groovy/biz/nellemann/hmci/pojo/VirtualFiberChannelAdapter.groovy b/src/main/groovy/biz/nellemann/hmci/pcm/VirtualFiberChannelAdapter.groovy similarity index 92% rename from src/main/groovy/biz/nellemann/hmci/pojo/VirtualFiberChannelAdapter.groovy rename to src/main/groovy/biz/nellemann/hmci/pcm/VirtualFiberChannelAdapter.groovy index abe332c..380c251 100644 --- a/src/main/groovy/biz/nellemann/hmci/pojo/VirtualFiberChannelAdapter.groovy +++ b/src/main/groovy/biz/nellemann/hmci/pcm/VirtualFiberChannelAdapter.groovy @@ -1,4 +1,4 @@ -package biz.nellemann.hmci.pojo +package biz.nellemann.hmci.pcm import groovy.transform.ToString diff --git a/src/test/groovy/biz/nellemann/hmci/HmcClientTest.groovy b/src/test/groovy/biz/nellemann/hmci/HmcClientTest.groovy index ba0aa20..4ab0a0d 100644 --- a/src/test/groovy/biz/nellemann/hmci/HmcClientTest.groovy +++ b/src/test/groovy/biz/nellemann/hmci/HmcClientTest.groovy @@ -61,7 +61,7 @@ class HmcClientTest extends Specification { mockServer.enqueue(new MockResponse().setBody(testJson)); when: - String jsonString = hmc.getReponseBody(new URL(mockServer.url("/rest/api/pcm/ProcessedMetrics/ManagedSystem_e09834d1-c930-3883-bdad-405d8e26e166_20200807T122600+0200_20200807T122600+0200_30.json") as String)) + String jsonString = hmc.getResponseBody(new URL(mockServer.url("/rest/api/pcm/ProcessedMetrics/ManagedSystem_e09834d1-c930-3883-bdad-405d8e26e166_20200807T122600+0200_20200807T122600+0200_30.json") as String)) then: jsonString.contains('"uuid": "e09834d1-c930-3883-bdad-405d8e26e166"') @@ -75,7 +75,7 @@ class HmcClientTest extends Specification { mockServer.enqueue(new MockResponse().setBody(testJson)); when: - String jsonString = hmc.getReponseBody(new URL(mockServer.url("/rest/api/pcm/ProcessedMetrics/LogicalPartition_2DE05DB6-8AD5-448F-8327-0F488D287E82_20200807T123730+0200_20200807T123730+0200_30.json") as String)) + String jsonString = hmc.getResponseBody(new URL(mockServer.url("/rest/api/pcm/ProcessedMetrics/LogicalPartition_2DE05DB6-8AD5-448F-8327-0F488D287E82_20200807T123730+0200_20200807T123730+0200_30.json") as String)) then: jsonString.contains('"uuid": "b597e4da-2aab-3f52-8616-341d62153559"') diff --git a/src/test/groovy/biz/nellemann/hmci/ManagedSystemTest.groovy b/src/test/groovy/biz/nellemann/hmci/ManagedSystemTest.groovy index 9ef7165..115b78f 100644 --- a/src/test/groovy/biz/nellemann/hmci/ManagedSystemTest.groovy +++ b/src/test/groovy/biz/nellemann/hmci/ManagedSystemTest.groovy @@ -72,4 +72,19 @@ class ManagedSystemTest extends Specification { listOfMaps.first().get("fields")['assignedProcUnits'] == 23.767 } + void "test VIOS data"() { + setup: + def testFile = new File(getClass().getResource('/pcm-data-managed-system.json').toURI()) + def testJson = testFile.getText('UTF-8') + ManagedSystem system = new ManagedSystem("site1", "e09834d1-c930-3883-bdad-405d8e26e166", "Test Name","Test Type", "Test Model", "Test S/N") + + when: + system.processMetrics(testJson) + List listOfMaps = system.getSharedProcessorPools() + + then: + listOfMaps.size() == 1 + listOfMaps.first().get("fields")['assignedProcUnits'] == 23.767 + } + } diff --git a/src/test/groovy/biz/nellemann/hmci/MetaSystemTest.groovy b/src/test/groovy/biz/nellemann/hmci/MetaSystemTest.groovy index 4a66ac9..e53e79e 100644 --- a/src/test/groovy/biz/nellemann/hmci/MetaSystemTest.groovy +++ b/src/test/groovy/biz/nellemann/hmci/MetaSystemTest.groovy @@ -20,4 +20,5 @@ class MetaSystemTest extends Specification { then: instant.getEpochSecond() == 1597086630 } + }