chore: 🤖 JSON credential data modeling (#1485)
* chore: 🤖 JSON credential data modeling Added json type to credential model, created `json_object` attribute for `json` type, updated credential serializer to handle `json_object` attribute data being sent to backend and updated normalizer to handlle secret untracked 'json_object'. ✅ Closes: ICU-6653, ICU-6684, ICU-6685, ICU-6802, ICU-6803 * Update en-us.yaml fixed spelling * Update addons/api/addon/models/credential.js Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com> * refactor: 💡 refactor credential serializer and .yaml Refactored credential serializer to check for `json_object` existence before serializing and changed help variable in `.yaml` file for credentials. * refactor: 💡 refactor for credential serializer Refactor credential serializer removed redundant code, Co-authored-by: Cameron Perera <cameron.perera@hashicorp.com>
This commit is contained in:
1 parent
6b166401a1
commit
e3d44eb813
5 files changed
+90
-3
No files matched your search
@@ -79,4 +79,12 @@ export default class GeneratedCredentialModel extends BaseModel {
|
||||
description: 'The private key passphrase for credential.',
|
||||
})
|
||||
private_key_passphrase;
|
||||
|
||||
@attr('string', {
|
||||
for: 'json',
|
||||
isNestedAttribute: true,
|
||||
isSecret: true,
|
||||
description: 'The secret associated with credential.',
|
||||
})
|
||||
json_object;
|
||||
}
|
||||
@@ -13,6 +13,20 @@ export default class CredentialSerializer extends ApplicationSerializer {
|
||||
*/
|
||||
serializeScopeID = false;
|
||||
|
||||
serialize() {
|
||||
const serialized = super.serialize(...arguments);
|
||||
|
||||
if (serialized.type === 'json') {
|
||||
delete serialized.attributes.username;
|
||||
|
||||
if (serialized?.attributes?.json_object) {
|
||||
serialized.attributes.object = JSON.parse(serialized.attributes.json_object);
|
||||
delete serialized.attributes.json_object;
|
||||
}
|
||||
}
|
||||
|
||||
return serialized;
|
||||
}
|
||||
|
||||
normalize(typeClass, hash, ...rest) {
|
||||
const normalizedHash = copy(hash, true);
|
||||
@@ -21,6 +35,7 @@ export default class CredentialSerializer extends ApplicationSerializer {
|
||||
normalized.data.attributes.password = '';
|
||||
normalized.data.attributes.private_key = '';
|
||||
normalized.data.attributes.private_key_passphrase = '';
|
||||
normalized.data.attributes.json_object = '';
|
||||
return normalized;
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ export default ApplicationSerializer.extend({
|
||||
delete json.attributes?.password;
|
||||
delete json.attributes?.private_key;
|
||||
delete json.attributes?.private_key_passphrase;
|
||||
|
||||
delete json.attributes?.json_object;
|
||||
return json;
|
||||
},
|
||||
});
|
||||
@@ -92,6 +92,37 @@ module('Unit | Serializer | credential', function (hooks) {
|
||||
});
|
||||
});
|
||||
|
||||
test('it serializes json_object type correctly on create', async function (assert) {
|
||||
assert.expect(1);
|
||||
const store = this.owner.lookup('service:store');
|
||||
const serializer = store.serializerFor('credential');
|
||||
const record = store.createRecord('credential', {
|
||||
credential_store_id: 'csst_i7p1eu0Nw8',
|
||||
json_object:
|
||||
'{"secret_key": "QWERTYUIOP", "secret_access_key": "QWERT.YUIOP234567890"}',
|
||||
type: 'json',
|
||||
name: 'Name',
|
||||
description: 'Description',
|
||||
version: 1,
|
||||
});
|
||||
const snapshot = record._createSnapshot();
|
||||
const serializedRecord = serializer.serialize(snapshot);
|
||||
|
||||
assert.deepEqual(serializedRecord, {
|
||||
attributes: {
|
||||
object: {
|
||||
secret_key: 'QWERTYUIOP',
|
||||
secret_access_key: 'QWERT.YUIOP234567890',
|
||||
},
|
||||
},
|
||||
credential_store_id: 'csst_i7p1eu0Nw8',
|
||||
type: 'json',
|
||||
name: 'Name',
|
||||
description: 'Description',
|
||||
version: 1,
|
||||
});
|
||||
});
|
||||
|
||||
test('it serializes ssh_private_key type correctly when only the username is updated', function (assert) {
|
||||
assert.expect(1);
|
||||
const store = this.owner.lookup('service:store');
|
||||
@@ -146,6 +177,7 @@ module('Unit | Serializer | credential', function (hooks) {
|
||||
private_key_passphrase: '',
|
||||
private_key: '',
|
||||
password: '',
|
||||
json_object: '',
|
||||
},
|
||||
type: 'credential',
|
||||
id: 'credup_123',
|
||||
@@ -180,6 +212,7 @@ module('Unit | Serializer | credential', function (hooks) {
|
||||
private_key_passphrase: '',
|
||||
private_key: '',
|
||||
password: '',
|
||||
json_object: '',
|
||||
},
|
||||
type: 'credential',
|
||||
id: 'credspk_123',
|
||||
@@ -187,4 +220,33 @@ module('Unit | Serializer | credential', function (hooks) {
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
test('it normalizes "json" type credential record', async function (assert) {
|
||||
assert.expect(1);
|
||||
const store = this.owner.lookup('service:store');
|
||||
const serializer = store.serializerFor('credential');
|
||||
const credentialModelClass = store.createRecord('credential').constructor;
|
||||
const payload = {
|
||||
id: 'credjson_123',
|
||||
version: 1,
|
||||
type: 'json',
|
||||
};
|
||||
const normalized = serializer.normalize(credentialModelClass, payload);
|
||||
|
||||
assert.deepEqual(normalized, {
|
||||
data: {
|
||||
attributes: {
|
||||
type: 'json',
|
||||
version: 1,
|
||||
private_key_passphrase: '',
|
||||
private_key: '',
|
||||
password: '',
|
||||
json_object: '',
|
||||
},
|
||||
type: 'credential',
|
||||
id: 'credjson_123',
|
||||
relationships: {},
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -436,10 +436,12 @@ credential:
|
||||
types:
|
||||
username_password: Username & Password
|
||||
ssh_private_key: Username & Key Pair
|
||||
json: JSON
|
||||
unknown: Unknown
|
||||
help:
|
||||
username_password: This host requires a username and password to connect.
|
||||
ssh_private_key: This host requires a username, public key, and private key to connect.
|
||||
username_password: Connect using the provided username and password.
|
||||
ssh_private_key: Connect using a username, public key, and private key.
|
||||
json: Connect using a JSON blob containing the credentials.
|
||||
form:
|
||||
username:
|
||||
label: Username
|
||||
|
||||
Reference in new issue
Block a user