Compare commits

..

6 Commits

Author SHA1 Message Date
35153cd6b6 Fix path handling for zkhandler
Using full paths broke the local schema generator, so convert these to
proper class instance methods and use them along with a new default +
settable override.
2024-10-11 16:03:40 -04:00
7f7047dd52 Add one more instance of mirror as purple 2024-10-11 14:44:14 -04:00
9a91767405 Add proper return codes to API handlers 2024-10-11 14:43:44 -04:00
bcfa6851e1 Use purple for mirror state colour 2024-10-11 10:44:39 -04:00
28b8b3bb44 Use proper response parsing instead of raise_for 2024-10-11 10:32:15 -04:00
02425159ef Update Grafana graphs 2024-10-11 09:47:19 -04:00
8 changed files with 6203 additions and 6204 deletions

View File

@ -21,4 +21,5 @@
from daemon_lib.zkhandler import ZKSchema
ZKSchema.write()
schema = ZKSchema(root_path=".")
schema.write()

View File

@ -1432,7 +1432,7 @@ def vm_snapshot_receive_block_createsnap(zkhandler, pool, volume, snapshot):
output = {"message": retdata.replace('"', "'")}
return output, retcode
return {"message": "Successfully received VM configuration data"}, 200
return {"message": "Successfully received RBD snapshot"}, 200
@ZKConnection(config)
@ -1448,7 +1448,6 @@ def vm_snapshot_receive_config(zkhandler, snapshot, vm_config, source_snapshot=N
First, we need to determine if this is an incremental or full send. If it's full, and the VM already exists,
this is an issue and we have to error. But this should have already happened with the RBD volumes.
"""
print(vm_config)
def parse_unified_diff(diff_text, original_text):
"""
@ -1528,6 +1527,11 @@ def vm_snapshot_receive_config(zkhandler, snapshot, vm_config, source_snapshot=N
False,
snapshot_vm_xml,
)
if not retcode:
retcode = 400
retdata = {"message": retmsg}
return retdata, retcode
retcode, retmsg = pvc_vm.modify_vm_metadata(
zkhandler,
vm_config["uuid"],
@ -1538,6 +1542,10 @@ def vm_snapshot_receive_config(zkhandler, snapshot, vm_config, source_snapshot=N
vm_config["migration_method"],
vm_config["migration_max_downtime"],
)
if not retcode:
retcode = 400
retdata = {"message": retmsg}
return retdata, retcode
current_vm_tags = zkhandler.children(("domain.meta.tags", vm_config["uuid"]))
new_vm_tags = [t["name"] for t in vm_config["tags"]]
@ -1576,6 +1584,10 @@ def vm_snapshot_receive_config(zkhandler, snapshot, vm_config, source_snapshot=N
vm_config["tags"],
"mirror",
)
if not retcode:
retcode = 400
retdata = {"message": retmsg}
return retdata, retcode
# Add this snapshot to the VM manually in Zookeeper
zkhandler.write(
@ -1619,6 +1631,8 @@ def vm_snapshot_receive_config(zkhandler, snapshot, vm_config, source_snapshot=N
]
)
return {"message": "Successfully received VM configuration snapshot"}, 200
#
# Network functions

View File

@ -223,6 +223,8 @@ def cli_cluster_status_format_pretty(CLI_CONFIG, data):
state_colour = ansii["green"]
elif state in ["migrate", "disable", "provision", "mirror"]:
state_colour = ansii["blue"]
elif state in ["mirror"]:
state_colour = ansii["purple"]
elif state in ["stop", "fail"]:
state_colour = ansii["red"]
else:

View File

@ -1861,7 +1861,7 @@ def format_info(config, domain_information, long_output):
"provision": ansiprint.blue(),
"restore": ansiprint.blue(),
"import": ansiprint.blue(),
"mirror": ansiprint.blue(),
"mirror": ansiprint.purple(),
}
ainformation.append(
"{}State:{} {}{}{}".format(
@ -2371,16 +2371,14 @@ def format_list(config, vm_list):
# Format the string (elements)
for domain_information in sorted(vm_list, key=lambda v: v["name"]):
if domain_information["state"] == "start":
if domain_information["state"] in ["start"]:
vm_state_colour = ansiprint.green()
elif domain_information["state"] == "restart":
elif domain_information["state"] in ["restart", "shutdown"]:
vm_state_colour = ansiprint.yellow()
elif domain_information["state"] == "shutdown":
vm_state_colour = ansiprint.yellow()
elif domain_information["state"] == "stop":
vm_state_colour = ansiprint.red()
elif domain_information["state"] == "fail":
elif domain_information["state"] in ["stop", "fail"]:
vm_state_colour = ansiprint.red()
elif domain_information["state"] in ["mirror"]:
vm_state_colour = ansiprint.purple()
else:
vm_state_colour = ansiprint.blue()

View File

@ -3389,18 +3389,17 @@ def vm_worker_send_snapshot(
"snapshot": snapshot_name,
"source_snapshot": incremental_parent,
}
try:
response = session.post(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/config",
headers={"Content-Type": "application/json"},
params=send_params,
json=vm_detail,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send config: {e}",
f"Failed to send config: {response.json()['message']}",
)
return False
@ -3548,17 +3547,16 @@ def vm_worker_send_snapshot(
buffer[i],
"application/octet-stream",
)
try:
response = session.put(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
files=files,
stream=True,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send diff batch ({e}): {response.json()['message']}",
f"Failed to send diff batch: {response.json()['message']}",
)
return False
@ -3655,8 +3653,7 @@ def vm_worker_send_snapshot(
params=send_params,
data=full_chunker(),
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to send snapshot: {response.json()['message']}",
@ -3677,8 +3674,7 @@ def vm_worker_send_snapshot(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
params=send_params,
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to send snapshot: {response.json()['message']}",
@ -3983,18 +3979,17 @@ def vm_worker_create_mirror(
"snapshot": snapshot_name,
"source_snapshot": incremental_parent,
}
try:
response = session.post(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/config",
headers={"Content-Type": "application/json"},
params=send_params,
json=vm_detail,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send config: {e}",
f"Failed to send config: {response.json()['message']}",
)
return False
@ -4142,17 +4137,16 @@ def vm_worker_create_mirror(
buffer[i],
"application/octet-stream",
)
try:
response = session.put(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
files=files,
stream=True,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send diff batch ({e}): {response.json()['message']}",
f"Failed to send diff batch: {response.json()['message']}",
)
return False
@ -4249,8 +4243,7 @@ def vm_worker_create_mirror(
params=send_params,
data=full_chunker(),
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to create mirror: {response.json()['message']}",
@ -4271,8 +4264,7 @@ def vm_worker_create_mirror(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
params=send_params,
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to create mirror: {response.json()['message']}",
@ -4610,18 +4602,17 @@ def vm_worker_promote_mirror(
"snapshot": snapshot_name,
"source_snapshot": incremental_parent,
}
try:
response = session.post(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/config",
headers={"Content-Type": "application/json"},
params=send_params,
json=vm_detail,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send config: {e}",
f"Failed to send config: {response.json()['message']}",
)
return False
@ -4769,17 +4760,16 @@ def vm_worker_promote_mirror(
buffer[i],
"application/octet-stream",
)
try:
response = session.put(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
files=files,
stream=True,
)
response.raise_for_status()
except Exception as e:
if response.status_code != 200:
fail(
celery,
f"Failed to send diff batch ({e}): {response.json()['message']}",
f"Failed to send diff batch: {response.json()['message']}",
)
return False
@ -4876,8 +4866,7 @@ def vm_worker_promote_mirror(
params=send_params,
data=full_chunker(),
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to promote mirror: {response.json()['message']}",
@ -4898,8 +4887,7 @@ def vm_worker_promote_mirror(
f"{destination_api_uri}/vm/{vm_name}/snapshot/receive/block",
params=send_params,
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to promote mirror: {response.json()['message']}",
@ -4929,14 +4917,12 @@ def vm_worker_promote_mirror(
total=total_stages,
)
try:
response = session.post(
f"{destination_api_uri}/vm/{vm_name}/state",
headers={"Content-Type": "application/octet-stream"},
params={"state": previous_vm_state, "wait": True, "force": True},
)
response.raise_for_status()
except Exception:
if response.status_code != 200:
fail(
celery,
f"Failed to promote mirror: {response.json()['message']}",

View File

@ -30,7 +30,8 @@ from kazoo.client import KazooClient, KazooState
from kazoo.exceptions import NoNodeError
SCHEMA_ROOT_PATH = "daemon_lib/migrations/versions"
DEFAULT_ROOT_PATH = "/usr/share/pvc"
SCHEMA_PATH = "daemon_lib/migrations/versions"
#
@ -832,8 +833,8 @@ class ZKSchema(object):
def schema(self, schema):
self._schema = schema
def __init__(self):
pass
def __init__(self, root_path=DEFAULT_ROOT_PATH):
self.schema_path = f"{root_path}/{SCHEMA_PATH}"
def __repr__(self):
return f"ZKSchema({self.version})"
@ -873,7 +874,7 @@ class ZKSchema(object):
if not quiet:
print(f"Loading schema version {version}")
with open(f"{SCHEMA_ROOT_PATH}/{version}.json", "r") as sfh:
with open(f"{self.schema_path}/{version}.json", "r") as sfh:
self.schema = json.load(sfh)
self.version = self.schema.get("version")
@ -1135,7 +1136,7 @@ class ZKSchema(object):
# Migrate from older to newer schema
def migrate(self, zkhandler, new_version):
# Determine the versions in between
versions = ZKSchema.find_all(start=self.version, end=new_version)
versions = self.find_all(start=self.version, end=new_version)
if versions is None:
return
@ -1151,7 +1152,7 @@ class ZKSchema(object):
# Rollback from newer to older schema
def rollback(self, zkhandler, old_version):
# Determine the versions in between
versions = ZKSchema.find_all(start=old_version - 1, end=self.version - 1)
versions = self.find_all(start=old_version - 1, end=self.version - 1)
if versions is None:
return
@ -1166,6 +1167,12 @@ class ZKSchema(object):
# Apply those changes
self.run_migrate(zkhandler, changes)
# Write the latest schema to a file
def write(self):
schema_file = f"{self.schema_path}/{self._version}.json"
with open(schema_file, "w") as sfh:
json.dump(self._schema, sfh)
@classmethod
def key_diff(cls, schema_a, schema_b):
# schema_a = current
@ -1211,26 +1218,10 @@ class ZKSchema(object):
return {"add": diff_add, "remove": diff_remove, "rename": diff_rename}
# Load in the schemal of the current cluster
@classmethod
def load_current(cls, zkhandler):
new_instance = cls()
version = new_instance.get_version(zkhandler)
new_instance.load(version)
return new_instance
# Write the latest schema to a file
@classmethod
def write(cls):
schema_file = f"{SCHEMA_ROOT_PATH}/{cls._version}.json"
with open(schema_file, "w") as sfh:
json.dump(cls._schema, sfh)
# Static methods for reading information from the files
@staticmethod
def find_all(start=0, end=None):
def find_all(self, start=0, end=None):
versions = list()
for version in os.listdir(SCHEMA_ROOT_PATH):
for version in os.listdir(self.schema_path):
sequence_id = int(version.split(".")[0])
if end is None:
if sequence_id > start:
@ -1243,11 +1234,18 @@ class ZKSchema(object):
else:
return None
@staticmethod
def find_latest():
def find_latest(self):
latest_version = 0
for version in os.listdir(SCHEMA_ROOT_PATH):
for version in os.listdir(self.schema_path):
sequence_id = int(version.split(".")[0])
if sequence_id > latest_version:
latest_version = sequence_id
return latest_version
# Load in the schema of the current cluster
@classmethod
def load_current(cls, zkhandler):
new_instance = cls()
version = new_instance.get_version(zkhandler)
new_instance.load(version)
return new_instance

File diff suppressed because it is too large Load Diff

View File

@ -15,7 +15,7 @@
"type": "grafana",
"id": "grafana",
"name": "Grafana",
"version": "10.2.2"
"version": "11.1.4"
},
{
"type": "datasource",
@ -112,6 +112,7 @@
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -119,10 +120,11 @@
"fields": "/^pvc_cluster_id$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -144,7 +146,6 @@
}
],
"title": "Cluster",
"transformations": [],
"type": "stat"
},
{
@ -187,6 +188,7 @@
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -194,10 +196,11 @@
"fields": "/^vm$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -219,7 +222,6 @@
}
],
"title": "VM Name",
"transformations": [],
"type": "stat"
},
{
@ -301,6 +303,21 @@
"color": "dark-red",
"index": 8,
"text": "fail"
},
"9": {
"color": "dark-blue",
"index": 9,
"text": "import"
},
"10": {
"color": "dark-blue",
"index": 10,
"text": "restore"
},
"99": {
"color": "dark-purple",
"index": 11,
"text": "mirror"
}
},
"type": "value"
@ -323,6 +340,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -330,10 +348,11 @@
"fields": "/^Value$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -355,7 +374,6 @@
}
],
"title": "State",
"transformations": [],
"type": "stat"
},
{
@ -398,6 +416,7 @@
"graphMode": "area",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -405,10 +424,11 @@
"fields": "/^uuid$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -430,7 +450,6 @@
}
],
"title": "UUID",
"transformations": [],
"type": "stat"
},
{
@ -473,6 +492,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -480,10 +500,11 @@
"fields": "/^node$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -505,7 +526,6 @@
}
],
"title": "Active Node",
"transformations": [],
"type": "stat"
},
{
@ -545,6 +565,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -552,10 +573,11 @@
"fields": "/^last_node$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -577,7 +599,6 @@
}
],
"title": "Migrated",
"transformations": [],
"type": "stat"
},
{
@ -646,6 +667,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -653,10 +675,11 @@
"fields": "/^Value$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -678,7 +701,6 @@
}
],
"title": "Autostart",
"transformations": [],
"type": "stat"
},
{
@ -721,6 +743,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -728,10 +751,11 @@
"fields": "/^description$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -753,7 +777,6 @@
}
],
"title": "Description",
"transformations": [],
"type": "stat"
},
{
@ -796,6 +819,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -803,10 +827,11 @@
"fields": "/^Value$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -828,7 +853,6 @@
}
],
"title": "vCPUs",
"transformations": [],
"type": "stat"
},
{
@ -871,6 +895,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -878,10 +903,11 @@
"fields": "/^topology$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -903,7 +929,6 @@
}
],
"title": "vCPU Topology",
"transformations": [],
"type": "stat"
},
{
@ -947,6 +972,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -954,10 +980,11 @@
"fields": "/^Value$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -979,7 +1006,6 @@
}
],
"title": "vRAM",
"transformations": [],
"type": "stat"
},
{
@ -1022,6 +1048,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -1029,10 +1056,11 @@
"fields": "/^node_limit$/",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -1054,7 +1082,6 @@
}
],
"title": "Node Limits",
"transformations": [],
"type": "stat"
},
{
@ -1097,6 +1124,7 @@
"graphMode": "none",
"justifyMode": "auto",
"orientation": "auto",
"percentChangeColorMode": "standard",
"reduceOptions": {
"calcs": [
"lastNotNull"
@ -1104,10 +1132,11 @@
"fields": "failed_reason",
"values": false
},
"showPercentChange": false,
"textMode": "auto",
"wideLayout": true
},
"pluginVersion": "10.2.2",
"pluginVersion": "11.1.4",
"targets": [
{
"datasource": {
@ -1129,11 +1158,10 @@
}
],
"title": "Failure Reason",
"transformations": [],
"type": "stat"
},
{
"collapsed": true,
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
@ -1141,7 +1169,10 @@
"y": 10
},
"id": 14,
"panels": [
"panels": [],
"title": "CPU & Memory Stats",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
@ -1664,21 +1695,20 @@
],
"title": "Swap Utilization (+ in/- out)",
"type": "timeseries"
}
],
"title": "CPU & Memory Stats",
"type": "row"
},
{
"collapsed": true,
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 11
"y": 27
},
"id": 19,
"panels": [
"panels": [],
"title": "NIC Stats",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
@ -1727,8 +1757,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
},
{
"color": "red",
@ -1757,7 +1786,7 @@
"h": 10,
"w": 24,
"x": 0,
"y": 12
"y": 28
},
"id": 20,
"options": {
@ -1864,8 +1893,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
},
{
"color": "red",
@ -1894,7 +1922,7 @@
"h": 10,
"w": 24,
"x": 0,
"y": 22
"y": 38
},
"id": 21,
"options": {
@ -2001,8 +2029,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
}
]
},
@ -2027,7 +2054,7 @@
"h": 8,
"w": 12,
"x": 0,
"y": 32
"y": 48
},
"id": 22,
"options": {
@ -2134,8 +2161,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
}
]
},
@ -2160,7 +2186,7 @@
"h": 8,
"w": 12,
"x": 12,
"y": 32
"y": 48
},
"id": 23,
"options": {
@ -2218,21 +2244,20 @@
],
"title": "Errors (+ RX/- TX)",
"type": "timeseries"
}
],
"title": "NIC Stats",
"type": "row"
},
{
"collapsed": true,
"collapsed": false,
"gridPos": {
"h": 1,
"w": 24,
"x": 0,
"y": 12
"y": 56
},
"id": 24,
"panels": [
"panels": [],
"title": "Disk Stats",
"type": "row"
},
{
"datasource": {
"type": "prometheus",
@ -2281,8 +2306,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
},
{
"color": "red",
@ -2311,7 +2335,7 @@
"h": 9,
"w": 24,
"x": 0,
"y": 13
"y": 57
},
"id": 25,
"options": {
@ -2368,7 +2392,6 @@
}
],
"title": "IOPS (+ Read/- Write)",
"transformations": [],
"type": "timeseries"
},
{
@ -2419,8 +2442,7 @@
"mode": "absolute",
"steps": [
{
"color": "green",
"value": null
"color": "green"
},
{
"color": "red",
@ -2449,7 +2471,7 @@
"h": 9,
"w": 24,
"x": 0,
"y": 22
"y": 66
},
"id": 26,
"options": {
@ -2509,12 +2531,8 @@
"type": "timeseries"
}
],
"title": "Disk Stats",
"type": "row"
}
],
"refresh": "5s",
"schemaVersion": 38,
"schemaVersion": 39,
"tags": [
"pvc"
],