Compare commits
280
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e4ab7d881 | ||
|
|
859a3fdd83 | ||
|
|
b1568aa30f | ||
|
|
a46b44b13f | ||
|
|
59dee87141 | ||
|
|
f1a20ea33d | ||
|
|
4a5e72d77b | ||
|
|
87a6d839e7 | ||
|
|
1b449bdea4 | ||
|
|
1ba0c873e9 | ||
|
|
f8e7ec7f5f | ||
|
|
4d4affe6d7 | ||
|
|
b13befaff2 | ||
|
|
3836656042 | ||
|
|
55e3284e3f | ||
|
|
27a416001b | ||
|
|
43a41d6818 | ||
|
|
b17088803f | ||
|
|
5eb9d01b23 | ||
|
|
288a38f6ea | ||
|
|
e7724ab8a5 | ||
|
|
e7c7d2b280 | ||
|
|
80abe240b4 | ||
|
|
6960aaeffc | ||
|
|
deb8871060 | ||
|
|
ba671b4ab3 | ||
|
|
bd3a4935a4 | ||
|
|
13ce61218c | ||
|
|
fa2e1021c5 | ||
|
|
c213ee18b2 | ||
|
|
43c667729f | ||
|
|
26e6cc8a9b | ||
|
|
5d57c8dd25 | ||
|
|
f31a93085a | ||
|
|
1927ef7832 | ||
|
|
fd53f7b282 | ||
|
|
eaaeed6d1b | ||
|
|
8f8566548a | ||
|
|
40e12366e6 | ||
|
|
39ea49ccdf | ||
|
|
a69dfa251a | ||
|
|
906a336acb | ||
|
|
9c9988a305 | ||
|
|
1a901b15d2 | ||
|
|
e894dbc4e8 | ||
|
|
18e95435f5 | ||
|
|
e2154f9698 | ||
|
|
d27ddb1eee | ||
|
|
8d3aea2e23 | ||
|
|
4d47b3cf51 | ||
|
|
b741d3af16 | ||
|
|
92cf57a542 | ||
|
|
aa6d369514 | ||
|
|
1ed685d81f | ||
|
|
586a4dbe23 | ||
|
|
f858da88f2 | ||
|
|
5f342a0ee8 | ||
|
|
3468acce39 | ||
|
|
b0a93e2e2d | ||
|
|
c2b66b74eb | ||
|
|
32ec1f0f70 | ||
|
|
e539a86600 | ||
|
|
efcdd0701e | ||
|
|
9ab9800f7e | ||
|
|
4336fde21b | ||
|
|
4cb7985ac1 | ||
|
|
04726a61da | ||
|
|
53270519cb | ||
|
|
5105d80a9d | ||
|
|
53423739d3 | ||
|
|
f782d90a7e | ||
|
|
721d09899a | ||
|
|
d1303c7bca | ||
|
|
31682ffd85 | ||
|
|
b5a791d618 | ||
|
|
e110f33e40 | ||
|
|
68bf02ee25 | ||
|
|
063d643d76 | ||
|
|
b6818871fc | ||
|
|
1effa79c93 | ||
|
|
6fd075f7e8 | ||
|
|
0d8508cd4e | ||
|
|
f3bd8d0b6f | ||
|
|
8889e86cec | ||
|
|
6500d56273 | ||
|
|
80cffeb48b | ||
|
|
263c8c01e9 | ||
|
|
74531f5d85 | ||
|
|
e0eed2b4ea | ||
|
|
c9df20184a | ||
|
|
afa1deef94 | ||
|
|
5d04dca21e | ||
|
|
746f45b6da | ||
|
|
a62d36af92 | ||
|
|
a41572302a | ||
|
|
2138aa8b01 | ||
|
|
4ea53c9cc7 | ||
|
|
c4e5a4c121 | ||
|
|
e5544415b0 | ||
|
|
ce84d2405c | ||
|
|
b07c90ee53 | ||
|
|
27a28c6db2 | ||
|
|
82eed3c5fe | ||
|
|
3d13d8f412 | ||
|
|
6927008041 | ||
|
|
c978958df2 | ||
|
|
e8b2e1aa6f | ||
|
|
43528c64c2 | ||
|
|
d7f090f348 | ||
|
|
93a9efbd1b | ||
|
|
a50a0735bb | ||
|
|
838567c2d2 | ||
|
|
95e6144e44 | ||
|
|
58c9df272f | ||
|
|
3696e45275 | ||
|
|
73503f98dc | ||
|
|
15f6c408d4 | ||
|
|
0ccc6e7f78 | ||
|
|
69a10f891a | ||
|
|
18d5b60c6d | ||
|
|
f279ac44ca | ||
|
|
29f21e0dfe | ||
|
|
9e588212a4 | ||
|
|
3361aa1800 | ||
|
|
5c3b44b2f6 | ||
|
|
59d345a912 | ||
|
|
2adfdf6ef6 | ||
|
|
8aa9a51c88 | ||
|
|
60b7d0134a | ||
|
|
ae26d588a9 | ||
|
|
abc1827280 | ||
|
|
682bb14037 | ||
|
|
28ec1008a0 | ||
|
|
83ab375829 | ||
|
|
e960c34542 | ||
|
|
4d2cb86a62 | ||
|
|
22131864f8 | ||
|
|
ac8a6054b0 | ||
|
|
22d578620d | ||
|
|
82506d11c8 | ||
|
|
84818a54f5 | ||
|
|
a0b2c6883a | ||
|
|
180b74cc98 | ||
|
|
12f2042f87 | ||
|
|
f096eaf7d7 | ||
|
|
e2ff75f435 | ||
|
|
96ef767e65 | ||
|
|
f387416d6d | ||
|
|
933ade8a16 | ||
|
|
bf4d43cee2 | ||
|
|
6b3b6c4d58 | ||
|
|
4630e130d4 | ||
|
|
42ace44716 | ||
|
|
888b106780 | ||
|
|
6bd994c86b | ||
|
|
6ce09162d7 | ||
|
|
f487c4f0d9 | ||
|
|
2d0afd7b9c | ||
|
|
f406fc3861 | ||
|
|
760710ae23 | ||
|
|
0219b5c99a | ||
|
|
6056b50939 | ||
|
|
9e57f838d5 | ||
|
|
896671ceb1 | ||
|
|
ca9485053e | ||
|
|
7e6c46de2b | ||
|
|
c68c1ba0fb | ||
|
|
5f83751db2 | ||
|
|
8179ab7dec | ||
|
|
d93d48197f | ||
|
|
d010d25934 | ||
|
|
3bb9d66377 | ||
|
|
42fe8f4eca | ||
|
|
45bf901d9e | ||
|
|
a35aacdf5e | ||
|
|
feddb2efad | ||
|
|
47c664eda9 | ||
|
|
9d847348a0 | ||
|
|
9fc2b7a409 | ||
|
|
02642bc5e4 | ||
|
|
8f8e257523 | ||
|
|
86916bb842 | ||
|
|
a81de6a996 | ||
|
|
e3e3009afc | ||
|
|
29ff79942b | ||
|
|
e50db68abe | ||
|
|
2f5ea0fcba | ||
|
|
dc27ac2d52 | ||
|
|
50d568605b | ||
|
|
b79f8b6552 | ||
|
|
99754e47e0 | ||
|
|
ea1c32ad8b | ||
|
|
ba34b6c4f9 | ||
|
|
60675a12a6 | ||
|
|
a17ca4a9fb | ||
|
|
17d2df9f52 | ||
|
|
6541fbade8 | ||
|
|
11d054152f | ||
|
|
3cc70256de | ||
|
|
24bbaeb6ad | ||
|
|
4659b7beed | ||
|
|
49795c81c1 | ||
|
|
fbf39b3bba | ||
|
|
bcbd81a31c | ||
|
|
0fae093112 | ||
|
|
6ed036a35e | ||
|
|
c8a843e843 | ||
|
|
050c2577d0 | ||
|
|
ec23e3706b | ||
|
|
dbb7f65930 | ||
|
|
f2af91c780 | ||
|
|
31c985d8d1 | ||
|
|
07d5d7dc46 | ||
|
|
71148c3f77 | ||
|
|
06c6b18f33 | ||
|
|
e1e92cc36b | ||
|
|
61562aea0a | ||
|
|
560b0c8578 | ||
|
|
841709cd16 | ||
|
|
837d75f733 | ||
|
|
342444e3d0 | ||
|
|
13a8b531a7 | ||
|
|
03963579a1 | ||
|
|
998c227341 | ||
|
|
10fe08c28d | ||
|
|
e9c297b1cf | ||
|
|
4ae5e73def | ||
|
|
3107a7e36e | ||
|
|
78505c720f | ||
|
|
491720de4a | ||
|
|
8791462e3e | ||
|
|
3b33256d4a | ||
|
|
fe9ec32b8e | ||
|
|
f94ab2b75e | ||
|
|
740964f66f | ||
|
|
12751fec06 | ||
|
|
38acced902 | ||
|
|
b8eb690a4e | ||
|
|
9dfb07e1cd | ||
|
|
32b6410618 | ||
|
|
d61faa9338 | ||
|
|
80d6eda228 | ||
|
|
c6fd966372 | ||
|
|
b861352389 | ||
|
|
6591b88e7f | ||
|
|
ae6eb97bc0 | ||
|
|
a0f8e0d2ae | ||
|
|
2b77c25238 | ||
|
|
6f5e2ce2e9 | ||
|
|
6fcaf8e950 | ||
|
|
388a146cda | ||
|
|
6f9fa06d11 | ||
|
|
25a0e1cbbc | ||
|
|
09c8680ff2 | ||
|
|
02996c62d8 | ||
|
|
5f6dfa61c4 | ||
|
|
7153e7c18b | ||
|
|
00c5e9a4ad | ||
|
|
595d79cf24 | ||
|
|
de5c81bda0 | ||
|
|
811d1dbe32 | ||
|
|
675a24996a | ||
|
|
3dac3b3d09 | ||
|
|
f2229c0486 | ||
|
|
a6355aacfc | ||
|
|
7e1b2b1c4c | ||
|
|
139d9a0e95 | ||
|
|
404c74ebf0 | ||
|
|
dbe7003068 | ||
|
|
7333f06428 | ||
|
|
bf2650f58f | ||
|
|
a3311cf8c5 | ||
|
|
05709f7ee5 | ||
|
|
3084d6cf06 | ||
|
|
ac92575b36 | ||
|
|
900f342894 | ||
|
|
2f3478d043 | ||
|
|
af8947dc62 | ||
|
|
a3c12b36e7 | ||
|
|
92640b96aa |
No files matched your search
@@ -1,5 +1,5 @@
|
||||
name: Validate Monorepo
|
||||
on: [push]
|
||||
on: pull_request
|
||||
jobs:
|
||||
|
||||
compliance:
|
||||
@@ -39,6 +39,7 @@ jobs:
|
||||
lint:
|
||||
name: Lint
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 5
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/cache@v2
|
||||
@@ -56,6 +57,7 @@ jobs:
|
||||
test:
|
||||
name: Test
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 15
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/cache@v2
|
||||
|
||||
@@ -0,0 +1,23 @@
|
||||
name: "Trigger Test Boundary UI release"
|
||||
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
branch:
|
||||
description: Please use tag-like format n.n.n-someword (1.111.11-beta)
|
||||
required: true
|
||||
|
||||
jobs:
|
||||
trigger-circleci-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
|
||||
- name: Trigger Release job
|
||||
if: github.event_name == 'workflow_dispatch'
|
||||
run: |
|
||||
echo "Triggering Test release using BRANCH and TEST_TAG ${{ github.event.inputs.branch }}"
|
||||
|
||||
curl -u ${{ secrets.CIRCLE_TOKEN }}: -X POST --header "Content-Type: application/json" \
|
||||
-d '{ "branch": "main", "parameters": {"TAG": "'${{ github.event.inputs.branch }}'" }}' \
|
||||
https://circleci.com/api/v2/project/github/hashicorp/boundary-ui-releases/pipeline
|
||||
@@ -9,12 +9,11 @@ jobs:
|
||||
trigger-circleci-release:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: Checkout
|
||||
uses: actions/checkout@master
|
||||
- uses: actions/checkout@v2
|
||||
- name: Trigger Release job
|
||||
env:
|
||||
TAG: ${{ github.event.release.tag_name }}
|
||||
run: |
|
||||
echo "Triggering release with a TAG ${GITHUB_REF#refs/tags/}"
|
||||
|
||||
curl -u ${{ secrets.CIRCLE_TOKEN }}: -X POST --header "Content-Type: application/json" \
|
||||
-d '{ "branch": "main", "parameters": {"TAG": "${TAG}" }}' \
|
||||
-d '{ "branch": "main", "parameters": {"TAG": "'${GITHUB_REF#refs/tags/}'" }}' \
|
||||
https://circleci.com/api/v2/project/github/hashicorp/boundary-ui-releases/pipeline
|
||||
@@ -0,0 +1,6 @@
|
||||
# Contributing to Boundary
|
||||
|
||||
Thank you for contributing to Boundary! Here you can find common questions around reporting issues and opening
|
||||
pull requests to our project.
|
||||
|
||||
When contributing in any way to the Boundary project (new issue, PR, etc), please be aware that our team identifies with many gender pronouns and to use non-binary pronouns when addressing our team. For more reading on our code of conduct, please see the [HashiCorp community guidelines](https://www.hashicorp.com/community-guidelines).
|
||||
@@ -120,7 +120,7 @@ To provide a signing identify for macOS build, use `BOUNDARY_DESKTOP_SIGNING_IDE
|
||||
environment variable to set signing certificate name (e.g Developer ID Application: * (*)).
|
||||
|
||||
Assets are saved to `ui/desktop/electron-app/out/make/`.
|
||||
DMG packaged desktop UI is available at asset location as `Boundary Desktop.dmg`.
|
||||
DMG packaged desktop UI is available at asset location as `boundary.dmg`.
|
||||
|
||||
### Committing
|
||||
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
# misc
|
||||
/coverage/
|
||||
!.*
|
||||
.eslintcache
|
||||
|
||||
# ember-try
|
||||
/.node_modules.ember-try/
|
||||
|
||||
+21
-15
@@ -7,48 +7,54 @@ module.exports = {
|
||||
ecmaVersion: 2018,
|
||||
sourceType: 'module',
|
||||
ecmaFeatures: {
|
||||
legacyDecorators: true
|
||||
}
|
||||
legacyDecorators: true,
|
||||
},
|
||||
},
|
||||
plugins: [
|
||||
'ember'
|
||||
],
|
||||
plugins: ['ember'],
|
||||
extends: [
|
||||
'eslint:recommended',
|
||||
'plugin:ember/recommended'
|
||||
'plugin:ember/recommended',
|
||||
'plugin:prettier/recommended',
|
||||
],
|
||||
env: {
|
||||
browser: true
|
||||
browser: true,
|
||||
},
|
||||
rules: {
|
||||
'ember/no-get': 'off',
|
||||
'ember/no-get-with-default': 'off',
|
||||
'ember/no-computed-properties-in-native-classes': 'off',
|
||||
'ember/no-assignment-of-untracked-properties-used-in-tracking-contexts':
|
||||
'off',
|
||||
},
|
||||
rules: {},
|
||||
overrides: [
|
||||
// node files
|
||||
{
|
||||
files: [
|
||||
'.eslintrc.js',
|
||||
'.prettierrc.js',
|
||||
'.template-lintrc.js',
|
||||
'ember-cli-build.js',
|
||||
'index.js',
|
||||
'testem.js',
|
||||
'blueprints/*/index.js',
|
||||
'config/**/*.js',
|
||||
'tests/dummy/config/**/*.js'
|
||||
'tests/dummy/config/**/*.js',
|
||||
],
|
||||
excludedFiles: [
|
||||
'addon/**',
|
||||
'addon-test-support/**',
|
||||
'app/**',
|
||||
'tests/dummy/app/**'
|
||||
'tests/dummy/app/**',
|
||||
],
|
||||
parserOptions: {
|
||||
sourceType: 'script'
|
||||
sourceType: 'script',
|
||||
},
|
||||
env: {
|
||||
browser: false,
|
||||
node: true
|
||||
node: true,
|
||||
},
|
||||
plugins: ['node'],
|
||||
extends: ['plugin:node/recommended']
|
||||
}
|
||||
]
|
||||
extends: ['plugin:node/recommended'],
|
||||
},
|
||||
],
|
||||
};
|
||||
@@ -10,6 +10,7 @@
|
||||
/.editorconfig
|
||||
/.ember-cli
|
||||
/.env*
|
||||
/.eslintcache
|
||||
/.eslintignore
|
||||
/.eslintrc.js
|
||||
/.git/
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
# See https://help.github.com/ignore-files/ for more about ignoring files.
|
||||
# unconventional js
|
||||
/blueprints/*/files/
|
||||
/vendor/
|
||||
|
||||
# compiled output
|
||||
/dist/
|
||||
@@ -9,15 +11,9 @@
|
||||
/node_modules/
|
||||
|
||||
# misc
|
||||
/.env*
|
||||
/.pnp*
|
||||
/.sass-cache
|
||||
/connect.lock
|
||||
/coverage/
|
||||
/libpeerconnection.log
|
||||
/npm-debug.log*
|
||||
/testem.log
|
||||
/yarn-error.log
|
||||
!.*
|
||||
.eslintcache
|
||||
|
||||
# ember-try
|
||||
/.node_modules.ember-try/
|
||||
@@ -0,0 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
singleQuote: true,
|
||||
};
|
||||
@@ -1,5 +1,5 @@
|
||||
'use strict';
|
||||
|
||||
module.exports = {
|
||||
extends: 'octane'
|
||||
extends: 'octane',
|
||||
};
|
||||
@@ -3,7 +3,7 @@ import { serializeIntoHash } from '@ember-data/adapter/-private';
|
||||
/* eslint-disable-next-line ember/no-mixins */
|
||||
import AdapterBuildURLMixin from '../mixins/adapter-build-url';
|
||||
import config from 'ember-get-config';
|
||||
import { get, getWithDefault } from '@ember/object';
|
||||
import { get } from '@ember/object';
|
||||
import { InvalidError } from '@ember-data/adapter/error';
|
||||
import { dasherize } from '@ember/string';
|
||||
import { pluralize } from 'ember-inflector';
|
||||
@@ -69,7 +69,7 @@ export default class ApplicationAdapter extends RESTAdapter.extend(
|
||||
* @return {string}
|
||||
*/
|
||||
urlSuffix(modelName, id, snapshot = {}) {
|
||||
const method = getWithDefault(snapshot, 'adapterOptions.method', '');
|
||||
const method = get(snapshot, 'adapterOptions.method') || '';
|
||||
return method ? `:${method}` : '';
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,12 @@ import { attr } from '@ember-data/model';
|
||||
export default class GeneratedAuthMethodModel extends BaseModel {
|
||||
// =attributes
|
||||
|
||||
@attr('boolean', {
|
||||
description: 'Specifies if this is the primary auth method for its scope.',
|
||||
readOnly: true,
|
||||
})
|
||||
is_primary;
|
||||
|
||||
@attr('string', {
|
||||
description: 'The type of the resource, to help differentiate schemas',
|
||||
})
|
||||
|
||||
@@ -18,7 +18,8 @@ export default class GeneratedRoleModel extends BaseModel {
|
||||
description;
|
||||
|
||||
@attr('string', {
|
||||
description: 'The scope to which this role applies. Defaults to the role\'s scope.',
|
||||
description:
|
||||
"The scope to which this role applies. Defaults to the role's scope.",
|
||||
})
|
||||
grant_scope_id;
|
||||
|
||||
|
||||
@@ -7,6 +7,12 @@ import { attr } from '@ember-data/model';
|
||||
export default class GeneratedScopeModel extends BaseModel {
|
||||
// =attributes
|
||||
|
||||
@attr('string', {
|
||||
description:
|
||||
'The ID of the primary auth method for this scope. A primary auth method\nis allowed to vivify users when new accounts are created and is the source for the users account info.',
|
||||
})
|
||||
primary_auth_method_id;
|
||||
|
||||
@attr('string', {
|
||||
description: 'The type of the resource',
|
||||
})
|
||||
|
||||
@@ -2,7 +2,6 @@ import BaseModel from '../../models/base';
|
||||
import { attr } from '@ember-data/model';
|
||||
|
||||
export default class GeneratedSessionModel extends BaseModel {
|
||||
|
||||
// =attributes
|
||||
|
||||
@attr('string') user_id;
|
||||
@@ -32,5 +31,4 @@ export default class GeneratedSessionModel extends BaseModel {
|
||||
description: 'Current version number of this resource.',
|
||||
})
|
||||
version;
|
||||
|
||||
}
|
||||
@@ -24,13 +24,13 @@ export default class GeneratedTargetModel extends BaseModel {
|
||||
|
||||
@attr('number', {
|
||||
description: '',
|
||||
defaultValue: 28800
|
||||
defaultValue: 28800,
|
||||
})
|
||||
session_max_seconds;
|
||||
|
||||
@attr('number', {
|
||||
description: '',
|
||||
defaultValue: 1
|
||||
defaultValue: 1,
|
||||
})
|
||||
session_connection_limit;
|
||||
|
||||
|
||||
@@ -4,7 +4,6 @@ import { computed } from '@ember/object';
|
||||
import { equal } from '@ember/object/computed';
|
||||
|
||||
export default class AccountModel extends GeneratedAccountModel {
|
||||
|
||||
// =attributes
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,3 +1,25 @@
|
||||
import GeneratedAuthMethodModel from '../generated/models/auth-method';
|
||||
import { equal } from '@ember/object/computed';
|
||||
|
||||
export default class AuthMethodModel extends GeneratedAuthMethodModel {}
|
||||
export default class AuthMethodModel extends GeneratedAuthMethodModel {
|
||||
// =attributes
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
@equal('is_primary', true) isPrimary;
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
get isPassword() {
|
||||
return this.type === 'password';
|
||||
}
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
get isOIDC() {
|
||||
return this.type === 'oidc';
|
||||
}
|
||||
}
|
||||
@@ -25,7 +25,6 @@ import { computed } from '@ember/object';
|
||||
* 2) Or as an ID: `record.scopeID`.
|
||||
*/
|
||||
export default class BaseModel extends Model {
|
||||
|
||||
// =relationships
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,7 +2,6 @@ import GeneratedHostSetModel from '../generated/models/host-set';
|
||||
import { fragmentArray } from 'ember-data-model-fragments/attributes';
|
||||
|
||||
export default class HostSetModel extends GeneratedHostSetModel {
|
||||
|
||||
// =attributes
|
||||
|
||||
/**
|
||||
|
||||
@@ -2,11 +2,9 @@ import GeneratedHostModel from '../generated/models/host';
|
||||
import { fragment } from 'ember-data-model-fragments/attributes';
|
||||
|
||||
export default class HostModel extends GeneratedHostModel {
|
||||
|
||||
/**
|
||||
* Attributes of this resource, if any, represented as a JSON fragment.
|
||||
* @type {FragmentHostAttributesModel}
|
||||
*/
|
||||
@fragment('fragment-host-attributes', { defaultValue: {} }) attributes;
|
||||
|
||||
}
|
||||
@@ -35,7 +35,7 @@ export default class RoleModel extends GeneratedRoleModel {
|
||||
return this.save({
|
||||
adapterOptions: {
|
||||
method: 'set-grants',
|
||||
grantStrings
|
||||
grantStrings,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import { equal } from '@ember/object/computed';
|
||||
import { attr } from '@ember-data/model';
|
||||
|
||||
export default class SessionModel extends GeneratedSessionModel {
|
||||
|
||||
// =attributes
|
||||
|
||||
@attr('string', { readOnly: true }) proxy_address;
|
||||
@@ -61,5 +60,4 @@ export default class SessionModel extends GeneratedSessionModel {
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -41,8 +41,9 @@ export default class TargetModel extends GeneratedTargetModel {
|
||||
* @type {SessionModel[]}
|
||||
*/
|
||||
get sessions() {
|
||||
return this.store.peekAll('session')
|
||||
.filter(s => s && (s.target_id === this.id));
|
||||
return this.store
|
||||
.peekAll('session')
|
||||
.filter((s) => s && s.target_id === this.id);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -58,8 +59,9 @@ export default class TargetModel extends GeneratedTargetModel {
|
||||
* @type {boolean}
|
||||
*/
|
||||
get isActive() {
|
||||
const pendingOrActiveSessions =
|
||||
this.sessions.filter(s => s.isActive || s.isPending);
|
||||
const pendingOrActiveSessions = this.sessions.filter(
|
||||
(s) => s.isActive || s.isPending
|
||||
);
|
||||
return Boolean(pendingOrActiveSessions.length);
|
||||
}
|
||||
|
||||
|
||||
@@ -3,7 +3,6 @@ import { attr } from '@ember-data/model';
|
||||
import { A } from '@ember/array';
|
||||
|
||||
export default class UserModel extends GeneratedUserModel {
|
||||
|
||||
// =attributes
|
||||
|
||||
/**
|
||||
@@ -74,5 +73,4 @@ export default class UserModel extends GeneratedUserModel {
|
||||
removeAccount(accountID, options) {
|
||||
return this.removeAccounts([accountID], options);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default class AccountSerializer extends ApplicationSerializer {
|
||||
|
||||
// =properties
|
||||
|
||||
/**
|
||||
|
||||
@@ -7,7 +7,6 @@ import { copy } from 'ember-copy';
|
||||
* Manages serialization/normalization of data to/from the API.
|
||||
*/
|
||||
export default class ApplicationSerializer extends RESTSerializer {
|
||||
|
||||
// =properties
|
||||
|
||||
/**
|
||||
@@ -82,7 +81,7 @@ export default class ApplicationSerializer extends RESTSerializer {
|
||||
// Delete `scope` field
|
||||
delete serialized.scope;
|
||||
// And serialize `scope_id`
|
||||
if(this.serializeScopeID) {
|
||||
if (this.serializeScopeID) {
|
||||
const scope_id = snapshot?.attr('scope')?.attr('scope_id');
|
||||
if (scope_id) serialized.scope_id = scope_id;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,35 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default class AuthMethodSerializer extends ApplicationSerializer {
|
||||
/**
|
||||
* Sorts the array in order of "is_primary" such that the primary method
|
||||
* appears first. The "natural" order of auth methods places primary first.
|
||||
*
|
||||
* @override
|
||||
* @return {object}
|
||||
*/
|
||||
normalizeArrayResponse() {
|
||||
const normalized = super.normalizeArrayResponse(...arguments);
|
||||
normalized.data = normalized.data.sort((a) =>
|
||||
a.attributes.is_primary ? -1 : 1
|
||||
);
|
||||
return normalized;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets `is_primary` to `false` if it is missing in the response. The API
|
||||
* omits "zero" values per:
|
||||
* https://developers.google.com/protocol-buffers/docs/proto3#default
|
||||
*
|
||||
* TODO: generalize this so that all zero values are reified.
|
||||
* @override
|
||||
* @return {object}
|
||||
*/
|
||||
normalize() {
|
||||
const normalized = super.normalize(...arguments);
|
||||
if (!normalized.data.attributes.is_primary) {
|
||||
normalized.data.attributes.is_primary = false;
|
||||
}
|
||||
return normalized;
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,6 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default class HostSetSerializer extends ApplicationSerializer {
|
||||
|
||||
// =properties
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,12 +1,10 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default class HostSerializer extends ApplicationSerializer {
|
||||
|
||||
// =properties
|
||||
|
||||
/**
|
||||
* @type {boolean}
|
||||
*/
|
||||
serializeScopeID = false;
|
||||
|
||||
}
|
||||
@@ -17,8 +17,8 @@ export default class RoleSerializer extends ApplicationSerializer {
|
||||
serialize(snapshot) {
|
||||
const grantStrings = get(snapshot, 'adapterOptions.grantStrings');
|
||||
let serialized = super.serialize(...arguments);
|
||||
if (grantStrings) serialized =
|
||||
this.serializeWithGrantStrings(snapshot, grantStrings);
|
||||
if (grantStrings)
|
||||
serialized = this.serializeWithGrantStrings(snapshot, grantStrings);
|
||||
const principalIDs = snapshot?.adapterOptions?.principalIDs;
|
||||
if (principalIDs)
|
||||
serialized = this.serializewithPrincipals(snapshot, principalIDs);
|
||||
@@ -34,7 +34,7 @@ export default class RoleSerializer extends ApplicationSerializer {
|
||||
serializeWithGrantStrings(snapshot, grantStrings) {
|
||||
return {
|
||||
version: snapshot.attr('version'),
|
||||
grant_strings: grantStrings
|
||||
grant_strings: grantStrings,
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -13,8 +13,8 @@ export default class UserSerializer extends ApplicationSerializer {
|
||||
serialize(snapshot) {
|
||||
let serialized = super.serialize(...arguments);
|
||||
const accountIDs = snapshot?.adapterOptions?.accountIDs;
|
||||
if (accountIDs) serialized =
|
||||
this.serializewithAccounts(snapshot, accountIDs);
|
||||
if (accountIDs)
|
||||
serialized = this.serializewithAccounts(snapshot, accountIDs);
|
||||
return serialized;
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
export { default } from 'api/serializers/auth-method';
|
||||
@@ -25,9 +25,9 @@ module.exports = async function () {
|
||||
name: 'ember-lts-3.20',
|
||||
npm: {
|
||||
devDependencies: {
|
||||
'ember-source': '~3.20.5'
|
||||
}
|
||||
}
|
||||
'ember-source': '~3.20.5',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'ember-release',
|
||||
@@ -62,9 +62,9 @@ module.exports = async function () {
|
||||
},
|
||||
npm: {
|
||||
devDependencies: {
|
||||
'@ember/jquery': '^1.1.0'
|
||||
}
|
||||
}
|
||||
'@ember/jquery': '^1.1.0',
|
||||
},
|
||||
},
|
||||
},
|
||||
{
|
||||
name: 'ember-classic',
|
||||
|
||||
+284
-224
@@ -5,8 +5,7 @@ import { pickRandomStatusString } from './factories/session';
|
||||
import { Response } from 'miragejs';
|
||||
import initializeMockIPC from './scenarios/ipc';
|
||||
|
||||
export default function() {
|
||||
|
||||
export default function () {
|
||||
initializeMockIPC(this);
|
||||
|
||||
// make this `http://localhost:8080`, for example, if your API is on a different server
|
||||
@@ -23,17 +22,20 @@ export default function() {
|
||||
|
||||
// Scope resources
|
||||
|
||||
this.get('/scopes', ({ scopes }, { queryParams: { scope_id, recursive } }) => {
|
||||
// Default parent scope is global
|
||||
if (!scope_id) scope_id = 'global';
|
||||
if (recursive && scope_id === 'global') {
|
||||
return scopes.all();
|
||||
} else {
|
||||
return scopes.where(scope => {
|
||||
return scope.scope ? scope.scope.id === scope_id : false
|
||||
});
|
||||
this.get(
|
||||
'/scopes',
|
||||
({ scopes }, { queryParams: { scope_id, recursive } }) => {
|
||||
// Default parent scope is global
|
||||
if (!scope_id) scope_id = 'global';
|
||||
if (recursive && scope_id === 'global') {
|
||||
return scopes.all();
|
||||
} else {
|
||||
return scopes.where((scope) => {
|
||||
return scope.scope ? scope.scope.id === scope_id : false;
|
||||
});
|
||||
}
|
||||
}
|
||||
});
|
||||
);
|
||||
this.post('/scopes', function ({ scopes }) {
|
||||
// Parent scope comes through the payload via `scope_id`, but this needs
|
||||
// to be expanded to a scope object `scope: {id:..., type:...}` before
|
||||
@@ -49,41 +51,60 @@ export default function() {
|
||||
|
||||
// Auth & IAM resources
|
||||
|
||||
this.get('/auth-methods', ({ authMethods }, { queryParams: { scope_id: scopeId } }) => {
|
||||
return authMethods.where({ scopeId });
|
||||
});
|
||||
this.get(
|
||||
'/auth-methods',
|
||||
({ authMethods }, { queryParams: { scope_id: scopeId } }) => {
|
||||
return authMethods.where({ scopeId });
|
||||
}
|
||||
);
|
||||
this.post('/auth-methods');
|
||||
this.get('/auth-methods/:id');
|
||||
this.patch('/auth-methods/:id');
|
||||
this.del('/auth-methods/:id');
|
||||
this.del('/auth-methods/:id', ({ authMethods }, { params: { id } }) => {
|
||||
const authMethod = authMethods.find(id);
|
||||
const scope = authMethod.scope;
|
||||
authMethod.destroy();
|
||||
// If the primary auth method is deleted, the associated scope's
|
||||
// primary_auth_method_id field should be set to null.
|
||||
if (scope.primaryAuthMethodId === id) {
|
||||
scope.update({ primaryAuthMethodId: null });
|
||||
}
|
||||
return new Response(202);
|
||||
});
|
||||
|
||||
// Auth Method Accounts
|
||||
this.get('/accounts', ({ accounts }, { queryParams: { auth_method_id: authMethodId } }) => {
|
||||
return accounts.where({ authMethodId });
|
||||
});
|
||||
this.get(
|
||||
'/accounts',
|
||||
({ accounts }, { queryParams: { auth_method_id: authMethodId } }) => {
|
||||
return accounts.where({ authMethodId });
|
||||
}
|
||||
);
|
||||
this.post('/accounts');
|
||||
this.get('/accounts/:id');
|
||||
this.patch('/accounts/:id');
|
||||
this.del('/accounts/:id');
|
||||
this.post('/accounts/:idMethod', function ({ accounts }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const account = accounts.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
attributes: account.attributes
|
||||
};
|
||||
// Set new password
|
||||
if (method === 'set-password') {
|
||||
updatedAttrs.attributes.password = attrs.password;
|
||||
this.post(
|
||||
'/accounts/:idMethod',
|
||||
function ({ accounts }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const account = accounts.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
attributes: account.attributes,
|
||||
};
|
||||
// Set new password
|
||||
if (method === 'set-password') {
|
||||
updatedAttrs.attributes.password = attrs.password;
|
||||
}
|
||||
// Set new password
|
||||
if (method === 'change-password') {
|
||||
updatedAttrs.attributes.password = attrs.new_password;
|
||||
}
|
||||
return account.update(updatedAttrs);
|
||||
}
|
||||
// Set new password
|
||||
if (method === 'change-password') {
|
||||
updatedAttrs.attributes.password = attrs.new_password;
|
||||
}
|
||||
return account.update(updatedAttrs);
|
||||
});
|
||||
);
|
||||
|
||||
// Authenticate/deauthenticate routes
|
||||
this.post('/auth-methods/:id_method', authHandler);
|
||||
@@ -104,11 +125,11 @@ export default function() {
|
||||
const user = users.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
accountIds: user.accountIds
|
||||
accountIds: user.accountIds,
|
||||
};
|
||||
// If adding accounts, push them into the array
|
||||
if (method === 'add-accounts') {
|
||||
attrs.accountIds.forEach(id => {
|
||||
attrs.accountIds.forEach((id) => {
|
||||
if (!updatedAttrs.accountIds.includes(id)) {
|
||||
updatedAttrs.accountIds.push(id);
|
||||
}
|
||||
@@ -116,7 +137,7 @@ export default function() {
|
||||
}
|
||||
// If deleting accounts, filter them out of the array
|
||||
if (method === 'remove-accounts') {
|
||||
updatedAttrs.accountIds = updatedAttrs.accountIds.filter(id => {
|
||||
updatedAttrs.accountIds = updatedAttrs.accountIds.filter((id) => {
|
||||
return !attrs.accountIds.includes(id);
|
||||
});
|
||||
}
|
||||
@@ -131,31 +152,34 @@ export default function() {
|
||||
this.get('/groups/:id');
|
||||
this.patch('/groups/:id');
|
||||
this.del('/groups/:id');
|
||||
this.post('/groups/:idMethod', function ({ groups }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const group = groups.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
memberIds: group.memberIds
|
||||
};
|
||||
// If adding members, push them into the array
|
||||
if (method === 'add-members') {
|
||||
attrs.memberIds.forEach(id => {
|
||||
if (!updatedAttrs.memberIds.includes(id)) {
|
||||
updatedAttrs.memberIds.push(id);
|
||||
}
|
||||
});
|
||||
this.post(
|
||||
'/groups/:idMethod',
|
||||
function ({ groups }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const group = groups.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
memberIds: group.memberIds,
|
||||
};
|
||||
// If adding members, push them into the array
|
||||
if (method === 'add-members') {
|
||||
attrs.memberIds.forEach((id) => {
|
||||
if (!updatedAttrs.memberIds.includes(id)) {
|
||||
updatedAttrs.memberIds.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
// If deleting members, filter them out of the array
|
||||
if (method === 'remove-members') {
|
||||
updatedAttrs.memberIds = updatedAttrs.memberIds.filter((id) => {
|
||||
return !attrs.memberIds.includes(id);
|
||||
});
|
||||
}
|
||||
return group.update(updatedAttrs);
|
||||
}
|
||||
// If deleting members, filter them out of the array
|
||||
if (method === 'remove-members') {
|
||||
updatedAttrs.memberIds = updatedAttrs.memberIds.filter(id => {
|
||||
return !attrs.memberIds.includes(id);
|
||||
});
|
||||
}
|
||||
return group.update(updatedAttrs);
|
||||
});
|
||||
);
|
||||
|
||||
// IAM: Roles
|
||||
this.get('/roles', ({ roles }, { queryParams: { scope_id: scopeId } }) => {
|
||||
@@ -165,66 +189,72 @@ export default function() {
|
||||
this.get('/roles/:id');
|
||||
this.patch('/roles/:id');
|
||||
this.del('/roles/:id');
|
||||
this.post('/roles/:idMethod', function ({ roles, users, groups }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const role = roles.find(id);
|
||||
let updatedAttrs = {};
|
||||
this.post(
|
||||
'/roles/:idMethod',
|
||||
function ({ roles, users, groups }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const role = roles.find(id);
|
||||
let updatedAttrs = {};
|
||||
|
||||
// Principals is a combined list of users and groups, but in Mirage we've
|
||||
// internally modelled them as separate lists. Therefore we must check
|
||||
// the type by looking up the user or group first, then determine which
|
||||
// list to add the principal to.
|
||||
if (method === 'add-principals') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
userIds: role.userIds,
|
||||
groupIds: role.groupIds
|
||||
};
|
||||
attrs.principalIds.forEach(id => {
|
||||
const isUser = users.find(id);
|
||||
const isGroup = groups.find(id);
|
||||
if (isUser && !updatedAttrs.userIds.includes(id)) {
|
||||
updatedAttrs.userIds.push(id);
|
||||
}
|
||||
if (isGroup && !updatedAttrs.groupIds.includes(id)) {
|
||||
updatedAttrs.groupIds.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
// If deleting principals, filter them out of both users and groups,
|
||||
// and in this case don't care about the type
|
||||
if (method === 'remove-principals') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
userIds: role.userIds,
|
||||
groupIds: role.groupIds
|
||||
};
|
||||
updatedAttrs.userIds = updatedAttrs.userIds.filter(id => {
|
||||
return !attrs.principalIds.includes(id);
|
||||
});
|
||||
updatedAttrs.groupIds = updatedAttrs.groupIds.filter(id => {
|
||||
return !attrs.principalIds.includes(id);
|
||||
});
|
||||
}
|
||||
// Principals is a combined list of users and groups, but in Mirage we've
|
||||
// internally modelled them as separate lists. Therefore we must check
|
||||
// the type by looking up the user or group first, then determine which
|
||||
// list to add the principal to.
|
||||
if (method === 'add-principals') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
userIds: role.userIds,
|
||||
groupIds: role.groupIds,
|
||||
};
|
||||
attrs.principalIds.forEach((id) => {
|
||||
const isUser = users.find(id);
|
||||
const isGroup = groups.find(id);
|
||||
if (isUser && !updatedAttrs.userIds.includes(id)) {
|
||||
updatedAttrs.userIds.push(id);
|
||||
}
|
||||
if (isGroup && !updatedAttrs.groupIds.includes(id)) {
|
||||
updatedAttrs.groupIds.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
// If deleting principals, filter them out of both users and groups,
|
||||
// and in this case don't care about the type
|
||||
if (method === 'remove-principals') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
userIds: role.userIds,
|
||||
groupIds: role.groupIds,
|
||||
};
|
||||
updatedAttrs.userIds = updatedAttrs.userIds.filter((id) => {
|
||||
return !attrs.principalIds.includes(id);
|
||||
});
|
||||
updatedAttrs.groupIds = updatedAttrs.groupIds.filter((id) => {
|
||||
return !attrs.principalIds.includes(id);
|
||||
});
|
||||
}
|
||||
|
||||
if (method === 'set-grants') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
grantStrings: attrs.grantStrings
|
||||
};
|
||||
}
|
||||
if (method === 'set-grants') {
|
||||
updatedAttrs = {
|
||||
version: attrs.version,
|
||||
grantStrings: attrs.grantStrings,
|
||||
};
|
||||
}
|
||||
|
||||
return role.update(updatedAttrs);
|
||||
});
|
||||
return role.update(updatedAttrs);
|
||||
}
|
||||
);
|
||||
|
||||
// Other resources
|
||||
// host-catalog
|
||||
|
||||
this.get('/host-catalogs', ({ hostCatalogs }, { queryParams: { scope_id: scopeId } }) => {
|
||||
return hostCatalogs.where({ scopeId });
|
||||
});
|
||||
this.get(
|
||||
'/host-catalogs',
|
||||
({ hostCatalogs }, { queryParams: { scope_id: scopeId } }) => {
|
||||
return hostCatalogs.where({ scopeId });
|
||||
}
|
||||
);
|
||||
this.post('/host-catalogs');
|
||||
this.get('/host-catalogs/:id');
|
||||
this.patch('/host-catalogs/:id');
|
||||
@@ -232,9 +262,12 @@ export default function() {
|
||||
|
||||
// host
|
||||
|
||||
this.get('/hosts', function ({ hosts }, { queryParams: { host_catalog_id: hostCatalogId } }) {
|
||||
return hosts.where({ hostCatalogId });
|
||||
});
|
||||
this.get(
|
||||
'/hosts',
|
||||
function ({ hosts }, { queryParams: { host_catalog_id: hostCatalogId } }) {
|
||||
return hosts.where({ hostCatalogId });
|
||||
}
|
||||
);
|
||||
this.post('/hosts', function ({ hostCatalogs, hosts }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const hostCatalog = hostCatalogs.find(attrs.hostCatalogId);
|
||||
@@ -247,9 +280,15 @@ export default function() {
|
||||
|
||||
// host-set
|
||||
|
||||
this.get('/host-sets', function ({ hostSets }, { queryParams: { host_catalog_id: hostCatalogId } }) {
|
||||
return hostSets.where({ hostCatalogId });
|
||||
});
|
||||
this.get(
|
||||
'/host-sets',
|
||||
function (
|
||||
{ hostSets },
|
||||
{ queryParams: { host_catalog_id: hostCatalogId } }
|
||||
) {
|
||||
return hostSets.where({ hostCatalogId });
|
||||
}
|
||||
);
|
||||
this.post('/host-sets', function ({ hostCatalogs, hostSets }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const hostCatalog = hostCatalogs.find(attrs.hostCatalogId);
|
||||
@@ -259,49 +298,57 @@ export default function() {
|
||||
this.get('/host-sets/:id');
|
||||
this.patch('/host-sets/:id');
|
||||
this.del('/host-sets/:id');
|
||||
this.post('/host-sets/:idMethod', function ({ hostSets }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const hostSet = hostSets.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
hostIds: hostSet.hostIds
|
||||
}
|
||||
this.post(
|
||||
'/host-sets/:idMethod',
|
||||
function ({ hostSets }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const hostSet = hostSets.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
hostIds: hostSet.hostIds,
|
||||
};
|
||||
|
||||
// If adding hosts, push them into the array
|
||||
if(method === 'add-hosts') {
|
||||
attrs.hostIds.forEach(id => {
|
||||
if(!updatedAttrs.hostIds.includes(id)) {
|
||||
updatedAttrs.hostIds.push(id);
|
||||
}
|
||||
})
|
||||
}
|
||||
// If adding hosts, push them into the array
|
||||
if (method === 'add-hosts') {
|
||||
attrs.hostIds.forEach((id) => {
|
||||
if (!updatedAttrs.hostIds.includes(id)) {
|
||||
updatedAttrs.hostIds.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
// If deleting hosts, filter them out of the array
|
||||
if (method === 'remove-hosts') {
|
||||
updatedAttrs.hostIds = updatedAttrs.hostIds.filter(id => {
|
||||
return !attrs.hostIds.includes(id);
|
||||
});
|
||||
}
|
||||
// If deleting hosts, filter them out of the array
|
||||
if (method === 'remove-hosts') {
|
||||
updatedAttrs.hostIds = updatedAttrs.hostIds.filter((id) => {
|
||||
return !attrs.hostIds.includes(id);
|
||||
});
|
||||
}
|
||||
|
||||
return hostSet.update(updatedAttrs);
|
||||
});
|
||||
return hostSet.update(updatedAttrs);
|
||||
}
|
||||
);
|
||||
|
||||
// target
|
||||
|
||||
this.get('/targets', function ({ targets }, { queryParams: { scope_id, recursive } }) {
|
||||
if (recursive && scope_id === 'global') {
|
||||
return targets.all();
|
||||
} else if (recursive) {
|
||||
return targets.where(target => {
|
||||
const targetModel = targets.find(target.id);
|
||||
return (target.scopeId === scope_id)
|
||||
|| (targetModel?.scope?.scope?.id === scope_id)
|
||||
});
|
||||
this.get(
|
||||
'/targets',
|
||||
function ({ targets }, { queryParams: { scope_id, recursive } }) {
|
||||
if (recursive && scope_id === 'global') {
|
||||
return targets.all();
|
||||
} else if (recursive) {
|
||||
return targets.where((target) => {
|
||||
const targetModel = targets.find(target.id);
|
||||
return (
|
||||
target.scopeId === scope_id ||
|
||||
targetModel?.scope?.scope?.id === scope_id
|
||||
);
|
||||
});
|
||||
}
|
||||
return targets.where((target) => target.scopeId === scope_id);
|
||||
}
|
||||
return targets.where(target => target.scopeId === scope_id);
|
||||
});
|
||||
);
|
||||
this.post('/targets', function ({ targets }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
return targets.create(attrs);
|
||||
@@ -309,83 +356,96 @@ export default function() {
|
||||
this.get('/targets/:id');
|
||||
this.patch('/targets/:id');
|
||||
this.del('/targets/:id');
|
||||
this.post('/targets/:idMethod', function ({ targets }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const target = targets.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
hostSetIds: target.hostSetIds
|
||||
};
|
||||
// If adding host sets, push them into the array
|
||||
if (method === 'add-host-sets') {
|
||||
attrs.hostSetIds.forEach(id => {
|
||||
if (!updatedAttrs.hostSetIds.includes(id)) {
|
||||
updatedAttrs.hostSetIds.push(id);
|
||||
}
|
||||
});
|
||||
this.post(
|
||||
'/targets/:idMethod',
|
||||
function ({ targets }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const target = targets.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
hostSetIds: target.hostSetIds,
|
||||
};
|
||||
// If adding host sets, push them into the array
|
||||
if (method === 'add-host-sets') {
|
||||
attrs.hostSetIds.forEach((id) => {
|
||||
if (!updatedAttrs.hostSetIds.includes(id)) {
|
||||
updatedAttrs.hostSetIds.push(id);
|
||||
}
|
||||
});
|
||||
}
|
||||
// If deleting host sets, filter them out of the array
|
||||
if (method === 'remove-host-sets') {
|
||||
updatedAttrs.hostSetIds = updatedAttrs.hostSetIds.filter((id) => {
|
||||
return !attrs.hostSetIds.includes(id);
|
||||
});
|
||||
}
|
||||
return target.update(updatedAttrs);
|
||||
}
|
||||
// If deleting host sets, filter them out of the array
|
||||
if (method === 'remove-host-sets') {
|
||||
updatedAttrs.hostSetIds = updatedAttrs.hostSetIds.filter(id => {
|
||||
return !attrs.hostSetIds.includes(id);
|
||||
});
|
||||
}
|
||||
return target.update(updatedAttrs);
|
||||
});
|
||||
);
|
||||
|
||||
// session
|
||||
|
||||
this.get('/sessions', function ({ sessions }, { queryParams: { scope_id, recursive } }) {
|
||||
// To simulate changes to `session.status` that may occur in the backend,
|
||||
// we quietly randomize the value of the field on GET.
|
||||
// To populate sessions for logged in user,
|
||||
// update alternate sessions to auth user.
|
||||
// But only if not in testing mode.
|
||||
// In tests, we need deterministic statuses.
|
||||
if (!Ember.testing) {
|
||||
sessions.all()
|
||||
.models
|
||||
.forEach(session => {
|
||||
this.get(
|
||||
'/sessions',
|
||||
function ({ sessions }, { queryParams: { scope_id, recursive } }) {
|
||||
// To simulate changes to `session.status` that may occur in the backend,
|
||||
// we quietly randomize the value of the field on GET.
|
||||
// To populate sessions for logged in user,
|
||||
// update alternate sessions to auth user.
|
||||
// But only if not in testing mode.
|
||||
// In tests, we need deterministic statuses.
|
||||
if (!Ember.testing) {
|
||||
sessions.all().models.forEach((session) => {
|
||||
session.update({
|
||||
status: pickRandomStatusString()
|
||||
});
|
||||
if(session.id.split('-').pop() % 2) session.update({
|
||||
userId: 'authenticateduser'
|
||||
status: pickRandomStatusString(),
|
||||
});
|
||||
if (session.id.split('-').pop() % 2)
|
||||
session.update({
|
||||
userId: 'authenticateduser',
|
||||
});
|
||||
});
|
||||
}
|
||||
if (recursive && scope_id === 'global') {
|
||||
return sessions.all();
|
||||
} else if (recursive) {
|
||||
return sessions.where((session) => {
|
||||
const sessionModel = sessions.find(session.id);
|
||||
return (
|
||||
session.scopeId === scope_id ||
|
||||
sessionModel?.scope?.scope?.id === scope_id
|
||||
);
|
||||
});
|
||||
}
|
||||
return sessions.where((session) => session.scopeId === scope_id);
|
||||
}
|
||||
if (recursive && scope_id === 'global') {
|
||||
return sessions.all();
|
||||
} else if (recursive) {
|
||||
return sessions.where(session => {
|
||||
const sessionModel = sessions.find(session.id);
|
||||
return (session.scopeId === scope_id)
|
||||
|| (sessionModel?.scope?.scope?.id === scope_id)
|
||||
});
|
||||
}
|
||||
return sessions.where(session => session.scopeId === scope_id);
|
||||
});
|
||||
);
|
||||
this.get('/sessions/:id', function ({ sessions }, { params: { id } }) {
|
||||
const session = sessions.find(id);
|
||||
return session.update({
|
||||
status: pickRandomStatusString()
|
||||
});
|
||||
});
|
||||
this.post('/sessions/:idMethod', function ({ sessions }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const session = sessions.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version
|
||||
};
|
||||
if (method === 'cancel') {
|
||||
updatedAttrs.status = 'canceling';
|
||||
if (!Ember.testing) {
|
||||
session.update({
|
||||
status: pickRandomStatusString(),
|
||||
});
|
||||
}
|
||||
return session.update(updatedAttrs);
|
||||
return session;
|
||||
});
|
||||
this.post(
|
||||
'/sessions/:idMethod',
|
||||
function ({ sessions }, { params: { idMethod } }) {
|
||||
const attrs = this.normalizedRequestAttrs();
|
||||
const id = idMethod.split(':')[0];
|
||||
const method = idMethod.split(':')[1];
|
||||
const session = sessions.find(id);
|
||||
const updatedAttrs = {
|
||||
version: attrs.version,
|
||||
};
|
||||
if (method === 'cancel') {
|
||||
updatedAttrs.status = 'canceling';
|
||||
}
|
||||
return session.update(updatedAttrs);
|
||||
}
|
||||
);
|
||||
|
||||
// auth-tokens
|
||||
|
||||
|
||||
@@ -1,20 +1,24 @@
|
||||
import factory from '../generated/factories/auth-method';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
|
||||
const types = ['password', 'oidc'];
|
||||
|
||||
export default factory.extend({
|
||||
id: (i) => `auth-method-id-${i}`,
|
||||
|
||||
// Cycle through available types
|
||||
type: (i) => types[i % types.length],
|
||||
|
||||
/**
|
||||
* Adds accounts (with associated users) to auth method.
|
||||
*/
|
||||
withAccountsAndUsers: trait({
|
||||
afterCreate(authMethod, server) {
|
||||
const { scope } = authMethod;
|
||||
server.createList('user', 5, { scope }).map(user => {
|
||||
server.createList('user', 5, { scope }).map((user) => {
|
||||
const { id } = server.create('account', { scope, authMethod });
|
||||
user.update({ accountIds: [id] });
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -13,6 +13,6 @@ export default factory.extend({
|
||||
const scope = group.scope;
|
||||
const members = server.createList('user', 2, { scope });
|
||||
group.update({ members });
|
||||
}
|
||||
})
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -2,13 +2,11 @@ import factory from '../generated/factories/host-catalog';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
|
||||
export default factory.extend({
|
||||
|
||||
withChildren: trait({
|
||||
afterCreate(hostCatalog, server) {
|
||||
const { scope } = hostCatalog;
|
||||
const hosts = server.createList('host', 10, { scope, hostCatalog });
|
||||
server.createList('host-set', 3, { scope, hostCatalog, hosts });
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import factory from '../generated/factories/host-set';
|
||||
|
||||
export default factory.extend({
|
||||
id: (i) => `host-set-id-${i}`
|
||||
id: (i) => `host-set-id-${i}`,
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import factory from '../generated/factories/host';
|
||||
|
||||
export default factory.extend({
|
||||
id: (i) => `host-id-${i}`
|
||||
id: (i) => `host-id-${i}`,
|
||||
});
|
||||
@@ -2,11 +2,10 @@ import factory from '../generated/factories/role';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
|
||||
export default factory.extend({
|
||||
|
||||
// eslint-disable-next-line ember/avoid-leaking-state-in-ember-objects
|
||||
grant_strings: () => [
|
||||
'id=*;action=*',
|
||||
'id=*;type=host-catalog;actions=create,read'
|
||||
'id=*;type=host-catalog;actions=create,read',
|
||||
],
|
||||
|
||||
/**
|
||||
@@ -18,15 +17,16 @@ export default factory.extend({
|
||||
const users = server.createList('user', 2, { scope });
|
||||
const groups = server.createList('group', 2, { scope });
|
||||
role.update({ users, groups });
|
||||
}
|
||||
},
|
||||
}),
|
||||
|
||||
/**
|
||||
* Set the grant scope ID to match the scope ID.
|
||||
*/
|
||||
afterCreate(role) {
|
||||
const { scope: { id } } = role;
|
||||
const {
|
||||
scope: { id },
|
||||
} = role;
|
||||
role.update({ grant_scope_id: id });
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -2,7 +2,6 @@ import factory from '../generated/factories/scope';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
|
||||
export default factory.extend({
|
||||
|
||||
type: 'global',
|
||||
|
||||
/**
|
||||
@@ -18,18 +17,22 @@ export default factory.extend({
|
||||
withChildren: trait({
|
||||
afterCreate(record, server) {
|
||||
if (record.type === 'global') {
|
||||
server.createList('scope', 1, {
|
||||
type: 'org',
|
||||
scope: { id: record.id, type: record.type }
|
||||
}, 'withChildren');
|
||||
server.createList(
|
||||
'scope',
|
||||
1,
|
||||
{
|
||||
type: 'org',
|
||||
scope: { id: record.id, type: record.type },
|
||||
},
|
||||
'withChildren'
|
||||
);
|
||||
}
|
||||
if (record.type === 'org') {
|
||||
server.createList('scope', 3, {
|
||||
type: 'project',
|
||||
scope: { id: record.id, type: record.type }
|
||||
scope: { id: record.id, type: record.type },
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -2,17 +2,11 @@ import factory from '../generated/factories/session';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
import { random } from 'faker';
|
||||
|
||||
const statusStrings = [
|
||||
'pending',
|
||||
'active',
|
||||
'canceling',
|
||||
'terminated'
|
||||
];
|
||||
const statusStrings = ['pending', 'active', 'canceling', 'terminated'];
|
||||
|
||||
export const pickRandomStatusString = () => random.arrayElement(statusStrings);
|
||||
|
||||
export default factory.extend({
|
||||
|
||||
id: (i) => `session-id-${i}`,
|
||||
status: pickRandomStatusString,
|
||||
|
||||
@@ -26,7 +20,8 @@ export default factory.extend({
|
||||
const scopeId = record.scopeId;
|
||||
if (record.scope.type === 'project') {
|
||||
const orgScopeId = record.scope?.scope.id;
|
||||
const user = server.schema.users.where({ scopeId: orgScopeId }).models[0];
|
||||
const user = server.schema.users.where({ scopeId: orgScopeId })
|
||||
.models[0];
|
||||
if (user) record.update({ user });
|
||||
}
|
||||
const target = server.schema.targets.where({ scopeId }).models[0];
|
||||
@@ -39,7 +34,6 @@ export default factory.extend({
|
||||
if (host) record.update({ host });
|
||||
}
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -1,16 +1,15 @@
|
||||
import factory from '../generated/factories/target';
|
||||
import { trait } from 'ember-cli-mirage';
|
||||
import { random } from 'faker';
|
||||
import { random, datatype } from 'faker';
|
||||
|
||||
const randomBoolean = (chance = 0.5) => Math.random() < chance;
|
||||
const hostSetChance = 0.3;
|
||||
|
||||
export default factory.extend({
|
||||
|
||||
/**
|
||||
* -1 means "unlimited" and we want to generate these on occassion.
|
||||
*/
|
||||
session_connection_limit: () => random.arrayElement([-1, random.number()]),
|
||||
session_connection_limit: () => random.arrayElement([-1, datatype.number()]),
|
||||
|
||||
/**
|
||||
* Generates attributes fields by type.
|
||||
@@ -19,8 +18,8 @@ export default factory.extend({
|
||||
if (target.type === 'tcp') {
|
||||
target.update({
|
||||
attributes: {
|
||||
default_port: random.number()
|
||||
}
|
||||
default_port: datatype.number(),
|
||||
},
|
||||
});
|
||||
}
|
||||
},
|
||||
@@ -37,10 +36,9 @@ export default factory.extend({
|
||||
// expect at this level of abstraction, but appears to be a serialized
|
||||
// representation of the model instance. It's very confusing since
|
||||
// the result set of `where` _is a collection of model instances_.
|
||||
.where(hostSet => hostSet.scopeId === target.scope.id).models
|
||||
.filter(() => randomBoolean(hostSetChance));
|
||||
target.update({hostSets: randomlySelectedHostSets});
|
||||
}
|
||||
})
|
||||
|
||||
.where((hostSet) => hostSet.scopeId === target.scope.id)
|
||||
.models.filter(() => randomBoolean(hostSetChance));
|
||||
target.update({ hostSets: randomlySelectedHostSets });
|
||||
},
|
||||
}),
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import factory from '../generated/factories/user';
|
||||
|
||||
export default factory.extend({
|
||||
id: (i) => `user-${i}`
|
||||
id: (i) => `user-${i}`,
|
||||
});
|
||||
@@ -1,17 +1,15 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedAccountFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'password',
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
version: () => random.number(),
|
||||
version: () => datatype.number(),
|
||||
attributes: () => ({ login_name: random.words() }),
|
||||
|
||||
});
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedAuthMethodModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'password',
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedGroupModelFactory
|
||||
* Group contains all fields related to a Group resource
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedHostCatalogModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'static',
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,17 +1,15 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedHostSetModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'static',
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
version: () => random.number(),
|
||||
size: () => random.number(),
|
||||
|
||||
version: () => datatype.number(),
|
||||
size: () => datatype.number(),
|
||||
});
|
||||
@@ -1,17 +1,17 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date, internet } from 'faker';
|
||||
import { random, date, internet, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedHostModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'static',
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
version: () => random.number(),
|
||||
attributes: () => { return { address: internet.ipv6() } },
|
||||
|
||||
version: () => datatype.number(),
|
||||
attributes: () => {
|
||||
return { address: internet.ipv6() };
|
||||
},
|
||||
});
|
||||
@@ -6,10 +6,8 @@ import { random, date } from 'faker';
|
||||
*
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
|
||||
});
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedProjectModelFactory
|
||||
* Project contains all fields related to a Project resource
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,17 +1,15 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedRoleModelFactory
|
||||
* Role contains all field related to a Role resource
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
version: () => random.number(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
version: () => datatype.number(),
|
||||
});
|
||||
@@ -1,15 +1,13 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedScopeModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,14 +1,12 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedSessionModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'tcp',
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
version: () => random.number(),
|
||||
|
||||
version: () => datatype.number(),
|
||||
});
|
||||
@@ -1,19 +1,17 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedTargetModelFactory
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
type: 'tcp',
|
||||
name: () => random.words(),
|
||||
session_max_seconds: () => random.number(),
|
||||
session_connection_limit: () => random.number(),
|
||||
session_max_seconds: () => datatype.number(),
|
||||
session_connection_limit: () => datatype.number(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
version: () => random.number(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
version: () => datatype.number(),
|
||||
});
|
||||
@@ -1,16 +1,14 @@
|
||||
import { Factory } from 'ember-cli-mirage';
|
||||
import { random, date } from 'faker';
|
||||
import { random, date, datatype } from 'faker';
|
||||
|
||||
/**
|
||||
* GeneratedUserModelFactory
|
||||
* User contains all fields related to a User resource
|
||||
*/
|
||||
export default Factory.extend({
|
||||
|
||||
name: () => random.words(),
|
||||
description: () => random.words(),
|
||||
created_time: () => date.recent(),
|
||||
updated_time: () => date.recent(),
|
||||
disabled: () => random.boolean(),
|
||||
|
||||
disabled: () => datatype.boolean(),
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
authMethod: belongsTo()
|
||||
|
||||
authMethod: belongsTo(),
|
||||
});
|
||||
@@ -1,7 +1,5 @@
|
||||
import { Model, belongsTo } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo()
|
||||
|
||||
scope: belongsTo(),
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
members: hasMany('user')
|
||||
|
||||
members: hasMany('user'),
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
hostSets: hasMany()
|
||||
|
||||
hostSets: hasMany(),
|
||||
});
|
||||
@@ -1,10 +1,8 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
target: belongsTo(),
|
||||
hostCatalog: belongsTo(),
|
||||
hosts: hasMany()
|
||||
|
||||
hosts: hasMany(),
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
hostCatalog: belongsTo()
|
||||
|
||||
hostCatalog: belongsTo(),
|
||||
});
|
||||
@@ -1,9 +1,7 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
users: hasMany(),
|
||||
groups: hasMany()
|
||||
|
||||
groups: hasMany(),
|
||||
});
|
||||
@@ -1,11 +1,9 @@
|
||||
import { Model, belongsTo } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
user: belongsTo(),
|
||||
target: belongsTo(),
|
||||
host: belongsTo(),
|
||||
hostSet: belongsTo(),
|
||||
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
hostSets: hasMany()
|
||||
|
||||
hostSets: hasMany(),
|
||||
});
|
||||
@@ -1,8 +1,6 @@
|
||||
import { Model, belongsTo, hasMany } from 'ember-cli-mirage';
|
||||
|
||||
export default Model.extend({
|
||||
|
||||
scope: belongsTo(),
|
||||
accounts: hasMany('account')
|
||||
|
||||
accounts: hasMany('account'),
|
||||
});
|
||||
@@ -12,7 +12,7 @@ import { Response } from 'miragejs';
|
||||
// */
|
||||
// export default function authenticateHandler(schema, request) {
|
||||
// const payload = JSON.parse(request.requestBody);
|
||||
// if (payload.credentials.login_name === 'error') {
|
||||
// if (payload.attributes.login_name === 'error') {
|
||||
// return new Response(400);
|
||||
// } else {
|
||||
// const cookieName = config.auth.passwordCookieName;
|
||||
@@ -23,29 +23,98 @@ import { Response } from 'miragejs';
|
||||
// }
|
||||
// }
|
||||
|
||||
// Quick and dirty counter system to simulate the polling behavior
|
||||
// of the API. If the OIDC flow is pending, the route returns 100.
|
||||
// If complete it returns 200 with the token JSON.
|
||||
let oidcAttemptCounter = 0;
|
||||
const oidcRequiredAttempts = 3;
|
||||
|
||||
const commandHandlers = {
|
||||
password: {
|
||||
login: (payload, scopeAttrs) => {
|
||||
if (payload.attributes.login_name === 'error') {
|
||||
return new Response(400);
|
||||
} else {
|
||||
return new Response(
|
||||
200,
|
||||
{},
|
||||
{
|
||||
attributes: {
|
||||
scope: scopeAttrs,
|
||||
id: 'token123',
|
||||
token: 'thetokenstring',
|
||||
account_id: '1',
|
||||
user_id: 'user123',
|
||||
auth_method_id: 'authmethod123',
|
||||
created_time: '',
|
||||
updated_time: '',
|
||||
last_used_time: '',
|
||||
expiration_time: '',
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
},
|
||||
|
||||
/**
|
||||
* OIDC authentication is a two-step process:
|
||||
*
|
||||
* 1. `authenticate:start` kicks of authentication by requesting some details
|
||||
* from the Boundary server about the request, including the third-party
|
||||
* URL to which to redirect the user.
|
||||
* 2. `authenticate` accepts the token_id and state parameters in
|
||||
* order to retrieve a Boundary token. This endpoint may be polled until
|
||||
* the authentication flow is completed.
|
||||
*/
|
||||
oidc: {
|
||||
start: () =>
|
||||
new Response(
|
||||
200,
|
||||
{},
|
||||
{
|
||||
attributes: {
|
||||
auth_url: 'https://www.duckduckgo.com',
|
||||
token_id: 'token_1234',
|
||||
},
|
||||
}
|
||||
),
|
||||
token: (_, scopeAttrs) => {
|
||||
oidcAttemptCounter++;
|
||||
if (oidcAttemptCounter < oidcRequiredAttempts) {
|
||||
return new Response(202);
|
||||
} else {
|
||||
return new Response(
|
||||
200,
|
||||
{},
|
||||
{
|
||||
attributes: {
|
||||
scope: scopeAttrs,
|
||||
id: 'token123',
|
||||
token: 'thetokenstring',
|
||||
account_id: '1',
|
||||
user_id: 'user123',
|
||||
auth_method_id: 'authmethod123',
|
||||
created_time: '',
|
||||
updated_time: '',
|
||||
last_used_time: '',
|
||||
expiration_time: '',
|
||||
},
|
||||
}
|
||||
);
|
||||
}
|
||||
},
|
||||
},
|
||||
};
|
||||
|
||||
export function authHandler({ scopes, authMethods }, request) {
|
||||
const payload = JSON.parse(request.requestBody);
|
||||
if (payload.credentials.login_name === 'error') {
|
||||
return new Response(400);
|
||||
} else {
|
||||
const id = request.params.id_method.split(':')[0];
|
||||
const authMethod = authMethods.find(id);
|
||||
const scope = scopes.find(authMethod.scopeId);
|
||||
const scopeAttrs =
|
||||
this.serialize(scopes.find(scope.id));
|
||||
return new Response(200, {}, {
|
||||
scope: scopeAttrs,
|
||||
id: 'token123',
|
||||
token: 'thetokenstring',
|
||||
account_id: '1',
|
||||
user_id: 'authenticateduser',
|
||||
auth_method_id: 'authmethod123',
|
||||
created_time: '',
|
||||
updated_time: '',
|
||||
last_used_time: '',
|
||||
expiration_time: ''
|
||||
});
|
||||
}
|
||||
const [, id] = request.params.id_method.match(/(?<id>.[^:]*)/);
|
||||
const { command } = payload;
|
||||
const authMethod = authMethods.find(id);
|
||||
const scope = scopes.find(authMethod.scopeId);
|
||||
const scopeAttrs = this.serialize(scopes.find(scope.id));
|
||||
return commandHandlers[authMethod.type][command](payload, scopeAttrs);
|
||||
}
|
||||
|
||||
export function deauthHandler() {
|
||||
|
||||
@@ -1,23 +1,41 @@
|
||||
export default function(server) {
|
||||
|
||||
export default function (server) {
|
||||
// Scope resources
|
||||
|
||||
// creates a global scope
|
||||
const globalScope = server.create('scope', {
|
||||
id: 'global',
|
||||
type: 'global',
|
||||
name: 'Global'
|
||||
name: 'Global',
|
||||
});
|
||||
const orgScope = server.createList('scope', 3, {
|
||||
type: 'org',
|
||||
scope: { id: globalScope.id, type: globalScope.type }
|
||||
}, 'withChildren')[0];
|
||||
const orgScope = server.createList(
|
||||
'scope',
|
||||
3,
|
||||
{
|
||||
type: 'org',
|
||||
scope: { id: globalScope.id, type: globalScope.type },
|
||||
},
|
||||
'withChildren'
|
||||
)[0];
|
||||
|
||||
server.create('user', { id: 'authenticateduser' });
|
||||
|
||||
// Auth
|
||||
server.createList('auth-method', 1, { scope: globalScope }, 'withAccountsAndUsers');
|
||||
server.createList('auth-method', 3, { scope: orgScope }, 'withAccountsAndUsers');
|
||||
const globalAuthMethods = server.createList(
|
||||
'auth-method',
|
||||
1,
|
||||
{ scope: globalScope },
|
||||
'withAccountsAndUsers'
|
||||
);
|
||||
const orgAuthMethods = server.createList(
|
||||
'auth-method',
|
||||
3,
|
||||
{ scope: orgScope },
|
||||
'withAccountsAndUsers'
|
||||
);
|
||||
// Assign primary auth methods per scope
|
||||
// TODO make this generic
|
||||
globalScope.update({ primaryAuthMethodId: globalAuthMethods[0].id });
|
||||
orgScope.update({ primaryAuthMethodId: orgAuthMethods[1].id });
|
||||
|
||||
// Groups and Users
|
||||
server.createList('group', 1, { scope: globalScope }, 'withMembers');
|
||||
@@ -27,7 +45,7 @@ export default function(server) {
|
||||
server.createList('role', 5, { scope: orgScope }, 'withPrincipals');
|
||||
|
||||
// Other resources
|
||||
server.schema.scopes.where({type: 'project'}).models.forEach(scope => {
|
||||
server.schema.scopes.where({ type: 'project' }).models.forEach((scope) => {
|
||||
server.createList('host-catalog', 2, { scope }, 'withChildren');
|
||||
server.createList('target', 2, { scope }, 'withRandomHostSets');
|
||||
server.createList('session', 4, { scope }, 'withAssociations');
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import Ember from 'ember';
|
||||
import config from 'ember-get-config';
|
||||
import { random } from 'faker';
|
||||
import { datatype } from 'faker';
|
||||
|
||||
export default function initializeMockIPC (server) {
|
||||
export default function initializeMockIPC(server) {
|
||||
/**
|
||||
* We strive to make this application runnable in a regular web browser, since
|
||||
* it is a convenient environment for development and testing. But only an
|
||||
@@ -51,13 +51,13 @@ export default function initializeMockIPC (server) {
|
||||
target,
|
||||
userId: 'authenticateduser',
|
||||
type,
|
||||
created_time: new Date().toISOString()
|
||||
created_time: new Date().toISOString(),
|
||||
});
|
||||
return {
|
||||
address: window.location.hostname,
|
||||
port: random.number(),
|
||||
port: datatype.number(),
|
||||
protocol: type,
|
||||
session_id: newSession.id
|
||||
session_id: newSession.id,
|
||||
};
|
||||
}
|
||||
}
|
||||
@@ -80,5 +80,4 @@ export default function initializeMockIPC (server) {
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
}
|
||||
@@ -4,9 +4,12 @@ export default ApplicationSerializer.extend({
|
||||
modelName: 'account',
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
json.auth_method_id = model.authMethodId;
|
||||
delete json.attributes?.password;
|
||||
return json;
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -6,7 +6,6 @@ import { isArray } from '@ember/array';
|
||||
* Manages serialization/normalization of data into and out of the mock API.
|
||||
*/
|
||||
export default RestSerializer.extend({
|
||||
|
||||
// =attributes
|
||||
|
||||
/**
|
||||
@@ -45,7 +44,7 @@ export default RestSerializer.extend({
|
||||
serialize() {
|
||||
let json = RestSerializer.prototype.serialize.apply(this, arguments);
|
||||
// If array, root it under a standard `items` key
|
||||
if (isArray(json)) json = {items: json};
|
||||
if (isArray(json)) json = { items: json };
|
||||
return json;
|
||||
},
|
||||
|
||||
@@ -59,7 +58,7 @@ export default RestSerializer.extend({
|
||||
if (model.scope) {
|
||||
json.scope = {
|
||||
id: model.scope.id,
|
||||
type: model.scope.type
|
||||
type: model.scope.type,
|
||||
};
|
||||
}
|
||||
return json;
|
||||
@@ -79,6 +78,5 @@ export default RestSerializer.extend({
|
||||
}
|
||||
const value = RestSerializer.prototype.normalize.apply(this, [newJSON]);
|
||||
return value;
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -1,5 +1,18 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default ApplicationSerializer.extend({
|
||||
modelName: 'auth-method'
|
||||
modelName: 'auth-method',
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
// If the scope marks this auth method as primary, designate it
|
||||
// as such with a read-only boolean field (this is how the API behaves).
|
||||
const isPrimary =
|
||||
model.scope && model.scope.primaryAuthMethodId === model.id;
|
||||
json.is_primary = isPrimary;
|
||||
return json;
|
||||
},
|
||||
});
|
||||
@@ -11,9 +11,11 @@ export default ApplicationSerializer.extend({
|
||||
},
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
if (model.memberIds.length) json.member_ids = model.memberIds;
|
||||
return json;
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -11,12 +11,14 @@ export default ApplicationSerializer.extend({
|
||||
},
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
json.host_catalog_id = model.hostCatalogId;
|
||||
if (model.hostIds?.length) {
|
||||
json.host_ids = model.hostIds;
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default ApplicationSerializer.extend({
|
||||
modelName: 'host'
|
||||
modelName: 'host',
|
||||
});
|
||||
@@ -4,23 +4,26 @@ export default ApplicationSerializer.extend({
|
||||
modelName: 'role',
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const serializedUsers = model.users.models.map(user => ({
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
const serializedUsers = model.users.models.map((user) => ({
|
||||
scope_id: model.scope.id,
|
||||
id: user.id,
|
||||
type: 'user'
|
||||
type: 'user',
|
||||
}));
|
||||
const serializedGroups = model.groups.models.map(group => ({
|
||||
const serializedGroups = model.groups.models.map((group) => ({
|
||||
scope_id: model.scope.id,
|
||||
id: group.id,
|
||||
type: 'group'
|
||||
type: 'group',
|
||||
}));
|
||||
json.principals = [ ...serializedUsers, ...serializedGroups ];
|
||||
json.principals = [...serializedUsers, ...serializedGroups];
|
||||
if (!json.principals.length) delete json.principals;
|
||||
|
||||
// default grant scope
|
||||
if (!json.grant_scope_id) json.grant_scope_id = json.scope.id;
|
||||
|
||||
return json;
|
||||
}
|
||||
},
|
||||
});
|
||||
@@ -1,5 +1,5 @@
|
||||
import ApplicationSerializer from './application';
|
||||
|
||||
export default ApplicationSerializer.extend({
|
||||
modelName: 'scope'
|
||||
modelName: 'scope',
|
||||
});
|
||||
@@ -11,12 +11,14 @@ export default ApplicationSerializer.extend({
|
||||
},
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
json.user_id = model.userId;
|
||||
json.target_id = model.targetId;
|
||||
json.host_set_id = model.hostSetId;
|
||||
json.host_id = model.hostId;
|
||||
return json;
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -11,16 +11,18 @@ export default ApplicationSerializer.extend({
|
||||
},
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
const { hostSets } = this.schema;
|
||||
if (model.hostSetIds?.length) {
|
||||
json.host_sets = model.hostSetIds.map(host_set_id => {
|
||||
json.host_sets = model.hostSetIds.map((host_set_id) => {
|
||||
const hostSet = hostSets.find(host_set_id);
|
||||
const host_catalog_id = hostSet?.hostCatalog?.id;
|
||||
return { id: host_set_id, host_catalog_id };
|
||||
});
|
||||
}
|
||||
return json;
|
||||
}
|
||||
|
||||
},
|
||||
});
|
||||
@@ -11,8 +11,11 @@ export default ApplicationSerializer.extend({
|
||||
},
|
||||
|
||||
_hashForModel(model) {
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(this, arguments);
|
||||
const json = ApplicationSerializer.prototype._hashForModel.apply(
|
||||
this,
|
||||
arguments
|
||||
);
|
||||
if (model.accountIds.length) json.account_ids = model.accountIds;
|
||||
return json;
|
||||
}
|
||||
},
|
||||
});
|
||||
+31
-22
@@ -10,56 +10,65 @@
|
||||
"scripts": {
|
||||
"build:development": "ember build",
|
||||
"build": "ember build --environment=production",
|
||||
"lint": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*",
|
||||
"lint": "npm-run-all --aggregate-output --continue-on-error --parallel 'lint:!(fix)'",
|
||||
"lint:fix": "npm-run-all --aggregate-output --continue-on-error --parallel lint:*:fix",
|
||||
"lint:hbs": "ember-template-lint .",
|
||||
"lint:hbs:fix": "ember-template-lint . --fix",
|
||||
"lint:js": "eslint .",
|
||||
"lint:js:fix": "eslint . --fix",
|
||||
"format": "npm run format:js",
|
||||
"format:js": "prettier --write '{addon,app,config,stories,tests}/**/*.js' *.js",
|
||||
"format:js": "prettier --write '{addon,app,config,stories,tests,mirage}/**/*.js' *.js",
|
||||
"start": "ember serve",
|
||||
"test": "ember test",
|
||||
"test:ember-compatibility": "ember try:each",
|
||||
"doc:toc": "doctoc README.md"
|
||||
},
|
||||
"dependencies": {
|
||||
"ember-cli-babel": "^7.21.0",
|
||||
"ember-cli-htmlbars": "^5.2.0",
|
||||
"ember-cli-babel": "^7.23.0",
|
||||
"ember-cli-htmlbars": "^5.3.1",
|
||||
"ember-cli-mirage": "^1.1.8",
|
||||
"ember-data": "^3.20.0",
|
||||
"ember-data-model-fragments": "5.0.0-beta.0",
|
||||
"ember-fetch": "^8.0.1",
|
||||
"ember-cli-mirage": "^1.1.8"
|
||||
"ember-fetch": "^8.0.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@ember/optional-features": "^1.3.0",
|
||||
"@glimmer/component": "^1.0.1",
|
||||
"@glimmer/tracking": "^1.0.0",
|
||||
"@ember/optional-features": "^2.0.0",
|
||||
"@ember/test-helpers": "^2.1.4",
|
||||
"@glimmer/component": "^1.0.3",
|
||||
"@glimmer/tracking": "^1.0.3",
|
||||
"babel-eslint": "^10.1.0",
|
||||
"broccoli-asset-rev": "^3.0.0",
|
||||
"doctoc": "^1.4.0",
|
||||
"ember-auto-import": "^1.6.0",
|
||||
"ember-cli": "~3.20.2",
|
||||
"ember-auto-import": "^1.10.1",
|
||||
"ember-cli": "~3.24.0",
|
||||
"ember-cli-dependency-checker": "^3.2.0",
|
||||
"ember-cli-inject-live-reload": "^2.0.2",
|
||||
"ember-cli-sri": "^2.1.1",
|
||||
"ember-cli-uglify": "^3.0.0",
|
||||
"ember-cli-terser": "^4.0.1",
|
||||
"ember-cli-update": "^0.54.6",
|
||||
"ember-copy": "^1.0.0",
|
||||
"ember-disable-prototype-extensions": "^1.1.3",
|
||||
"ember-export-application-global": "^2.0.1",
|
||||
"ember-get-config": "^0.3.0",
|
||||
"ember-load-initializers": "^2.1.1",
|
||||
"ember-load-initializers": "^2.1.2",
|
||||
"ember-maybe-import-regenerator": "^0.1.6",
|
||||
"ember-qunit": "^4.6.0",
|
||||
"ember-resolver": "^8.0.0",
|
||||
"ember-source": "~3.20.2",
|
||||
"ember-source-channel-url": "^2.0.1",
|
||||
"ember-template-lint": "^2.9.1",
|
||||
"ember-page-title": "^6.0.3",
|
||||
"ember-qunit": "^5.1.1",
|
||||
"ember-resolver": "^8.0.2",
|
||||
"ember-source": "~3.24.0",
|
||||
"ember-source-channel-url": "^3.0.0",
|
||||
"ember-template-lint": "^2.15.0",
|
||||
"ember-try": "^1.4.0",
|
||||
"eslint": "^7.5.0",
|
||||
"eslint-plugin-ember": "^8.9.1",
|
||||
"eslint": "^7.17.0",
|
||||
"eslint-config-prettier": "^7.1.0",
|
||||
"eslint-plugin-ember": "^10.1.1",
|
||||
"eslint-plugin-node": "^11.1.0",
|
||||
"eslint-plugin-prettier": "^3.3.1",
|
||||
"loader.js": "^4.7.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"prettier": "^2.0.5",
|
||||
"qunit-dom": "^1.2.0"
|
||||
"prettier": "^2.2.1",
|
||||
"qunit": "^2.13.0",
|
||||
"qunit-dom": "^1.6.0"
|
||||
},
|
||||
"engines": {
|
||||
"node": "10.* || >= 12"
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
{{page-title "Dummy"}}
|
||||
|
||||
<h2 id="title">Welcome to Ember</h2>
|
||||
|
||||
{{outlet}}
|
||||
@@ -3,7 +3,7 @@
|
||||
"packages": [
|
||||
{
|
||||
"name": "ember-cli",
|
||||
"version": "3.20.2",
|
||||
"version": "3.24.0",
|
||||
"blueprints": [
|
||||
{
|
||||
"name": "addon",
|
||||
|
||||
@@ -21,6 +21,13 @@
|
||||
{{content-for "body"}}
|
||||
{{content-for "test-body"}}
|
||||
|
||||
<div id="qunit"></div>
|
||||
<div id="qunit-fixture">
|
||||
<div id="ember-testing-container">
|
||||
<div id="ember-testing"></div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<script src="/testem.js" integrity=""></script>
|
||||
<script src="{{rootURL}}assets/vendor.js"></script>
|
||||
<script src="{{rootURL}}assets/test-support.js"></script>
|
||||
|
||||
@@ -1,8 +1,12 @@
|
||||
import Application from 'dummy/app';
|
||||
import config from 'dummy/config/environment';
|
||||
import * as QUnit from 'qunit';
|
||||
import { setApplication } from '@ember/test-helpers';
|
||||
import { setup } from 'qunit-dom';
|
||||
import { start } from 'ember-qunit';
|
||||
|
||||
setApplication(Application.create(config.APP));
|
||||
|
||||
setup(QUnit.assert);
|
||||
|
||||
start();
|
||||
@@ -9,7 +9,7 @@ module('Unit | Mixin | build-url', function (hooks) {
|
||||
|
||||
test('it does not interfere with basic URLs', function (assert) {
|
||||
assert.expect(1);
|
||||
/* eslint-disable-next-line ember/no-new-mixins */
|
||||
/* eslint-disable-next-line ember/no-new-mixins, ember/no-classic-classes */
|
||||
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin);
|
||||
this.owner.register('adapter:adapter', Adapter);
|
||||
const adapter = this.owner.lookup('adapter:adapter');
|
||||
@@ -19,7 +19,7 @@ module('Unit | Mixin | build-url', function (hooks) {
|
||||
|
||||
test('it does not interfere with namespaced URLs', function (assert) {
|
||||
assert.expect(1);
|
||||
/* eslint-disable-next-line ember/no-new-mixins */
|
||||
/* eslint-disable-next-line ember/no-new-mixins, ember/no-classic-classes */
|
||||
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
|
||||
namespace: 'api/v1',
|
||||
});
|
||||
@@ -31,7 +31,7 @@ module('Unit | Mixin | build-url', function (hooks) {
|
||||
|
||||
test('it can prepend a prefix', function (assert) {
|
||||
assert.expect(1);
|
||||
/* eslint-disable-next-line ember/no-new-mixins */
|
||||
/* eslint-disable-next-line ember/no-new-mixins, ember/no-classic-classes */
|
||||
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
|
||||
urlPrefix() {
|
||||
return '/foo/bars';
|
||||
@@ -45,7 +45,7 @@ module('Unit | Mixin | build-url', function (hooks) {
|
||||
|
||||
test('it can append a suffix', function (assert) {
|
||||
assert.expect(1);
|
||||
/* eslint-disable-next-line ember/no-new-mixins */
|
||||
/* eslint-disable-next-line ember/no-new-mixins, ember/no-classic-classes */
|
||||
const Adapter = RESTAdapter.extend(AdapterBuildURLMixin, {
|
||||
urlSuffix() {
|
||||
return ':method';
|
||||
|
||||
@@ -21,5 +21,4 @@ module('Unit | Model | account', function (hooks) {
|
||||
model.attributes.login_name = 'username';
|
||||
assert.equal(model.username, 'username');
|
||||
});
|
||||
|
||||
});
|
||||
@@ -1,11 +1,11 @@
|
||||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Model | auth token', function(hooks) {
|
||||
module('Unit | Model | auth token', function (hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
test('it exists', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('auth-token', {});
|
||||
assert.ok(model);
|
||||
|
||||
@@ -24,10 +24,7 @@ module('Unit | Model | host set', function (hooks) {
|
||||
attributes: {
|
||||
name: 'Host Set',
|
||||
description: 'Description',
|
||||
host_ids: [
|
||||
{value: '1'},
|
||||
{value: '3'},
|
||||
],
|
||||
host_ids: [{ value: '1' }, { value: '3' }],
|
||||
version: 1,
|
||||
scope: {
|
||||
scope_id: 'o_1',
|
||||
@@ -58,10 +55,7 @@ module('Unit | Model | host set', function (hooks) {
|
||||
attributes: {
|
||||
name: 'Host Set',
|
||||
description: 'Description',
|
||||
host_ids: [
|
||||
{value: '1'},
|
||||
{value: '3'},
|
||||
],
|
||||
host_ids: [{ value: '1' }, { value: '3' }],
|
||||
version: 1,
|
||||
scope: {
|
||||
scope_id: 'o_1',
|
||||
@@ -92,10 +86,7 @@ module('Unit | Model | host set', function (hooks) {
|
||||
attributes: {
|
||||
name: 'Host Set',
|
||||
description: 'Description',
|
||||
host_ids: [
|
||||
{value: '1'},
|
||||
{value: '3'},
|
||||
],
|
||||
host_ids: [{ value: '1' }, { value: '3' }],
|
||||
version: 1,
|
||||
scope: {
|
||||
scope_id: 'o_1',
|
||||
@@ -126,10 +117,7 @@ module('Unit | Model | host set', function (hooks) {
|
||||
attributes: {
|
||||
name: 'Host Set',
|
||||
description: 'Description',
|
||||
host_ids: [
|
||||
{value: '1'},
|
||||
{value: '3'},
|
||||
],
|
||||
host_ids: [{ value: '1' }, { value: '3' }],
|
||||
version: 1,
|
||||
scope: {
|
||||
scope_id: 'o_1',
|
||||
|
||||
@@ -1,28 +1,28 @@
|
||||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Model | session', function(hooks) {
|
||||
module('Unit | Model | session', function (hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
test('it exists', function(assert) {
|
||||
test('it exists', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('session', {});
|
||||
assert.ok(model);
|
||||
assert.notOk(model.isCancelable);
|
||||
});
|
||||
|
||||
test('it allows cancellation of an active session', function(assert) {
|
||||
test('it allows cancellation of an active session', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('session', {
|
||||
status: 'active'
|
||||
status: 'active',
|
||||
});
|
||||
assert.ok(model.isCancelable);
|
||||
});
|
||||
|
||||
test('it allows cancellation of a pending session', function(assert) {
|
||||
test('it allows cancellation of a pending session', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('session', {
|
||||
status: 'pending'
|
||||
status: 'pending',
|
||||
});
|
||||
assert.ok(model.isCancelable);
|
||||
});
|
||||
@@ -31,7 +31,7 @@ module('Unit | Model | session', function(hooks) {
|
||||
assert.expect(2);
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('session', {
|
||||
status: 'pending'
|
||||
status: 'pending',
|
||||
});
|
||||
assert.notOk(model.isActive);
|
||||
model.status = 'active';
|
||||
@@ -42,7 +42,7 @@ module('Unit | Model | session', function(hooks) {
|
||||
assert.expect(2);
|
||||
let store = this.owner.lookup('service:store');
|
||||
let model = store.createRecord('session', {
|
||||
status: 'active'
|
||||
status: 'active',
|
||||
});
|
||||
assert.notOk(model.isPending);
|
||||
model.status = 'pending';
|
||||
@@ -55,7 +55,7 @@ module('Unit | Model | session', function(hooks) {
|
||||
assert.equal(model.proxy, null);
|
||||
model.setProperties({
|
||||
proxy_address: 'localhost',
|
||||
proxy_port: '12345'
|
||||
proxy_port: '12345',
|
||||
});
|
||||
assert.equal(model.proxy, 'localhost:12345');
|
||||
});
|
||||
|
||||
@@ -186,33 +186,37 @@ module('Unit | Model | target', function (hooks) {
|
||||
store.push({
|
||||
data: {
|
||||
id: '123abc',
|
||||
type: 'target'
|
||||
}
|
||||
type: 'target',
|
||||
},
|
||||
});
|
||||
const target = store.peekRecord('target', '123abc');
|
||||
assert.equal( target.sessions.length, 0);
|
||||
assert.equal(target.sessions.length, 0);
|
||||
store.push({
|
||||
data: {
|
||||
id: '1',
|
||||
type: 'session',
|
||||
attributes: { target_id: '123abc' }
|
||||
}
|
||||
attributes: { target_id: '123abc' },
|
||||
},
|
||||
});
|
||||
store.push({
|
||||
data: {
|
||||
id: '2',
|
||||
type: 'session',
|
||||
attributes: { target_id: '123abc' }
|
||||
}
|
||||
attributes: { target_id: '123abc' },
|
||||
},
|
||||
});
|
||||
store.push({
|
||||
data: {
|
||||
id: '3',
|
||||
type: 'session',
|
||||
attributes: { target_id: '456xyz' }
|
||||
}
|
||||
attributes: { target_id: '456xyz' },
|
||||
},
|
||||
});
|
||||
assert.equal(store.peekAll('session').length, 3, 'There are 3 sessions loaded in the store');
|
||||
assert.equal(
|
||||
store.peekAll('session').length,
|
||||
3,
|
||||
'There are 3 sessions loaded in the store'
|
||||
);
|
||||
assert.equal(
|
||||
target.sessions.length,
|
||||
2,
|
||||
|
||||
@@ -66,7 +66,7 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
const serializedRecord = serializer.serialize(snapshot);
|
||||
assert.deepEqual(serializedRecord, {
|
||||
name: 'User',
|
||||
description: 'Description'
|
||||
description: 'Description',
|
||||
});
|
||||
});
|
||||
|
||||
@@ -172,7 +172,7 @@ module('Unit | Serializer | application', function (hooks) {
|
||||
attributes: {
|
||||
name: 'User 1',
|
||||
account_ids: [],
|
||||
scope: { scope_id: 'o_123' }
|
||||
scope: { scope_id: 'o_123' },
|
||||
},
|
||||
relationships: {},
|
||||
},
|
||||
|
||||
@@ -0,0 +1,66 @@
|
||||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Serializer | auth method', function (hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let serializer = store.serializerFor('auth-method');
|
||||
|
||||
assert.ok(serializer);
|
||||
});
|
||||
|
||||
test('it serializes records', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let record = store.createRecord('auth-method', {});
|
||||
|
||||
let serializedRecord = record.serialize();
|
||||
|
||||
assert.ok(serializedRecord);
|
||||
});
|
||||
|
||||
test('it sorts primary first in normalizeArrayResponse', function (assert) {
|
||||
assert.expect(2);
|
||||
const store = this.owner.lookup('service:store');
|
||||
const serializer = store.serializerFor('auth-method');
|
||||
const modelClass = store.createRecord('auth-method').constructor;
|
||||
const payload = {
|
||||
items: [{ id: 1 }, { id: 2, is_primary: true }, { id: 3 }],
|
||||
};
|
||||
const normalizedArray = serializer.normalizeArrayResponse(
|
||||
store,
|
||||
modelClass,
|
||||
payload
|
||||
);
|
||||
assert.ok(payload.items[1].is_primary, 'Second payload item is primary');
|
||||
assert.deepEqual(
|
||||
normalizedArray,
|
||||
{
|
||||
included: [],
|
||||
data: [
|
||||
{
|
||||
id: '2',
|
||||
type: 'auth-method',
|
||||
attributes: { is_primary: true },
|
||||
relationships: {},
|
||||
},
|
||||
{
|
||||
id: '1',
|
||||
type: 'auth-method',
|
||||
attributes: { is_primary: false },
|
||||
relationships: {},
|
||||
},
|
||||
{
|
||||
id: '3',
|
||||
type: 'auth-method',
|
||||
attributes: { is_primary: false },
|
||||
relationships: {},
|
||||
},
|
||||
],
|
||||
},
|
||||
'First normalized item is primary'
|
||||
);
|
||||
});
|
||||
});
|
||||
@@ -1,18 +1,18 @@
|
||||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Serializer | host', function(hooks) {
|
||||
module('Unit | Serializer | host', function (hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
test('it exists', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let serializer = store.serializerFor('host');
|
||||
|
||||
assert.ok(serializer);
|
||||
});
|
||||
|
||||
test('it serializes records', function(assert) {
|
||||
test('it serializes records', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let record = store.createRecord('host', {});
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@ module('Unit | Serializer | role', function (hooks) {
|
||||
name: 'User',
|
||||
description: 'Description',
|
||||
version: 1,
|
||||
grant_scope_id: null
|
||||
grant_scope_id: null,
|
||||
});
|
||||
});
|
||||
|
||||
|
||||
@@ -1,11 +1,11 @@
|
||||
import { module, test } from 'qunit';
|
||||
import { setupTest } from 'ember-qunit';
|
||||
|
||||
module('Unit | Serializer | session', function(hooks) {
|
||||
module('Unit | Serializer | session', function (hooks) {
|
||||
setupTest(hooks);
|
||||
|
||||
// Replace this with your real tests.
|
||||
test('it exists', function(assert) {
|
||||
test('it exists', function (assert) {
|
||||
let store = this.owner.lookup('service:store');
|
||||
let serializer = store.serializerFor('session');
|
||||
|
||||
|
||||
@@ -20,7 +20,7 @@ module('Unit | Serializer | target', function (hooks) {
|
||||
type: 'org',
|
||||
},
|
||||
version: 1,
|
||||
type: 'tcp'
|
||||
type: 'tcp',
|
||||
});
|
||||
const snapshot = record._createSnapshot();
|
||||
snapshot.adapterOptions = {};
|
||||
|
||||
Loaded 100 of 392 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user