ops/monitoring: pull in grafonnet-7.0

Change-Id: Ie036ef767419418876a18255a5ad378f5cfa1535
diff --git a/ops/monitoring/lib/grafonnet/dashboard.libsonnet b/ops/monitoring/lib/grafonnet/dashboard.libsonnet
new file mode 100644
index 0000000..28dc13a
--- /dev/null
+++ b/ops/monitoring/lib/grafonnet/dashboard.libsonnet
@@ -0,0 +1,85 @@
+// This file was generated by https://github.com/grafana/dashboard-spec
+
+{
+  new(
+    description=null,
+    editable=true,
+    graphTooltip=0,
+    refresh=null,
+    schemaVersion=25,
+    style='dark',
+    tags=[],
+    timezone=null,
+    title=null,
+    uid=null,
+  ):: {
+    [if description != null then 'description']: description,
+    [if editable != null then 'editable']: editable,
+    [if graphTooltip != null then 'graphTooltip']: graphTooltip,
+    [if refresh != null then 'refresh']: refresh,
+    [if schemaVersion != null then 'schemaVersion']: schemaVersion,
+    [if style != null then 'style']: style,
+    [if tags != null then 'tags']: tags,
+    [if timezone != null then 'timezone']: timezone,
+    [if title != null then 'title']: title,
+    [if uid != null then 'uid']: uid,
+
+    setTime(
+      from='now-6h',
+      to='now',
+    ):: self {}
+        + { time+: { [if from != null then 'from']: from } }
+        + { time+: { [if to != null then 'to']: to } }
+    ,
+
+    setTimepicker(
+      refreshIntervals=['5s', '10s', '30s', '1m', '5m', '15m', '30m', '1h', '2h', '1d'],
+    ):: self {}
+        + { timepicker+: { [if refreshIntervals != null then 'refresh_intervals']: refreshIntervals } }
+    ,
+
+
+    addTemplate(
+      template
+    ):: self {}
+        + { templating+: { list+: [
+          template,
+        ] } },
+
+    addAnnotation(
+      builtIn=0,
+      datasource='default',
+      enable=true,
+      hide=false,
+      iconColor=null,
+      name=null,
+      rawQuery=null,
+      showIn=0,
+    ):: self {}
+        + { annotations+: { list+: [
+          {
+            [if builtIn != null then 'builtIn']: builtIn,
+            [if datasource != null then 'datasource']: datasource,
+            [if enable != null then 'enable']: enable,
+            [if hide != null then 'hide']: hide,
+            [if iconColor != null then 'iconColor']: iconColor,
+            [if name != null then 'name']: name,
+            [if rawQuery != null then 'rawQuery']: rawQuery,
+            [if showIn != null then 'showIn']: showIn,
+          },
+        ] } },
+
+
+    panels: [],
+    _nextPanelID:: 2,
+    addPanel(panel):: self {
+      local nextPanelID = super._nextPanelID,
+      panels+: [
+        panel { id: nextPanelID } +
+        if 'panels' in panel then { panels: std.mapWithIndex(function(i, p) p { id: nextPanelID + i + 1 }, panel.panels) } else {},
+      ],
+      _nextPanelID:: nextPanelID + 1 + (if 'panels' in panel then std.length(panel.panels) else 0),
+    },
+    addPanels(panels):: std.foldl(function(d, p) d.addPanel(p), panels, self),
+  },
+}