- Updated Nov 15 2021, 4:07:32 pm
+ {{#if @timestamp}}
+ Updated
+ {{date-format @timestamp "MMM d yyyy, h:mm:ss aaa"}}
+ {{/if}}
diff --git a/ui/app/templates/components/clients/vertical-bar-chart.hbs b/ui/app/templates/components/clients/vertical-bar-chart.hbs
index 185e3e58c2998..d3292e0afa92f 100644
--- a/ui/app/templates/components/clients/vertical-bar-chart.hbs
+++ b/ui/app/templates/components/clients/vertical-bar-chart.hbs
@@ -3,6 +3,7 @@
class="chart has-grid"
{{on "mouseleave" this.removeTooltip}}
{{did-insert this.registerListener @dataset}}
+ {{did-update this.renderChart @dataset}}
>
@@ -21,8 +22,8 @@
}}
{{/modal-dialog}}
diff --git a/ui/lib/core/addon/utils/date-formatters.js b/ui/lib/core/addon/utils/date-formatters.js
new file mode 100644
index 0000000000000..c1cb5ac2183fc
--- /dev/null
+++ b/ui/lib/core/addon/utils/date-formatters.js
@@ -0,0 +1,20 @@
+import { format, parseISO } from 'date-fns';
+
+// convert RFC3339 timestamp ( '2021-03-21T00:00:00Z' ) to date object, optionally format
+export const parseAPITimestamp = (timestamp, style) => {
+ if (!timestamp) return;
+ let date = parseISO(timestamp.split('T')[0]);
+ if (!style) return date;
+ return format(date, style);
+};
+
+// convert ISO timestamp '2021-03-21T00:00:00Z' to ['2021', 2]
+// (e.g. 2021 March, month is zero indexed) (used by calendar widget)
+export const parseRFC3339 = (timestamp) => {
+ if (Array.isArray(timestamp)) {
+ // return if already formatted correctly
+ return timestamp;
+ }
+ let date = parseAPITimestamp(timestamp);
+ return date ? [`${date.getFullYear()}`, date.getMonth()] : null;
+};
diff --git a/ui/mirage/handlers/clients.js b/ui/mirage/handlers/clients.js
index fda9813f00984..acccab50dcd87 100644
--- a/ui/mirage/handlers/clients.js
+++ b/ui/mirage/handlers/clients.js
@@ -1,4 +1,5 @@
-import { formatISO, isBefore, sub } from 'date-fns';
+import { differenceInCalendarMonths, formatISO, formatRFC3339, isBefore, sub } from 'date-fns';
+import { parseAPITimestamp } from 'core/utils/date-formatters';
export default function (server) {
// 1.10 API response
@@ -47,7 +48,7 @@ export default function (server) {
],
license_id: '060d7820-fa59-f95c-832b-395db0aeb9ba',
performance_standby_count: 9999,
- start_time: '2021-05-17T00:00:00Z',
+ start_time: '2021-01-17T00:00:00Z',
},
persisted_autoload: {
expiration_time: '2022-05-17T23:59:59.999Z',
@@ -70,7 +71,7 @@ export default function (server) {
],
license_id: '060d7820-fa59-f95c-832b-395db0aeb9ba',
performance_standby_count: 9999,
- start_time: '2021-05-17T00:00:00Z',
+ start_time: '2021-01-17T00:00:00Z',
},
},
};
@@ -91,181 +92,97 @@ export default function (server) {
server.get('/sys/internal/counters/activity', (schema, req) => {
const { start_time, end_time } = req.queryParams;
// fake client counting start date so warning shows if user queries earlier start date
- const counts_start = '2020-10-17T00:00:00Z';
- return {
- request_id: '25f55fbb-f253-9c46-c6f0-3cdd3ada91ab',
- lease_id: '',
- renewable: false,
- lease_duration: 0,
- data: {
- by_namespace: [
- {
- namespace_id: '96OwG',
- namespace_path: 'test-ns/',
- counts: {
- distinct_entities: 18290,
- entity_clients: 18290,
- non_entity_tokens: 18738,
- non_entity_clients: 18738,
- clients: 37028,
- },
- mounts: [
- {
- mount_path: 'path-1',
- counts: {
- distinct_entities: 6403,
- entity_clients: 6403,
- non_entity_tokens: 6300,
- non_entity_clients: 6300,
- clients: 12703,
- },
- },
- {
- mount_path: 'path-2',
- counts: {
- distinct_entities: 5699,
- entity_clients: 5699,
- non_entity_tokens: 6777,
- non_entity_clients: 6777,
- clients: 12476,
- },
- },
- {
- mount_path: 'path-3',
- counts: {
- distinct_entities: 6188,
- entity_clients: 6188,
- non_entity_tokens: 5661,
- non_entity_clients: 5661,
- clients: 11849,
- },
- },
- ],
- },
+ const counts_start = '2020-12-31T00:00:00Z';
+ const mockMonthlyData = [
+ {
+ timestamp: '2021-10-01T00:00:00Z',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 20,
+ non_entity_tokens: 0,
+ non_entity_clients: 20,
+ clients: 40,
+ },
+ namespaces: [
{
namespace_id: 'root',
namespace_path: '',
counts: {
- distinct_entities: 19099,
- entity_clients: 19099,
- non_entity_tokens: 17781,
- non_entity_clients: 17781,
- clients: 36880,
+ distinct_entities: 0,
+ entity_clients: 8,
+ non_entity_tokens: 0,
+ non_entity_clients: 7,
+ clients: 15,
},
mounts: [
{
- mount_path: 'path-3',
+ mount_path: 'auth/up2/',
counts: {
- distinct_entities: 6863,
- entity_clients: 6863,
- non_entity_tokens: 6801,
- non_entity_clients: 6801,
- clients: 13664,
- },
- },
- {
- mount_path: 'path-2',
- counts: {
- distinct_entities: 6047,
- entity_clients: 6047,
- non_entity_tokens: 5957,
- non_entity_clients: 5957,
- clients: 12004,
+ distinct_entities: 0,
+ entity_clients: 8,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 8,
},
},
{
- mount_path: 'path-1',
+ mount_path: 'auth/up1/',
counts: {
- distinct_entities: 6189,
- entity_clients: 6189,
- non_entity_tokens: 5023,
- non_entity_clients: 5023,
- clients: 11212,
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
+ non_entity_clients: 7,
+ clients: 7,
},
},
],
},
- ],
- end_time: end_time || formatISO(sub(new Date(), { months: 1 })),
- months: [
{
- timestamp: '2021-05-01T00:00:00Z',
+ namespace_id: 's07UR',
+ namespace_path: 'ns1/',
counts: {
distinct_entities: 0,
- entity_clients: 13,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 12,
- clients: 25,
+ non_entity_clients: 5,
+ clients: 10,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 8,
+ entity_clients: 0,
non_entity_tokens: 0,
- non_entity_clients: 7,
- clients: 15,
- },
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 8,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 8,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 7,
- clients: 7,
- },
- },
- ],
+ non_entity_clients: 5,
+ clients: 5,
+ },
},
{
- namespace_id: 's07UR',
- namespace_path: 'ns1/',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 10,
- },
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 5,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 5,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 5,
- },
- },
- ],
+ non_entity_clients: 0,
+ clients: 5,
+ },
},
],
- new_clients: {
+ },
+ ],
+ new_clients: {
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 3,
+ non_entity_tokens: 0,
+ non_entity_clients: 2,
+ clients: 5,
+ },
+ namespaces: [
+ {
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
entity_clients: 3,
@@ -273,342 +190,342 @@ export default function (server) {
non_entity_clients: 2,
clients: 5,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 3,
non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
non_entity_clients: 2,
- clients: 5,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 3,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 2,
- clients: 2,
- },
- },
- ],
},
],
},
- },
+ ],
+ },
+ },
+ {
+ timestamp: '2021-09-01T00:00:00Z',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 17,
+ non_entity_tokens: 0,
+ non_entity_clients: 18,
+ clients: 35,
+ },
+ namespaces: [
{
- timestamp: '2021-04-01T00:00:00Z',
+ namespace_id: 'oImjk',
+ namespace_path: 'ns2/',
counts: {
distinct_entities: 0,
- entity_clients: 10,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 10,
- clients: 20,
+ non_entity_clients: 5,
+ clients: 10,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'oImjk',
- namespace_path: 'ns2/',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 5,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 5,
- clients: 10,
- },
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 5,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 5,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 5,
- },
- },
- ],
+ clients: 5,
+ },
},
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 3,
+ non_entity_clients: 0,
clients: 5,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
+ },
+ ],
+ },
+ {
+ namespace_id: 'root',
+ namespace_path: '',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ mounts: [
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 3,
+ },
},
{
- namespace_id: 's07UR',
- namespace_path: 'ns1/',
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
+ },
+ },
+ ],
+ },
+ {
+ namespace_id: 's07UR',
+ namespace_path: 'ns1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 3,
+ non_entity_tokens: 0,
+ non_entity_clients: 2,
+ clients: 5,
+ },
+ mounts: [
+ {
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 3,
non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
non_entity_clients: 2,
- clients: 5,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 3,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 2,
- clients: 2,
- },
- },
- ],
},
],
- new_clients: {
+ },
+ ],
+ new_clients: {
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 10,
+ non_entity_tokens: 0,
+ non_entity_clients: 10,
+ clients: 20,
+ },
+ namespaces: [
+ {
+ namespace_id: 'oImjk',
+ namespace_path: 'ns2/',
counts: {
distinct_entities: 0,
- entity_clients: 10,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 10,
- clients: 20,
+ non_entity_clients: 5,
+ clients: 10,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'oImjk',
- namespace_path: 'ns2/',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 5,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 5,
- clients: 10,
+ clients: 5,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 5,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 5,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 5,
- },
- },
- ],
},
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 3,
+ non_entity_clients: 0,
clients: 5,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
},
+ ],
+ },
+ {
+ namespace_id: 'root',
+ namespace_path: '',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ mounts: [
{
- namespace_id: 's07UR',
- namespace_path: 'ns1/',
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
+ },
+ },
+ ],
+ },
+ {
+ namespace_id: 's07UR',
+ namespace_path: 'ns1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 3,
+ non_entity_tokens: 0,
+ non_entity_clients: 2,
+ clients: 5,
+ },
+ mounts: [
+ {
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 3,
non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
non_entity_clients: 2,
- clients: 5,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 3,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 2,
- clients: 2,
- },
- },
- ],
},
],
},
- },
+ ],
+ },
+ },
+ {
+ timestamp: '2021-08-01T00:00:00Z',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 7,
+ non_entity_tokens: 0,
+ non_entity_clients: 8,
+ clients: 15,
+ },
+ namespaces: [
{
- timestamp: '2021-03-01T00:00:00Z',
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
- entity_clients: 7,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 8,
- clients: 15,
+ non_entity_clients: 5,
+ clients: 10,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 5,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 5,
- clients: 10,
- },
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 5,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 5,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 5,
- },
- },
- ],
+ clients: 5,
+ },
},
{
- namespace_id: 's07UR',
- namespace_path: 'ns1/',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 5,
non_entity_tokens: 0,
- non_entity_clients: 3,
+ non_entity_clients: 0,
clients: 5,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
},
],
- new_clients: {
+ },
+ {
+ namespace_id: 's07UR',
+ namespace_path: 'ns1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ mounts: [
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
+ },
+ },
+ ],
+ },
+ ],
+ new_clients: {
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ namespaces: [
+ {
+ namespace_id: 's07UR',
+ namespace_path: 'ns1/',
counts: {
distinct_entities: 0,
entity_clients: 2,
@@ -616,45 +533,45 @@ export default function (server) {
non_entity_clients: 3,
clients: 5,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 's07UR',
- namespace_path: 'ns1/',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 3,
- clients: 5,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
},
],
},
- },
+ ],
+ },
+ },
+ {
+ timestamp: '2021-07-01T00:00:00Z',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 5,
+ non_entity_tokens: 0,
+ non_entity_clients: 5,
+ clients: 10,
+ },
+ namespaces: [
{
- timestamp: '2021-02-01T00:00:00Z',
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
entity_clients: 5,
@@ -662,42 +579,42 @@ export default function (server) {
non_entity_clients: 5,
clients: 10,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 5,
non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 5,
+ },
+ },
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
non_entity_clients: 5,
- clients: 10,
- },
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 5,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 5,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 5,
- clients: 5,
- },
- },
- ],
+ clients: 5,
+ },
},
],
- new_clients: {
+ },
+ ],
+ new_clients: {
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 3,
+ non_entity_tokens: 0,
+ non_entity_clients: 2,
+ clients: 5,
+ },
+ namespaces: [
+ {
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
entity_clients: 3,
@@ -705,45 +622,45 @@ export default function (server) {
non_entity_clients: 2,
clients: 5,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up2/',
counts: {
distinct_entities: 0,
entity_clients: 3,
non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up1/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_tokens: 0,
non_entity_clients: 2,
- clients: 5,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 3,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 2,
- clients: 2,
- },
- },
- ],
},
],
},
- },
+ ],
+ },
+ },
+ {
+ timestamp: '2021-06-01T00:00:00Z',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ namespaces: [
{
- timestamp: '2021-01-01T00:00:00Z',
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
entity_clients: 2,
@@ -751,42 +668,42 @@ export default function (server) {
non_entity_clients: 3,
clients: 5,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 3,
- clients: 5,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
},
],
- new_clients: {
+ },
+ ],
+ new_clients: {
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 3,
+ clients: 5,
+ },
+ namespaces: [
+ {
+ namespace_id: 'root',
+ namespace_path: '',
counts: {
distinct_entities: 0,
entity_clients: 2,
@@ -794,44 +711,162 @@ export default function (server) {
non_entity_clients: 3,
clients: 5,
},
- namespaces: [
+ mounts: [
{
- namespace_id: 'root',
- namespace_path: '',
+ mount_path: 'auth/up1/',
counts: {
distinct_entities: 0,
- entity_clients: 2,
+ entity_clients: 0,
non_entity_tokens: 0,
non_entity_clients: 3,
- clients: 5,
+ clients: 3,
+ },
+ },
+ {
+ mount_path: 'auth/up2/',
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 2,
+ non_entity_tokens: 0,
+ non_entity_clients: 0,
+ clients: 2,
},
- mounts: [
- {
- mount_path: 'auth/up1/',
- counts: {
- distinct_entities: 0,
- entity_clients: 0,
- non_entity_tokens: 0,
- non_entity_clients: 3,
- clients: 3,
- },
- },
- {
- mount_path: 'auth/up2/',
- counts: {
- distinct_entities: 0,
- entity_clients: 2,
- non_entity_tokens: 0,
- non_entity_clients: 0,
- clients: 2,
- },
- },
- ],
},
],
},
+ ],
+ },
+ },
+ ];
+ const addMonthsWithoutData = (queryStartTimestamp, monthlyData) => {
+ const queryDate = parseAPITimestamp(queryStartTimestamp);
+ const startDateByMonth = parseAPITimestamp(monthlyData[monthlyData.length - 1].timestamp);
+ const transformedMonthlyArray = [...monthlyData];
+ if (isBefore(queryDate, startDateByMonth)) {
+ // no data for months before (upgraded to 1.10 during billing period)
+ let i = 0;
+ do {
+ i++;
+ let timestamp = formatRFC3339(sub(startDateByMonth, { months: i }));
+ transformedMonthlyArray.push({
+ timestamp,
+ counts: {
+ distinct_entities: 0,
+ entity_clients: 0,
+ non_entity_clients: 0,
+ clients: 0,
+ },
+ namespaces: [],
+ new_clients: {
+ counts: {
+ entity_clients: 0,
+ non_entity_clients: 0,
+ clients: 0,
+ },
+ namespaces: [],
+ },
+ });
+ } while (i < differenceInCalendarMonths(startDateByMonth, queryDate));
+ }
+ return transformedMonthlyArray;
+ };
+ let mockQueriedMonths = addMonthsWithoutData(start_time, mockMonthlyData);
+ return {
+ request_id: '25f55fbb-f253-9c46-c6f0-3cdd3ada91ab',
+ lease_id: '',
+ renewable: false,
+ lease_duration: 0,
+ data: {
+ by_namespace: [
+ {
+ namespace_id: '96OwG',
+ namespace_path: 'test-ns/',
+ counts: {
+ distinct_entities: 18290,
+ entity_clients: 18290,
+ non_entity_tokens: 18738,
+ non_entity_clients: 18738,
+ clients: 37028,
+ },
+ mounts: [
+ {
+ mount_path: 'path-1',
+ counts: {
+ distinct_entities: 6403,
+ entity_clients: 6403,
+ non_entity_tokens: 6300,
+ non_entity_clients: 6300,
+ clients: 12703,
+ },
+ },
+ {
+ mount_path: 'path-2',
+ counts: {
+ distinct_entities: 5699,
+ entity_clients: 5699,
+ non_entity_tokens: 6777,
+ non_entity_clients: 6777,
+ clients: 12476,
+ },
+ },
+ {
+ mount_path: 'path-3',
+ counts: {
+ distinct_entities: 6188,
+ entity_clients: 6188,
+ non_entity_tokens: 5661,
+ non_entity_clients: 5661,
+ clients: 11849,
+ },
+ },
+ ],
+ },
+ {
+ namespace_id: 'root',
+ namespace_path: '',
+ counts: {
+ distinct_entities: 19099,
+ entity_clients: 19099,
+ non_entity_tokens: 17781,
+ non_entity_clients: 17781,
+ clients: 36880,
+ },
+ mounts: [
+ {
+ mount_path: 'path-3',
+ counts: {
+ distinct_entities: 6863,
+ entity_clients: 6863,
+ non_entity_tokens: 6801,
+ non_entity_clients: 6801,
+ clients: 13664,
+ },
+ },
+ {
+ mount_path: 'path-2',
+ counts: {
+ distinct_entities: 6047,
+ entity_clients: 6047,
+ non_entity_tokens: 5957,
+ non_entity_clients: 5957,
+ clients: 12004,
+ },
+ },
+ {
+ mount_path: 'path-1',
+ counts: {
+ distinct_entities: 6189,
+ entity_clients: 6189,
+ non_entity_tokens: 5023,
+ non_entity_clients: 5023,
+ clients: 11212,
+ },
+ },
+ ],
},
],
+ end_time: end_time || formatISO(sub(new Date(), { months: 1 })),
+ months: mockQueriedMonths || mockMonthlyData,
start_time: isBefore(new Date(start_time), new Date(counts_start)) ? counts_start : start_time,
total: {
distinct_entities: 37389,
diff --git a/ui/tests/acceptance/client-history-test.js b/ui/tests/acceptance/client-history-test.js
index 5adc61ef28923..19c4b1006ddba 100644
--- a/ui/tests/acceptance/client-history-test.js
+++ b/ui/tests/acceptance/client-history-test.js
@@ -1,5 +1,5 @@
import { module, test } from 'qunit';
-import { visit, currentURL, click, settled, waitUntil, find } from '@ember/test-helpers';
+import { visit, currentURL, click, settled, find } from '@ember/test-helpers';
import { setupApplicationTest } from 'ember-qunit';
import Pretender from 'pretender';
import authPage from 'vault/tests/pages/auth';
@@ -196,7 +196,7 @@ module('Acceptance | clients history tab', function (hooks) {
assert.dom('[data-test-stat-text="total-clients"] .stat-value').hasText('15');
assert.dom('[data-test-stat-text="entity-clients"] .stat-value').hasText('5');
assert.dom('[data-test-stat-text="non-entity-clients"] .stat-value').hasText('10');
- await waitUntil(() => find('[data-test-horizontal-bar-chart]'));
+ await settled();
assert.dom('[data-test-horizontal-bar-chart]').exists('Shows attribution bar chart');
assert.dom('[data-test-top-attribution]').includesText('Top auth method');